<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Peter Cammeraat</title><description>Welcome to my space on the internet. Building software with Swift.</description><link>https://petercammeraat.net</link><language>en-gb</language><lastBuildDate>Wed, 14 Feb 2024 15:39:01 +0100</lastBuildDate><pubDate>Wed, 14 Feb 2024 15:39:01 +0100</pubDate><ttl>250</ttl><atom:link href="https://petercammeraat.net/index.xml" rel="self" type="application/rss+xml"/><item><guid isPermaLink="true">https://petercammeraat.net/journal/2024/no-longer-making-quiet-open-source/</guid><title>No longer making Quiet open source</title><description>No longer making Quiet open source</description><link>https://petercammeraat.net/journal/2024/no-longer-making-quiet-open-source/</link><pubDate>Wed, 14 Feb 2024 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>A while ago I wrote about making <a href="https://petercammeraat.net/journal/2024/making-quiet-open-source/">Quiet open source</a>. I've been getting quite a few emails from other indie app developers lately, who, like me, decided to make their apps open source but later wished they hadn't.</p><p>They've been sharing their experiences and warning against it, mainly because of all the extra stress and problems it brought them. After thinking it over, I've decided to take their advice and I am no longer making Quiet open source, but keep it a closed-source project.</p><small><small>#100DaysToOffload 11/100</small></small>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2024/a-2024-plea-for-lean-software/</guid><title>A 2024 plea for lean software</title><description>A 2024 plea for lean software</description><link>https://petercammeraat.net/journal/2024/a-2024-plea-for-lean-software/</link><pubDate>Mon, 12 Feb 2024 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>This post is dedicated to the memory of Niklaus Wirth, a computing pioneer who passed away 1 January 2024. In 1995 he wrote an influential article called “A Plea for Lean Software,” published in Computer, the magazine for members of the IEEE Computer Society, which I read early in my career as an entrepreneur and software developer.</p></blockquote><blockquote><p>The way we build and ship software these days is mostly ridiculous, leading to apps using millions of lines of code to open a garage door, and other simple programs importing 1,600 external code libraries—dependencies—of unknown provenance. Software security is dire, which is a function both of the quality of the code and the sheer amount of it. Many of us programmers know the current situation is untenable. Many programmers (and their management) sadly haven’t ever experienced anything else. And for the rest of us, we rarely get the time to do a better job.</p></blockquote><p>→ <a href="https://spectrum.ieee.org/lean-software-development">https://spectrum.ieee.org/lean-software-development</a></p><p>The whole article is worthy of your time to read.</p><blockquote><p><strong>We are likely looking at over 50 million active lines of code to open a garage door….</strong></p></blockquote><p>First of all, bloated software is inherently more difficult to maintain and debug. With millions of lines of code, even the smallest change can have unforeseen consequences, leading to a never-ending cycle of patches and updates.</p><p>Secondly, bloated software is often slower and less efficient than its leaner counterparts. This means longer load times, increased resource consumption, and, ultimately, a worse user experience.</p><p>But it doesn't have to be this way. There's a growing movement within the software development community that advocates for simplicity and minimalism. Instead of trying to cram as many features as possible into the software and/or using dependencies for everything, these developers focus on doing one thing—and doing it well. By stripping away unnecessary complexity, dialling down on how many dependencies you use, they're able to create software that is faster, more reliable, and easier to use.</p><small><small>#100DaysToOffload 10/100</small></small>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2024/quiet-4-2-new-app-icon-and-visionos-support/</guid><title>Quiet 4.2 - new app icon and visionOS support</title><description>Quiet 4.2 - new app icon and visionOS support</description><link>https://petercammeraat.net/journal/2024/quiet-4-2-new-app-icon-and-visionos-support/</link><pubDate>Wed, 31 Jan 2024 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>New app icon</h3><p>After 7 (almost 8) years it was really time for a new app icon for Quiet. Check it out! A beautiful new colour calming mix of green/blue, a bubble for you to be in, and waves that symbolises the constant never ending distractions in everyday life.</p><img src="../../../assets/quiet/quiet.png "Quiet App Icon"" alt="Quiet App Icon"/><p>Nice layered app icon for visionOS:</p><video class="video-shortcode" style="width:100%" preload="auto" controls>
    <source src="https://petercammeraat.net/assets/videos/quiet-4-2/quiet-app-icon-visionos.mp4" type="video/mp4">
    There should have been a video here but your browser does not seem
    to support it.
</video><p>I absolutely love it and I hope you do to.</p><p>This app icon is all thanks to, the master in app icon design, <a href="https://www.matthewskiles.com">Matthew Skiles</a>. If you ever need an app icon, I highly recommend him.</p><h3>visionOS support</h3><img src="../../../assets/images/journal/quiet-4-2/block.png "Quiet on visionOS, block tab"" alt="Quiet on visionOS, block tab"/><p>After macOS, iOS, and iPadOS; visionOS will be the 4th platform Quiet works on. Love the glass looks, how the tabbar works. And how easy it was to add visionOS support to Quiet.</p><p>Pictures and words do not say enough. So here is a video:</p><video class="video-shortcode" style="width:100%" preload="auto" controls>
    <source src="https://petercammeraat.net/assets/videos/quiet-4-2/quiet-visionos.mp4" type="video/mp4">
    There should have been a video here but your browser does not seem
    to support it.
</video><h3>More...</h3><p>Furthermore I made some rule updates, and incorporated the feedback you provided. I also took care of some bugs.</p><p>Quiet's here to help you stay focused. Enjoy the new vibe and keep being productive!</p><p><a href="https://apps.apple.com/app/apple-store/id1441525727?pt=119418684&ct=Quiet4dot2BlogPost&mt=8">Download Quiet 4.2</a></p><p>You can help Quiet grow, please share it with friends and/or leave a donation in the app.</p><h3>What is next?</h3><ul><li>make <a href="https://petercammeraat.net/journal/2024/making-quiet-open-source/">Quiet open source</a></li><li>create a vision document for the future of Quiet</li><li>new hide rule: hide Google Login sheet you find on so much websites nowadays</li><li>new block rule: block Mastodon servers</li><li>make multiple sets of custom list of websites you want to block possible, so it is easier to switch</li></ul><small><small>#100DaysToOffload 9/100</small></small>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2024/changes-from-apple-for-the-european-union/</guid><title>Changes from Apple for the European Union</title><description>Changes from Apple for the European Union</description><link>https://petercammeraat.net/journal/2024/changes-from-apple-for-the-european-union/</link><pubDate>Thu, 25 Jan 2024 21:00:00 +0100</pubDate><content:encoded><![CDATA[<p>So it was a while in the making, we finally know how Apple is going to comply with the DMA rules of the European Union. There is a lot to read and dig through. I will try to compile a list of pages and quotes from those pages I found interesting.</p><h4>Official announcement</h4><blockquote><p>Apple today announced changes to iOS, Safari, and the App Store impacting developers’ apps in the European Union (EU) to comply with the Digital Markets Act (DMA). The changes include more than <strong>600 new APIs</strong>, expanded app analytics, functionality for alternative browser engines, and options for processing app payments and distributing iOS apps. Across every change, Apple is introducing new safeguards that reduce — but don’t eliminate — new risks the DMA poses to EU users. With these steps, Apple will continue to deliver the best, most secure experience possible for EU users.</p></blockquote><p>→ <a href="https://www.apple.com/newsroom/2024/01/apple-announces-changes-to-ios-safari-and-the-app-store-in-the-european-union/">https://www.apple.com/newsroom/2024/01/apple-announces-changes-to-ios-safari-and-the-app-store-in-the-european-union/</a></p><h4>Update on apps distributed in the European Union</h4><blockquote><p>Apple is sharing changes to iOS, Safari, and the App Store, impacting developers’ apps in the European Union (EU) to comply with the Digital Markets Act (DMA). These changes create new options for developers, including how they can distribute apps on iOS, process payments, use web browser engines in iOS apps, request interoperability with iPhone and iOS hardware and software features, access data and analytics about their apps, and transfer App Store user data. <br/><br/> The changes are available for developers who distribute apps in any of the <strong>27 EU member countries</strong> and only apply to apps available and distributed to users in the EU. For existing developers who want nothing to change for them — from how the App Store works currently and in the rest of the world — no action is needed, and they can continue to distribute their apps only on the App Store and use its private and secure In-App Purchase system.</p></blockquote><p>→ <a href="https://developer.apple.com/support/dma-and-apps-in-the-eu/#Introduction">https://developer.apple.com/support/dma-and-apps-in-the-eu/#Introduction</a></p><h4>Notarization for iOS apps</h4><blockquote><p>Notarization for iOS apps is a baseline review that applies to all apps, regardless of their distribution channel, focused on platform policies for security and privacy and to maintain device integrity. Through a combination of automated checks and human review, Notarization will help ensure apps are free of known malware, viruses, or other security threats, function as promised, and don’t expose users to egregious fraud.</p></blockquote><p>→ <a href="https://developer.apple.com/support/dma-and-apps-in-the-eu/#ios-app-eu">https://developer.apple.com/support/dma-and-apps-in-the-eu/#ios-app-eu</a></p><p>Like on the Mac with some extra's. And fair enough.</p><h4>Using alternative payment options on the App Store in the European Union</h4><blockquote><p>For linking out, the commission applies to sales of digital goods or services that are initiated within <strong>seven</strong> calendar days after the user taps “Continue” on the in-app notice sheet. This includes any adjustments for refunds, reversals and chargebacks.</p></blockquote><blockquote><p>For auto-renewable subscriptions, a transaction is classified as, (i) a sale initiated, including with a free trial or offer, within <strong>seven</strong> calendar days after a link out; and (ii) each subsequent renewal after the subscription is initiated. For both linking out and in-app transactions using an alternative payment service provider, subsequent subscriptions renewals will be included for commission until the customer cancels their subscription, performs a new purchase outside of the seven day window without using the link within the app, or until you inactivate their subscription due to payment issues. Renewals will continue on the payment processor where the subscription was initiated.</p></blockquote><p>→ <a href="https://developer.apple.com/support/apps-using-alternative-payment-providers-in-the-eu/">https://developer.apple.com/support/apps-using-alternative-payment-providers-in-the-eu/</a></p><p>For seven days after the user is guided to your own payment system Apple will receive commission for those sales.</p><h4>Using alternative browser engines in the European Union</h4><blockquote><p>iOS 17.4 introduces new capabilities that let iOS apps use alternative browser engines — browser engines other than WebKit — for dedicated browser apps and apps providing in-app browsing experiences in the EU.</p></blockquote><p>→ <a href="https://developer.apple.com/support/alternative-browser-engines/">https://developer.apple.com/support/alternative-browser-engines/</a></p><p>Choice in which browser you want to use is always good. I am however afraid that Chrome becomes even bigger. Hate to see that happen. Will stick to Safari myself off course.</p><h4>HCE-based contactless transactions for banking and wallet apps in the European Economic Area</h4><blockquote><p>iOS 17.4 introduces new APIs for developers to support contactless payment transactions from within their banking or wallet apps using host card emulation (HCE). Users based in the European Economic Area (EEA) with an iPhone running iOS 17.4 or later can initiate in-person payment transactions from a banking or wallet app at compatible NFC terminals or mobile devices that accept contactless payments.</p></blockquote><p>→ <a href="https://developer.apple.com/support/hce-payment-transactions-in-payment-apps/">https://developer.apple.com/support/hce-payment-transactions-in-payment-apps/</a></p><h4>Requesting interoperability with iOS in the European Union</h4><blockquote><p>Apple has designed a new process for developers of iOS apps in the European Union to request additional interoperability with hardware and software features built into iPhone and iOS under Article 6(7) of the EU Digital Markets Act (DMA). Apple will evaluate each request and inform you about the outcome of its review.</p></blockquote><p>→ <a href="https://developer.apple.com/support/ios-interoperability/">https://developer.apple.com/support/ios-interoperability/</a></p><p>This is nice. I have a request in mind.</p><h4>Expanded developer app analytics and user data portability</h4><blockquote><p>To reflect the DMA’s changes, Apple will expand the analytics available for developers’ apps both in the EU and around the world to help developers get even more insight into their businesses and their apps’ performance. Over 50 new reports will be available through the App Store Connect API to help developers analyze their app performance and find opportunities for improvement with more metrics in areas like: <br/> <strong>Engagement</strong> — with additional information on the number of users on the App Store interacting with a developer’s app or sharing it with others;<br/> <strong>Commerce</strong> — with additional information on downloads, sales and proceeds, pre-orders, and transactions made with the App Store’s secure In-App Purchase system;<br/> <strong>App usage</strong> — with additional information on crashes, active devices, installs, app deletions, and more.<br/> <strong>Frameworks usage</strong> — with additional information on an app’s interaction with OS capabilities such as PhotoPicker, Widgets, and CarPlay.</p></blockquote><p>→ <a href="https://developer.apple.com/support/dma-and-apps-in-the-eu/#app-analytics">https://developer.apple.com/support/dma-and-apps-in-the-eu/#app-analytics</a></p><h4>Core Technology Fee</h4><blockquote><p>The Core Technology Fee (CTF) is an element of the new business terms in the European Union (EU) that reflects the value Apple provides developers through ongoing investments in the tools, technologies, and services that enable them to build and share innovative apps with users around the world. Developers can choose to remain on the App Store’s current business terms or adopt the new business terms for iOS apps in the EU.</p></blockquote><blockquote><p>Developers operating under the new business terms for EU apps will have the option to distribute their iOS apps in the EU on the App Store and/or alternative app marketplaces. These developers can also use alternative payment processors in their apps in the EU on the App Store across Apple operating systems. For developers who choose to agree to the new business terms, membership in the Apple Developer Program includes one million first annual installs per year for free for apps distributed from the App Store and/or alternative marketplaces. Developers who achieve exceptional scale on iOS, with apps that have over one million first annual installs in the past 12 months in the EU, will pay a Core Technology Fee.</p></blockquote><blockquote><p>Only certain kinds of installs can be considered a first annual install, such as the <strong>first time</strong> an app is ever installed, redownloads of an app that was previously installed, and app updates, as long as they start a new 12-month period. Other installs, such as reinstalls of offloaded apps, iCloud transfers, and auto-downloads onto additional iOS devices by the same Apple account in the EU won’t be considered first annual installs.</p></blockquote><p>→ <a href="https://developer.apple.com/support/core-technology-fee/">https://developer.apple.com/support/core-technology-fee/</a></p><h4>Fee Calculator</h4><blockquote><p>Apple is sharing new business terms available for developers’ apps in the European Union. Developers can choose to adopt these new business terms, or stay on Apple’s existing terms. For existing developers who want nothing to change for them — from how the App Store works currently and in the rest of the world — no action is needed, and they can continue to distribute their apps only on the App Store and use its private and secure In-App Purchase system. Developers must adopt the new business terms for EU apps to use the new capabilities for alternative distribution or alternative payment processing. For apps in the EU member states where the DMA is taking effect, the following options will be available:</p></blockquote><blockquote><p><strong>Today’s capabilities and terms</strong> — the same capabilities and terms used today, where developers distribute on the App Store and pay Apple a commission on the sale of digital goods and services. Developers continuing with these capabilities and terms for their EU apps do not need to take any further action</p></blockquote><blockquote><p><strong>New capabilities and terms for apps in the EU</strong> — where developers have additional distribution and payment processing options available. Apple will apply a reduced commission, an optional payment processing fee, and a fee for first annual installs above one million in the last 12 months.</p></blockquote><p>→ <a href="https://developer.apple.com/support/fee-calculator-for-apps-in-the-eu/">https://developer.apple.com/support/fee-calculator-for-apps-in-the-eu/</a></p><h4>My thoughts</h4><p>If you have a lot (1 million plus) of installs every year but not a lot of revenue. For example for free apps with donation buttons in it, or small amounts of one time purchases. The new terms are not worth it.</p><p>To show you:</p><ul><li>2 million first installs per year in the EU</li><li>$25000 revenue per year from users in the EU</li></ul><h5>Todays terms</h5><p>I would pay $313 per month on commission with todays terms.</p><img src="../../../assets/images/journal/changes-from-apple-for-the-european-union/fee-calculator-todays-terms.png "Fee calculator: todays terms"" alt="Fee calculator: todays terms"/><h5>New terms</h5><p>I would pay $45561 per month on commission/fees with the new terms.</p><img src="../../../assets/images/journal/changes-from-apple-for-the-european-union/fee-calculator-new-terms.png "Fee calculator: new terms"" alt="Fee calculator: new terms"/><p>Maybe the are going to tweak the Core Technology Fee a bit. We will see. And non-profits, government organisations, and education institutions can apply for a fee waiver.</p><p>There is a lot to read and think about. Hope you found this overview helpful :-)</p><small><small>#100DaysToOffload 8/100</small></small>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2024/the-mac-is-40-years-old/</guid><title>The Mac is 40 years old</title><description>The Mac is 40 years old. My journey through the years.</description><link>https://petercammeraat.net/journal/2024/the-mac-is-40-years-old/</link><pubDate>Wed, 24 Jan 2024 12:00:00 +0100</pubDate><content:encoded><![CDATA[<p>On this day 40 years ago (24 January 1984) it all began, when Apple Inc. introduced the first Macintosh computer to the world. Back then, it was a groundbreaking moment, as the Macintosh was one of the first personal computers to feature a graphical user interface and a mouse. This revolutionary approach to computing changed the game and set the stage for the user-friendly devices we know and love today.</p><h3>The Mac's I have used</h3><p>Because of my dad's (many thanks to him) job as an IT professional, our home always had a variety of Mac computers. I can vividly recall many of them. At the age of 7, I had my very own computer in my bedroom. Initially, it lacked internet connectivity, but as we entered the PowerPC era, we eventually had internet access at home. This sparked a profound interest in technology and played a pivotal role in shaping where I am today.</p><h4>Macintosh SE30</h4><img src="../../../assets/images/journal/the-mac-is-40-years-old/macintosh-se-30.jpg "Macintosh SE30"" alt="Macintosh SE30"/><p>First computer.</p><h4>Macintosh LC</h4><img src="../../../assets/images/journal/the-mac-is-40-years-old/macintosh-lc.jpg "Macintosh LC"" alt="Macintosh LC"/><p>Cycled through a few Macintosh LC's every year.</p><h4>Macintosh Portable</h4><img src="../../../assets/images/journal/the-mac-is-40-years-old/macintosh-portable.jpg "Macintosh Portable"" alt="Macintosh Portable"/><p>First laptop. Still have this Mac somewhere in the attic. Last time I tried to boot it up the small battery (for time and stuff) was stuck and not working anymore.</p><h4>iMac G3 Bondi</h4><img src="../../../assets/images/journal/the-mac-is-40-years-old/imac-g3-bondi.jpg "iMac G3 Bondi"" alt="iMac G3 Bondi"/><p>The era of colourful Mac's started.</p><h4>iMac G3 Graphite</h4><img src="../../../assets/images/journal/the-mac-is-40-years-old/imac-g3-graphite.jpg "iMac G3 Graphite"" alt="iMac G3 Graphite"/><p>Could see inside and see the components. Very cool!</p><h4>Power Mac G3</h4><img src="../../../assets/images/journal/the-mac-is-40-years-old/power-mac-g3.jpg "Power Mac G3"" alt="Power Mac G3"/><h4>Power Mac G4 Cube</h4><img src="../../../assets/images/journal/the-mac-is-40-years-old/power-mac-g4-cube.jpg "Power Mac G4 Cube"" alt="Power Mac G4 Cube"/><p>I hope they bring a Cube form factor Mac back into the line up. Mac Studio would be the perfect candidate for it.</p><h4>iMac G4</h4><img src="../../../assets/images/journal/the-mac-is-40-years-old/imac-g4.jpg "iMac G4"" alt="iMac G4"/><p>Most stunning iMac ever.</p><h4>iBook G4</h4><img src="../../../assets/images/journal/the-mac-is-40-years-old/ibook-g4.jpg "iBook G4"" alt="iBook G4"/><h4>Mac mini G4</h4><img src="../../../assets/images/journal/the-mac-is-40-years-old/mac-mini-g4.jpg "Mac mini G4"" alt="Mac mini G4"/><p>Till this day I still use Mac mini's.</p><h4>Mac mini Intel</h4><img src="../../../assets/images/journal/the-mac-is-40-years-old/mac-mini-intel.jpg "Mac mini Intel"" alt="Mac mini Intel"/><h4>iMac Intel Unibody Late 2009</h4><img src="../../../assets/images/journal/the-mac-is-40-years-old/imac-intel.jpg "iMac Intel"" alt="iMac Intel"/><p>First Mac I bought with my own money. iMac 21.5" Core2Duo 3.06GHz, 4GB RAM, 1TB Disk, Radeon HD 4670</p><h4>MacBook Air Mid 2012</h4><img src="../../../assets/images/journal/the-mac-is-40-years-old/macbook-air-first.jpg "MacBook Air"" alt="MacBook Air"/><h4>MacBook Air Retina 2018</h4><img src="../../../assets/images/journal/the-mac-is-40-years-old/macbook-air-retina.png "MacBook Air"" alt="MacBook Air"/><p>The transition to Retina display was mind blowing at the time. Never go back from that.</p><h4>Mac mini M1</h4><img src="../../../assets/images/journal/the-mac-is-40-years-old/mac-mini-m1.jpg "Mac mini M1"" alt="Mac mini M1"/><p>Circled back to a Mac mini. The transition to Apple Silicon Mac's is amazing. It blew new life into the Mac division of Apple.</p><h4>Next one?</h4><p>Probably a Mac Studio with an Apple Studio Display.</p><h3>The future</h3><p>I'm hopeful for another 40 years of the Mac. With the immense success of the iPhone, the Mac seemed to take a back seat for a while. It's reassuring to witness the shift to Apple Silicon, which has brought the Mac back into the spotlight.</p><p>Also curious to see what role the Apple Vision Pro will play in the future of Mac. The constant evolution of Apple's technology keeps us on our toes, and I'm excited to see how this new addition will contribute to the Mac's journey in the years to come.</p><p>Here's to more years of innovation and success for our beloved Mac!</p><small><small>#100DaysToOffload 7/100</small></small>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2024/writing-html-with-htmlkit-in-swift/</guid><title>Writing HTML with HTMLKit in Swift</title><description>Writing HTML with HTMLKit in Swift</description><link>https://petercammeraat.net/journal/2024/writing-html-with-htmlkit-in-swift/</link><pubDate>Thu, 18 Jan 2024 17:00:00 +0100</pubDate><content:encoded><![CDATA[<p>Continuing my exploration of HTMLKit, I find its potential quite promising. In this post, I delve deeper into leveraging its capabilities to seamlessly integrate HTML into Swift. Along the way, I've written a small web application that fetches stock information, presenting it through both a chart and a data table. I'll be sharing specific examples of the Swift code I've authored to achieve these functionalities.</p><p>This project is open source and can be found here: <a href="https://github.com/petercammeraat/stocks">https://github.com/petercammeraat/stocks</a></p><h3>Search form</h3><p>The search form includes labels, input fields, date pickers, and a submit button, making it easy for you to enter your search details and submit them smoothly.</p><pre><code><span class="splash-keyword">struct</span> SearchForm: <span class="splash-type">View</span> {
    <span class="splash-keyword">private let</span> ticker = <span class="splash-string">"ticker"</span>
    <span class="splash-keyword">private let</span> from = <span class="splash-string">"from"</span>
    <span class="splash-keyword">private let</span> to = <span class="splash-string">"to"</span>

    <span class="splash-keyword">private let</span> today = <span class="splash-type">Date</span>().<span class="splash-property">convertToOnlyDate</span>
    <span class="splash-keyword">private let</span> sevenDaysAgo = <span class="splash-type">Calendar</span>.<span class="splash-property">current</span>.<span class="splash-call">date</span>(
        byAdding: .<span class="splash-dotAccess">day</span>, 
        value: -<span class="splash-number">7</span>, 
        to: <span class="splash-type">Date</span>()
    )!.convertToOnlyDate

    <span class="splash-keyword">var</span> body: <span class="splash-type">Content</span> {
        <span class="splash-type">Form</span> {
            <span class="splash-type">Label</span> {
                <span class="splash-string">"Ticker:"</span>
            }
            <span class="splash-type">Input</span>()
                .<span class="splash-call">type</span>(.<span class="splash-dotAccess">text</span>)
                .<span class="splash-call">name</span>(ticker)
                .<span class="splash-call">id</span>(ticker)

            <span class="splash-type">Label</span> {
                <span class="splash-string">"From date:"</span>
            }
            <span class="splash-type">Input</span>()
                .<span class="splash-call">type</span>(.<span class="splash-dotAccess">date</span>)
                .<span class="splash-call">name</span>(from)
                .<span class="splash-call">id</span>(from)
                .<span class="splash-call">value</span>(sevenDaysAgo)

            <span class="splash-type">Label</span> {
                <span class="splash-string">"To date:"</span>
            }
            <span class="splash-type">Input</span>()
                .<span class="splash-call">type</span>(.<span class="splash-dotAccess">date</span>)
                .<span class="splash-call">name</span>(to)
                .<span class="splash-call">id</span>(to)
                .<span class="splash-call">value</span>(today)

            <span class="splash-type">Button</span> {
                <span class="splash-string">"Search"</span>
            }
            .<span class="splash-call">type</span>(.<span class="splash-dotAccess">submit</span>)
        }
        .<span class="splash-call">method</span>(.<span class="splash-dotAccess">post</span>)
        .<span class="splash-call">action</span>(<span class="splash-string">"/search"</span>)
    }
}

</code></pre><h3>Handling the query</h3><p>This code works behind the scenes, managing the search request on the server, retrieving stock information, and displaying it in the SearchView for you.</p><pre><code><span class="splash-keyword">func</span> getSearch(<span class="splash-keyword">_</span> request: <span class="splash-type">Request</span>) <span class="splash-keyword">async throws</span> -&gt; <span class="splash-type">Vapor</span>.<span class="splash-type">View</span> {
    <span class="splash-keyword">let</span> data = <span class="splash-keyword">try</span> request.<span class="splash-property">content</span>.<span class="splash-call">decode</span>(<span class="splash-type">SearchPayload</span>.<span class="splash-keyword">self</span>)

    <span class="splash-keyword">let</span> getStockData = <span class="splash-type">Task</span> {
        <span class="splash-keyword">return try await</span> <span class="splash-type">Stock</span>.<span class="splash-call">get</span>(search: data)
    }
    <span class="splash-keyword">let</span> stockData = <span class="splash-keyword">try await</span> getStockData.<span class="splash-property">value</span>
    <span class="splash-keyword">return try await</span> request.<span class="splash-property">htmlkit</span>.<span class="splash-call">render</span>(<span class="splash-type">SearchView</span>(stock: stockData))
}
</code></pre><h3>Search results</h3><p>After searching, you'll land on a page where you can search for another stock. Plus, you'll see the results in a chart and a table for easy understanding.</p><pre><code><span class="splash-keyword">struct</span> SearchView: <span class="splash-type">View</span> {
    <span class="splash-keyword">let</span> stock: <span class="splash-type">Stock</span>
    <span class="splash-keyword">let</span> reversedResults: [<span class="splash-type">Stock</span>.<span class="splash-type">Result</span>]
    <span class="splash-keyword">let</span> highestClosingPrice: <span class="splash-type">Double</span>

    <span class="splash-keyword">var</span> body: <span class="splash-type">Content</span> {
        <span class="splash-type">BaseView</span> {
            <span class="splash-type">Main</span> {
                <span class="splash-type">SearchForm</span>()

                <span class="splash-type">Div</span> {
                    <span class="splash-type">H1</span> { stock.<span class="splash-property">ticker</span> }
                    <span class="splash-type">StockChart</span>(stock: stock, highestClosingPrice: highestClosingPrice)
                    <span class="splash-type">StockTable</span>(reversedResults: reversedResults)
                }
                .<span class="splash-call">id</span>(<span class="splash-string">"results"</span>)
            }
        }
    }

    <span class="splash-keyword">init</span>(stock: <span class="splash-type">Stock</span>) {
        <span class="splash-keyword">self</span>.<span class="splash-property">stock</span> = stock
        reversedResults = stock.<span class="splash-property">results</span>.<span class="splash-call">reversed</span>()
        highestClosingPrice = stock.<span class="splash-property">results</span>.<span class="splash-call">map</span> { $0.<span class="splash-property">closingPrice</span> }.<span class="splash-call">max</span>() ?? <span class="splash-number">0</span>
    }
}
</code></pre><h3>What it looks like</h3><img src="../../../assets/images/journal/writing-html-with-htmlkit-in-swift/stock-web-app-1.png "Stock Web App"" alt="Stock Web App"/><br/><img src="../../../assets/images/journal/writing-html-with-htmlkit-in-swift/stock-web-app-2.png "Stock Web App"" alt="Stock Web App"/><br/><img src="../../../assets/images/journal/writing-html-with-htmlkit-in-swift/stock-web-app-3.png "Stock Web App"" alt="Stock Web App"/><br/><h3>Thoughts</h3><p>I find HTMLKit quite capable, especially with its convenient approach to writing HTML in Swift. In my next exploration, I plan to dive into the SwiftUI-like components that HTMLKit provides, discovering more about their functionality.</p><small><small>#100DaysToOffload 6/100</small></small>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2024/swift-dsl-for-html/</guid><title>Swift DSL for HTML</title><description>Looking for a good Swift Domain Specific Language (DSL) for HTML</description><link>https://petercammeraat.net/journal/2024/swift-dsl-for-html/</link><pubDate>Tue, 16 Jan 2024 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>Wait what is Swift DSL? In this context, Swift DSL simply refers to using Swift as a programming language to create a Domain Specific Language (DSL). A DSL is a language specialised for a particular domain or problem, making it more expressive and readable for tasks within that domain. I am looking for a DSL to write HTML in Swift.</p><p>I discovered several options and experimented with them to determine the one I prefer for building my static site generator in Swift.</p><h5><a href="https://github.com/dokun1/Vaux">Vaux</a></h5><pre><code><span class="splash-keyword">func</span> simplePage() -&gt; <span class="splash-type">HTML</span> {
  <span class="splash-call">html</span> {
    <span class="splash-call">head</span> {
      <span class="splash-call">title</span>(pageTitle)
    }
    <span class="splash-call">body</span> {
      <span class="splash-call">div</span> {
        pageBody
      }
    }
  }
}
</code></pre><p>Vaux seems to be one of the early frameworks for writing HTML in Swift. However, it hasn't received updates in years.</p><h5><a href="https://github.com/JohnSundell/Plot">Plot</a></h5><pre><code><span class="splash-keyword">let</span> html = <span class="splash-type">HTML</span>(
    .<span class="splash-call">head</span>(
        .<span class="splash-call">title</span>(<span class="splash-string">"My website"</span>),
        .<span class="splash-call">stylesheet</span>(<span class="splash-string">"styles.css"</span>)
    ),
    .<span class="splash-call">body</span>(
        .<span class="splash-call">div</span>(
            .<span class="splash-call">h1</span>(<span class="splash-string">"My website"</span>),
            .<span class="splash-call">p</span>(<span class="splash-string">"Writing HTML in Swift is pretty great!"</span>)
        )
    )
)
</code></pre><p>Authored by John Sundell, currently used (at time of writing) for this website. It lacks essential HTML elements, contains minor bugs, and is not actively updated.</p><h5><a href="https://github.com/Alja7dali/swift-web-page">swift-web-page</a></h5><pre><code><span class="splash-keyword">let</span> page = <span class="splash-call">document</span> {
  <span class="splash-call">html</span> {
    <span class="splash-call">head</span>(<span class="splash-call">title</span>(<span class="splash-string">"YOLO!"</span>))
    <span class="splash-call">body</span> {
      <span class="splash-call">h1</span>(<span class="splash-string">"Welcome!"</span>)
        .<span class="splash-call">color</span>(.<span class="splash-call">tomato</span>())
      <span class="splash-call">p</span>(<span class="splash-string">"You've found our site!"</span>)
    }
  }
}
</code></pre><p>You have the ability to include CSS through view modifiers, which is a positive step forward. Unfortunately, the downside is that it's no longer being actively maintained.</p><h5><a href="https://github.com/johngarrett/HyperSwift">HyperSwift</a></h5><pre><code><span class="splash-type">VStack</span>(justify: .<span class="splash-dotAccess">center</span>, align: .<span class="splash-dotAccess">center</span>) {
    <span class="splash-type">HStack</span>(justify: .<span class="splash-dotAccess">spaceEvenly</span>, align: .<span class="splash-dotAccess">center</span>) {
        <span class="splash-type">Image</span>(url: <span class="splash-string">"/images/error_bomb.png"</span>)
            .<span class="splash-call">width</span>(<span class="splash-number">100</span>)
            .<span class="splash-call">height</span>(<span class="splash-number">100</span>)

        <span class="splash-type">Header</span>(.<span class="splash-dotAccess">header3</span>) { <span class="splash-string">"HTTP 500"</span> }
            .<span class="splash-call">font</span>(weight: <span class="splash-string">"bold"</span>, size: <span class="splash-number">40</span>, family: <span class="splash-string">"SF Mono"</span>)
    }

    <span class="splash-type">Paragraph</span>(fiveOfiveMessage)
}
.<span class="splash-call">backgroundColor</span>(<span class="splash-type">GColors</span>.<span class="splash-property">lightRed</span>)
.<span class="splash-call">textAlign</span>(.<span class="splash-dotAccess">center</span>)
.<span class="splash-call">margin</span>(<span class="splash-number">5</span>, .<span class="splash-dotAccess">percent</span>)
.<span class="splash-call">display</span>(.<span class="splash-dotAccess">flex</span>)
.<span class="splash-call">shadow</span>(x: <span class="splash-number">20</span>, y: <span class="splash-number">30</span>, color: <span class="splash-type">GColors</span>.<span class="splash-property">cardShadow</span>)
.<span class="splash-call">border</span>(width: <span class="splash-number">1</span>, color: .<span class="splash-dotAccess">black</span>)
</code></pre><p>HyperSwift closely resembles SwiftUI in both appearance and user experience. Regrettably, this project is no longer under active maintenance, and there is also a lack of community support behind it.</p><h5><a href="https://github.com/vapor-community/HTMLKit">HTMLKit</a></h5><pre><code><span class="splash-keyword">struct</span> IndexView: <span class="splash-type">View</span> {
    <span class="splash-keyword">var</span> body: <span class="splash-type">Content</span> {
        <span class="splash-type">ViewContainer</span> {
            <span class="splash-type">Header</span> {
                <span class="splash-type">Text</span> {
                    <span class="splash-string">"Some title"</span>
                }
                .<span class="splash-call">font</span>(.<span class="splash-dotAccess">subheadline</span>)
                .<span class="splash-call">backgroundColor</span>(.<span class="splash-dotAccess">red</span>)
            }
        }
    }
}
</code></pre><p>HTMLKit stands out as a promising choice. It exhibits a SwiftUI-like appearance, complete with features such as <code>VStack</code> and <code>HStack</code>, reminiscent of SwiftUI components. Notably, it is actively developed and benefits from robust community support, particularly from the Vapor community.</p><p>Two more examples of how HTMLKit can be used.</p><p>Login card:</p><pre><code><span class="splash-type">Card</span> {
    <span class="splash-type">Form</span>(method: .<span class="splash-dotAccess">post</span>) {
        <span class="splash-type">VStack</span> {
            <span class="splash-type">FieldLabel</span>(for: <span class="splash-string">"username"</span>) {
                <span class="splash-string">"Username"</span>
            }
            <span class="splash-type">TextField</span>(name: <span class="splash-string">"username"</span>)
                .<span class="splash-call">borderShape</span>(.<span class="splash-dotAccess">smallrounded</span>)
        }
        <span class="splash-type">VStack</span> {
            <span class="splash-type">FieldLabel</span>(for: <span class="splash-string">"password"</span>) {
                <span class="splash-string">"Password"</span>
            }
            <span class="splash-type">SecureField</span>(name: <span class="splash-string">"password"</span>)
                .<span class="splash-call">borderShape</span>(.<span class="splash-dotAccess">smallrounded</span>)
        }
        .<span class="splash-call">margin</span>(insets: .<span class="splash-dotAccess">bottom</span>, length: .<span class="splash-dotAccess">small</span>)
        <span class="splash-type">HStack</span> {
            <span class="splash-type">Button</span>(role: .<span class="splash-dotAccess">submit</span>) {
                <span class="splash-string">"Sign in"</span>
            }
            .<span class="splash-call">buttonStyle</span>(.<span class="splash-dotAccess">primary</span>)
            .<span class="splash-call">borderShape</span>(.<span class="splash-dotAccess">smallrounded</span>)
            .<span class="splash-call">buttonSize</span>(.<span class="splash-dotAccess">full</span>)
        }
        .<span class="splash-call">margin</span>(insets: .<span class="splash-dotAccess">bottom</span>, length: .<span class="splash-dotAccess">small</span>)
    }
    .<span class="splash-call">tag</span>(<span class="splash-string">"login-form"</span>)
    .<span class="splash-call">onSubmit</span> { form <span class="splash-keyword">in</span>
        form.<span class="splash-call">validate</span>(<span class="splash-string">"login-form"</span>, <span class="splash-type">LoginModel</span>.<span class="splash-type">Input</span>.<span class="splash-property">validators</span>)
    }
}
.<span class="splash-call">borderShape</span>(.<span class="splash-dotAccess">smallrounded</span>)
.<span class="splash-call">frame</span>(width: .<span class="splash-dotAccess">twelve</span>)
</code></pre><p>Grid with cards:</p><pre><code><span class="splash-type">Grid</span>(ratio: .<span class="splash-call">custom</span>(<span class="splash-string">"masonary"</span>)) {
    <span class="splash-keyword">for</span> item <span class="splash-keyword">in</span> pagination.<span class="splash-property">items</span> {
        <span class="splash-type">Card</span> {
            item.<span class="splash-property">message</span>
        }
        .<span class="splash-call">borderShape</span>(.<span class="splash-dotAccess">smallrounded</span>)
    }
}
.<span class="splash-call">contentSpace</span>(.<span class="splash-dotAccess">small</span>)
</code></pre><h5>Conclusion</h5><p>I believe HTMLKit is a great option when you're considering creating your website or web application using Swift. It provides a straightforward and user-friendly approach with components reminiscent of SwiftUI, making it easier to write correct HTML. Choosing HTMLKit can simplify the process of building and structuring your web content, especially if you're already familiar with Swift.</p><small><small>#100DaysToOffload 5/100</small></small>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2024/making-this-website-in-swift-part-2/</guid><title>Making this website in Swift - part 2</title><description>Making this website in Swift - part 2</description><link>https://petercammeraat.net/journal/2024/making-this-website-in-swift-part-2/</link><pubDate>Thu, 11 Jan 2024 07:30:00 +0100</pubDate><content:encoded><![CDATA[<p>If you are interested in making your own theme for Publish, then here are some examples:</p><ul><li><a href="https://github.com/swiftwasm/blog.swiftwasm.org">https://github.com/swiftwasm/blog.swiftwasm.org</a></li><li><a href="https://github.com/nonstrict-hq/nonstrict.eu-website">https://github.com/nonstrict-hq/nonstrict.eu-website</a></li><li><a href="https://github.com/kradalby/aspargesgaarden-swift">https://github.com/kradalby/aspargesgaarden-swift</a></li><li><a href="https://github.com/fbernutz/die-himmelstraeumerin-blog">https://github.com/fbernutz/die-himmelstraeumerin-blog</a></li><li><a href="https://github.com/vapor/blog">https://github.com/vapor/blog</a></li></ul><h5>Small bugs and incomplete</h5><p>While using Publish and Plot I encountered a lot of small bugs. Like not ending a url with a slash. Resulting in unnecessary redirects. Not having the <code>me</code> case for link relationships and much more.</p><p>For now it is workable and almost good enough for my needs. Until I write my own DSL (Domain Specific Language) to write HTML and other web markup languages in Swift. Plus writing my own static site generator in Swift will be a nice challenge. I like writing my website in Swift. Not having to leave the tools I use everyday is also a plus and it proves that Swift can be used for a lot more than iOS app development.</p><h5>New additions</h5><ul><li>nice code syntax styling</li><li>css minifier</li><li>a <a href="https://github.com/petercammeraat/petercammeraat.net/blob/develop/Sources/MyWebsite/Components/SiteHead.swift">custom head</a>, so it doesn't add all the twitter metadata and fixed some weird stuff with homepage title</li><li>allowed robots to scan and index the site</li><li>added some site verification for Google and Bing Webmaster tools</li><li>updated the readme, so it clear how to run this project localy</li><li>added email address to my <a href="https://petercammeraat.net/public-key/">public key</a> page</li><li>created a next and previous navigator that lives below each article, so you can keep reading...</li></ul><pre><code><span class="splash-keyword">struct</span> Suggested&lt;Site: <span class="splash-type">Website</span>&gt;: <span class="splash-type">Component</span> {
    <span class="splash-keyword">var</span> context: <span class="splash-type">PublishingContext</span>&lt;<span class="splash-type">Site</span>&gt;
    <span class="splash-keyword">var</span> item: <span class="splash-type">Item</span>&lt;<span class="splash-type">Site</span>&gt;
    
    <span class="splash-keyword">var</span> body: <span class="splash-type">Component</span> {
        <span class="splash-keyword">let</span> items = context.<span class="splash-call">allItems</span>(sortedBy: \.<span class="splash-property">date</span>)
        <span class="splash-keyword">let</span> index = items.<span class="splash-call">firstIndex</span>(of: item) ?? <span class="splash-number">0</span>
        <span class="splash-keyword">let</span> last = items.<span class="splash-property">endIndex</span> - <span class="splash-number">1</span>
        
        <span class="splash-keyword">return</span> <span class="splash-type">Navigation</span> {
            <span class="splash-keyword">if</span> index != <span class="splash-number">0</span> {
                <span class="splash-keyword">let</span> previousItem = items[index - <span class="splash-number">1</span>]
                
                <span class="splash-type">Link</span>(url: previousItem.<span class="splash-property">path</span>.<span class="splash-property">absoluteString</span>) {
                    <span class="splash-type">Span</span>(<span class="splash-string">"Previous"</span>)
                    <span class="splash-type">Paragraph</span>(previousItem.<span class="splash-property">title</span>)
                }
                .<span class="splash-call">linkRelationship</span>(.<span class="splash-dotAccess">prev</span>)
            }
            
            <span class="splash-keyword">if</span> index &lt; last {
                <span class="splash-keyword">let</span> nextItem = items[index + <span class="splash-number">1</span>]
                
                <span class="splash-type">Link</span>(url: nextItem.<span class="splash-property">path</span>.<span class="splash-property">absoluteString</span>) {
                    <span class="splash-type">Span</span>(<span class="splash-string">"Next"</span>)
                    <span class="splash-type">Paragraph</span>(nextItem.<span class="splash-property">title</span>)
                }
                .<span class="splash-call">linkRelationship</span>(.<span class="splash-dotAccess">next</span>)
            }
        }
        .<span class="splash-call">class</span>(<span class="splash-string">"suggested"</span>)
    }
}

</code></pre><h5>What is next?</h5><p>I want to revamp the projects page and the style of the project pages. After that I will do some research in making my own static site generator and if there already is a DSL good enough to write web markup languages in Swift.</p><small><small>#100DaysToOffload 4/100</small></small>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2024/making-this-website-in-swift-part-1/</guid><title>Making this website in Swift - part 1</title><description>Making this website in Swift - part 1</description><link>https://petercammeraat.net/journal/2024/making-this-website-in-swift-part-1/</link><pubDate>Mon, 8 Jan 2024 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>Over the weekend, I set myself a big challenge: I wanted to switch my website from using <a href="https://gohugo.io">Hugo</a>, which is a static site generator, to a different one called <a href="https://github.com/johnsundell/publish">Publish</a>. This new one is made in Swift by John Sundell. Since I'm really into Swift this year, I thought it would be cool to use it for my website too. I thought about making a guide to show others how to do it too, but lots of people have already done that. Instead, I'll share links to those guides so you can check them out!</p><h5>How to get started</h5><ul><li><a href="https://www.danijelavrzan.com/posts/2022/06/create-portfolio-website-using-publish/">https://www.danijelavrzan.com/posts/2022/06/create-portfolio-website-using-publish/</a></li><li><a href="https://www.createwithswift.com/static-site-generation-with-swift-using-publish/">https://www.createwithswift.com/static-site-generation-with-swift-using-publish/</a></li><li><a href="https://andyregensky.dev/articles/publish-getting-started/">https://andyregensky.dev/articles/publish-getting-started/</a></li><li><a href="https://stefanblos.com/posts/getting-started-with-publish/">https://stefanblos.com/posts/getting-started-with-publish/</a></li></ul><h5>Creating a custom theme</h5><p>Publish comes with a basic design called Foundation that's great for starting out and trying things. But I have my very own design called Yellow, which I used with Hugo before. To make it work with Publish, I took the style and layout from Yellow and began with the index page. I had another tab open in my web browser showing how the old Hugo version of my site was set up. This way, I could look at the html code and build the new version in Publish by following along.</p><p>The first thing I focused on was creating a list of all the posts for the homepage.</p><p>Hugo:</p><pre><code>&lt;div <span class="splash-keyword">class</span>=<span class="splash-string">"container"</span>&gt;
    &lt;section&gt;
        &lt;h2&gt;<span class="splash-type">Latest</span> entries&lt;/h2&gt;
        &lt;div <span class="splash-keyword">class</span>=<span class="splash-string">"posts"</span>&gt;
            {{ range <span class="splash-property">$pages</span>.<span class="splash-type">Pages</span> }}
            &lt;div <span class="splash-keyword">class</span>=<span class="splash-string">"post"</span>&gt;
                &lt;a href=<span class="splash-string">"{{ .RelPermalink }}"</span>&gt;
                    &lt;div <span class="splash-keyword">class</span>=<span class="splash-string">"post-row"</span>&gt;
                        &lt;time&gt;{{ .<span class="splash-dotAccess">Date</span>.<span class="splash-type">Format</span> <span class="splash-string">"02/01"</span> }}&lt;/time&gt;
                        &lt;h3&gt;{{ .<span class="splash-dotAccess">Title</span> }}&lt;/h3&gt;
                    &lt;/div&gt;
                &lt;/a&gt;
            &lt;/div&gt;
            {{ end }}
        &lt;/div&gt;
    &lt;/section&gt;
&lt;/div&gt;

</code></pre><p>Publish:</p><pre><code><span class="splash-type">SiteContainer</span> {
    <span class="splash-type">SiteSection</span> {
        <span class="splash-type">H2</span>(<span class="splash-string">"Latest entries"</span>)

        <span class="splash-keyword">let</span> allEntries = context.<span class="splash-call">allItems</span>(sortedBy: \.<span class="splash-property">date</span>, order: .<span class="splash-dotAccess">descending</span>)
        <span class="splash-keyword">let</span> lastFiveEntries = <span class="splash-type">Array</span>(allEntries[<span class="splash-number">0</span>...<span class="splash-number">5</span>])
        <span class="splash-type">ItemList</span>(
            items: lastFiveEntries,
            site: context.<span class="splash-property">site</span>,
            sectionID: <span class="splash-type">Site</span>.<span class="splash-type">SectionID</span>.<span class="splash-keyword">init</span>(rawValue: <span class="splash-string">"journal"</span>)!
        )
    }
}
</code></pre><p>Recreating the website wasn't too tough. The <a href="https://github.com/JohnSundell/Publish/blob/master/Sources/Publish/API/Theme%2BFoundation.swift">Foundation theme</a> in Publish is like a helpful starting point. It shows you how things work and makes it easier to create your own unique theme.</p><h5>My struggles so far</h5><p>When I was working on my website, I noticed there aren't many guides or examples for making custom themes with Publish. Right now, if you look on GitHub, there are about <a href="https://github.com/search?q=github.com%2Fjohnsundell%2Fpublish+language%3ASwift+package.swift&type=code">187 repositories</a> that use the Publish package.</p><p>Comparing it to Hugo, Hugo is more developed and adaptable. For instance:</p><ul><li>With Hugo, I could include HTML right in my markdown files, but that's not possible with Publish... which is a bit of a bummer.</li><li>I had to create a plugin myself to generate RSS feeds for each tag, while Hugo already had that feature built-in.</li></ul><h5>Still to tackle</h5><ul><li>Adding Previous and Next buttons at the bottom of each post.</li><li>Adding code highlighting to make it look really sharp.</li><li>Giving the projects page a fresh new design.</li></ul><h5>The cherry on top</h5><p>I made this website open source. This adds to having more examples available. Feel free to look around.</p><p>→ <a href="https://github.com/petercammeraat/petercammeraat.net">https://github.com/petercammeraat/petercammeraat.net</a></p><small><small>#100DaysToOffload 3/100</small></small>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2024/making-quiet-open-source/</guid><title>Making Quiet open source</title><description>Making Quiet open source</description><link>https://petercammeraat.net/journal/2024/making-quiet-open-source/</link><pubDate>Fri, 5 Jan 2024 14:00:00 +0100</pubDate><content:encoded><![CDATA[<p>Update:</p><p>I will <a href="https://petercammeraat.net/journal/2024/no-longer-making-quiet-open-source/">no longer</a> make Quiet open source.</p><p>--</p><p><s>Big news! I am in the process of making Quiet open source. </s></p><p>This involves dividing the project into three distinct parts:</p><ul><li><code>quiet-app</code> will focus on developing and enhancing of the Mac and iOS apps</li><li><code>quiet-localisations</code> will handle the localisation of content into various languages</li><li><code>quiet-rules</code> will manage the control mechanisms for website blocking</li></ul><p>Why the shift? It's all about embracing openness and transparency in how Quiet operates. Opening up the project allows others to contribute, making Quiet even better for all users. You don't have to be a coding expert by fixing bugs, addressing localisation issues, or suggesting new rules are all valuable contributions.</p><p>The aim is to complete the transition to an open-source model by the second quarter of the year. Once this happens, everyone can access, review, and enhance the code. I'm inviting everyone to join this journey toward a more streamlined internet, free from unnecessary distractions.</p><small><small>#100DaysToOffload 2/100</small></small>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2024/plans-for-2024/</guid><title>Plans for 2024</title><description>Plans for 2024</description><link>https://petercammeraat.net/journal/2024/plans-for-2024/</link><pubDate>Mon, 1 Jan 2024 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>Hey there! As we step into 2024, I'm excited to share my plans for diving deeper into Swift development and making some cool stuff open source. I want to make Quiet open source, inviting everyone to join in and make it even better together.</p><p>Will be working on creating several open-source Swift packages. One of these packages will be a static site generator. Imagine a tool that helps make static websites using Swift, it's something I'm eager to build and share with fellow developers.</p><p>But I'm not stopping there. I'm keen on exploring what else we can do with Swift. Here are a few areas I'm excited about:</p><ol><li>Swift for Servers: Swift isn't just for apps; it can also be great for building server systems. I want to help create tools and frameworks that make it easier for developers to use Swift on the server side.</li><li>Swift in Embedded Systems: Think about tiny devices in smart homes or gadgets. Swift could be handy there too. I'm planning to explore how we can use Swift for these embedded systems.</li><li>Swift on Windows: Yep, making Swift work smoothly on Windows is another thing on my radar. Making it more accessible to a wider audience of developers is important to me.</li><li>Swift and Web Assembly: This is about making Swift work well inside web browsers. It's a bit of a challenge, but I'm interested in exploring how Swift can play a role here.</li><li>Swift on Android: We all know Android uses a different language, but what if Swift could work there too? That's something I'm curious about and eager to dive into.</li></ol><p>So, in simple terms, I'm all about making Swift more versatile and widely used by working on these open-source projects. I believe that when people team up and share ideas, we can create some pretty awesome stuff.</p><p>I'll be sharing updates on these projects as they progress. And hey, if you're into Swift or just curious, feel free to join in! Let's make 2024 a year where Swift becomes even more exciting and accessible for everyone.</p><p>As an additional challenge I'm taking on: the <a href="https://100daystooffload.com">100 Days to Offload challenge</a>. In a nutshell, I'll be embarking on a journey to craft 100 blog posts within the span of a year.</p><p>This challenge is a personal commitment to consistent learning, sharing, and contributing to the vibrant community of knowledge-seekers. Over the course of the next 365 days, I'll be penning down thoughts, insights, and discoveries related to Swift, open-source projects, and the ever-evolving landscape of software.</p><small><small>#100DaysToOffload 1/100</small></small>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/ted-talks-of-2023/</guid><title>TED Talks of 2023</title><description>TED Talks of 2023</description><link>https://petercammeraat.net/journal/2023/ted-talks-of-2023/</link><pubDate>Sun, 31 Dec 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>How a habit of self-reflection could help improve your career</h3><blockquote><p>I think my life has been a reasonably unique and unusual one. Now in my early forties, I've had careers as an opera singer, a Catholic priest, a corporate lawyer, and now, a management consultant.</p></blockquote><blockquote><p>Through all of these changes, through all of these careers, one constant has been present: the practice of reflection. Now people may think that reflection is something that happens in a dark, private room by candlelight or flashlight, to purge one's deepest, darkest secrets. But I want to bring this practice out of the dark and into the light. I want to share how this practice can help our everyday lives, and especially our work lives. I want to share how this practice helps to improve performance, to make better decisions, both big and small, and to build better relationships.</p></blockquote><p>→ <a href="https://www.ted.com/talks/paul_catchlove_how_a_habit_of_self_reflection_could_help_improve_your_career">https://www.ted.com/talks/paul<em>catchlove</em>how<em>a</em>habit<em>of</em>self<em>reflection</em>could<em>help</em>improve<em>your</em>career</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/decentralised/</guid><title>Decentralised</title><description>Decentralised</description><link>https://petercammeraat.net/journal/2023/decentralised/</link><pubDate>Wed, 12 Jul 2023 15:00:00 +0200</pubDate><content:encoded><![CDATA[<p>I believe decentralised services are the way forward. Like email and websites our social media services should be decentralised.</p><p>After Elon bought Twitter it has been in a dead spiral down. Third party clients were blocked. Users rate limited. While he claimed <a href="https://twitter.com/elonmusk/status/1585841080431321088?lang=en">the bird was freed</a>, it is more locked down than ever. After the shitshow of Twitter, Reddit decided it was their turn to make a mess. We all know how that turned out, our favourite Reddit clients do not work anymore.</p><p>These companies forget that they exist because people ask questions, follow other people, answer, post funny things etc. on their platforms. Without the platform would be dead and would soon be forgotten, like MySpace, Hyves (small Dutch social media platform), and in a sense Facebook.</p><p>Companies need to make profits for their shareholders, ultimately it is the goal of a company to make value. That is why they often sort to showing ads or worse make profiles of you and sell that to the highest bidder. The whole ad tech industry should be made illegal. The amount of data that is collected about you is shocking (post for another day, there is on in my drafts).</p><p>I am kind of happy that Facebook made <a href="http://threads.net">Threads</a> (the Twitter clone by Instagram). It is build on ActivityPub, the protocol where Mastodon is build on, so in time people on Mastodon could follow Threads accounts and vice versa. Famous people and companies can use that.</p><p>Just an hour ago I read about the fact that the Dutch government has a Mastodon instance: <a href="https://social.overheid.nl/public/local">https://social.overheid.nl/public/local</a> 👀 this makes me very happy.</p><p>I dived some deeper into it and it turns out that more governments and organisations have their own Mastodon server. Think it is an awesome idea. You have instant verification, the person really belongs to the government or organisation.</p><h3>Instances</h3><h5>Governments</h5><ul><li>European Union: <a href="https://social.network.europa.eu/public/local">https://social.network.europa.eu/public/local</a></li><li>Dutch government: <a href="https://social.overheid.nl/public/local">https://social.overheid.nl/public/local</a></li><li>German government: <a href="https://social.bund.de/public/local">https://social.bund.de/public/local</a></li><li>Municipality Amsterdam: <a href="https://social.amsterdam.nl/public/local">https://social.amsterdam.nl/public/local</a></li></ul><h5>News organistions</h5><ul><li>ARD (German): <a href="https://ard.social/public/local">https://ard.social/public/local</a></li><li>Groene Amsterdamer (Dutch): <a href="https://social.groene.nl/public/local">https://social.groene.nl/public/local</a></li></ul><h5>Universities</h5><ul><li>MIT: <a href="https://mastodon.mit.edu/">https://mastodon.mit.edu/</a></li></ul><h5>Other organisations</h5><ul><li>W3C: <a href="https://w3c.social/public/local">https://w3c.social/public/local</a></li><li>Greenpeace Switzerland: <a href="https://mastodon.greenpeace.ch">https://mastodon.greenpeace.ch</a></li></ul><p><em>Please <a href="https://petercammeraat.net/contact/">let me know</a> if you found more. Will update this list.</em></p><h3>Next</h3><p>Microblogging is the first step. There are other services to tackle.</p><p>Other decentralised replacements for big single entities:</p><ul><li>YouTube replacement PeerTube: <a href="https://joinpeertube.org">https://joinpeertube.org</a></li><li>Instagram replacement Pixelfed: <a href="https://pixelfed.org">https://pixelfed.org</a></li><li>Reddit replacement Lemmy: <a href="https://join-lemmy.org">https://join-lemmy.org</a></li></ul>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/my-app-store-screenshots-flow/</guid><title>My App Store Screenshots Flow</title><description>My App Store Screenshots Flow</description><link>https://petercammeraat.net/journal/2023/my-app-store-screenshots-flow/</link><pubDate>Fri, 30 Jun 2023 17:00:00 +0200</pubDate><content:encoded><![CDATA[<p>For Quiet I need to make 975 screenshots for the App Store. It is way way too much to do that by hand. And waaaay to much work to put it in a nice frame with a label.</p><h5>Quick math</h5><ul><li>2 iPad models _*_ 4 screenshots = 8</li><li>3 iPhone models _*_ 4 screenshots = 12</li><li>1 Mac model _*_ 5 screenshots = 5</li><li>25 screenshots per language <strong>_ 39 languages = </strong>975**</li></ul><h3>1. Write UI Tests and make screenshots</h3><p>Start with a function which makes the screenshots.</p><pre><code><span class="splash-keyword">func</span> takeScreenshot(name: <span class="splash-type">String</span>) {
    <span class="splash-keyword">let</span> fullScreenshot = <span class="splash-type">XCUIScreen</span>.<span class="splash-property">main</span>.<span class="splash-call">screenshot</span>()
    <span class="splash-keyword">let</span> type = <span class="splash-string">"public.png"</span>
    <span class="splash-keyword">let</span> payload = fullScreenshot.<span class="splash-property">pngRepresentation</span>
    <span class="splash-keyword">let</span> name = <span class="splash-string">"</span>\(<span class="splash-type">UIDevice</span>.<span class="splash-property">current</span>.<span class="splash-property">name</span>)<span class="splash-string">-</span>\(name)<span class="splash-string">.png"</span>
    <span class="splash-keyword">let</span> screenshot = <span class="splash-type">XCTAttachment</span>(
    	uniformTypeIdentifier: type, 
    	name: name, 
    	payload: payload, 
    	userInfo: <span class="splash-keyword">nil</span>
    )
    screenshot.<span class="splash-property">lifetime</span> = .<span class="splash-dotAccess">keepAlways</span>
    <span class="splash-call">add</span>(screenshot)
}

</code></pre><p>In this example I only switch tabs and only show the iPhone part. Part for iPad is similar.</p><pre><code><span class="splash-comment">// Device is an iPhone</span>
<span class="splash-keyword">if</span> <span class="splash-type">UIDevice</span>.<span class="splash-property">current</span>.<span class="splash-property">userInterfaceIdiom</span> == .<span class="splash-dotAccess">phone</span> {
	<span class="splash-keyword">let</span> app = <span class="splash-type">XCUIApplication</span>()
	app.<span class="splash-property">launchArguments</span> = [<span class="splash-string">"enable-screenshot-data"</span>]
	app.<span class="splash-call">launch</span>()

	<span class="splash-keyword">let</span> tabBar = app.<span class="splash-property">tabBars</span>.<span class="splash-call">element</span>(boundBy: <span class="splash-number">0</span>)

	<span class="splash-comment">// First view</span>
	<span class="splash-call">takeScreenshot</span>(name: <span class="splash-string">"0"</span>)
	<span class="splash-call">sleep</span>(<span class="splash-number">2</span>)

	<span class="splash-comment">// Tap on tabbar to go to second view</span>
	tabBar.<span class="splash-property">buttons</span>.<span class="splash-call">element</span>(boundBy: <span class="splash-number">1</span>).<span class="splash-call">tap</span>()
	<span class="splash-call">sleep</span>(<span class="splash-number">2</span>)
	<span class="splash-call">takeScreenshot</span>(name: <span class="splash-string">"1"</span>)
	<span class="splash-call">sleep</span>(<span class="splash-number">2</span>)

	<span class="splash-comment">// Tap on tabbar to go to third view</span>
	tabBar.<span class="splash-property">buttons</span>.<span class="splash-call">element</span>(boundBy: <span class="splash-number">2</span>).<span class="splash-call">tap</span>()
	<span class="splash-call">sleep</span>(<span class="splash-number">2</span>)
	<span class="splash-call">takeScreenshot</span>(name: <span class="splash-string">"2"</span>)
	<span class="splash-call">sleep</span>(<span class="splash-number">2</span>)

	<span class="splash-comment">// Tap on tabbar to go to fourth view</span>
	tabBar.<span class="splash-property">buttons</span>.<span class="splash-call">element</span>(boundBy: <span class="splash-number">3</span>).<span class="splash-call">tap</span>()
	<span class="splash-call">sleep</span>(<span class="splash-number">2</span>)
	<span class="splash-call">takeScreenshot</span>(name: <span class="splash-string">"3"</span>)
	<span class="splash-call">sleep</span>(<span class="splash-number">2</span>)
}

</code></pre><p>With Xcode's record test functionality it is easy to navigate through an app and learn how to write UITests.</p><h3>2. Run UITest automated</h3><p>With a <a href="https://blog.winsmith.de/english/ios/2020/04/14/xcuitest-screenshots.html">bit of help from the internet</a> I tweaked a shell script that runs the UITest created above on all devices and languages specified.</p><pre><code>#!/bin/bash

# <span class="splash-type">The Xcode</span> project to create screenshots <span class="splash-keyword">for</span>
projectName=<span class="splash-string">"/path/to/project/AppName/AppName.xcodeproj"</span>

# <span class="splash-type">The</span> scheme to run tests <span class="splash-keyword">for</span>
schemeName=<span class="splash-string">"AppNameUITests"</span>

# <span class="splash-type">Temporary Data Folder</span>
tempFolder=<span class="splash-string">"/tmp/AppNameData"</span>

# <span class="splash-type">Save</span> <span class="splash-keyword">final</span> screenshots into this folder (it will be created)
targetFolder=<span class="splash-string">"/path/to/project/AppName/fastlane/screenshots/ios"</span>

# <span class="splash-type">All</span> the simulators we want to screenshot
simulators=(
    <span class="splash-string">"iPhone 11 Pro Max"
    "iPhone 14 Pro Max"
    "iPhone 8 Plus"
    "iPad Pro (12.9-inch) (6th generation)"
    "iPad Pro (12.9-inch) (2nd generation)"</span>
)

# <span class="splash-type">All</span> the languages we want to screenshot (<span class="splash-type">ISO</span> <span class="splash-number">3166</span>-<span class="splash-number">1</span> codes)
languages=(
    <span class="splash-string">"ar-SA"
    "de-DE"
    "en-GB"
    "es-ES"
    "es-MX"
    "fr-CA"
    "fr-FR"
    "he"
    "ja"
    "ko"
    "nl-NL"
    "pt-BR"
    "pt-PT"
    "zh-Hans"
    "zh-Hant"</span>
)

<span class="splash-keyword">for</span> simulator <span class="splash-keyword">in</span> <span class="splash-string">"${simulators[@]}"</span>
<span class="splash-keyword">do</span>
    # <span class="splash-type">Boot</span> simulator
    echo <span class="splash-string">"$simulator booting"</span>
    xcrun simctl boot <span class="splash-string">"$simulator"</span>

    # <span class="splash-type">Get UUID</span> of simulator
    deviceUUID=$(xcrun simctl list devices | grep <span class="splash-string">"(Booted)"</span> | grep -<span class="splash-type">E</span> -o -i <span class="splash-string">"([0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12})"</span>)
    echo <span class="splash-string">"uuid: $deviceUUID"</span>

    # <span class="splash-type">Override</span> statusbar
    echo <span class="splash-string">"Override statusbar"</span>
    xcrun simctl status_bar <span class="splash-property">$deviceUUID</span> <span class="splash-keyword">override</span> --time <span class="splash-string">"2007-01-09T09:41:00+01:00"</span> --dataNetwork wifi --wifiMode active --wifiBars <span class="splash-number">3</span> --cellularMode active --cellularBars <span class="splash-number">4</span> --batteryState charged --batteryLevel <span class="splash-number">100</span> &amp;&gt; /dev/null

    <span class="splash-keyword">for</span> language <span class="splash-keyword">in</span> <span class="splash-string">"${languages[@]}"</span>
    <span class="splash-keyword">do</span>
        rm -rf <span class="splash-property">$tempFolder</span>/<span class="splash-type">Logs</span>/<span class="splash-type">Test</span>
        echo <span class="splash-string">"Building and Running for $simulator in $language"</span>
        xcodebuild -testLanguage <span class="splash-property">$language</span> -scheme <span class="splash-property">$schemeName</span> -project <span class="splash-property">$projectName</span> -derivedDataPath <span class="splash-property">$tempFolder</span> -destination <span class="splash-string">"platform=iOS Simulator,name=$simulator"</span> build test
        echo <span class="splash-string">"Collecting Results..."</span>
        mkdir -p <span class="splash-string">"$targetFolder/$language"</span>
        find <span class="splash-property">$tempFolder</span>/<span class="splash-type">Logs</span>/<span class="splash-type">Test</span> -maxdepth <span class="splash-number">1</span> -type d -exec xcparse <span class="splash-call">screenshots</span> {} <span class="splash-string">"$targetFolder/$language"</span> \;
    done

    xcrun simctl shutdown <span class="splash-property">$deviceUUID</span>
    echo <span class="splash-string">"$simulator shutdown"</span>
done

</code></pre><p>Note: you need <a href="https://github.com/ChargePoint/xcparse">xcparce</a> and Xcode command line tools installed for this script.</p><h3>3. Remove UUID's from screenshot file names</h3><p>I reused an AppleScript that I was using for another automated flows.</p><pre><code>on <span class="splash-call">run</span> {input, parameters}
	<span class="splash-keyword">repeat</span> with myFile <span class="splash-keyword">in</span> input
		tell application <span class="splash-string">"System Events"</span>
			<span class="splash-keyword">set</span> myName to the characters <span class="splash-number">1</span> thru ((offset of <span class="splash-string">".png"</span> <span class="splash-keyword">in</span> (name of myFile <span class="splash-keyword">as</span> text)) - <span class="splash-number">1</span>) of (name of myFile <span class="splash-keyword">as</span> text)
			tell application <span class="splash-string">"Finder"</span>
				<span class="splash-keyword">set</span> myExtention to name <span class="splash-keyword">extension</span> of (myFile <span class="splash-keyword">as</span> alias)
				<span class="splash-keyword">set</span> myNewName to characters <span class="splash-number">1</span> thru (((length of myName) - <span class="splash-number">37</span>) <span class="splash-keyword">as</span> number) of (myName <span class="splash-keyword">as</span> text)
				<span class="splash-keyword">set</span> name of file (myFile <span class="splash-keyword">as</span> text) to (myNewName &amp; <span class="splash-string">"."</span> &amp; myExtention <span class="splash-keyword">as</span> text)
			end tell
		end tell
	end <span class="splash-keyword">repeat</span>
end run
</code></pre><p>Now we have a nice file name that we can use in the next step.</p><h3>4. Framing</h3><p><a href="https://github.com/Patrick-Kladek/ScreenshotFramer">ScreenshotFramer</a> an app made by the people of MindNode.</p><p>I has a nice UI for you (or designer) can make a nice framing of the screenshot. You can add text (localised), background colours, and other images.</p><img src="../../../assets/images/journal/my-app-store-screenshot-flow/screenshot-framer.png "ScreenshotFramer UI"" alt="ScreenshotFramer UI"/><p>To create framed screenshot for all devices simply type this command in the Terminal.</p><pre><code><span class="splash-type">Screenshot</span>-<span class="splash-type">Framer</span>-<span class="splash-type">CLI</span> -project .
</code></pre><h3>5. Sending it to App Store Connect</h3><p>Currently I use <a href="https://docs.fastlane.tools/actions/deliver/">fastlane deliver</a> to send the framed screenshots to App Store Connect. Their website has the best documentation on how to set it up. I am however writing a Xcode Project Plugin with the App Store Connect API to send screenshots and metadata to App Store Connect. With all the exciting Vision Pro stuff and experimenting that plugin is on hold for now, but will continue when the dust has settled down a bit.</p><h3>After thoughts</h3><p>I did it a few times by hand, I took me a whole day and some RSI issues 😝</p><p>Now the wole process takes 30 minutes... (on a M1 Mac Mini)</p><ul><li>20 minutes taking screenshots</li><li>6 minutes framing</li><li>4 minutes uploading</li></ul><p>Run this flow every time I release a new version of Quiet, so it always has up to date screenshots.</p><p>Initial setup took me approximately half a day.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/update-on-privacy-in-apple-s-ecosystem/</guid><title>Update on privacy in Apple's ecosystem</title><description>Update on privacy in Apple's ecosystem</description><link>https://petercammeraat.net/journal/2023/update-on-privacy-in-apple-s-ecosystem/</link><pubDate>Thu, 8 Jun 2023 05:00:00 +0200</pubDate><content:encoded><![CDATA[<p>Every year I watch the WWDC sessions that have to do with privacy. I find them very interesting. So this year for the first time I will try to write a summary about it. Saved you watching 4 WWDC sessions with a total time of 1 hour and 15 minutes.</p><h2>The 4 privacy pillars</h2><h5>1. Data minimisation</h5><p>Limit the utilisation of data to the necessary information for constructing a feature. This principle should be followed across the entire architecture of your application, including the extent of data accessed for features, data exchanged with application servers, and data that could potentially be shared with external entities.</p><h5>2. On-device processing</h5><p>Leverage the capabilities of the device to locally process data and prevent any need for sharing it with external servers.</p><h5>3. Transparency and control</h5><p>Transparency and control involve ensuring that individuals comprehend the details of data access and processing, including the what, why, when, and where aspects, while providing them with sufficient controls beforehand. Additionally, it involves empowering them to modify their preferences at a later stage.</p><h5>4. Security protections</h5><p>Implement powerful technical measures to uphold the remaining principles, including the implementation of end-to-end encryption.</p><h2>What is new this year?</h2><h3>Photo picker</h3><p>Introducing improvements to the Photos picker, designed to provide easy access to photos. This empowers users to make specific decisions about the data they share with your app. With the Photos picker, users can selectively share chosen photos or videos without granting access to their entire library. It seamlessly integrates into your app and ensures user control over their photos. Customisation options allow you to tailor the picker's appearance, while its efficiency eliminates the need for complex permission requests or designing a photo-picking flow. Consider adopting the picker to access photos individually, avoiding the need for full access.</p><h3>Screen Capture picker</h3><p>Introducing a new API, <a href="https://developer.apple.com/documentation/screencapturekit">ScreenCaptureKit</a>, for macOS that enhances screen sharing by enabling selective sharing of windows or screens required by your app. With the SCContentSharingPicker API in macOS Sonoma, users can choose specific screen content to share, avoiding the need to grant full screen recording permission to conferencing apps. The selected content is shared immediately upon selection, ensuring a better experience. Your app can record the chosen content throughout the screen capture session without requiring separate permission or building a custom content picker. macOS Sonoma includes a screen sharing menu bar item to remind users that the screen is being recorded, providing a preview and options to add, remove, or end the capture session. Customisation options are available to tailor the picker to your app's requirements, such as selection modes or preferred applications.</p><h3>Calendar</h3><p>Calendar integration in your app now offers a seamless experience, particularly for apps focused on creating new events. Apple has introduced two important changes to Calendar access:</p><ol><li>EventKitUI: If your app only creates new events, EventKitUI allows you to render view controllers outside your app without explicit permission, maintaining the same functionality.</li><li>Add-only permission: For apps with custom event creation UI, a new add-only calendar permission is available. It enables adding events without accessing other calendar events, seamlessly integrating your app's events into the user's schedule.</li></ol><p>When full Calendar access is required later, you can request an upgrade with user consent. Ensure clear explanations and appropriate timing to avoid rejections that impact the user experience.</p><p>Remember, providing a meaningful purpose string and aligning the request with user intent are essential for users to understand the necessity of access. Previous Calendar access defaults to write-only permission upon upgrading to iOS 17 or macOS Sonoma. If your app is linked against an older version of EventKit and requests Calendar access, the system prompts for write-only access. In such cases, attempting to fetch Calendar events triggers an automatic prompt for an upgrade to full access.</p><h3>Oblivious HTTP API</h3><p>The Oblivious HTTP API, a powerful tool for safeguarding user privacy. This API helps conceal client IP addresses from your servers and shields potentially sensitive app usage patterns from network operators.</p><p>The knowledge of when and which apps individuals use can reveal profound insights into their lives. Network operators, with their ability to observe server connections, can gain access to personal app usage and behavioural patterns. This can be particularly concerning for apps like dating or health-related applications.</p><p>IP addresses, while necessary for internet communication, can be exploited to determine someone's location or identity. Exposure to IP addresses can pose challenges when implementing anonymous features like client analytics.</p><p>To address these concerns, Apple platforms now support Oblivious HTTP (OHTTP). OHTTP is a lightweight, standardised internet protocol that proxies encrypted messages at the application layer, facilitating fast transactional server interactions. With OHTTP, network operators can only observe a connection to the relay provider rather than your application server.</p><p>The central element of this architecture is the relay, which possesses the client's IP address and the destination server name but remains unaware of the encrypted content. The relay always sees connections to your application server, but the only significant information it gains is the client IP. The relay establishes the final connection to your application server.</p><p>By utilising a third-party-operated relay, no single entity retains complete visibility over the source IP, destination IP, and content. This enables the addition of technical guarantees for features where user identification or tracking is undesired, such as anonymous analytics.</p><p>Embracing OHTTP empowers you to create robust internet privacy protections that significantly impact users. Services like iCloud Private Relay already leverage OHTTP for its exceptional performance and strong privacy safeguards, such as protecting all DNS queries.</p><p>With OHTTP support, you have the opportunity to enhance privacy measures and provide a meaningful impact on user privacy.</p><h3>Sensitive Content Analyse framework</h3><p>Introducing Communication Safety and the Sensitive Content Analysis framework, powerful tools for child protection in your app.</p><p>Communication Safety keeps children safe by warning and providing resources for nudity-related photo sharing. It goes beyond Messages, covering AirDrop, FaceTime, contact posters, and the Photos picker.</p><p>Sensitive Content Warning makes these features available to all. The new Sensitive Content Analysis framework enables on-device content detection with system-provided ML models. No external server sharing is required, and integration is straightforward with minimal code.</p><p>To start, create an instance of SCSensitivityAnalyzer. Check the <code>analysisPolicy</code> attribute for intervention instructions. Use <code>analyzeImage</code> for photos or <code>videoAnalysis</code> for videos, tracking progress with the handler. Retrieve results using <code>hasSensitiveContent</code>. If <code>isSensitive</code> is true, the content likely contains nudity. Provide your own intervention, like blurring, with an option to view it.</p><h3>Privacy manifests</h3><p>As an app developer, you are responsible for all code in your apps, including data collection and tracking practices. Third-party SDKs play a significant role in your app's privacy, but getting the necessary information from them can be challenging.</p><p>Privacy manifests are here to help. Third-party SDK developers can include a privacy manifest, created as a "PrivacyInfo.xcprivacy" property list file in Xcode. This manifest declares the types of data collected, their usage, whether they are linked to users, and if they involve tracking as defined by the App Tracking Transparency policy.</p><p>To ensure accuracy, review the privacy manifest and make sure it aligns with your understanding of the SDK's functionality. The definitions in the manifest match those of the Nutrition Label, so refer to Apple's developer <a href="https://developer.apple.com/documentation/bundleresources/describing_data_use_in_privacy_manifests/">documentation</a> for details.</p><p>With Xcode 15, you can generate a privacy report for your app that summarises the data uses declared in all privacy manifests. This report, presented as a PDF, follows the format of Privacy Nutrition Labels, making it easier for you to describe your app's privacy practices in App Store Connect.</p><p>Privacy manifests also assist in managing tracking domains, helping you understand and control network connections from your app. By declaring tracking domains in the manifest, iOS 17 automatically blocks connections to those domains when tracking permission is not granted.</p><p>During testing, the Points of Interest instrument in Xcode 15 highlights connections to domains that may engage in cross-app and cross-website tracking. You can assess if a domain qualifies as a tracking domain under App Tracking Transparency and declare it in the privacy manifest accordingly.</p><p>Remember, tracking is allowed with user permission, but fingerprinting is never allowed. To support beneficial use cases without enabling fingerprinting, Apple introduces Required reason APIs. These APIs come with approved reasons for access, and you must declare their usage in privacy manifests.</p><p>Privacy manifests provide a comprehensive view of your app's privacy story, and they are particularly crucial for privacy-impacting SDKs. Apps containing such SDKs must include a copy of the SDK with a privacy manifest, and SDK signatures are recommended for all third-party SDKs.</p><p>Starting in Fall 2023, App Store checks will require privacy-impacting SDKs to have a signature and privacy manifest. Apps accessing Required Reason APIs without declaring approved reasons will also receive informational emails. These requirements will become part of App Review in Spring 2024.</p><p>As an app developer, ask for privacy manifests from third-party SDK developers and refer to the Xcode privacy report when submitting your app. SDK developers should adopt signatures and manifests, while all developers must document and declare tracking domains and Required Reason API usage in their privacy manifests.</p><p>With privacy manifests, providing accurate and transparent privacy information to your users is easier than ever.</p><p>Apple will publish additional information later this year, including:</p><ul><li>A list of privacy-impacting SDKs (third-party SDKs that have particularly high impact on user privacy)</li><li>A list of “required reason” APIs for which an allowed reason must be declared</li><li>A developer feedback form to suggest new reasons for calling covered APIs</li><li>Additional documentation on the benefits of and details about signatures, privacy manifests, and when they will be required</li></ul><h3>Dependency signature verification</h3><p>Using third-party SDKs can simplify app development and offer additional functionality, but it also comes with risks. Supply chain security is crucial for mitigating these risks and protecting users. Developers must be cautious when choosing dependencies and ensure they don't inadvertently use a compromised version. This responsibility extends to SDK authors who include other SDKs in their development process. Manual mitigation of these risks can be burdensome and complex.</p><p>To address this, Xcode introduces a new feature called dependency signature verification, which automates and simplifies the process. Digital signatures play a vital role in safeguarding developers and reducing the burden associated with supply chain security. Apple's code signing technology is used to cryptographically link the compiled binary and associated metadata, such as the Info.plist or privacy manifest, with the developer's identity.</p><p>The code signing process involves generating a Code Directory hash for the binary, which is then signed using the developer's certificate. This certificate consists of a private key for code signing and a public key distributed as part of the signature. The signature verifies the identity of the developer and can be used to detect tampering. For XCFramework dependencies, the code signature resides within the _CodeSignature directory, ensuring the integrity of all files within the framework.</p><p>Xcode 15 introduces a "Signature" view in the Inspector, which displays the signature status for included XCFramework. It provides information about the author's identity, indicating whether the XCFramework is signed by an Apple Developer Program identity, a self-signed certificate, or remains unsigned. Xcode records the identity during the initial use of an XCFramework and verifies its consistency in subsequent builds. Different levels of features are offered based on the trust in the identity used.</p><p>Xcode automatically validates the XCFramework author's signing certificate and alerts developers if the signature is invalid, the identity has changed, or the certificate has expired or been revoked. For self-signed certificates, developers need to verify the fingerprint or contact the XCFramework author. Xcode ensures the integrity of the supply chain by notifying developers and offering to remove compromised XCFrameworks.</p><p>For SDK authors, it is essential to cryptographically sign SDKs using Apple Developer Program certificates to establish trust with clients. The certificates verify the author's identity and guarantee the integrity of the code. Apple handles certificate validation automatically, enhancing trust and security. SDK authors who are not Apple Developer Program members can use self-signed certificates but must share the certificate fingerprint for verification.</p><p>By utilising Xcode's signature verification feature, SDK authors can improve the security and authenticity of their SDKs, boosting client confidence in the supply chain. App developers should encourage SDK authors to sign their SDKs, while also leveraging Xcode 15's automated integrity and security checks for included dependencies. Responsible app development involves prioritising the verification of SDK signatures to protect users' security and privacy.</p><h2>What is updated this year?</h2><h3>Apps data on macOS</h3><p>Introducing enhanced privacy protections for macOS, designed to safeguard your app's data from other apps on the same device.</p><p>In macOS Sonoma, system-managed permissions control access to locations like the Desktop, Documents, and Downloads folders. This empowers users to manage when apps can access their private data, such as project presentations or budget spreadsheets.</p><p>For apps that store private data in different locations, like messaging apps or notes apps, macOS Sonoma provides additional control. Users must grant permission before an app can access data in another app's data container from a different developer.</p><p>To ensure your app benefits from these protections: 1. If your app stores data outside system-managed locations, adopt App Sandbox to extend the new protection to your users' data. Existing App Sandbox apps receive this protection automatically. 2. If your app needs to access data from other apps, macOS Sonoma will prompt for permission when accessing files in another app's data container. Ensure your app's access is expected, and provide a clear purpose string to explain the need for access.</p><p>To request explicit permission for file access from other apps:</p><ul><li>Use NSOpenPanel for seamless access to individual files and folders outside your app's process.</li><li>Backup utilities or disk-management tools with Full Disk Access do not require an additional prompt.</li><li>Apps signed with your Team ID can access data in your other apps' containers without a prompt.</li><li>For a more restrictive policy, specify an NSDataAccessSecurityPolicy in your app's Info.plist to allow specific processes access to your app's data.</li></ul><h3>Advanced Data Protection</h3><p>With Advanced Data Protection, you have the opportunity to enhance data protection for your users.</p><p>Introduced in 2022, Advanced Data Protection enables end-to-end encryption for the majority of data stored in iCloud, offering heightened privacy. By utilising CloudKit, you can automatically apply end-to-end encryption to data stored by your app when users enable Advanced Data Protection.</p><p>No changes are required on your end to handle encryption keys, operations, or recovery flows. To extend the privacy benefits to your users, follow these simple steps:</p><ol><li>Ensure all fields in your CloudKit schema use encrypted data types. This includes CKAsset fields, and there are encrypted variants available for most data types (e.g., EncryptedString).</li></ol><ol start="2"><li>Utilise the encryptedValues API to retrieve or store data in your CloudKit records. This API abstracts all encryption and decryption operations for your convenience.</li></ol><p>By following these steps, your app's data will benefit from the robust security and privacy protections offered by Advanced Data Protection when users enable this feature.</p><h3>Safari</h3><p>Safari's Private Browsing mode now includes enhanced protections against fingerprinting and tracking.</p><p>Designed with privacy as a priority, Safari's Private Browsing mode ensures that your browsing history, search history, and AutoFill information are not remembered when you close a tab.</p><p>In Safari 17, Private Browsing mode introduces advanced tracking and fingerprinting protection with two key features.</p><p>First, Safari blocks the loading of known tracking and fingerprinting resources. If you are a website developer, it is important to test your website's functionality in Private Browsing mode, specifically focusing on login flows, cross-site navigation, and the use of browser APIs related to screen, audio, and graphics. You can reload your website without the advanced protections to check if any changes in behavior are a result of these new safeguards.</p><p>To test without the protections, you can right-click on the reload button on macOS, use the page settings button on iOS, or test in Safari's normal browsing mode. You can also open the Web Inspector to review any output in the JavaScript console. Messages beginning with "Blocked connection to known tracker" indicate network requests that were blocked due to contacting known trackers.</p><p>The second protection in Private Browsing mode is the removal of tracking parameters during browser navigation and when copying a link. When Safari detects a tracking parameter, it removes the identifying components from the URL while keeping non-identifiable parts intact. This gives users more control over their tracking preferences.</p><p>It's important to note that ad attribution can still be achieved without identifying individuals across websites. Private Click Measurement, for instance, offers a privacy-preserving alternative for advertising attribution. This feature is now available in Private Browsing mode for direct-response advertising, ensuring that no data is written to disk and attribution is limited to a single browsing context within a single tab. This aligns with Safari's strict model of ephemeral browsing and tab separation in Private Browsing.</p><p>These new fingerprinting and tracking protections in Safari's Private Browsing mode further reinforce Safari's commitment to user privacy and provide a more secure browsing experience.</p><h2>My thoughts</h2><p>I am happy that Apple keeps improving. The Privacy Manifests requirement for SDK's is a good step forward. Often it feels like they are sucking way to much data, without a lot of control for the developer. Or developers do not know at all because it sometimes is a black box. Good step!</p><p>Also love the fact that apps can make use of the Advanced Data Protection. Gives me piece of mind in the next project where I am going to use CloudKit.</p><p>The Oblivious HTTP API sounds very interesting and cannot wait to play with it.</p><h4>Sources</h4><ul><li><a href="https://developer.apple.com/videos/play/wwdc2023/10053/">What's new in privacy</a></li><li><a href="https://developer.apple.com/videos/play/wwdc2023/10060/">Get started with privacy manifests</a></li><li><a href="https://developer.apple.com/videos/play/wwdc2023/10061">Verify app dependencies with digital signatures</a></li><li><a href="https://developer.apple.com/videos/play/wwdc2023/10002">Ready, set, relay: Protect app traffic with network relays</a></li><li><a href="https://developer.apple.com/news/?id=av1nevon">What’s new in privacy on the App Store</a></li></ul>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/i-am-happy-with-tipkit/</guid><title>I am happy with TipKit</title><description>I am happy with TipKit</description><link>https://petercammeraat.net/journal/2023/i-am-happy-with-tipkit/</link><pubDate>Wed, 7 Jun 2023 04:00:00 +0200</pubDate><content:encoded><![CDATA[<p>Over the years I became more convinced that onboarding flows were users are educated are not working. It is much better to educate people in context and when needed.</p><p>This is where TipKit comes in.</p><p>You can create Tips. Decide where to display them. Make rules when they need to be displayed. When an user already used a functionality TipKit does not show the Tip linked to that functionality. Also synced across devices with iCloud.</p><p>Nice <a href="https://developer.apple.com/videos/play/wwdc2023/10229/">WWDC session</a> to watch.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/on-device-machine-learning/</guid><title>On Device Machine Learning</title><description>On Device Machine Learning</description><link>https://petercammeraat.net/journal/2023/on-device-machine-learning/</link><pubDate>Tue, 6 Jun 2023 19:00:00 +0200</pubDate><content:encoded><![CDATA[<p>I loved how during the WWDC Keynote and The State of Union not once the term AI was used. AI is an hype word and could mean a lot of things. Love how Apple keeps saying "On Device Machine Learning". It is important because a lot of other tech companies send your data to a server somewhere and do machine learning on server. It is impressive that Apple keeps doing it on device and that often it is invisible to the user.</p><p>Have an idea for an app that is going to use on device machine learning to give better recommendations to users. Cannot wait to dive deep into it.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/why-not-flutter/</guid><title>Why not Flutter?</title><description>Why not Flutter?</description><link>https://petercammeraat.net/journal/2023/why-not-flutter/</link><pubDate>Sat, 20 May 2023 05:00:00 +0200</pubDate><content:encoded><![CDATA[<h5>Slow in adopting new functionalities and technologies</h5><p>When a new version of Android or iOS is released, it introduces changes that take time for Google to incorporate into Flutter. While they may be relatively prompt for most updates, the dark mode for iOS devices remained incomplete by the end of 2021, despite being more than two years since the introduction of dark mode in iOS 13.</p><h5>Overhead</h5><p>One of the drawbacks of using Flutter is that it requires delivering its own engine with every app, which can contribute to increased size, memory usage, and startup overhead.</p><h5>Dart</h5><p>When comparing Dart to languages like Kotlin or Swift, developers may consider Dart to be relatively simpler or less mature. In comparison, Kotlin and Swift offer more advanced features, a larger community, and a more extensive ecosystem. For me as a developer using Swift it feels as taking 10 steps back.</p><h5>Google</h5><p>Flutter and Dart are products from Google. There is an high change they end up being killed. Google has a long history of killing products. You can build on that. See <a href="https://killedbygoogle.com">https://killedbygoogle.com</a></p><h5>Smaller Community and Ecosystem</h5><p>Compared to native development platforms, Flutter has a relatively smaller community and ecosystem. This means that finding solutions to specific problems or accessing comprehensive documentation and libraries may require more effort.</p><h5>Limited UI Customisation</h5><p>Flutter provides a wide range of pre-built widgets for UI development. However, if you have specific design requirements or intricate UI components, customising and fine-tuning them in Flutter may be more time-consuming and challenging compared to native development.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/personal-voice/</guid><title>Personal Voice</title><description>Apple introduces Personal Voice</description><link>https://petercammeraat.net/journal/2023/personal-voice/</link><pubDate>Wed, 17 May 2023 05:00:00 +0200</pubDate><content:encoded><![CDATA[<blockquote><p>Users can create a Personal Voice by reading along with a randomized set of text prompts to record 15 minutes of audio on iPhone or iPad. This speech accessibility feature uses on-device machine learning to keep users’ information private and secure, and integrates seamlessly with Live Speech so users can speak with their Personal Voice when connecting with loved ones.</p></blockquote><p>→ <a href="https://www.apple.com/newsroom/2023/05/apple-previews-live-speech-personal-voice-and-more-new-accessibility-features/">https://www.apple.com/newsroom/2023/05/apple-previews-live-speech-personal-voice-and-more-new-accessibility-features/</a></p><p>On device machine learning for an feature that will be used by people for who it really matters.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/apple-brings-final-cut-pro-and-logic-pro-to-ipad/</guid><title>Apple brings Final Cut Pro and Logic Pro to iPad</title><description>Apple brings Final Cut Pro and Logic Pro to iPad</description><link>https://petercammeraat.net/journal/2023/apple-brings-final-cut-pro-and-logic-pro-to-ipad/</link><pubDate>Wed, 10 May 2023 05:00:00 +0200</pubDate><content:encoded><![CDATA[<blockquote><p>Apple today unveiled Final Cut Pro and Logic Pro for iPad. Video and music creators can now unleash their creativity in new ways that are only possible on iPad. Final Cut Pro and Logic Pro for iPad bring all-new touch interfaces that allow users to enhance their workflows with the immediacy and intuitiveness of Multi-Touch. Final Cut Pro for iPad introduces a powerful set of tools for video creators to record, edit, finish, and share, all from one portable device. Logic Pro for iPad puts the power of professional music creation in the hands of the creator — no matter where they are — with a complete collection of sophisticated tools for songwriting, beat making, recording, editing, and mixing.</p></blockquote><p>→ <a href="https://www.apple.com/newsroom/2023/05/apple-brings-final-cut-pro-and-logic-pro-to-ipad/">https://www.apple.com/newsroom/2023/05/apple-brings-final-cut-pro-and-logic-pro-to-ipad/</a></p><p>This is amazing and a good showcase of what our iOS devices are capable of. This generates lots of ideas what is possible on device.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/have-an-iphone-again/</guid><title>Have an iPhone again</title><description>Have an iPhone again</description><link>https://petercammeraat.net/journal/2023/have-an-iphone-again/</link><pubDate>Tue, 2 May 2023 05:00:00 +0200</pubDate><content:encoded><![CDATA[<p><a href="https://petercammeraat.net/journal/2021/i-do-not-have-a-smartphone/">Almost 2 years ago</a> I stopped using my iPhone and Apple Watch.</p><p>In recent weeks I bought an iPhone because I missed the camera and the Photo app too much. I am very happy to have them back in my life. Tried all kinds of substitute but they are simply not available or good enough.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/do-not-run-servers/</guid><title>Do not Run Servers</title><description>Do not Run Servers</description><link>https://petercammeraat.net/journal/2023/do-not-run-servers/</link><pubDate>Sat, 29 Apr 2023 05:00:00 +0200</pubDate><content:encoded><![CDATA[<p>I listen for a few years now to the podcast Under the Radar. It is about developing apps as an indie developer. Highly recommended to add to your podcast app if you have any interest in developing apps.</p><p>This episode is named "Don’t Run Servers". It is about thinking outside the box and not default to use a server for some functionality. Often it is not needed at all.</p><p>→ <a href="https://overcast.fm/+FgnYbdx_Y">https://overcast.fm/+FgnYbdx_Y</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/quiet-4-1/</guid><title>Quiet 4.1</title><description>Quiet 4.1</description><link>https://petercammeraat.net/journal/2023/quiet-4-1/</link><pubDate>Wed, 26 Apr 2023 05:00:00 +0200</pubDate><content:encoded><![CDATA[<p><strong>What is new in Quiet 4.1?</strong></p><ul><li>lists are now alphabetically ordered</li><li>added information about rules</li><li>added clear instructions when status is on disabled</li><li>updated localisations</li><li>added support for new languages</li><li>added Share with Friend card in Settings</li><li>cleaned up some logic</li><li>fixed some bugs</li></ul><p><a href="https://apps.apple.com/app/apple-store/id1441525727?pt=119418684&ct=Quiet4dot1BlogPost&mt=8">Download Quiet 4.1</a></p><p>I am still working on adding the ability to block apps on iOS with Screen Time. Run in some obstacles that need to be dealt with first.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/moving-away-from-building-prettified-json-viewers/</guid><title>Moving away from building Prettified JSON Viewers</title><description>Moving away from building Prettified JSON Viewers</description><link>https://petercammeraat.net/journal/2023/moving-away-from-building-prettified-json-viewers/</link><pubDate>Wed, 19 Apr 2023 05:00:00 +0200</pubDate><content:encoded><![CDATA[<p>At my jobby job the status quo is that we build apps like this:</p><img src="../../../assets/images/journal/moving-away-from-building-prettified-json-viewers/status-quo.png "Flow of status quo"" alt="Flow of status quo"/><ul><li>View tells Controller* I want to show X</li><li>Controller tells Backend, I want X</li><li>Backend sends X back to Controller</li><li>Controller makes X useful for View</li><li>Controller tells View I have X for you</li><li>View shows X</li></ul><small>_*_ for simplification I called it a controller, it is an illustration of the layer(s) between backend and a view</small><p>I call this Prettified JSON Viewers. I do not remember who coined this term first, if you know please send me an email to sayhello [at] petercammeraat.net - think it was on a podcast.</p><p>It is very boring. Offloads all the logic and storage of data to a backend. Which often require the user to create an account.</p><h2>Proposed Flow</h2><p>I want to challenge it. Make the flow a bit more complex:</p><img src="../../../assets/images/journal/moving-away-from-building-prettified-json-viewers/proposed-change.png "Proposed change of flow"" alt="Proposed change of flow"/><p>In this new flow there is a Local Database and a Sync Engine added.</p><p>Local Database is responsible for storing all the data and the data from the Local Database is used in the app.</p><p>Sync Engine is responsible for keeping the Local Database and the Backend in sync. Large parts of the app only talk to the Local Database and never to the Backend directly.</p><h3>Why do you ask?</h3><ul><li>By making Sync Engine responsible for most network calls we only have to build it once.</li><li>With a Local Database it is much easier to create an excellent offline experience of the app.</li><li>Prepares for more advanced stuff done on device.</li><li>Easier to test</li><li>Backend and Frontend can work simultaneously instead of being blocked and dependent</li></ul><h3>Some scenarios</h3><p><strong>Just showing things that are already there</strong></p><ul><li>View tells Controller I want to show X</li><li>Controller tells Local Database, I want X</li><li>Local Database sends X back to Controller</li><li>Controller makes X useful for View</li><li>Controller tells View I have X for you</li><li>View shows X</li></ul><p><strong>What about changing things?</strong></p><ul><li>View tells Controller I want to change X</li><li>Controller tells Local Database, I want to change X</li><li>Local Database sends changed X back to Controller</li><li>Controller tells View here is changed X</li><li>View shows changed X</li><li>In the background Local Database tells Sync Engine X has changed</li><li>Sync Engine tells Backend X has changed</li></ul><p><strong>Second device?</strong></p><p>On Device A:</p><ul><li>X has changed in the Local Database</li><li>Local Database tells Sync Engine</li><li>Sync Engine tells Backend</li></ul><p>On the Backend:</p><ul><li>Backend notifies all subscribers to X with a silent push notification including Device B</li></ul><p>On Device B:</p><ul><li>Device B has subscribed to X</li><li>Gets silent push notification</li><li>Sync Engine on Device B ask Backend for changed X</li><li>Backend sends back X</li><li>Sync Engine puts it in the Local Database</li><li>Local Database see that there is something new</li><li>Local Database tells Controller</li><li>Controller tells View</li><li>View shows changed X</li></ul>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/offline-experience-of-apps/</guid><title>Offline experience of apps</title><description>Offline experience of apps - Provide an offline experience by default</description><link>https://petercammeraat.net/journal/2023/offline-experience-of-apps/</link><pubDate>Tue, 18 Apr 2023 05:00:00 +0200</pubDate><content:encoded><![CDATA[<h3>Provide an offline experience by default</h3><p>If your app doesn't require much data, then cache that data by default. Users can become increasingly frustrated if they can only access their data with a network connection. Try to make the experience as stable as possible. An unstable connection will make your app feel untrustworthy, where an app that lessens the impact of a network failure will feel magical to the user.</p><ul><li>You’re on a flight, and you don’t want to pay for WiFi.</li><li>You’re on a trip in a remote location.</li><li>You can’t afford a data plan for your phone.</li><li>Poor coverage of a provider.</li><li>Extreme weather conditions.</li><li>Traveling on a train and going through a tunnel.</li><li>Internet connection is managed by a third party and time-boxed when it will be active or inactive like in an airport or hotel.</li></ul><h3>Offer key content and functionally for offline usage</h3><p>Ideally, your app should work equally well when users are offline and online. If your app doesn’t require a lot of data, then you should cache all data by default.</p><p>In this case, it’s recommended to adapt to connection — load available content and cache it while users are online (auto-download and auto-save it locally on the device). It will help you create engagement even when the user is offline.</p><h3>Inform users of their current state and change of state</h3><p>Educate the user so they understand what they can do in the offline mode. Add this information to user onboarding.</p><h3>Save user’s in-app progress</h3><p>Reassure users that their progress will be saved and no data that they’ve entered be deleted. For example, when a first-time user writes a new message and taps “Send” in messenger, they should have a reassuring message “Message will be sent when the connection is restored.” For regular users, it will be enough to have a visual indication of progress.</p><h4>Sources</h4><ul><li><a href="https://web.dev/offline-ux-design-guidelines/">https://web.dev/offline-ux-design-guidelines/</a></li><li><a href="https://uxplanet.org/youre-not-connected-to-internet-50a46ee016a7">https://uxplanet.org/youre-not-connected-to-internet-50a46ee016a7</a></li></ul>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/getting-an-entitlement-for-family-controls-distribution/</guid><title>Getting an entitlement for Family Controls (Distribution)</title><description>Getting an entitlement for Family Controls (Distribution)</description><link>https://petercammeraat.net/journal/2023/getting-an-entitlement-for-family-controls-distribution/</link><pubDate>Thu, 30 Mar 2023 05:00:00 +0200</pubDate><content:encoded><![CDATA[<p>In February I wanted to release an update for Quiet. There is a big update to the iOS app. Quiet can hide apps according to the rules active in Quiet. For example if you block TikTok in Quiet, the TikTok app will disappear from your iOS device.</p><p>To do this I use the ScreenTime API. For using the ScreenTime API the Family Controls capability is needed. Unfortunately I <a href="https://developer.apple.com/documentation/familycontrols">discovered</a> this was only for development and <strong>not</strong> for distribution:</p><blockquote><p>This capability adds the Family Controls entitlement to your app. Before submitting your app to the App Store, you must request permission to use the entitlement.</p></blockquote><p>Using this <a href=" https://developer.apple.com/contact/request/family-controls-distribution">form</a> you can request a "Family Controls &amp; Personal Device Usage Entitlement".</p><p>I did it on 2023-02-19 and got the entitlement on 2023-03-30, it took 40 days to get the entitlement from Apple.</p><p>Early today I got an email from Apple:</p><blockquote><p>The entitlement for Family Controls (Distribution) has been assigned to your account, and you can now configure this capability for eligible apps. If you’re enrolled as an organization, Admins on your team can also use this capability.</p></blockquote><p>Adding this entitlement to your project is easy. You can find all <a href="https://developer.apple.com/help/account/reference/provisioning-with-managed-capabilities">documentation here</a>.</p><p>An Additional Capabilities tab has appeared in the Identifier page of you project at Certificates, Identifiers &amp; Profiles.</p><img src="../../../assets/images/journal/getting-an-entitlement-for-family-control-distribution/additional-capabilities.png "Additional Capabilities tab"" alt="Additional Capabilities tab"/><p>Lesson learned: RTFM 😂</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/bicycle/</guid><title>Bicycle</title><description>Bicycle</description><link>https://petercammeraat.net/journal/2023/bicycle/</link><pubDate>Wed, 29 Mar 2023 05:00:00 +0200</pubDate><content:encoded><![CDATA[<blockquote><p>There is something delightful about riding a bicycle. Once mastered, the simple action of pedaling to move forward and turning the handlebars to steer makes bike riding an effortless activity.</p></blockquote><blockquote><p>Compared to internal combustion engines or mechanical watches, bicycles are fairly simple machines – most of their parts operate in plain sight. What’s not directly visible are all the forces that make it possible to ride and control a bicycle without compromising the structural integrity of its components.</p></blockquote><blockquote><p>In this article, I’ll focus on the delicate interplay between many of the forces that act on a bicycle and its parts when riding. We’ll witness how forces applied through tires make a bicycle accelerate, brake, and turn, and we’ll also investigate how the wheels and the frame handle those different forces without breaking.</p></blockquote><p>→ <a href="https://ciechanow.ski/bicycle/">https://ciechanow.ski/bicycle/</a></p><p>Awesome explanation about the bicycle. It seems simple. But there is more at play then you think. Worth the read, as always.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/case-against-the-cloud/</guid><title>Case against the cloud</title><description>Case against the cloud</description><link>https://petercammeraat.net/journal/2023/case-against-the-cloud/</link><pubDate>Thu, 23 Mar 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>Migrating to the cloud or starting with a cloud-based solution has become increasingly popular in recent years, with many businesses opting for this approach. However, I believe that for most projects, it may be an overkill and not the most economical option in the long run.</p><p>One of the key concerns with migrating to the cloud is the potential for lock-in. Once you start using a cloud-based solution, it can be difficult and costly to move out of that solution if you decide to switch to a different provider or solution. This can be particularly problematic if the solution you are locked into does not provide the features or functionality that you need, or if the costs associated with the solution become prohibitive.</p><p>Ahrefs wrote a piece comparing costs [^1] between running in a datacenter versus running on AWS:</p><blockquote><p>Ahrefs has a rented colocation data center in Singapore with a rather homogenous infrastructure. So we decided to consolidate all the costs spent for this data center, divide them by the number of servers, and compare them to the cost of a similar installation in the Amazon Web Services (AWS) cloud (we use this as the leading IaaS example).</p></blockquote><blockquote><p>Ahrefs has saved ~USD 400 million by ensuring its infrastructure is NOT 100% in the IaaS cloud during the last 2½ years. This figure is growing bigger, as currently we are starting another massive colocation data center with new hardware.</p></blockquote><p>37signals known for Basecamp and Hey, started moving away[^2] from the cloud:</p><blockquote><p>You inevitably accrue some dimension of technical debt and complexity on this path. Your deployment strategy isn’t the only thing that has to change: you’ll have to invent new tooling to manage those stacks and create useful CI/CD to cater to the needs of both operations and programming. Most likely you will have to rethink your monitoring strategy as well.</p></blockquote><blockquote><p>Bottom line: you need a lot of processes to do this right. In a lot of places, it became apparent we were spending more than we got out of it in return — not just economically, but also operationally.</p></blockquote><p>They are also very open[^3] about the cost:</p><blockquote><p>In total, we spent $3,201,564 on all these cloud services in 2022. That comes out to $266,797 per month. Whew!</p></blockquote><blockquote><p>In 2023, we hope to dramatically cut that bill by moving a lot of services and dependencies out of the cloud and onto our own hardware.</p></blockquote>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/restructured-website/</guid><title>Restructured website</title><description>Restructured website</description><link>https://petercammeraat.net/journal/2023/restructured-website/</link><pubDate>Sat, 4 Mar 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>I have made some changes to my website's structure. Specifically, I have combined the Writings, Linked, Reading, and Projects sections into a single section called Journal. I have also removed several Linked entries and organised the tags more effectively. These changes have created a better system for future writing. Overall, my website is now more organised and clean, which makes me quite pleased with the outcome. 😃</p><p>I invested time in transferring my website from Netlify to my own VPS. I plan on creating a guide on how to do this in the future. My main motivation for doing this is to promote the decentralised web. By hosting my website on a large platform, I contribute to the centralisation of the web, which goes against my beliefs.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/social-media-is-a-major-cause-of-the-mental-illness-epidemic/</guid><title>Social Media is a Major Cause of the Mental Illness Epidemic</title><description>Social Media is a Major Cause of the Mental Illness Epidemic in Teen Girls. Here’s the Evidence. Journalists should stop saying that the evidence is just correlational</description><link>https://petercammeraat.net/journal/2023/social-media-is-a-major-cause-of-the-mental-illness-epidemic/</link><pubDate>Thu, 23 Feb 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>In sum, there are now many true experiments using a variety of methods to test questions such as whether reducing or eliminating exposure to social media confers benefits (it does, when continued for at least a month), or if exposing girls and women to Instagram or Instagram-like experiences damages their mood or body image (it does). These experiments provide direct evidence that social media—particularly Instagram—is a cause, not just a correlate, of bad mental health, especially in teen girls and young women.</p></blockquote><blockquote><p>The Collaborative Review doc that Jean Twenge, Zach Rausch and I have put together collects more than a hundred correlational, longitudinal, and experimental studies, on both sides of the question. Taken as a whole, it shows strong and clear evidence of causation, not just correlation. There are surely other contributing causes, but the Collaborative Review doc points strongly to this conclusion: Social Media is a Major Cause of the Mental Illness Epidemic in Teen Girls.</p></blockquote><blockquote><p>"It also creates a trap—a collective action problem—for girls and for parents. Each girl might be worse off quitting Instagram even though all girls would be better off if everyone quit."</p></blockquote><p>An article [^1] worth reading from Jonathan Haidt, about social media being the major cause of the mental illness in teen girls. Well, the cause is most measurable in teen girls, social media is also bad for other genders and age groups. I am thankful that this article is published.</p><p>My hope is that it makes people rethink and reevaluate their social media usage. It confirms something I and a lot of other people had a gut feeling about. Social Media is the new smoking. We know it is bad, we should label it as bad. This problem or cancer called social media is something we need to battle as a collective.<br><br><br>Also worth reading are the comments on Hacker News [^2].</p><p>Like a concerned dad that has 4 daughters:</p><blockquote><p>I'm still reading it, but this is great so far. As a father to four little girls, though, it makes me feel really defeated. I can already see that social media has eroded my wife's mental health. I just don't know what to do in the next few years when our girls approach the age when everyone else will get an iPhone and have an Instagram account.</p></blockquote><p>Or a middle school educator that explains what can be done:</p><blockquote><p>Middle School educator here. I can assure you that your daughters will not be alone when it comes to a moratorium on social media. However, the girls they may very well want to be friends with may be very much into social media and group chats. My advice is to be firm but also take steps to create social opportunities for your daughters. I have a 12yo and I host board game nights with amazing snack trays. I help her to play video games socially using air console. <strong>You have to play defense. These apps are deleterious to your daughters self worth.</strong> I’ve seen too many hospitalizations and suicides to believe otherwise. But you also have to play offense. They will need guidance on how to be social in a world coopted by manipulation and deceit. Parenting these days is challenging but it’s possible to raise girls who thrive without phones.</p></blockquote><p>Measurements that are taken as a collective:</p><blockquote><p>I once sat next to a dean of private school on a plane—she mentioned that the ~100 parents that sent their children to the school signed an agreement that they would restrict their children's access to social media until 9th grade.</p></blockquote><p>My own journey of quitting social media started in 2012, also wrote about it in this post "<a href="https://petercammeraat.net/journal/2015/why-i-stopped-using-facebook/">Why I stopped using Facebook</a>".</p><p>In 2016 I started working on <a href="https://petercammeraat.net/projects/quiet/">Quiet</a>, it started out as a way to block social media websites in Safari. Because I saw the need for it, for myself, but also for other people. Between 2016 to the end of 2022 it got approximately 35000 users. This year I made Quiet free of charge and donation based. With as goal to get more users to use it.</p><p>Every week I receive multiple emails from user that tell stories how Quiet changed them. Even if it is just for being more productive. This is a win.</p><p>I am working on bring Quiet to other platforms outside macOS and iOS. To reach more people and to help them to get their focus back and maybe even help some of them with their mental health struggles.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/onboarding-tutorials-vs-contextual-help/</guid><title>Onboarding Tutorials vs. Contextual Help</title><description>Onboarding Tutorials vs. Contextual Help - Tutorials interrupt users, don’t necessarily improve task performance, and are quickly forgotten.</description><link>https://petercammeraat.net/journal/2023/onboarding-tutorials-vs-contextual-help/</link><pubDate>Wed, 15 Feb 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>Tutorials interrupt users, don’t necessarily improve task performance, and are quickly forgotten. Contextual help signals can avoid these pitfalls but require unintrusive ways to activate.</p></blockquote><blockquote><p>When I first launched the app, it ushered me into a long tutorial on how to set up the new belt. The multistep tutorial was nice and clear, except for one big thing –- once I finished it, I couldn’t remember how to do the procedure on the setup screen, and, even worse, I couldn’t figure out how to launch the tutorial again. Eventually, I realized that there was a list of instructions available in the Help menu, but that still required me to memorize the steps, go back to the main part of the app, and complete the process with all that information in my working memory.</p></blockquote><p>→ <a href="https://www.nngroup.com/articles/onboarding-tutorials/">https://www.nngroup.com/articles/onboarding-tutorials/</a></p><p>Nice to have my gut feeling confirmed. Onboarding tutorials <strong>do not</strong> work. In context help indicators like tooltips, coach markers, and inline overlays are better.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/comments-rule-in-quiet/</guid><title>Comments rule in Quiet</title><description>Comments rule in Quiet - Block connections to all servers used to display Comments sections and their scripts. Hide Comments sections from websites that include them in their webpages.</description><link>https://petercammeraat.net/journal/2023/comments-rule-in-quiet/</link><pubDate>Thu, 2 Feb 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>What does the Comments rule do?</h3><ul><li>Block connections to all servers used to display Comments sections and their scripts.</li><li>Hide Comments sections from websites that include them in their webpages.</li></ul><p>{{&lt; before-after src-before="quiet-rule-comments-before.png" title-before="Comments before blocked by Quiet" src-after="quiet-rule-comments-after.png" title-after="Comments after blocked by Quiet"&gt;}}</p><h3>Why block &amp; hide Comments from websites?</h3><p>Hiding comments can enhance your focus by eliminating distractions and interruptions, enabling you to concentrate on the content that interests you. The comments section of a website can often be cluttered, consuming valuable screen real estate. By hiding comments, the visual appearance of the website can be streamlined, freeing up space to view the content you are interested in.</p><p>The reading experience is improved by suppressing the noise and distractions associated with comments sections, making it particularly useful for websites with numerous comments or ones that contain off-topic, spammy, or irrelevant comments.</p><p><a href="https://apps.apple.com/app/apple-store/id1441525727?pt=119418684&ct=QuietRuleComments&mt=8">Download Quiet</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/notifications-rule-in-quiet/</guid><title>Notifications rule in Quiet</title><description>Notifications rule in Quiet - Block connections to all servers used to display Notifications popups/banners/alerts and their scripts. Hide Notifications popups/banners/alerts from websites that include them in their webpages</description><link>https://petercammeraat.net/journal/2023/notifications-rule-in-quiet/</link><pubDate>Wed, 1 Feb 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>What does the Notifications rule do?</h3><ul><li>Block connections to all servers used to display Notifications popups/banners/alerts and their scripts.</li><li>Hide Notifications popups/banners/alerts from websites that include them in their webpages.</li></ul><img src="../../../assets/quiet/help/quiet-rule-notifications.png" alt="Notifications popup example"/><h3>Why block &amp; hide Notifications popups/banners/alerts?</h3><p>Removing notification pop-ups from websites improves the user experience by reducing distractions and interruptions. Pop-ups are annoying and intrusive, causing users to lose focus on the task at hand. It slows down the website and consume valuable screen real estate. By removing pop-ups, it can create a cleaner and more streamlined user interface, allowing users to easily access and interact with the content they are looking for.</p><p><a href="https://apps.apple.com/app/apple-store/id1441525727?pt=119418684&ct=QuietRuleNotifications&mt=8">Download Quiet</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/newsletter-rule-in-quiet/</guid><title>Newsletter rule in Quiet</title><description>Newsletter rule in Quiet - Block connections to all servers used to display Newsletter popups/banners/alerts and their scripts. Hide Newsletter popups/banners/alerts from websites that include them in their webpages.</description><link>https://petercammeraat.net/journal/2023/newsletter-rule-in-quiet/</link><pubDate>Tue, 31 Jan 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>What does the Newsletter rule do?</h3><ul><li>Block connections to all servers used to display Newsletter popups/banners/alerts and their scripts.</li><li>Hide Newsletter popups/banners/alerts from websites that include them in their webpages.</li></ul><p>{{&lt; before-after src-before="quiet-rule-newsletter-before.png" title-before="Newsletter before blocked by Quiet" src-after="quiet-rule-newsletter-after.png" title-after="Newsletter after blocked by Quiet"&gt;}}</p><h3>Why block &amp; hide Newsletter popups/banners/alerts?</h3><p>Newsletters popups, banners, and alerts can be incredibly distracting for users when browsing the internet, making it hard for them to focus on the main purpose of a website. To make the browsing experience faster, smoother, and more enjoyable, it is recommended to block and hide these elements. By doing so, users can access the website without being interrupted by unnecessary distractions, allowing them to make the most of their time and achieve their goals faster and more efficiently.</p><p><a href="https://apps.apple.com/app/apple-store/id1441525727?pt=119418684&ct=QuietRuleNewsletter&mt=8">Download Quiet</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/relevant-content-rule-in-quiet/</guid><title>'Relevant Content' rule in Quiet</title><description>'Relevant Content' rule in Quiet - Block connections to all servers used to display 'Relevant Content' and their scripts. Hide 'Relevant Content' from websites that include them in their webpages.</description><link>https://petercammeraat.net/journal/2023/relevant-content-rule-in-quiet/</link><pubDate>Mon, 30 Jan 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>What does the 'Relevant Content' rule do?</h3><ul><li>Block connections to all servers used to display 'Relevant Content' and their scripts.</li><li>Hide 'Relevant Content' from websites that include them in their webpages.</li></ul><p>{{&lt; before-after src-before="quiet-rule-relevant-before.png" title-before="'Relevant Content' before blocked by Quiet" src-after="quiet-rule-relevant-after.png" title-after="'Relevant Content' after blocked by Quiet"&gt;}}</p><h3>Why block &amp; hide 'Relevant Content'?</h3><p>Taboola, Revcontent, Adblade, Content.ad, and others frequently appear on websites associated with false information. The 'Relevant Content' blocks are designed to look like related content suggestions and often feature attention-grabbing headlines and direct marketing offers.</p><p><a href="https://apps.apple.com/app/apple-store/id1441525727?pt=119418684&ct=QuietRuleRelevant&mt=8">Download Quiet</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/chatbots-rule-in-quiet/</guid><title>Chatbots rule in Quiet</title><description>Chatbots rule in Quiet - Block connections to all servers that provide scripts for Chatbots. By blocking these connections the Chatbots and Chat floating buttons disappear.</description><link>https://petercammeraat.net/journal/2023/chatbots-rule-in-quiet/</link><pubDate>Fri, 27 Jan 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>What does the Chatbots rule do?</h3><ul><li>Block connections to all servers that provide scripts for Chatbots.</li><li>By blocking these connections the Chatbots and Chat floating buttons disappear.</li></ul><p>{{&lt; before-after src-before="quiet-rule-chatbots-before.png" title-before="Chatbots before blocked by Quiet" src-after="quiet-rule-chatbots-after.png" title-after="Chatbots after blocked by Quiet"&gt;}}</p><h3>Why block &amp; hide Chatbots?</h3><p>One major issue with chatbots is that they can be intrusive and disruptive to a user's browsing experience. They often pop up unexpectedly, interrupting the user's flow and demanding their attention. This can be particularly frustrating for users who are trying to find specific information or complete a task on a website. Moreover, chatbots are not always effective in providing the help users need and they may not be able to understand or respond to complex questions or requests.</p><p>Another concern is the potential for chatbots to collect and use personal data without the user's consent. Many chatbots require users to provide personal information such as their name, email address, or location, in order to interact with them. This information can be used for targeted advertising or other marketing purposes, which may not be desirable for users.</p><p>Blocking chatbots on websites can be a good idea for several reasons:</p><ol><li>it gives users the ability to control their browsing experience and avoid unwanted interruptions.</li><li>it can help to protect users' personal data from being collected and used without their consent.</li><li>it can improve the overall user experience by allowing users to interact with the website in a more efficient and effective way.</li></ol><p><a href="https://apps.apple.com/app/apple-store/id1441525727?pt=119418684&ct=QuietRuleChatbot&mt=8">Download Quiet</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/share-buttons-rule-in-quiet/</guid><title>Share Buttons rule in Quiet</title><description>Share Buttons rule in Quiet - Block connections to all servers used by Share Buttons and their scripts. Hide the Share Buttons from websites that include them in their webpages.</description><link>https://petercammeraat.net/journal/2023/share-buttons-rule-in-quiet/</link><pubDate>Thu, 26 Jan 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>What does the Share Buttons rule do?</h3><ul><li>Block connections to all servers used by Share Buttons and their scripts.</li><li>Hide the Share Buttons from websites that include them in their webpages.</li></ul><p>{{&lt; before-after src-before="quiet-rule-sharebuttons-before.png" title-before="Share Buttons before blocked by Quiet" src-after="quiet-rule-sharebuttons-after.png" title-after="Share Buttons after blocked by Quiet"&gt;}}</p><h3>Why block &amp; hide Share Buttons?</h3><p>Sharing a website URL is a feature that has been integrated into most modern web browsers. This means that users can easily share a link to a website they are currently visiting with others by simply clicking on the appropriate button within their browser. However, it is not necessary for websites themselves to include specific "Share Buttons" on their pages, as the functionality is already built-in to the browser. Additionally, the use of browser-based sharing options allows for greater flexibility and compatibility across different devices and platforms, as opposed to relying on website-specific sharing buttons that may not be supported by all browsers or devices.</p><p>Share buttons, while they may seem like a convenient way to quickly share a website or piece of content with others, can also pose a significant privacy concern. This is because many share buttons, such as those provided by Facebook or other social media platforms, have the ability to send information back to the company or organisation that created the button. For example, if a website includes a Facebook "Like" or "Share" button, this integration can be used by Facebook to track the behavior and browsing habits of the website's visitors. This data is then typically collected and analysed by the company behind the button, which can be used for a variety of purposes, such as targeted advertising or user profiling. As a result, using share buttons can potentially compromise the privacy of website visitors, and it's important for website owners to be aware of the implications of including these buttons on their pages.</p><p><a href="https://apps.apple.com/app/apple-store/id1441525727?pt=119418684&ct=QuietRuleShareButtons&mt=8">Download Quiet</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/rip-third-party-twitter-apps/</guid><title>RIP Third-Party Twitter Apps</title><description>RIP Third-Party Twitter Apps - My favourite client was TweetBot. I also used Twitterrific for a time. Both made the Twitter experience a 100% better. Twitter's own app sucks.</description><link>https://petercammeraat.net/journal/2023/rip-third-party-twitter-apps/</link><pubDate>Fri, 20 Jan 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>Twitter has updated its developer terms to officially ban the creation of third-party clients. The change was made in the "restrictions" section of the agreement, which now includes a clause prohibiting the "use or access the Licensed Materials to create or attempt to create a substitute or similar service or product to the Twitter Applications." This update comes a week after Twitter cut off access to several prominent third-party app developers.</p><p>The fact that Twitter did not communicate this to the developers, so they could make a smooth experience phasing out their app, is really just a slap in the face and a f*ck you. Which these developers really not deserve.</p><p>My favourite client was TweetBot. I also used Twitterrific for a time. Both made the Twitter experience a 100% better. Twitter's own app sucks.</p><blockquote><p>“Since 2007, Twitterrific helped define the shape of the Twitter experience. It was the first desktop client, the first mobile client, one of the very first apps in the App Store, an Apple Design award winner, and it even helped redefine the word “tweet” in the dictionary. Ollie, Twitterrific’s bluebird mascot, was so popular it even prompted Twitter themselves to later adopt a bluebird logo of their very own. Our little app made a big dent on the world!”</p></blockquote><p>→ <a href="https://blog.iconfactory.com/2023/01/twitterrific-end-of-an-era/">https://blog.iconfactory.com/2023/01/twitterrific-end-of-an-era/</a></p><p>Twitter client apps were used by designers and developers to demonstrate their abilities and push the boundaries of user experience and design for a long time. One example of this is the developer of Tweetie who created the "pull-to-refresh" mechanism, which is now a common feature in mobile apps.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/quiet-4-0-and-a-commitment/</guid><title>Quiet 4.0 and a commitment</title><description>Quiet 4.0 and a commitment - Quiet 4.0 is a restart of Quiet and a commitment to support it for the next 10 years.</description><link>https://petercammeraat.net/journal/2023/quiet-4-0-and-a-commitment/</link><pubDate>Thu, 19 Jan 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>TLDR: Quiet 4.0 is a restart of Quiet and a commitment to support it for the next 10 years.</p><p>Last May I <a href="https://petercammeraat.net/journal/2022/sunsetting-quiet/">stopped updating Quiet</a> and pulled it from the App Store. Shutdown my own company to focus on my job and grow. Besides the monetary reasons I also was tired in that period, it was good decision to take a break.</p><p>Between now and then I grew as a person. I have gained a lot of knowledge and skills at my job. In addition, I have learned how to manage my time effectively and create a better balance between work, study, personal projects, social interactions with friends and loved ones, and time spent with family. Through this, I have been able to achieve a greater level of balance and fulfilment in my life.</p><p>Removing Quiet from the App Store was a decision that I now regret. The app provided value and utility to a large number of users, and I continue to receive emails from users who found it helpful. In December, I began to miss the app and began experimenting with it again. With the abundance of unwanted chatbots, pop-up newsletter prompts, and push notification alerts on various websites, I realised the importance of a tool like Quiet in helping individuals control their digital noise.</p><p>In the last 48 hours I republished Quiet again in the App Store, submitted a cleaned up version to Apple, and released it.</p><p>Quiet is now available for free, but users have the option to make a donation if they choose to. My primary objective has shifted from generating revenue to helping as many people as possible to reduce the overwhelming noise on the internet. I would greatly appreciate it if you could spread the word to your friends and let them know about this useful tool.</p><p>I want to assure all of the users of Quiet that I am fully committed to supporting the app for the next 10 years. I understand that my previous decision to remove the app from the App Store may have caused disappointment and mistrust among some users. I hope that by republishing the app and committing to its long-term support, I will be able to regain your trust and provide you with a valuable tool for managing digital noise.</p><p><a href="https://apps.apple.com/app/apple-store/id1441525727?pt=119418684&ct=Quiet4BlogPost&mt=8">Download Quiet</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/the-cab-ride-ill-never-forget/</guid><title>The Cab Ride I'll Never Forget</title><description>The Cab Ride I'll Never Forget</description><link>https://petercammeraat.net/journal/2023/the-cab-ride-ill-never-forget/</link><pubDate>Tue, 17 Jan 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>We were like strangers on a train, the passengers and I, hurtling through the night, revealing intimacies we would never have dreamed of sharing during the brighter light of day. I encountered people whose lives amazed me, ennobled me, made me laugh and made me weep. And none of those lives touched me more than that of a woman I picked up late on a warm August night.</p></blockquote><blockquote><p>I quietly reached over and shut off the meter. “What route would you like me to go?” I asked. For the next two hours we drove through the city. She showed me the building where she had once worked as an elevator operator. We drove through the neighborhood where she and her husband had lived when they had first been married. She had me pull up in front of a furniture warehouse that had once been a ballroom where she had gone dancing as a girl. Sometimes she would have me slow in front of a particular building or corner and would sit staring into the darkness, saying nothing.</p></blockquote><p>→ <a href="https://kentnerburn.com/the-cab-ride-ill-never-forget/">https://kentnerburn.com/the-cab-ride-ill-never-forget/</a></p><p>Beautiful story! Small acts of kindness can have a big impact on others' lives, and we all have the opportunity to be kind and make a difference. Pay attention, opportunities to be kind will present themselves.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/your-own-personal-website/</guid><title>Your own personal website</title><description>Your own personal website. Should you have one? How do you start? What do you put on your website?</description><link>https://petercammeraat.net/journal/2023/your-own-personal-website/</link><pubDate>Fri, 13 Jan 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>Why you should have your own personal website?</h3><p>Having your own space on the internet that you control helps a lot. In the last 20 years I have seen a lot of websites/platforms come and go. Twitter and Facebook will probably be gone in the next decade. When you have your own space, you could actually put effort in maintaining it.</p><p>I have been looking in my archive of tweets, blog posts on third party systems, bookmarking tools, and forums to build this website. Also looking backwards, I think it is nice to have it all in one place. I am not done yet, thousands of bookmarks/tweets/post to go through. In the end I will have an archive that starts in 2006 till now on my own website, cool to see how interest change and how I develop as a person.</p><p>Stability, maintainability, and control are the main reason I have my own personal website.</p><p>There are other reasons however:</p><ol><li>Build a professional online presence: showcase your skills, experiences, and accomplishments to potential employers, clients, or collaborators.</li><li>Building your brand: build and promote your personal brand, which is beneficial if you are a freelancer, entrepreneur, or independent professional.</li><li>Sharing your work and ideas: it allows you to share your work and ideas, which can be especially beneficial if you are a writer, artist, or other creative professional.</li><li>Your content is not used by a platform to generate more advertisements.</li><li>It is decentralised</li></ol><h3>How do you start?</h3><p>You start by choosing a domain name. I would stick to domain names that uses <a href="https://en.wikipedia.org/wiki/Top-level_domain">Top Level Domain</a> (TLD) <code>.com</code>, <code>.net</code>, <code>.org</code>, or <a href="https://en.wikipedia.org/wiki/Country_code_top-level_domain">TLD's from countries</a>.</p><p>You register your domain name at a domain name register or web hosting company. Namecheap and Google Domains are examples of domain name registers. Hetzner and OVH are examples of hosting companies. Do a bit of research before deciding which company to use.</p><p>I register my domain names at <a href="https://1984.is">1984.is</a>, a company in Iceland. Iceland has excellent privacy and free speech protections, known as the <a href="https://rsf.org/en/new-legislation-provide-exemplary-protection-freedom-information">Icelandic Modern Media Initiative</a>.</p><p>If you are a bit technical and used <code>git</code> before it is easy to setup a website with static site generators like <a href="https://gohugo.io">Hugo</a>. Also the actual hosting can be done for free or almost free by using GitHub Pages, CloudFlare Pages, Netlify, or Vercel.</p><p>If you are not that technical then there are excellent options for you.</p><ul><li>the old and reliable <a href="https://wordpress.com">Wordpress</a></li><li><a href="https://www.squarespace.com">Squarespace</a></li><li><a href="https://bearblog.dev">Bear blog</a></li><li><a href="https://ghost.org">Ghost</a></li><li><a href="https://substack.com">Substack</a></li></ul><h3>What content to put on your website?</h3><p>It can be anything you want off course 😁</p><ul><li>A portfolio to showcase your work.</li><li>Blog about topics that show your expertise.</li><li>Micro blog: you do not have to write long posts to blog, you could also write micro posts, like tweets or toots.</li><li>Just a business card with your contact details.</li><li>Link to posts or websites that you read and find interesting.</li></ul><p>Keep it simple! You do not have to start big. Start small.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/the-strangely-beautiful-experience-of-google-reviews/</guid><title>The Strangely Beautiful Experience of Google Reviews</title><description>The Strangely Beautiful Experience of Google Reviews</description><link>https://petercammeraat.net/journal/2023/the-strangely-beautiful-experience-of-google-reviews/</link><pubDate>Tue, 10 Jan 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>I slept under the overpass that night, and in the morning, I wrote a review: “Reasonably good bridge. A little loud for sleeping.” I gave it four stars. After I set off on my bike, I couldn’t stop thinking about it. Because of Google Reviews — because multiple people took the time to review this squat bridge in the middle of nowhere — I felt like I was part of some shared human experience, the newest member of an obscure club. Maybe the other reviewers would disagree, but this moment felt powerful, like seeing other people’s names etched into a park bench or finding yourself deeply moved by the graffiti inside a public bathroom stall. But it was also weird: This tool for consumer reviews had become a digital guestbook for anything and everything in the world.</p></blockquote><blockquote><p>It feels impossible to fully connect and empathize with all the people we interact with each day, to see the full existence of every person we pass on the street. It’s easier to keep your head down. But all these stories, these small nuggets of humanity buried in Google Reviews, feel like opportunities for us to practice that empathy.</p></blockquote><p>→ <a href="https://longreads.com/2023/01/03/the-strangely-beautiful-experience-of-google-reviews/">https://longreads.com/2023/01/03/the-strangely-beautiful-experience-of-google-reviews/</a></p><p>I think I have been a reader of <a href="https://longreads.com/">longreads</a> for the last 10 years. This website is a bliss for readers like me. Also this article shows that the good in people can be found unexpected places.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/20-years-of-safari/</guid><title>20 years of Safari</title><description>20 years of Safari - Safari was introduced in Mac OS X Panther on January 7, 2003. It was also included with the first generation iPhone, which was released in 2007.</description><link>https://petercammeraat.net/journal/2023/20-years-of-safari/</link><pubDate>Sat, 7 Jan 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>Safari was introduced in Mac OS X Panther on January 7, 2003. It was also included with the first generation iPhone, which was released in 2007. At the time of its release, Safari was known for being the fastest browser on the Mac.</p><p>Today marks the 20th anniversary of Safari 🥳</p><p>From the <a href="https://www.apple.com/newsroom/2003/01/07Apple-Unveils-Safari/">press release</a>:</p><blockquote><p>Safari’s highly-tuned rendering engine loads pages over three times faster than Microsoft’s Internet Explorer for the Mac and runs Javascript over twice as fast. Safari’s innovative features include Google search capabilities integrated directly into the toolbar; SnapBack, a new way to instantly snap back up to search results or the top level of any website after browsing down one or more levels; a completely new way to name, organize and present bookmarks; and automatic “pop-up” ad blocking.</p></blockquote><blockquote><p>“Safari is the fastest browser on the Mac, and we predict that many will feel it is the best browser ever created,” said Steve Jobs, Apple’s CEO. “We are bringing innovation back into this category with the first all new browser created in many years.”</p></blockquote><p>Safari is the underdog in a world dominated by Google Chrome. An underdog I keep using!</p><p>There are several reasons why you might choose to use Safari as your web browser:</p><ol><li>Speed: Safari is known for being fast and responsive, which can make browsing the web a more enjoyable experience.</li><li>Energy efficiency: Safari is designed to use less energy than other browsers, which can be especially beneficial if you use your laptop or desktop computer for long periods of time.</li><li>Integration with Apple ecosystem: If you use other Apple products and services, such as iCloud or the Keychain password manager, Safari can be a convenient choice because it integrates seamlessly with these tools.</li><li>Privacy: Safari includes a number of privacy features, such as Intelligent Tracking Prevention, that can help protect your online activity from being tracked by third parties.</li><li>Security: Safari is regularly updated to protect against security vulnerabilities, so you can feel confident that your browsing experience is secure.</li></ol><p>My hope is that Safari will continue to be a strong and viable web browser in the future. In an age where online privacy and security are increasingly important, it's important for Safari to continue to innovate and provide users with the tools they need to protect themselves from tracking and other online threats. I hope that Safari will continue to be a strong competitor to Chrome and other browsers.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/using-rss-feeds/</guid><title>Using RSS feeds</title><description>Using RSS feeds - With content delivered to you, there's no need to visit the website and risk getting drawn in by algorithms designed to keep you there.</description><link>https://petercammeraat.net/journal/2023/using-rss-feeds/</link><pubDate>Fri, 6 Jan 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>Why should you use RSS?</h3><p>With content delivered to you, there's no need to visit the website and risk getting drawn in by algorithms designed to keep you there. This means you can avoid the temptation to spend more time on the site and stay focused on what you need to do.</p><p>It saves you a lot of time 😃</p><p>It is also a lot cleaner:</p><ul><li>less ads (most of the time no ads)</li><li>no cookie banners</li><li>no chat popups</li><li>no asking for newsletters alerts</li><li>no enable notification boxes</li><li>etc</li></ul><h3>What is a RSS feed?</h3><p>RSS, or Really Simple Syndication, is a convenient way to stay informed about the latest updates and content from your favourite websites.</p><p>RSS feeds use simple text files and XML (extensible markup language) to extract and streamline important information, which is then delivered to an RSS reader. This allows users to stay up to date with the latest news and content from their favourite websites.</p><p>As internet content has become more complex, RSS feeds have also evolved to include images, video, and other non-text elements in a simplified format for improved organisation, faster loading times, and compatibility with RSS readers.</p><p>With an RSS feed, users can customise their online experience and receive automatic updates with the latest content from the websites they visit regularly.</p><h3>How do you find it?</h3><p>The creator of your preferred website or podcast generates an RSS feed that includes a list of updates or notifications. You have the option to view this list directly or subscribe to the feed so that the updates are automatically delivered to your feed reader.</p><p>Most feed readers have a feature that allows you to locate the RSS feed for a particular website by entering the URL into the reader.</p><p>There are also website where RSS feeds are not easily to find or advertised.</p><h4>YouTube</h4><p>Feed: <code>https://www.youtube.com/feeds/videos.xml?channel_id=THE_CHANNEL_ID_HERE</code></p><p>You need to find the <code>Channel ID</code> before you can subscribe to the RSS feed of a YouTube Channel. You can easily get the Channel ID by entering the Channel URL on this <a href="https://commentpicker.com/youtube-channel-id.php">website</a>.</p><p><em>For example:</em></p><ul><li>Channel: <a href="https://www.youtube.com/@marthijndevries">https://www.youtube.com/@marthijndevries</a></li><li>Channel ID: UCH4eXlgdvf4by9uVqjJtY7w</li><li>RSS Feed: <a href="https://www.youtube.com/feeds/videos.xml?channel_id=UCH4eXlgdvf4by9uVqjJtY7w">https://www.youtube.com/feeds/videos.xml?channel_id=UCH4eXlgdvf4by9uVqjJtY7w</a></li></ul><h4>Reddit</h4><p>Feed: <code>https://www.reddit.com/r/SUBREDDIT.rss</code></p><p><em>For example:</em></p><ul><li>Subreddit: <a href="https://www.reddit.com/r/oddlysatisfying/">https://www.reddit.com/r/oddlysatisfying/</a></li><li>RSS Feed: <a href="https://www.reddit.com/r/oddlysatisfying.rss">https://www.reddit.com/r/oddlysatisfying.rss</a></li></ul><h4>Twitter</h4><p>Feed: <code>https://nitter.net/USERNAME/rss</code></p><p><em>For example:</em></p><ul><li>Twitter: <a href="https://twitter.com/NASA">https://twitter.com/NASA</a></li><li>RSS Feed: <a href="https://nitter.net/NASA/rss">https://nitter.net/NASA/rss</a></li></ul><h3>What RSS reader can you use?</h3><p>An RSS reader functions similarly to an email inbox. When you subscribe to the RSS feed for a particular website, the reader will display the latest content from that site. You can use the reader to view the content or visit the website directly. As you read each piece of new content, the reader will mark it as read.</p><p>If you are in the Apple ecosystem I highly recommend <a href="https://netnewswire.com">NewsNetWire</a> available on macOS and iOS; syncs via iCloud.</p><p>There are many more RSS readers, here a small list:</p><ul><li><a href="https://feedly.com/">Feedly</a></li><li><a href="https://www.inoreader.com">Inoreader</a></li><li><a href="https://newsblur.com">NewsBlur</a></li><li><a href="https://feeder.co">Feeder</a></li></ul><h3>Does this website has a RSS feed?</h3><p>Yes this website also has <a href="https://petercammeraat.net/feeds/">RSS feeds</a>.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/build-by-tony-fadell/</guid><title>Build by Tony Fadell</title><description>Build by Tony Fadell</description><link>https://petercammeraat.net/journal/2023/build-by-tony-fadell/</link><pubDate>Wed, 4 Jan 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>The book contains lessons learned the hard way. Tony spent the first 10 years of his career failing, and the next 20 building some of the most amazing devices in history – the iPod, iPhone, and Nest Learning Thermostat. It has enough stories and advice about leadership, design, startups, mentorship, decision making, devastating screwups, and unbelievable success.</p><blockquote><p>“The most wonderful part of building something together with a team is that you’re walking side by side with other people. You’re all looking at your feet and scanning the horizon at the same time. Some people will see things you can’t, and you’ll see things that are invisible to everyone else. So don’t think doing the work just means locking yourself in a room—a huge part of it is walking with your team. The work is reaching your destination together. Or finding a new destination and bringing your team with you.”</p></blockquote><blockquote><p>“Being a good designer is more a way of thinking than a way of drawing. It’s not just about making things pretty—it’s about making them work better.”</p></blockquote><blockquote><p>“People do stupid things when they have a giant budget—they overdesign, they overthink. That inevitably leads to longer runways, longer schedules, and slower heartbeats. Much, much slower. Generally any brand-new product should never take longer than 18 months to ship—24 at the limit. The sweet spot is somewhere between 9 and 18 months. That applies to hardware and software, atoms and bits.”</p></blockquote><p>→ <a href="https://www.buildc.com/the-book">https://www.buildc.com/the-book</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2023/being-more-positive/</guid><title>Being more positive</title><description>Being more positive - This years theme is being more positive.</description><link>https://petercammeraat.net/journal/2023/being-more-positive/</link><pubDate>Tue, 3 Jan 2023 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>This years theme is being more positive.</p><p>I am pessimistic. If you look at the state of the world, technology, people, energy crisis, climate crisis, war in Ukraine, protests in Iran, whole generation scarred by 2 years of lock downs because of covid, echo chambers, bubbles, trump, covid crazy conspiracy theorists, big companies spying on users, privacy is dead and so much more. It is not that hard to be pessimistic like me about the future.</p><p>But there is also a lot of good stuff going on in the world. People still want to do good.</p><p>Like this <a href="https://news.ycombinator.com/item?id=34021944">dad asking for help</a> to re-active his autistic daughter's Instagram account. This post was read by some human at Meta and they helped. It is a shame that you need to have a public post like this to get in contact with another human being with these big companies that outsource support to chat robots. But that is a different story, this is an happy story, a pearl.</p><p>Also I want to write and read more this year. That is why I intent to complete <a href="https://100daystooffload.com">100DaysToOffload</a> challenge this year.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2022/ted-talks-of-2022/</guid><title>TED Talks of 2022</title><description>TED Talks of 2022</description><link>https://petercammeraat.net/journal/2022/ted-talks-of-2022/</link><pubDate>Sat, 31 Dec 2022 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>What you can learn from people who disagree with you</h3><blockquote><p>We've all likely felt this tendency to gravitate towards people who look, think and act like us. It's comfortable, but it can also be harmful because this polarization that we face today isn't just about believing that the other side is factually wrong. We are beginning to see the other side as malevolent beings with a hateful and hidden agenda. And you can see this. You can see this in the screaming cable news pundits, the politicians who vote down bills just because they come from the other side of the aisle. The hate groups that violently attack people who are different from themselves.</p></blockquote><blockquote><p>When I see these things as a teenager, I just feel so sad, so angry and so scared of this world that I'm soon going to be entering as an adult. But there's something that I found in having conversations with my peers that I think can be a path forward from all of this. An approach that focuses on conversations with the intent to listen and learn. Not to win and not to agree.</p></blockquote><p>→ <a href="https://www.ted.com/talks/shreya_joshi_what_you_can_learn_from_people_who_disagree_with_you">https://www.ted.com/talks/shreya<em>joshi</em>what<em>you</em>can<em>learn</em>from<em>people</em>who<em>disagree</em>with_you</a></p><p>It helps a lot if you once in a while step out your comfort zone and talk about different topics then you usually do. You may learn a thing or two when you talk with someone you do not agree with.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2022/what-is-a-wildcard-person/</guid><title>What is a Wildcard Person?</title><description>What is a Wildcard Person?</description><link>https://petercammeraat.net/journal/2022/what-is-a-wildcard-person/</link><pubDate>Thu, 29 Dec 2022 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>You know that person on your team who seems to be good at everything? I mean the literal definition of the word good. Not master. Good. When a problem comes up that nobody else has any experience with, this person volunteers to jump in head-first.</p></blockquote><blockquote><p>They don't produce masterpieces, but that was never the intention. The intention was for the problem to be solved, which it now is.</p></blockquote><blockquote><p>They are masters of producing minimum viable solutions in a diverse array of subjects. Some of these solutions never need to be replaced. The rest are viable until a full-time dedicated specialist is required.</p></blockquote><p>→ <a href="https://wildcardpeople.com/what-is-a-wildcard-person">https://wildcardpeople.com/what-is-a-wildcard-person</a></p><p>Believe I am a "wild card person", "Swiss army knife", "generalist", or "jack of all trades". The things listed under thrive, suffer, and need are exactly the points that make me thrive or suffer and what I need.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2022/mans-search-for-meaning-by-viktor-frankl/</guid><title>Man's Search for Meaning by Viktor Frankl</title><description>Man's Search for Meaning by Viktor Frankl</description><link>https://petercammeraat.net/journal/2022/mans-search-for-meaning-by-viktor-frankl/</link><pubDate>Wed, 21 Dec 2022 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>In the book, Frankl argues that the search for meaning is a fundamental human motivation and that finding meaning in one's life can provide a sense of purpose and hope, even in the face of extreme suffering and adversity. He developed his theory of meaning-seeking, called logotherapy, as a way to help people find meaning and purpose in their lives and to cope with suffering and adversity.</p><p>Frankl suggests that people can find meaning in their lives through three primary sources: their own personal experiences and relationships, their work and their values, and their attitude toward suffering and adversity. He also argues that people have the ability to choose their own attitude and response to suffering and adversity, and that this can be a source of meaning and hope.</p><blockquote><p>“Everything can be taken from a man but one thing: the last of the human freedoms—to choose one’s attitude in any given set of circumstances, to choose one’s own way.”</p></blockquote><blockquote><p>“So live as if you were living already for the second time and as if you had acted the first time as wrongly as you are about to act now!”</p></blockquote><blockquote><p>“Don’t aim at success. The more you aim at it and make it a target, the more you are going to miss it. For success, like happiness, cannot be pursued; it must ensue, and it only does so as the unintended side effect of one’s personal dedication to a cause greater than oneself or as the by-product of one’s surrender to a person other than oneself. Happiness must happen, and the same holds for success: you have to let it happen by not caring about it. I want you to listen to what your conscience commands you to do and go on to carry it out to the best of your knowledge. Then you will live to see that in the long-run—in the long-run, I say!—success will follow you precisely because you had forgotten to think about it”</p></blockquote><p>→ <a href="https://en.wikipedia.org/wiki/Man%27s_Search_for_Meaning">https://en.wikipedia.org/wiki/Man%27s<em>Search</em>for_Meaning</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2022/essentialism-by-greg-mckeown/</guid><title>Essentialism by Greg McKeown</title><description>Essentialism by Greg McKeown</description><link>https://petercammeraat.net/journal/2022/essentialism-by-greg-mckeown/</link><pubDate>Wed, 14 Dec 2022 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>In the book, McKeown argues that in order to lead a successful and fulfilling life, it is important to focus on the things that are truly essential and to eliminate distractions and unnecessary commitments. He suggests that by becoming an "essentialist," or someone who is disciplined in their pursuit of fewer but better things, we can make better choices, achieve greater clarity and impact, and live a more fulfilling life.</p><blockquote><p>“The life of an Essentialist is a life lived without regret. If you have correctly identified what really matters, if you invest your time and energy in it, then it is difficult to regret the choices you make. You become proud of the life you have chosen to live.”</p></blockquote><blockquote><p>“Sleep will enhance your ability to explore, make connections, and do less but better throughout your waking hours.”</p></blockquote><blockquote><p>“What do I feel deeply inspired by?” and “What am I particularly talented at?” and “What meets a significant need in the world?”</p></blockquote><p>→ <a href="https://gregmckeown.com/books/essentialism/">https://gregmckeown.com/books/essentialism/</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2022/sync-podcast-to-ipod/</guid><title>Sync podcasts to iPod</title><description>Sync podcasts to iPod. To my delight I discovered that syncing music and podcast still works.</description><link>https://petercammeraat.net/journal/2022/sync-podcast-to-ipod/</link><pubDate>Wed, 23 Nov 2022 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>So, <a href="../../2021/i-do-not-have-a-smartphone/">I do not have have a smartphone</a> anymore..</p><p>After a while I missed listening to music and podcasts; therefore, I bought an iPod Classic. To my delight I discovered that syncing music and podcast still works 😀 this is an excellent user experience of an old product that still works with the latest macOS version.</p><p>Download podcasts in the Apple Podcast app:</p><img src="../../../assets/images/journal/sync-podcasts-to-ipod/podcast-app.png "Podcast app"" alt="Podcast app"/><p>When you hookup an iPod it will appear in Finder, there you can sync podcasts with the iPod:</p><img src="../../../assets/images/journal/sync-podcasts-to-ipod/podcast-ipod-sync.png "Sync to iPod"" alt="Sync to iPod"/><p>To the Apple engineers that build iPod support into Finder, 🥳 thank you!</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2022/system-fonts-css/</guid><title>System Fonts CSS</title><description>System Fonts CSS. System fonts used on this website.</description><link>https://petercammeraat.net/journal/2022/system-fonts-css/</link><pubDate>Wed, 9 Nov 2022 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>System fonts used on this website:</p><pre><code><span class="splash-call">body</span> {
  font-family: -apple-system, <span class="splash-type">BlinkMacSystemFont</span>, 
  		<span class="splash-string">"Segoe UI"</span>, <span class="splash-string">"Droid Sans"</span>, <span class="splash-string">"Helvetica Neue"</span>;
}
</code></pre>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2022/permission-request-guidelines/</guid><title>Permission request guidelines</title><description>A good user experience for a permission request is important, because often permission request are the first thing the user sees. This can make or break the first impression about the app.</description><link>https://petercammeraat.net/journal/2022/permission-request-guidelines/</link><pubDate>Tue, 8 Nov 2022 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>A good user experience for a permission request is important, because often permission request are the first thing the user sees. This can make or break the first impression about the app. In this note I will outline how this experience can be improved.</p><h2>Why we request permission?</h2><p>I will let an hero of mine speak.</p><video class="video-shortcode" preload="auto" controls>
    <source src="https://petercammeraat.net/assets/videos/permission-request-guidelines/steve-jobs-about-privacy-and-permissions.mp4" type="video/mp4">
    There should have been a video here but your browser does not seem
    to support it.
</video><br/><small>Recorded during D8 Conference in 2010 and is an interview with Steve Jobs by Walt Mossberg and Kara Swisher.</small><br/><br/><p>Permission request exist to inform the user what data is used for what purpose in an application.</p><h2>Communicate rationale</h2><p>The best permission requests communicate the rationale for the request. In one study of 15 mobile apps they found that users were 12% more likely to grant a permission request when given the reason for the request. The most compelling reason resulted in an 81% increase in requests being accepted compared to the least compelling.</p><p>When users read a permission request; they ask themselves what benefit they get from granting this permission. and how much they trust the app to grant access.</p><p>Designers need to write understandable copy. Especially when communicating the rationale for unexpected permission requests. To avoid scaring users and help them understand why the app requires access.</p><p><strong>Examples</strong>:</p><p><em>Vague:</em> AppName would like to access your location for accommodation personalisation.</p><p><em>Clear:</em> AppName would like to access your location, so that you can quickly select accommodations near you.</p><p><em>Vague:</em> Allow AppName access to your camera for taking videos.</p><p><em>Clear:</em> Allow AppName access to your camera, so you can take videos in the app to share with family.</p><p>Not all permission requests are presented with a purpose string. Design pre alert screens so the rationale can be communicated to the users before a permission request appears.</p><blockquote><p>"<strong>Include only one button and make it clear that it opens the system alert.</strong> People can feel manipulated when a custom screen also includes a button that doesn’t open the alert because the experience diverts them from making their choice. Another type of manipulation is using a term like “Allow” to title the custom screen’s button. If the screen’s button seems similar in meaning and visual weight to the allow button in the alert, people can be more likely to choose the alert’s allow button without meaning to. Use a term like “Continue” or “Next” to title your custom screen’s single button, clarifying that its action is to open the system alert."</p></blockquote><p><em>-</em> Apple Human Interface Guidelines</p><h2>It is all about timing</h2><p>Permission requests asked in context are less likely to cause surprise. Users select an icon in the app or tap inside an address field, and the system reacts with a permission request. The context of the users’ action and timing of the permission request help them to reason about the meaning of the request.</p><p>Obstacles at the first time use can be overwhelming and confusing, first impressions are formed when users open an app for the first time. A better way is to ask only for core permissions upon the first launch. Ask for further permissions only when they are needed to offer the user extra functionality.</p><blockquote><p>“90% of permission prompts are dismissed or ignored”</p></blockquote><p><em>-</em> Chris Wilson at Chrome Dev summit in 2018</p><p>This happens because webdevelopers often ask for permission when the webpage finished loading. Asking in context instead of upfront increases the accepting percentages.</p><blockquote><p>"<strong>Request permission only when your app clearly needs access to the data or resource.</strong> It’s natural for people to be suspicious of a request for personal information or access to a device capability, especially if there’s no obvious need for it. Ideally, wait to request permission until people actually use an app feature that requires access. For example, you can use the location button to give people a way to share their location after they indicate interest in a feature that needs that information."</p></blockquote><p><em>-</em> Apple Human Interface Guidelines</p><h2>Permission denied</h2><blockquote><p>"No is a valid answer"</p></blockquote><p>Apps do not always need the permission they request to keep functioning. Location in a map app is very useful. To create directions the app needs a start and end point. Your location on the map makes it easy to have a start point. The app would function perfectly fine without a precise location.</p><p>Sometimes users initially deny access to a resource and then wish to reverse their decision.</p><p>Rather than reporting an error when users try to access a feature that relies on a denied permission. Clearly explain why that functionality cannot be used, and make it easier for them to give access.</p><p>Sometimes users do not mentally link a permission and a feature. Providing a message helps users to get the correct mental model of the application.</p><p>Provide a link to where they can grant the permission.</p><h2>Fine-grained control</h2><p>In the latest iOS 15 update multiple apps allow fine-grained control, on badges and banners. But also offer them in the app to give even more control to user.</p><p>Fine-grained control is not only used for notifications but you also see it being used for location access.</p><img src="../../../assets/images/journal/permission-request-guidelines/find-my-app.png "Find My app"" alt="Find My app"/><p>The Find My app is a good example. The app needs location access to see where my devices are. But the user can stop location data being used for the Share my location functionality of the app.</p><h2>Guidelines</h2><h4>Communicate</h4><ul><li>focus on user oriented benefits</li><li>inform user in pre alert screens</li><li>be transparent</li><li>use plain language</li><li>do not use jargon</li><li>do not manipulate</li></ul><h4>Timing</h4><ul><li>do not show all permission requests at once</li><li>do not request without providing value</li><li>avoid asking for permissions upfront</li><li>initiate permission request in context</li></ul><h4>Denied</h4><ul><li>fail gracefully</li><li>describe clearly why functionality is not working</li><li>button that opens the settings of the permission</li></ul><h4>Control</h4><ul><li>add fine-grained control when applicable</li></ul><h2>Sources</h2><ul><li><a href="https://developer.apple.com/design/human-interface-guidelines/patterns/accessing-private-data/">https://developer.apple.com/design/human-interface-guidelines/patterns/accessing-private-data/</a></li><li><a href="https://m2.material.io/design/platform-guidance/android-permissions.html#usage">https://m2.material.io/design/platform-guidance/android-permissions.html#usage</a></li><li><a href="https://dl.acm.org/doi/10.1145/2556288.2557400">https://dl.acm.org/doi/10.1145/2556288.2557400</a></li><li><a href="https://www.nngroup.com/articles/permission-requests/">https://www.nngroup.com/articles/permission-requests/</a></li><li><a href="https://uxplanet.org/getting-to-yes-best-practices-for-ios-permissions-dialogs-9d62892142cc">https://uxplanet.org/getting-to-yes-best-practices-for-ios-permissions-dialogs-9d62892142cc</a></li><li><a href="https://andrewchen.com/why-people-are-turning-off-push/">https://andrewchen.com/why-people-are-turning-off-push/</a></li><li><a href="https://stephaniewalter.design/blog/the-ultimate-guide-to-not-fck-up-push-notifications/">https://stephaniewalter.design/blog/the-ultimate-guide-to-not-fck-up-push-notifications/</a></li><li><a href="https://builtin.com/design-ux/push-notifications">https://builtin.com/design-ux/push-notifications</a></li></ul>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2022/hello-world/</guid><title>Hello World!</title><description>Hello World! In the coming months I am going to publish a lot of notes and links I collected over the years...</description><link>https://petercammeraat.net/journal/2022/hello-world/</link><pubDate>Tue, 1 Nov 2022 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>In the coming months I am going to publish a lot of notes and links I collected over the years, mainly about User Experience, Privacy, Apple, Books and Tech. I started storing this in 2006, so much content to go through before I can publish it. Probably will do year by year. This explains why "old" content will appear on my website.</p><pre><code><span class="splash-call">print</span>(<span class="splash-string">"Hello World"</span>)
</code></pre><blockquote><p>A "Hello, World!" program generally is a computer program that outputs or displays the message "Hello, World!". Such a program is very simple in most programming languages, and is often used to illustrate the basic syntax of a programming language. It is often the first program written by people learning to code. It can also be used as a sanity test to make sure that a computer language is correctly installed, and that the operator understands how to use it.</p></blockquote>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2022/baraye/</guid><title>Baraye</title><description>Baraye</description><link>https://petercammeraat.net/journal/2022/baraye/</link><pubDate>Mon, 31 Oct 2022 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>For a dance in the alley; For breaking the taboo of kissing in public; For our sisters, mine and yours; For a change in the minds of the fanatics; For father's shame for empty pockets; For the longing for a normal life; For the dreams of the dumpster kids; For this command economy; For this polluted air; For the dying Tehran's landmark trees; For the Persian cheetah (Pirouz) about to go extinct; For the unjustly banned street dogs, For these non-stop tears; For the loss of the downed passengers; For the faces that smile no more; For the school kids, for the future; For this forced road to paradise; For the jailed beautiful minds; For the neglected Afghan refugee kids; For this list that goes on and on; For these meaningless hostile chants; For the rubbles of the bribe-built houses; For feeling peace of mind; For the rise of sun after long-lasting nights; For the tranquilizers and insomnia; For man, homeland, prosperity; For the girl who wished she was a boy; For woman, life, freedom.</p></blockquote><p>→ <a href="https://en.wikipedia.org/wiki/Baraye">https://en.wikipedia.org/wiki/Baraye</a></p><p>→ <a href="https://www.youtube.com/watch?v=z8xXiqyfBg0">https://www.youtube.com/watch?v=z8xXiqyfBg0</a></p><p>A beautiful song that is now the soundtrack of the protests in Iran. I cried!</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2022/sound/</guid><title>Sound</title><description>Sound</description><link>https://petercammeraat.net/journal/2022/sound/</link><pubDate>Thu, 20 Oct 2022 05:00:00 +0200</pubDate><content:encoded><![CDATA[<blockquote><p>Invisible and relentless, sound is seemingly just there, traveling through our surroundings to carry beautiful music or annoying noises. In this article I’ll explain what sound is, how it’s created and propagated.</p></blockquote><blockquote><p>Throughout this presentation you will be hearing different sounds, which you will often play yourself on little keyboards like the one below. You can either click its keys with your mouse or use <code>W</code> <code>E</code> <code>R</code> keys on your computer keyboard, but before you do so make sure your system volume is at a reasonable level.</p></blockquote><blockquote><p>We’ll eventually understand how these sounds are created and how they get to your ears, but we have to start by talking about the medium that is most commonly associated with sound – air.</p></blockquote><p>→ <a href="https://ciechanow.ski/sound/">https://ciechanow.ski/sound/</a></p><p>Awesome explanation about Sound. I am a big fan of Bartosz Ciechanowski work, his explanations are clear and have cool interactive examples.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2022/the-midnight-library-by-matt-haig/</guid><title>The Midnight Library by Matt Haig</title><description>The main character, Nora Seed, finds herself in this library after attempting suicide. She is able to browse the books and see what her life could have been like...</description><link>https://petercammeraat.net/journal/2022/the-midnight-library-by-matt-haig/</link><pubDate>Sat, 18 Jun 2022 05:00:00 +0200</pubDate><content:encoded><![CDATA[<p>The main character, Nora Seed, finds herself in this library after attempting suicide. She is able to browse the books and see what her life could have been like if she had made different choices. As she explores the different versions of her life, she must ultimately decide which one she wants to live. It's a fiction book that explores the theme of regrets and opportunities, how the choices we make shape our lives and the power of second chances.</p><blockquote><p>“The only way to learn is to live.”</p></blockquote><blockquote><p>“A person was like a city. You couldn't let a few less desirable parts put you off the whole. There may be bits you don't like, a few dodgy side streets and suburbs, but the good stuff makes it worthwhile.”</p></blockquote><blockquote><p>“And that sadness is intrinsically part of the fabric of happiness. You can’t have one without the other. Of course, they come in different degrees and quantities. But there is no life where you can be in a state of sheer happiness for ever. And imagining there is just breeds more unhappiness in the life you’re in.”</p></blockquote><p>→ http://www.matthaig.com/books/midnight-library/</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2022/mechanical-watch/</guid><title>Mechanical Watch</title><description>Mechanical Watch</description><link>https://petercammeraat.net/journal/2022/mechanical-watch/</link><pubDate>Fri, 6 May 2022 05:00:00 +0200</pubDate><content:encoded><![CDATA[<blockquote><p>In the world of modern portable devices, it may be hard to believe that merely a few decades ago the most convenient way to keep track of time was a mechanical watch. Unlike their quartz and smart siblings, mechanical watches can run without using any batteries or other electronic components.</p></blockquote><blockquote><p>Over the course of this article I’ll explain the workings of the mechanism seen in the demonstration below. You can drag the device around to change your viewing angle, and you can use the slider to peek at what’s going on inside.</p></blockquote><p>→ <a href="https://ciechanow.ski/mechanical-watch/">https://ciechanow.ski/mechanical-watch/</a></p><p>Awesome explanation about the Mechanical Watch. I am a big fan of Bartosz Ciechanowski work, his explanations are clear and have cool interactive examples. Since I own a mechanical watch myself this article was extra interesting to me.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2022/sunsetting-quiet/</guid><title>Sunsetting Quiet</title><description>Sunsetting Quiet - Unfortunately the time has come to say goodbye to Quiet.</description><link>https://petercammeraat.net/journal/2022/sunsetting-quiet/</link><pubDate>Sun, 1 May 2022 05:00:00 +0200</pubDate><content:encoded><![CDATA[<p><em>Update 2023/01/19: <a href="https://petercammeraat.net/journal/2023/quiet-4-0-and-a-commitment/">Quiet 4.0 and a commitment</a></em></p><p>Dear Quiet user,</p><p>Unfortunately the time has come to say goodbye to Quiet. It served us all for almost 6 years. In that time I enjoyed the feedback you have given. I tried out multiple ways to make enough revenue to sustain the app without selling your data or show annoying ads. This however is really hard and did not work out in the end.</p><p>Quiet will be removed from the App Store on 1 June 2022. The app will still work after deletion from the App Store but can't be updated anymore.</p><p>My recommendations for replacing Quiet are <a href="https://nextdns.io">NextDNS</a> and <a href="https://obdev.at/products/littlesnitch/index.html">Little Snitch</a>.</p><p>Thank you for the time you have been a Quiet user.</p><p>Farewell,</p><p>Peter</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2022/gps/</guid><title>GPS</title><description>GPS</description><link>https://petercammeraat.net/journal/2022/gps/</link><pubDate>Fri, 21 Jan 2022 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>Global Positioning System is, without a doubt, one of the most useful inventions of the late 20th century. It made it significantly easier for ships, airplanes, cars, and hikers to figure out where they are with high degree of accuracy.</p></blockquote><blockquote><p>However, the satellites are just a part of what makes GPS possible. While I’ll discuss their motion in depth, over the course of this blog post I’ll also explain how the satellites help a GPS receiver determine where it is, and I’ll dive into the clever methods the system uses to make sure the signals sent all the way from space are reliably decoded on Earth.</p></blockquote><blockquote><p>We’ll start by creating a positioning system that can tell us where we are. Our initial approach will be quite simple, but we’ll step-by-step improve upon it to build an understanding of the positioning method used by GPS.</p></blockquote><p>→ <a href="https://ciechanow.ski/gps/">https://ciechanow.ski/gps/</a></p><p>Awesome explanation about GPS. I am a big fan of Bartosz Ciechanowski work, his explanations are clear and have cool interactive examples.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2021/ted-talks-of-2021/</guid><title>TED Talks of 2021</title><description>TED Talks of 2021</description><link>https://petercammeraat.net/journal/2021/ted-talks-of-2021/</link><pubDate>Fri, 31 Dec 2021 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>Better cybersecurity starts with honesty and accountability</h3><blockquote><p>Today, I'm going to talk about a shameful topic. This has happened to many of us, and it's embarrassing, but if we don't talk about it, nothing will ever change. It's about being hacked. Some of us have clicked on a phishing link and downloaded a computer virus. Some of us have had our identities stolen. And those of us who are software developers might have written insecure code with security bugs in it without realizing it. As a cybersecurity expert, I have worked with countless companies on improving their cybersecurity. Cybersecurity experts like me have advised companies on good cybersecurity practices, monitoring tools and proper user behaviors. But I actually see a much bigger problem that no tool can fix: the shame associated with the mistakes that we make.</p></blockquote><p>→ <a href="https://www.ted.com/talks/nadya_bartol_better_cybersecurity_starts_with_honesty_and_accountability/">https://www.ted.com/talks/nadya<em>bartol</em>better<em>cybersecurity</em>starts<em>with</em>honesty<em>and</em>accountability/</a></p><h3>How to escape the cynicism trap</h3><blockquote><p>I'm a psychologist and neuroscientist, and my whole career, I've studied the sunny side of human nature. My lab and I have found that giving away money activates similar parts of your brain as eating chocolate, and that helping other people through their stress calms our own. Our punch line is clear: there is good in us, and it does good for us.</p></blockquote><p>→ <a href="https://www.ted.com/talks/jamil_zaki_how_to_escape_the_cynicism_trap">https://www.ted.com/talks/jamil<em>zaki</em>how<em>to</em>escape<em>the</em>cynicism_trap</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2021/curves-and-surfaces/</guid><title>Curves and Surfaces</title><description>Curves and Surfaces</description><link>https://petercammeraat.net/journal/2021/curves-and-surfaces/</link><pubDate>Wed, 3 Nov 2021 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>From fonts to animated movies, curves and surfaces constitute fundamental building blocks of many geometrical designs. Over the course of this blog post I’ll explain how this model of a mask can be very smooth despite being described by a limited number of small points • that you can drag around to change the mask’s shape.</p></blockquote><blockquote><p>Throughout this article I’ll keep jumping back and forth between curves and surfaces to highlight how the ideas we develop for wiggly lines can be expanded onto three dimensional shells that we can shape.</p></blockquote><p>→ <a href="https://ciechanow.ski/curves-and-surfaces/">https://ciechanow.ski/curves-and-surfaces/</a></p><p>Awesome explanation about Curves and Surfaces. I am a big fan of Bartosz Ciechanowski work, his explanations are clear and have cool interactive examples.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2021/sunsetting-seckey/</guid><title>Sunsetting SecKey</title><description>Sunsetting SecKey. Unfortunately the time has come to say goodbye to SecKey. It served us all for almost 4 years.</description><link>https://petercammeraat.net/journal/2021/sunsetting-seckey/</link><pubDate>Fri, 1 Oct 2021 05:00:00 +0200</pubDate><content:encoded><![CDATA[<p>Dear SecKey user,</p><p>Unfortunately the time has come to say goodbye to SecKey. It served us all for almost 4 years. In that time I enjoyed the feedback you have given and also the donations given as a sign of appreciation. Times change, I am really busy with the app <a href="https://petercammeraat.net/projects/quiet/">Quiet</a>.</p><p>Also Apple has built in two factor authentication and one time password support into Keychain. Much better experience than SecKey can offer.</p><p>In this update I also added an Copy Secret button, which allows you to add the secret from the One Time Password to Apple Keychain or other One Time Passwords apps when you have not updated to iOS 15 or macOS 12 yet.</p><p>Every 10th launch of SecKey this message will be shown to remind you to move your one time passwords to Apple Keychain or another OTP app.</p><p>SecKey will be removed from the App Store on 1 November 2021. The app will still work after deletion from the App Store but can't be updated anymore.</p><p>Thank you for the time you have been a SecKey user.</p><p>Farewell,</p><p>Peter</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2021/naval-architecture/</guid><title>Naval Architecture</title><description>Naval Architecture</description><link>https://petercammeraat.net/journal/2021/naval-architecture/</link><pubDate>Thu, 29 Jul 2021 05:00:00 +0200</pubDate><content:encoded><![CDATA[<blockquote><p>When I first heard the term naval architecture I thought it was the artistic practice of designing beautiful boats. It turns out it’s a proper scientific discipline dedicated to the engineering of ships.</p></blockquote><blockquote><p>Over the course of this article we’ll go over different aspects of naval architecture. I’ll explain how ships are propelled, what makes them stay afloat, and how they’re carefully designed to not tip over even in dynamic conditions.</p></blockquote><blockquote><p>To understand why a ship rocks side-to-side in the wavy ocean waters, we first have to understand that it’s water itself that’s responsible for all of the ship’s behaviors. We’ll start with a simple device – a water-filled syringe.</p></blockquote><p>→ <a href="https://ciechanow.ski/naval-architecture/">https://ciechanow.ski/naval-architecture/</a></p><p>Awesome explanation about Naval Architecture. I am a big fan of Bartosz Ciechanowski work, his explanations are clear and have cool interactive examples.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2021/i-do-not-have-a-smartphone/</guid><title>I do not have a smartphone</title><description>I do not have a smartphone anymore. Sold my iPhone and bought an old dumb Nokia for 35 euros. Which also meant I had no use anymore for my smarthome devices, Apple Watch, and AirPods, so I sold them as well.</description><link>https://petercammeraat.net/journal/2021/i-do-not-have-a-smartphone/</link><pubDate>Thu, 24 Jun 2021 05:00:00 +0200</pubDate><content:encoded><![CDATA[<p>I do not have a smartphone anymore. Sold my iPhone and bought an old dumb Nokia for 35 euros.</p><p>Which also meant I had no use anymore for my smarthome devices, Apple Watch, and AirPods, so I sold them as well.</p><p>Bought a nice Swiss mechanical watch to replace the Apple Watch. The freedom of not having to charge your watch everyday (or ever really) is liberating.</p><h4>Why do you ask?</h4><p>I spend too much time on my phone and wanted to have more time to read, study, walk, and spending time with friends/family.</p><h5>Upsides</h5><ul><li>better for mental health</li><li>-1 addiction; because face it, we are addicted to smartphones</li><li>saves a lot of money, going from €40 to €7 per month makes a big difference</li><li>less data points for ad companies to track about me, so better for protecting my privacy</li><li>fear of missing out (fomo) will subside</li><li>instant reactions are not expected anymore</li><li>time to do the things you want to do</li></ul><h5>Downsides</h5><ul><li>do not have a camera handy</li><li>missing listing to music / podcasts</li><li>no maps app that guides me to my destination</li></ul><blockquote><p>I’ve been clean a year and a half now, and I’m doing fine. I get plenty of work, I don’t miss invitations, and I’m no longer scared of my own thoughts. These are not small victories in a world where constant communication isn’t just a convenient accessory – it’s a second skin. I got a landline and I got more sleep. I look people in the eye. I eat food instead of photographing it and am not driving half a ton of metal into oncoming traffic while looking down at a tiny screen. My business, social life, and personal safety have not evaporated overnight either. Turns out a basic internet connection and laptop is plenty of connectivity to keep friends informed, weekends fun and trains running on time.</p></blockquote><p><em>-</em> Jenna Woginrich in The Guardian</p><p>I will post in maybe a year from now how I experienced living without a smartphone.</p><p>Turns out using a dumbphone is like riding a bike; T9 is not nearly as bad as I’d remembered.</p><h4>I am not the only one</h4><ul><li><a href="https://www.irishtimes.com/life-and-style/health-family/how-and-why-i-got-rid-of-my-smartphone-1.4150057">https://www.irishtimes.com/life-and-style/health-family/how-and-why-i-got-rid-of-my-smartphone-1.4150057</a></li><li><a href="https://www.nytimes.com/2019/02/23/business/cell-phone-addiction.html">https://www.nytimes.com/2019/02/23/business/cell-phone-addiction.html</a></li><li><a href="https://www.independent.co.uk/news/long_reads/smartphone-get-rid-social-media-change-life-online-capitalism-internet-detox-control-a7910066.html">https://www.independent.co.uk/news/long_reads/smartphone-get-rid-social-media-change-life-online-capitalism-internet-detox-control-a7910066.html</a></li><li><a href="https://www.theguardian.com/technology/2016/feb/11/smartphone-technology-addiction-facebook-twitter">https://www.theguardian.com/technology/2016/feb/11/smartphone-technology-addiction-facebook-twitter</a></li><li><a href="https://www.huckmag.com/perspectives/reportage-2/why-more-young-people-are-ditching-their-smartphones/">https://www.huckmag.com/perspectives/reportage-2/why-more-young-people-are-ditching-their-smartphones/</a></li><li><a href="https://www.mattmcwilliams.com/get-rid-smartphone-reasons/">https://www.mattmcwilliams.com/get-rid-smartphone-reasons/</a></li><li><a href="https://everydaymamas.com/i-threw-out-my-smartphone-and-it-revolutionized-my-life/">https://everydaymamas.com/i-threw-out-my-smartphone-and-it-revolutionized-my-life/</a></li><li><a href="https://halftheclothes.com/life-without-smartphone/">https://halftheclothes.com/life-without-smartphone/</a></li><li><a href="https://www.alvarez.io/posts/living-like-its99/">https://www.alvarez.io/posts/living-like-its99/</a></li></ul>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2021/celebrating-five-years-of-quiet-and-a-note-on-our-exciting-future/</guid><title>Celebrating five years of Quiet, and a note on our exciting future</title><description>Celebrating five years of Quiet, and a note on our exciting future</description><link>https://petercammeraat.net/journal/2021/celebrating-five-years-of-quiet-and-a-note-on-our-exciting-future/</link><pubDate>Thu, 20 May 2021 05:00:00 +0200</pubDate><content:encoded><![CDATA[<p>As the world has become more and more digitally driven, it has never been easier to become distracted. Today, we have a whole world of possibilities and answers at our very fingertips. However, these possibilities can lead to distractions, and it can also lead to risks. From data tracking and harvesting to potentially dangerous and malicious platforms, our freedom to explore the web comes with potential threats.</p><h3>That is why, five years ago, we created Quiet.</h3><p>As an app aimed at trying to block dangerous, irritating, or otherwise time-consuming content on Safari for macOS and iOS, Quiet helps you to stay focused. Over the years, we have added various features to help us block access to social media platforms, social media sharing tools, comments, chat bubbles, notifications, cookies, and even Google Translate.</p><p>In short, Quiet looks to give you what you need – a more focused internet that removes the temptation of distraction. For five years, we have focused on the development of an easy to use application that makes the internet a safer place. Quiet also makes it easier to retain concentration on the matter at hand without being distracted by social media and other interactions that you don’t need at that moment.</p><p>Five years is a long time, and in that time, we have continued to add a gluttony of new features to Quiet. What started out as a simple social media blocking app has become a more focused product. Now, those ‘quick checks’ of Twitter or Facebook can come to an end – as can interactions with other annoying, time-consuming sub-features of websites. If you want to keep the internet quiet and stay focused on your task at hand, our app has provided the ideal blocker for five years.</p><h3>What does the future hold for Quiet?</h3><p>Of course, in the five years since our foundation we have seen the internet change forever. There is more to do, more options to explore, and more opportunities than ever before. That is why we are set to release Quiet 3.0 – a massive update for our app that adds even more features to the equation. New noise exists all the time on the web, so we look to counter the increasing risk of distraction by adding:</p><ul><li>Rules are updated in CloudKit, allowing for easier updates to be sent out in the future.</li><li>The opportunity to include your own bespoke links and URLs to block access to.</li><li>New rules for Analytics, Twitch, and Snapchat to help offer even more blocking.</li><li>Reporting of websites where the Hide filters are not applied or not applied correctly.</li><li>Mac app: Network Filters to help block rules system wide, not just in Safari.</li><li>Mac app: Automation managed in-app, with background checks for new updates.</li><li>iOS app: Shortcuts and background tasks running on iOS to help further expand automation and updating of rules.</li></ul><p>As you can see, Quiet 3.0 is going to offer the most diverse, powerful range of features yet. As we develop, so does the online world – and we want to stay ahead of the challenges faced online for everyone. If you want to make the internet a quiet place, come and join our users in making life a little more focused.</p><p>Our first five years have been incredible, with more features than ever expected at launch. In another five years, we hope to put even more power in your hands than any other blocking app!</p><p><a href="https://petercammeraat.net/projects/quiet/">Get Quiet today</a>, and enjoy an easier, safer, more focused browsing experience for years to come.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2021/how-quiet-network-filter-works/</guid><title>How Quiet Network Filter works</title><description>How Quiet Network Filter works. uiet Network Filter examines user network content on-device as it passes through the network stack and determines if that content should be blocked or allowed to pass on to its final destination.</description><link>https://petercammeraat.net/journal/2021/how-quiet-network-filter-works/</link><pubDate>Fri, 14 May 2021 05:00:00 +0200</pubDate><content:encoded><![CDATA[<p>Quiet Network Filter examines user network content on-device as it passes through the network stack and determines if that content should be blocked or allowed to pass on to its final destination.</p><p>Quiet Network Filter consists of two parts that work in close cooperation:</p><ul><li>Quiet app itself passes configuration information to the Quiet Network System Extension to allow that part to do its job.</li><li>Quiet Network System Extension receives user network content and examines that content to determine whether to block or allow it.</li></ul><p>This separation exists to guarantee user privacy. Quiet Network System Extension runs in a very restrictive sandbox that prevents user network content from escaping.</p><p>By combining these parts, Quiet Network Filter has access to the network but cannot use that access to export user network content.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2021/internal-combustion-engine/</guid><title>Internal Combustion Engine</title><description>Internal Combustion Engine</description><link>https://petercammeraat.net/journal/2021/internal-combustion-engine/</link><pubDate>Sat, 1 May 2021 05:00:00 +0200</pubDate><content:encoded><![CDATA[<blockquote><p>The invention of the internal combustion engine in the 19th century has revolutionized transportation over land, water, and air. Despite their omnipresence in modern day, the operation of an engine may be cryptic. Over the course of this article I’d like to explain the functionality of all the basic engine parts shown in the demonstration below.</p></blockquote><blockquote><p>It’s hard to talk about a mechanical device without visualizing its motion, so many demonstrations in this blog post are animated. An engine like this may seem complicated, but we will build it up from first principles. In fact, we’ll start with a significantly simpler way of generating a rotational motion.</p></blockquote><p>→ <a href="https://ciechanow.ski/internal-combustion-engine/">https://ciechanow.ski/internal-combustion-engine/</a></p><p>Awesome explanation about Internal Combustion Engine. I am a big fan of Bartosz Ciechanowski work, his explanations are clear and have cool interactive examples.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2021/seckey-2-0/</guid><title>SecKey 2.0</title><description>SecKey 2.0 - SecKey is rebuild from the ground up with SwiftUI - a new technology from Apple for building apps with a bright future in front of it.</description><link>https://petercammeraat.net/journal/2021/seckey-2-0/</link><pubDate>Thu, 28 Jan 2021 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>SecKey is rebuild from the ground up with SwiftUI - a new technology from Apple for building apps with a bright future in front of it. Rebuilding the app will make maintenance and adding new features a lot easier.</p><p>This results in an app that ready for the future. Less crash prone and more reliable on both macOS and iOS. Can not wait to see what is coming next to SecKey.</p><p>Also finally there is a visual countdown timer for every one time password.</p><p>Thank you for using <a href="../../../projects/seckey/">SecKey</a> and for all the feedback and support you have given :-)</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2020/ted-talks-of-2020/</guid><title>TED Talks of 2020</title><description>TED Talks of 2020</description><link>https://petercammeraat.net/journal/2020/ted-talks-of-2020/</link><pubDate>Thu, 31 Dec 2020 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>Inside the massive (and unregulated) world of surveillance tech</h3><blockquote><p>A few years ago, an American defense consultant I know told me about a trip he took to Uzbekistan. His role there was to help sell technology that the Uzbek government could use to spy on its own citizens. He eventually shared with me the marketing material he'd presented to the Uzbek government. One glossy brochure featured technology that could not just intercept phone calls, but identify the caller, regardless of what phone number they were using, based on their unique voiceprint, and then identify their exact geographic location.</p></blockquote><blockquote><p>And yet, tools of surveillance that an authoritarian regime could use to spy on its own citizens, on dissidents, on journalists, that, according to the US government today, is not a weapon. And yet, these tools of surveillance are part of a growing secretive multi-billion-dollar industry.</p></blockquote><blockquote><p>The Israeli-based company NSO Group has reportedly sold its technology to the regime in Saudi Arabia, which has been accused of harassing, and even, in one case, killing one of its political opponents. And we do think of weapons as things that kill people. But in the information age, some of the most powerful weapons are things that can track and identify us.</p></blockquote><p>→ <a href="https://www.ted.com/talks/sharon_weinberger_inside_the_massive_and_unregulated_world_of_surveillance_tech">https://www.ted.com/talks/sharon<em>weinberger</em>inside<em>the</em>massive<em>and</em>unregulated<em>world</em>of<em>surveillance</em>tech</a></p><h3>The future of digital communication and privacy</h3><blockquote><p>People send 100 billion WhatsApp messages every day -- and they're all encrypted to protect them from potentially curious entities like companies, governments and even WhatsApp itself. With our increased reliance on digital communication tools during the COVID-19 pandemic, our fundamental right to privacy is more important than ever, says Will Cathcart, head of WhatsApp. He describes the tech and protocols the company built to prevent encryption services from being misused to spread disinformation or commit crimes -- while still safeguarding privacy.</p></blockquote><p>→ <a href="https://www.ted.com/talks/will_cathcart_the_future_of_digital_communication_and_privacy">https://www.ted.com/talks/will<em>cathcart</em>the<em>future</em>of<em>digital</em>communication<em>and</em>privacy</a></p><h3>What tech companies know about your kids</h3><blockquote><p>I'm an anthropologist, and I'm also the mother of two little girls. And I started to become interested in this question in 2015 when I suddenly realized that there were vast -- almost unimaginable amounts of data traces that are being produced and collected about children. So I launched a research project, which is called Child Data Citizen, and I aimed at filling in the blank.</p></blockquote><blockquote><p>We have no knowledge or control over the ways in which those who buy, sell and process our data are profiling us and our children. But these profiles can come to impact our rights in significant ways.</p></blockquote><blockquote><p>But we need to abandon the belief that these technologies can objectively profile humans and that we can rely on them to make data-driven decisions about individual lives. Because they can't profile humans. Data traces are not the mirror of who we are. Humans think one thing and say the opposite, feel one way and act differently. Algorithmic predictions or our digital practices cannot account for the unpredictability and complexity of human experience.</p></blockquote><p>→ <a href="https://www.ted.com/talks/veronica_barassi_what_tech_companies_know_about_your_kids">https://www.ted.com/talks/veronica<em>barassi</em>what<em>tech</em>companies<em>know</em>about<em>your</em>kids</a></p><h3>What you need to know about face surveillance</h3><blockquote><p>So why do you do these things? My guess is, it's because you care about your privacy. The idea that privacy is dead is a myth. The idea that people don't care about their privacy because "they have nothing to hide" or they've done nothing wrong is also a myth. I'm guessing that you would not want to publicly share on the internet, for the world to see, all of your medical records. Or your search histories from your phone or your computer. And I bet that if the government wanted to put a chip in your brain to transmit every one of your thoughts to a centralized government computer, you would balk at that.</p></blockquote><blockquote><p>Nonetheless, we daily face a propaganda onslaught telling us that we have to give up some privacy in exchange for safety through surveillance programs. Face surveillance is the most dangerous of these technologies. There are two primary ways today governments use technologies like this. One is face recognition. That's to identify someone in an image. The second is face surveillance, which can be used in concert with surveillance-camera networks and databases to create records of all people's public movements, habits and associations, effectively creating a digital panopticon.</p></blockquote><blockquote><p>Just consider how trivial it would be for a government agency to put a surveillance camera outside a building where people meet for Alcoholics Anonymous meetings. They could connect that camera to a face-surveillance algorithm and a database, press a button and sit back and collect a record of every person receiving treatment for alcoholism. It would be just as easy for a government agency to use this technology to automatically identify every person who attended the Women's March or a Black Lives Matter protest. Even the technology industry is aware of the gravity of this problem.</p></blockquote><p>→ <a href="https://www.ted.com/talks/kade_crockford_what_you_need_to_know_about_face_surveillance">https://www.ted.com/talks/kade<em>crockford</em>what<em>you</em>need<em>to</em>know<em>about</em>face_surveillance</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2020/cameras-and-lenses/</guid><title>Cameras and Lenses</title><description>Cameras and Lenses</description><link>https://petercammeraat.net/journal/2020/cameras-and-lenses/</link><pubDate>Fri, 11 Dec 2020 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>Pictures have always been a meaningful part of the human experience. From the first cave drawings, to sketches and paintings, to modern photography, we’ve mastered the art of recording what we see.</p></blockquote><blockquote><p>Cameras and the lenses inside them may seem a little mystifying. In this blog post I’d like to explain not only how they work, but also how adjusting a few tunable parameters can produce fairly different results.</p></blockquote><blockquote><p>Over the course of this article we’ll build a simple camera from first principles. Our first steps will be very modest – we’ll simply try to take any picture. To do that we need to have a sensor capable of detecting and measuring light that shines onto it.</p></blockquote><p>→ <a href="https://ciechanow.ski/cameras-and-lenses/">https://ciechanow.ski/cameras-and-lenses/</a></p><p>Awesome explanation about Cameras and Lenses. I am a big fan of Bartosz Ciechanowski work, his explanations are clear and have cool interactive examples.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2020/apple-silicon-support/</guid><title>Apple Silicon Support</title><description>Apple Silicon Support. All my Mac apps have native support for Apple Silicon Macs.</description><link>https://petercammeraat.net/journal/2020/apple-silicon-support/</link><pubDate>Sat, 21 Nov 2020 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>All my Mac apps have native support for Apple Silicon Macs. From the following versions Apple Silicon is supported:</p><ul><li>Quiet 2.6.7</li><li>Internal Phone Numbers 1.2.2</li><li>SecKey 1.3.3</li><li>BrandBook 1.1.2</li></ul><h3>What is Apple Silicon?</h3><p>During WWDC 2020, Apple announced a plan to transition Mac computers to Apple-designed processors dubbed Apple Silicon, shifting away from the Intel CPUs that have been at the core of the Mac lineup since 2005.</p><p>In November 2020, Apple launched the first Macs with the brand new M1 chip - the MacBook Air, 13" MacBook Pro and Mac Mini.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2020/lights-and-shadows/</guid><title>Lights and Shadows</title><description>Lights and Shadows</description><link>https://petercammeraat.net/journal/2020/lights-and-shadows/</link><pubDate>Sat, 4 Jul 2020 05:00:00 +0200</pubDate><content:encoded><![CDATA[<blockquote><p>It’s hard to describe how paramount light is. Ultimately, it is the only thing we see. But just as important the presence of light is, so is its absence. To talk about light we have to start in darkness so let’s jump straight into it.</p></blockquote><blockquote><p>Light is a visible portion of electromagnetic radiation, but in this article I’m not going to discuss any of the underlying details like wave-particle duality. Instead, I’ll try to explain how light creates so many beautiful effects seen in everyday life. In the demonstration below you can use the sliders to control the position and size of a rectangular light source.</p></blockquote><p>→ <a href="https://ciechanow.ski/lights-and-shadows/">https://ciechanow.ski/lights-and-shadows/</a></p><p>Awesome explanation about Lights and Shadows. I am a big fan of Bartosz Ciechanowski work, his explanations are clear and have cool interactive examples.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2020/seckey-universal-purchases/</guid><title>SecKey moving to Universal Purchases</title><description>SecKey moving to Universal Purchases</description><link>https://petercammeraat.net/journal/2020/seckey-universal-purchases/</link><pubDate>Sat, 25 Apr 2020 05:00:00 +0200</pubDate><content:encoded><![CDATA[<p>First of all thank you for using SecKey all this time :-) I really appreciate the feedback you have given me and as always I will keep supporting and maintaining SecKey.</p><h3>What is Universal Purchases?</h3><blockquote><p>Distribute iOS, iPadOS, watchOS, macOS, and tvOS versions of your app as a universal purchase to let customers easily enjoy your app and in‑app purchases across platforms. They’ll only need to purchase once on the App Store. <a href="https://developer.apple.com/support/universal-purchase/">Learn</a> more...</p></blockquote><p>SecKey is available on macOS and iOS. They are seperate app records, those cannot be merged. I've looked in the App Store Connect Analytics section and the macOS version of the app has bigger user base than the iOS version. In order to enable universal purchase I have to remove the current version of SecKey from the iOS App Store. A consequence is that this version of the app can no longer be updated.</p><h3>What you need to do</h3><p>Download the new <a href="../../../projects/seckey/">SecKey</a> 1.2 from the App Store and remove the the current version of the App. No data will be lost in the transfer to the new app.</p><h3>But why?</h3><ul><li>For you it means you have "bought" the app once and have it available on all supported devices.</li><li>For me it is easier to maintain the app and less administration with each update.</li></ul>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2020/quiet-universal-purchases/</guid><title>Quiet moving to Universal Purchases</title><description>Quiet moving to Universal Purchases</description><link>https://petercammeraat.net/journal/2020/quiet-universal-purchases/</link><pubDate>Thu, 23 Apr 2020 05:00:00 +0200</pubDate><content:encoded><![CDATA[<p>First of all thank you for using Quiet all this time :-) I really appreciate the feedback you have given me and as always I will keep supporting and maintaining Quiet.</p><h3>What is Universal Purchases?</h3><blockquote><p>Distribute iOS, iPadOS, watchOS, macOS, and tvOS versions of your app as a universal purchase to let customers easily enjoy your app and in‑app purchases across platforms. They’ll only need to purchase once on the App Store. <a href="https://developer.apple.com/support/universal-purchase/">Learn</a> more...</p></blockquote><p>Quiet is available on macOS and iOS. They are seperate app records, those cannot be merged. I've looked in the App Store Connect Analytics section and the macOS version of the app has bigger user base than the iOS version. In order to enable universal purchase I have to remove the current version of Quiet from the iOS App Store. A consequence is that this version of the app can no longer be updated.</p><h3>What you need to do</h3><p>I will make Quiet free untill the end of April 2020 so you have plenty of time to get the new version from the App Store. If you didn't get it in time please email me.</p><p>Download the new <a href="https://petercammeraat.net/projects/quiet/">Quiet</a> 2.6 from the App Store and remove the the current version of the App.</p><h3>But why?</h3><ul><li>For you it means you have bought the app once and have it available on all supported devices.</li><li>Users that have bought Quiet on the Mac will get the iOS version free of charge.</li><li>Users that have bought Quiet on iOS also get the Mac version free of charge.</li><li>For me it is easier to maintain the app and less administration with each update.</li></ul>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2020/i-dont-care-what-google-or-apple-or-whomever-did/</guid><title>I Don’t Care What Google or Apple or Whoever Did</title><description>I Don’t Care What Google or Apple or Whoever Did</description><link>https://petercammeraat.net/journal/2020/i-dont-care-what-google-or-apple-or-whomever-did/</link><pubDate>Sat, 28 Mar 2020 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>It is not uncommon that I raise an accessibility or usability issue with a client’s design or implementation and am met with either “But Google does this,” or “But Apple does this.” Mostly it is the default response to any issue I raise, but it is far worse when it is a reaction to a genuine technical failure or problem real users have identified.</p></blockquote><blockquote><p>That response does not address the problem I may have raised. It avoids. It offloads responsibility. It declines to even try.</p></blockquote><p>→ <a href="https://adrianroselli.com/2020/03/i-dont-care-what-google-or-apple-or-whomever-did.html">https://adrianroselli.com/2020/03/i-dont-care-what-google-or-apple-or-whomever-did.html</a></p><p>Rant written by Adrian is worth reading. Just because <em>insert big tech company</em> does something means you can do it as well.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2020/gears/</guid><title>Gears</title><description>Gears</description><link>https://petercammeraat.net/journal/2020/gears/</link><pubDate>Sat, 15 Feb 2020 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>I’ve always been fascinated by mechanical gears. There is something captivating about the way their teeth come together to create a fluid, unified motion.</p></blockquote><blockquote><p>In this blog post I’d like to look at these simple machines up close. I’ll explain how gears affect the properties of rotational motion and how the shape of their teeth is way more sophisticated than it may initially seem. Movement is important in this article so most of the visualizations are animated – you can play and pause them by clicking on the button in their bottom left corner.</p></blockquote><p>→ <a href="https://ciechanow.ski/gears/">https://ciechanow.ski/gears/</a></p><p>Awesome explanation about Gears. I am a big fan of Bartosz Ciechanowski work, his explanations are clear and have cool interactive examples.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2020/the-5-am-club/</guid><title>The 5 AM Club by Robin Sharma</title><description>The 5 AM Club by Robin Sharma</description><link>https://petercammeraat.net/journal/2020/the-5-am-club/</link><pubDate>Sat, 11 Jan 2020 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>In the book Robin Sharma discusses the benefits of waking up at 5 AM and using the early morning hours for personal development and productivity. The book includes strategies and techniques for developing a successful morning routine, as well as stories and examples from successful individuals who have implemented this practice in their own lives. The idea is that the early hours of the day, before the distractions and demands of the day start, are the best time to focus on yourself and your goals.</p><blockquote><p>“Art feeds my soul. Great books battleproof my hope. Rich conversations magnify my creativity. Wonderful music uplifts my heart. Beautiful sights fortify my spirit.”</p></blockquote><blockquote><p>“All change is hard at first, messy in the middle and gorgeous at the end.”</p></blockquote><blockquote><p>“Limitation is nothing more than a mentality that too many good people practice daily until they believe it’s reality. It breaks my heart to see so many potentially powerful human beings stuck in a story about why they can’t be extraordinary, professionally and personally. You need to remember that your excuses are seducers, your fears are liars and your doubts are thieves.”</p></blockquote><p>→ <a href="https://www.robinsharma.com/book/the-5am-club">https://www.robinsharma.com/book/the-5am-club</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2019/ted-talks-of-2019/</guid><title>TED Talks of 2019</title><description>TED Talks of 2019</description><link>https://petercammeraat.net/journal/2019/ted-talks-of-2019/</link><pubDate>Tue, 31 Dec 2019 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>5 tips to improve your critical thinking</h3><blockquote><p>Every day, a sea of decisions stretches before us. Some are small and unimportant, but others have a larger impact on our lives. For example, which politician should I vote for? Should I try the latest diet craze? Or will email make me a millionaire? We're bombarded with so many decisions that it's impossible to make a perfect choice every time. But there are many ways to improve our chances, and one particularly effective technique is critical thinking.</p></blockquote><ol><li>formulate your question</li><li>gather your information</li><li>apply the information</li><li>consider the implications</li><li>explore other points of view</li></ol><p>→ <a href="https://www.ted.com/talks/samantha_agoos_5_tips_to_improve_your_critical_thinking">https://www.ted.com/talks/samantha<em>agoos</em>5<em>tips</em>to<em>improve</em>your<em>critical</em>thinking</a></p><h3>Everything around you can become a computer</h3><blockquote><p>Designer Ivan Poupyrev wants to integrate technology into everyday objects to make them more useful and fun -- like a jacket you can use to answer phone calls or a houseplant you can play like a keyboard. In a talk and tech demo, he lays out his vision for a physical world that's more deeply connected to the internet and shows how, with a little collaboration, we can get there.</p></blockquote><p>→ <a href="https://www.ted.com/talks/ivan_poupyrev_everything_around_you_can_become_a_computer">https://www.ted.com/talks/ivan<em>poupyrev</em>everything<em>around</em>you<em>can</em>become<em>a</em>computer</a></p><h3>It is not about privacy -- it is about power</h3><blockquote><p>The Facebook-Cambridge Analytica scandal is not about privacy -- it is about power, says journalist Carole Cadwalladr. In conversation with TED Global Curator Bruno Giussani, Cadwalladr discusses the latest on her reporting on the Facebook-Cambridge Analytica scandal -- and what we still don't know about the transatlantic links between Brexit and the 2016 US presidential election. "Who has the information, who has the data about you, that is where power now lies," Cadwalladr says.</p></blockquote><p>→ <a href="https://www.ted.com/talks/carole_cadwalladr_it_s_not_about_privacy_it_s_about_power">https://www.ted.com/talks/carole<em>cadwalladr</em>it<em>s</em>not<em>about</em>privacy<em>it</em>s<em>about</em>power</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2019/tesseract/</guid><title>Tesseract</title><description>Tesseract</description><link>https://petercammeraat.net/journal/2019/tesseract/</link><pubDate>Thu, 19 Dec 2019 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>A cube is one of the simplest solids one can imagine. Over the course of this article I’ll try to explain how to expand it to the next dimension to obtain a tesseract – a 4D equivalent of a cube.</p></blockquote><blockquote><p>The concept of a four dimensional cube may be a bit overwhelming, but by the time we’re done it should hopefully become more clear what the demonstration below is all about. You can drag the object around to view it from a different angle.</p></blockquote><p>→ <a href="https://ciechanow.ski/tesseract/">https://ciechanow.ski/tesseract/</a></p><p>Awesome explanation of Tesseract. I am a big fan of Bartosz Ciechanowski work, his explanations are clear and have cool interactive examples.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2019/earth-and-sun/</guid><title>Earth and Sun</title><description>Earth and Sun</description><link>https://petercammeraat.net/journal/2019/earth-and-sun/</link><pubDate>Sat, 19 Oct 2019 05:00:00 +0200</pubDate><content:encoded><![CDATA[<blockquote><p>The day-night cycle and the cycle of the seasons have been an important part of human civilization for millennia. Today the discoveries from centuries ago are well known, but despite the superficial simplicity of Earth revolving around its axis and orbiting the Sun, the interaction between those two actually forms a fairly complex system.</p></blockquote><blockquote><p>This blog post will talk about space and how our planet moves through it, so it’s only fitting if we embed ourselves in the cosmos itself.</p></blockquote><p>→ <a href="https://ciechanow.ski/earth-and-sun/">https://ciechanow.ski/earth-and-sun/</a></p><p>Good explanation of how the Earth and Sun movements work. I am a big fan of Bartosz Ciechanowski work.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2019/alpha-compositing/</guid><title>Alpha Compositing</title><description>Alpha Compositing</description><link>https://petercammeraat.net/journal/2019/alpha-compositing/</link><pubDate>Fri, 26 Jul 2019 05:00:00 +0200</pubDate><content:encoded><![CDATA[<blockquote><p>Transparency may not seem particularly exciting. The GIF image format which allowed some pixels to show through the background was published over 30 years ago. Almost every graphic design application released in the last two decades has supported the creation of semi-transparent content. The novelty of these concepts is long gone.</p></blockquote><blockquote><p>With this article I’m hoping to show you that transparency in digital imaging is actually much more interesting than it seems – there is a lot of invisible depth and beauty in something that we often take for granted.</p></blockquote><p>→ <a href="https://ciechanow.ski/alpha-compositing/">https://ciechanow.ski/alpha-compositing/</a></p><p>Good explanation about alpha compositing by Bartosz Ciechanowski.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2019/privacy-and-user-experience/</guid><title>Privacy and User Experience</title><description>Privacy and User Experience</description><link>https://petercammeraat.net/journal/2019/privacy-and-user-experience/</link><pubDate>Tue, 30 Apr 2019 05:00:00 +0200</pubDate><content:encoded><![CDATA[<h5>Common Concerns And Privacy In Web Forms</h5><blockquote><p>In the past, these topics could be spotted sporadically on the remote fringes of Twitter threads and blog posts. These days we’ve become very aware of the frightening dimensions that collection and use of personal data have gradually and silently gained. So we’ve started fighting back. Fighting back by publicly complaining about privacy-related dark patterns, unsolicited emails, shady practices, strict legal regulations, and ad-blocker wars against disruptive ads from hell. Of course, these are all important conversations to have and raising awareness is important; but we also need an applicable, pragmatic approach for designing and building ethical and respectful interfaces within our existing, well-established processes. We could use a few established patterns to bake in privacy-aware design decisions into our interfaces by default.</p></blockquote><p>→ <a href="https://www.smashingmagazine.com/2019/04/privacy-concerns-ux-web-forms/">https://www.smashingmagazine.com/2019/04/privacy-concerns-ux-web-forms/</a></p><h5>Better Cookie Consent Experiences</h5><blockquote><p>On top of that, many implementations don’t even respect users’ decisions anyway and set cookies despite their choices, assuming that most people will grant consent regardless. Admittedly, they aren’t entirely wrong. In our research, the vast majority of users willingly provide consent without reading the cookie notice at all. The reason is obvious and understandable: many customers expect that a website “probably wouldn’t work, or the content wouldn’t be accessible otherwise.” Of course, that’s not necessarily true, but users can’t know for sure unless they try it out. In reality, though, nobody wants to play ping-pong with the cookie consent prompt, and so they click the consent away by choosing the most obvious option: “OK.”</p></blockquote><p>→ <a href="https://www.smashingmagazine.com/2019/04/privacy-ux-better-cookie-consent-experiences/">https://www.smashingmagazine.com/2019/04/privacy-ux-better-cookie-consent-experiences/</a></p><h5>Better Notifications And Permission Requests</h5><blockquote><p>A brief glance at the screen is enough to have you breaking out in a sweat: you realize you’ve forgotten to charge your phone overnight, and it’s proudly running on its remaining 2% battery charge. As you rush down the street, full of hope and faith, you dim the brightness of the screen and hunt down the right app icon across the home screen. Of course, at that exact moment a slew of notifications cascades down your screen, asking for your undivided attention for new followers, updates, reminders, and messages.</p></blockquote><blockquote><p>Chances are high that you know way too well what this feels like. How likely are you to act on the cascading stack of notifications in that situation? And how likely are you turn off notifications altogether as another reminder reaches you a few minutes later, just when you missed your connection? That’s one of those situations when notifications are literally getting in a way in the most disruptive way possible, and despite all the thoroughly crafted user flows and polished, precious pixels.</p></blockquote><blockquote><p>We can’t deduce that one group of triggers is always more effective than another, but some notifications from every group tend to be much better at capturing attention than others: - People care more about new messages from close friends and relatives, notifications from selected colleagues during working hours, bank transactions and important alerts, calendar notifications, scheduled events, alarms, and any actionable and awaited confirmations or releases. - People care less about news updates, social feed updates, announcements, new features, crash reports, web notifications, informational and automated messages in general.</p></blockquote><p>→ <a href="https://www.smashingmagazine.com/2019/04/privacy-better-notifications-ux-permission-requests/">https://www.smashingmagazine.com/2019/04/privacy-better-notifications-ux-permission-requests/</a></p><h5>Privacy-Aware Design Framework</h5><blockquote><p>Of course, the scope of this series could stretch out much further, and we haven’t even looked into password recovery, in-app privacy settings design, floating chat windows and pop-ups, performance and accessibility considerations, or designing privacy experiences for the most vulnerable users — children, older people, and those with disadvantages. The critical point when making design decisions around privacy is always the same, though: we need to find a balance between strict business requirements and respectful design that helps users control their data and keep track of it, instead of harvesting all the information we can and locking customers into our service.</p></blockquote><blockquote><p>A good roadmap for finding that balance is adopting a privacy-first best-practice framework, known as Privacy by Design (PbD). Emerging in Canada back in the 1990s, it’s about anticipating, managing, and preventing privacy issues before a single line of code is written. With the EU’s data protection policy in place, privacy by design and data protection have become a default across all uses and applications. And that means many of its principles can be applied to ensure both GDPR-compliance and better privacy UX of your website or application.</p></blockquote><p>→ <a href="https://www.smashingmagazine.com/2019/04/privacy-ux-aware-design-framework/">https://www.smashingmagazine.com/2019/04/privacy-ux-aware-design-framework/</a></p><p>Good serie on privacy and user experience by Smashing Magazine. Worth the read!</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2019/color-spaces/</guid><title>Color Spaces</title><description>Color Spaces</description><link>https://petercammeraat.net/journal/2019/color-spaces/</link><pubDate>Thu, 21 Feb 2019 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>For the longest time we didn’t have to pay a lot of attention to the way we talk about color. The modern display technologies capable of showing more vivid shades have, for better or for worse, changed the rules of the game. Once esoteric ideas like a gamut or a color space are becoming increasingly important.</p></blockquote><blockquote><p>A color can be described in many different ways. We could use words, list amounts of CMYK printer inks, enumerate quite flawed HSL and HSV values, or even quantify the responses of cells in a human retina. Those notions are useful in some contexts, but I’m not going to focus on any of them.</p></blockquote><blockquote><p>This article is dedicated entirely to RGB values from RGB color spaces. It may seem fairly restrictive, but considering the domination of displays as the medium for color presentation, it is a pragmatic approach and it ultimately won’t prevent us from describing everything we can see.</p></blockquote><p>→ <a href="https://ciechanow.ski/color-spaces/">https://ciechanow.ski/color-spaces/</a></p><p>Good explanation about color spaces by Bartosz Ciechanowski.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2019/exposing-floating-point/</guid><title>Exposing Floating Point</title><description>Exposing Floating Point</description><link>https://petercammeraat.net/journal/2019/exposing-floating-point/</link><pubDate>Fri, 4 Jan 2019 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>Despite everyday use, floating point numbers are often understood in a hand-wavy manner and their behavior raises many eyebrows. Over the course of this article I’d like to show that things aren’t actually that complicated.</p></blockquote><blockquote><p>This blog post is a companion to my recently launched website – <a href="https://float.exposed">float.exposed</a>. Other than exploiting the absurdity of present day list of top level domains, it’s intended to be a handy tool for inspecting floating point numbers. While I encourage you to play with it, the purpose of many of its elements may be exotic at first. By the time we’ve finished, however, all of them will hopefully become familiar.</p></blockquote><blockquote><p>On a technical note, by floating point I’m referring to the ubiquitous IEEE 754 binary floating point format. Types <code>half</code>, <code>float</code>, and <code>double</code> are understood to be binary16, binary32, and binary64 respectively. There were other formats back in the day, but whatever device you’re reading this on is pretty much guaranteed to use IEEE 754.</p></blockquote><p>→ <a href="https://ciechanow.ski/exposing-floating-point/">https://ciechanow.ski/exposing-floating-point/</a></p><p>Good explanation about floating points by Bartosz Ciechanowski.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2018/ted-talks-of-2018/</guid><title>TED Talks of 2018</title><description>TED Talks of 2018</description><link>https://petercammeraat.net/journal/2018/ted-talks-of-2018/</link><pubDate>Mon, 31 Dec 2018 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>3 ways to make better decisions -- by thinking like a computer</h3><blockquote><p>I'm a computational cognitive scientist. I spend my time trying to understand how it is that human minds work, from our amazing successes to our dismal failures. To do that, I think about the computational structure of the problems that arise in everyday life, and compare the ideal solutions to those problems to the way that we actually behave. As a side effect, I get to see how applying a little bit of computer science can make human decision-making easier.</p></blockquote><p>→ <a href="https://www.ted.com/talks/tom_griffiths_3_ways_to_make_better_decisions_by_thinking_like_a_computer">https://www.ted.com/talks/tom<em>griffiths</em>3<em>ways</em>to<em>make</em>better<em>decisions</em>by<em>thinking</em>like<em>a</em>computer</a></p><h3>How data brokers sell your identity</h3><blockquote><p>This motley set of characteristics, attitudes, thoughts, and desires come very close to defining me as a person. It is also a precise and accurate description of what a group of companies I had never heard of, personal data trackers, had learned about me. My journey to uncover what data companies knew began in 2014, when I became curious about the murky world of data brokers, a multi-billion-pound industry of companies that collect, package, and sell detailed profiles of individuals based on their online and offline behaviours.</p></blockquote><blockquote><p>What I found out shocked me, and reinforced my anxieties about a profit-led system designed to log behaviours every time we interact with the connected world. I already knew about my daily records being collected by services such as Google Maps, Search, Facebook, or contactless credit card transactions. But you combine that with public information such as land registry, council tax, or voter records, along with my shopping habits and real-time health and location information, and these benign data sets begin to reveal a lot, such as whether you're optimistic, political, ambitious, or a risk-taker. Even as you're listening to me, you may be sedentary, but your smartphone can reveal your exact location, and even your posture. Your life is being converted into such a data package to be sold on. Ultimately, you are the product.</p></blockquote><p>→ <a href="https://www.ted.com/talks/madhumita_murgia_how_data_brokers_sell_your_identity">https://www.ted.com/talks/madhumita<em>murgia</em>how<em>data</em>brokers<em>sell</em>your_identity</a></p><h3>How the hyperlink changed everything</h3><blockquote><p>A hyperlink is an interface element, and what I mean by that is, when you're using software on your phone or your computer, there's a lot of code behind the interface that's giving all the instructions for the computer on how to manage it, but that interface is the thing that humans interact with: when we press on this, then something happens.</p></blockquote><blockquote><p>When they first came around, they were pretty simple and not particularly glamorous. Designers today have a huge range of options. The hyperlink uses what's called a markup language -- HTML. There's a little string of code. And then you put the address of where you want to send the person.</p></blockquote><p>→ <a href="https://www.ted.com/talks/margaret_gould_stewart_how_the_hyperlink_changed_everything">https://www.ted.com/talks/margaret<em>gould</em>stewart<em>how</em>the<em>hyperlink</em>changed_everything</a></p><h3>How the progress bar keeps you sane</h3><blockquote><p>The progress bar makes waiting more exciting... and mitigates our fear of death. Journalist Daniel Engber explores how it came into existence.</p></blockquote><blockquote><p>So if you have a progress bar that just moves at a constant rate -- let's say, that's really what's happening in the computer -- that will feel to people like it's slowing down. We get bored. Well, now you can start trying to enhance it and make it appear to move more quickly than it really is, make it move faster at the beginning, like a burst of speed. That's exciting, people feel like, "Oh! Something's really happening!" Then you can move back into a more naturalistic growth of the progress bar as you go along. You're assuming that people are focusing on the passage of time -- they're trying to watch grass grow, they're trying to watch a pot of water, waiting for it to boil, and you're just trying to make that less boring, less painful and less frustrating than it was before.</p></blockquote><p>→ <a href="https://www.ted.com/talks/daniel_engber_how_the_progress_bar_keeps_you_sane">https://www.ted.com/talks/daniel<em>engber</em>how<em>the</em>progress<em>bar</em>keeps<em>you</em>sane</a></p><h3>The case for a decentralised internet</h3><blockquote><p>The current internet we are using is about gatekeepers. If you want to reach something on the web, then you need to go through multiple middlemen. First, a domain name server, then a server hosting company, which usually points you to a third party, to a web hosting service. And this happens every time you want to reach a website on the web. But these gatekeepers are vulnerable to internet attacks and also makes the censorship and the surveillance easier. And the situation is getting worse. Everything is moving to the cloud, where the data is hosted by giant corporations. This move creates much, much more powerful middlemen.</p></blockquote><blockquote><p>And it's very easy to abuse this power. For example, last year, a CEO of a company that acts as a gatekeeper for nine million websites decided, after some public pressure, that one of the sites it manages, a far right page, should be blocked. He then sent an internal email to his coworkers. "This was an arbitrary decision. I woke up this morning in a bad mood and decided to kick them off the Internet." Even he admits, "No one should have this power." As a response, one of the employees asked him, "Is this the day the Internet dies?"</p></blockquote><blockquote><p>I don't think we are actually killing the internet, but I do think that we are in the middle of a kind of irresponsible centralization process that makes our internet more fragile. The decentralized, people-to-people web solves this problem by removing the central points, the web-hosting services. It empowers the users to have host sites they want to preserve.</p></blockquote><p>→ <a href="https://www.ted.com/talks/tamas_kocsis_the_case_for_a_decentralized_internet">https://www.ted.com/talks/tamas<em>kocsis</em>the<em>case</em>for<em>a</em>decentralized_internet</a></p><h3>The surveillance device you carry around all day</h3><blockquote><p>We make three mistakes: the first is underestimating the quantity of information that we produce every day; the second is depreciating the value of that information; and the third is thinking that our principal problem is a distant and super powerful agency that is called NSA. And it is true that NSA has the major access, better resources, the best tools, but they don't need any of that to spy on us, because we have everything there; we live in glass houses.</p></blockquote><blockquote><p>There are thousands of ways to be in the wrong place at the wrong time, and sometimes you don't even have to move. In Holland they had a census. It was a census that included religions with high devotion rates in the world. They wanted to know how many Protestants, Catholics, Jews they had to know how much money they had to put in each community, in each church or synagogue. What happened? When the Nazis came, they had their homework done. Only 10 percent of the Dutch Jews survived in the Second World War. If that database hadn't exist, the figures would've been very different. What I mean is that our problem isn't the NSA, neither our corrupt governments, neither ambitious companies that want to sell our data, neither bad people, and it has nothing to do with their intentions, nor with their bad intentions. The problem is that the very existence of that information makes us vulnerable in the ways that we can't anticipate right now.</p></blockquote><p>→ <a href="https://www.ted.com/talks/marta_peirano_the_surveillance_device_you_carry_around_all_day">https://www.ted.com/talks/marta<em>peirano</em>the<em>surveillance</em>device<em>you</em>carry<em>around</em>all_day</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2018/the-user-experience-of-chatbots/</guid><title>The User Experience of Chatbots</title><description>The User Experience of Chatbots</description><link>https://petercammeraat.net/journal/2018/the-user-experience-of-chatbots/</link><pubDate>Wed, 28 Nov 2018 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>Far from being ‘intelligent’, today’s chatbots guide users through simple linear flows, and our user research shows that they have a hard time whenever users deviate from such flows.</p></blockquote><blockquote><p>Some of our users were worried about sharing personal data such as birthday, address, credit-card numbers, and social-security numbers with interaction chatbots. They were not sure whether this data would stay private or would be shared with the platform in which the chatbot was built. In particular, in the case of Facebook Messenger, people seemed keenly aware of recent data breaches: “I am a little worried about putting my information in Facebook Messenger […] I would be hesitant to enter credit-card information; it would be nice to be able to enter it elsewhere.”</p></blockquote><blockquote><p>Companies are better off investing their money in the existing, well-established channels: improving the UX of your website or app will bring you higher return on investment than creating a chatbot that will get little use. We saw that even good chatbots (which are likely to require increased development and testing costs) have little chance of being discovered and considered useful.</p></blockquote><p>→ <a href="https://www.nngroup.com/articles/chatbots/">https://www.nngroup.com/articles/chatbots/</a></p><p>I absolutely hate chatbots! So much that I added a rule to <a href="https://petercammeraat.net/projects/quiet/">Quiet</a> to hide/block chatbots from websites.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2018/it-is-time-to-leave-the-facebook-universe/</guid><title>It is time to leave the Facebook universe!</title><description>It is time to leave the Facebook universe! All apps/services/products owned and/or operated by Facebook.</description><link>https://petercammeraat.net/journal/2018/it-is-time-to-leave-the-facebook-universe/</link><pubDate>Thu, 1 Nov 2018 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>What is the Facebook Universe?</h3><p>All apps/services/products owned and/or operated by Facebook.</p><ul><li>Facebook</li><li>FB Messenger</li><li>WhatsApp</li><li>Instagram</li><li>Onavo (VPN App for iOS and Android)</li><li>Oculus</li></ul><h3>Why I left the Facebook Universe?</h3><p>I left Facebook on 1 januari 2012. Never used Instagram and stopped using WhatsApp on 30 April 2017. I haven’t missed it for a second. Some people asked me why I don’t have Facebook / WhatsApp anymore. I have a few answers for them:</p><ol><li>It became clear that Facebook broke it’s promise. It promised it would not connect Facebook and WhatsApp. And would not use any WhatsApp data to improve their advertisement platform.</li><li>I spent too much time in WhatsApp, it became unhealthy.</li><li>I absolutely hated the group conversations, and you are kind of mandatory to be part of it and be responsive.</li><li>I hate the company Facebook and everything it stands for. I am principally against it.</li><li>Your data is used to sell more ads.</li><li>Cambridge Analytica used a lot of Facebook data to influence voters. It was not the only company that uses data to influence people.</li></ol><h3>Why you should leave too!</h3><p>In the last few weeks there is a lot of media coverage about Facebook. Founders of WhatsApp and Instagram left Facebook because they did not agree with Facebook management. Facebook was hacked and 50 million login details were leaked. It is using your phone number now for selling ads.</p><p>Below are 10 articles that are really interesting to read. It should open your eyes about the real cost of using Facebook and maybe it starts you thinking about your privacy!</p><h4>Facebook Is Giving Advertisers Access to Your Shadow Contact Information</h4><blockquote><p>“I think that many users don’t fully understand how ad targeting works today: that advertisers can literally specify exactly which users should see their ads by uploading the users’ email addresses, phone numbers, names+dates of birth, etc,” said Mislove. “In describing this work to colleagues, many computer scientists were surprised by this, and we’re even more surprised to learn that not only Facebook, but also Google, Pinterest, and Twitter all offer related services. Thus, we think there is a significant need to educate users about how exactly targeted advertising on such platforms works today.”</p></blockquote><p>→ <a href="https://gizmodo.com/facebook-is-giving-advertisers-access-to-your-shadow-co-1828476051">https://gizmodo.com/facebook-is-giving-advertisers-access-to-your-shadow-co-1828476051</a></p><h4>Exclusive: WhatsApp Cofounder Brian Acton Gives The Inside Story On #DeleteFacebook And Why He Left $850 Million Behind</h4><blockquote><p>“More than four years ago, Acton and his cofounder, Jan Koum, sold WhatsApp, which had relatively insignificant revenue, to Facebook for $22 billion, one of the most stunning acquisitions of the century. Ten months ago he left Facebook, saying he wanted to focus on a nonprofit. Then in March, as details of the Cambridge Analytica scandal oozed out, he sent a Tweet that quickly went viral and shocked his former employers, who had made him a billionaire many times over: “It is time. #deletefacebook.” No explanation followed. He hasn’t sent another Tweet since.”</p></blockquote><p>→ <a href="https://www.forbes.com/sites/parmyolson/2018/09/26/exclusive-whatsapp-cofounder-brian-acton-gives-the-inside-story-on-deletefacebook-and-why-he-left-850-million-behind/">https://www.forbes.com/sites/parmyolson/2018/09/26/exclusive-whatsapp-cofounder-brian-acton-gives-the-inside-story-on-deletefacebook-and-why-he-left-850-million-behind/</a></p><h4>Facebook’s New Message to WhatsApp: Make Money</h4><blockquote><p>“WhatsApp on Wednesday detailed plans to sell advertisements and charge big companies that use its service to interact with customers, launching its first major revenue streams as growth at Facebook’s main app is starting to decelerate.”</p></blockquote><p>→ <a href="https://www.wsj.com/articles/facebooks-new-message-to-whatsapp-make-money-1533139325">https://www.wsj.com/articles/facebooks-new-message-to-whatsapp-make-money-1533139325</a></p><h4>Hating Facebook</h4><blockquote><p>“I hate that, if I somehow don’t want to consign my personal data, beliefs, preferences, relationships, work history, daily plans, and private messages to a massive advertising corporation, I have to risk missing out on seminal life events. Not being on Facebook is sort of like not having a cellphone. Sure, me and a small number of weirdos can opt out, but we are increasingly disadvantaged by it. The disadvantage comes from the larger society relying more and more on such technologies. If even a small subset of your friends make heavy use of social media, you ARE missing out, and sometimes you can miss out on important life or death stuff.”</p></blockquote><p>→ <a href="https://web.archive.org/web/20190117001803/https://righteousruminations.blogspot.com/2015/06/hating-facebook.html">https://web.archive.org/web/20190117001803/https://righteousruminations.blogspot.com/2015/06/hating-facebook.html</a></p><h4>Achtung! Decentralize, decentralize, decentralize!</h4><blockquote><p>“I can hardly believe it, but the media is finally putting Facebook’s feet to the fire! No longer is it just the weird paranoid kids shouting at everyone to stop giving all of their information to these companies. We need to take this bull by the horns and drive it in a productive direction, and for that reason, it’s time to talk about decentralization, federation, and open source.”</p></blockquote><p>→ <a href="https://drewdevault.com/2018/03/24/Decentralize-decentralize-decentralize.html">https://drewdevault.com/2018/03/24/Decentralize-decentralize-decentralize.html</a></p><h4>Facebook apologizes for privacy breach with full-page newspaper ads</h4><blockquote><p>“Facebook isn’t just relying on TV appearances to apologize for its poor handling of Cambridge Analytica’s data sharing. The social network took out full-page apology ads in several major US and UK Sunday newspapers, including the New York Times, Wall Street Journal, Washington Post, Sunday Telegraph and Sunday Times. In each case, the ad included a missive from Mark Zuckerberg, who said he was “sorry” Facebook didn’t “do more” when it learned that Cambridge Analytica had harvested data on more than 50 million people without their permission.”</p></blockquote><p>→ <a href="https://www.engadget.com/2018-03-25-facebook-apologizes-for-privacy-breach-with-newspaper-ads.html">https://www.engadget.com/2018-03-25-facebook-apologizes-for-privacy-breach-with-newspaper-ads.html</a></p><h4>#deletefacebook</h4><blockquote><p>“Facebook is using us. It is actively giving away our information. It is creating an echo chamber in the name of connection. It surfaces the divisive and destroys the real reason we began using social media in the first place – human connection. — It is a cancer.”</p></blockquote><p>→ <a href="https://techcrunch.com/2018/03/19/deletefacebook/">https://techcrunch.com/2018/03/19/deletefacebook/</a></p><h4>Edward Snowden: Facebook is a surveillance company rebranded as ‘social media’</h4><blockquote><p>“Businesses that make money by collecting and selling detailed records of private lives were once plainly described as “surveillance companies.” Their rebranding as “social media” is the most successful deception since the Department of War became the Department of Defense.”</p></blockquote><p>→ <a href="https://web.archive.org/web/20190123021812/https://www.washingtonexaminer.com/news/edward-snowden-facebook-is-a-surveillance-company-rebranded-as-social-media">https://web.archive.org/web/20190123021812/https://www.washingtonexaminer.com/news/edward-snowden-facebook-is-a-surveillance-company-rebranded-as-social-media</a></p><h4>What Instagram users need to know about Facebook’s security breach</h4><blockquote><p>“Due to the nature of the hack, Facebook cannot rule out the fact that attackers may have also accessed any Instagram account linked to an affected Facebook account through Facebook Login. Still, it’s worth remembering that while Facebook can’t rule it out, the company has no evidence (yet) of this kind of activity.”</p></blockquote><p>→ <a href="https://techcrunch.com/2018/09/28/facebook-hack-instagram-facebook-login/">https://techcrunch.com/2018/09/28/facebook-hack-instagram-facebook-login/</a></p><h4>The Facebook hack affecting 50 million people also let the attackers access users’ Tinder, Spotify, and Instagram accounts</h4><blockquote><p>“So what happened? In short, the attackers found a way to trick Facebook into issuing them “access tokens” — basically, digital keys — that let them access other users’ accounts as if they were that user. After spotting some unusual activity earlier this month, Facebook realized what was going on on Tuesday evening and subsequently revoked these access tokens before disclosing the hack publicly on Friday — though not before 50 million people were affected.”</p></blockquote><p>→ <a href="https://www.businessinsider.com/facebook-hack-tinder-instagram-spotify-accounts-2018-9?r=DE&IR=T">https://www.businessinsider.com/facebook-hack-tinder-instagram-spotify-accounts-2018-9?r=DE&amp;IR=T</a></p><h3>Alternatives for Facebook Universe</h3><p><strong>Important messages / information</strong></p><p>For important stuff you should use the most used platform there is. Email. Because everyone has email and there are always people that do not use the latest social media website.</p><p><strong>WhatsApp + FB Messenger</strong></p><ul><li><a href="https://support.apple.com/en-gb/HT207006">iMessage</a> (macOS and iOS)</li><li><a href="https://www.signal.org">Signal</a> (macOS, iOS, Windows, Linux and Android)</li><li><a href="https://www.telegram.org">Telegram</a> (macOS, iOS, Windows, Linux, Web and Android)</li><li><a href="https://wire.com">Wire</a> (macOS, iOS, Windows, Linux, Web and Android)</li></ul><p><strong>Instagram</strong></p><ul><li><a href="https://steller.co">Steller</a> (iOS, Web and Android)</li><li><a href="https://ello.co">Ello</a> (iOS, Web and Android)</li><li><a href="https://500px.com">500px</a> (iOS, Web and Android)</li></ul><p><strong>Groups</strong></p><ul><li><a href="https://slack.com">Slack</a> (macOS, iOS, Windows, Web, Linux and Android)</li><li><a href="https://yammer.com">Yammer</a> (macOS, iOS, Windows, Web, Linux and Android)</li><li>All the texting platforms</li></ul><p><strong>Pages</strong></p><ul><li>Every company that has a Facebook page should also have a website. With exactly the same information on it. If you do not have it, you as a business are not serving your non facebook users.</li><li>A website will cost like 50 euro a year, to keep it up and running.</li><li>Limiting your company information to be in one closed environment is really bad.</li></ul><h3>How to delete Facebook?</h3><ol><li>Download all the data Facebook has of you.<ul><li>Go to the top right of Facebook.</li><li>Click Settings.</li><li>Click Your Facebook Information.</li><li>Go to Download Your Information and click View.</li><li>To add or remove categories of data from your request, click the boxes on the right side of Facebook.</li><li>Select other options, including: The format of your download request. The quality of photos, videos and other media. A specific date range of information. If you don’t select a date range, you’ll request all the information for the categories you’ve selected.</li><li>Click Create File to confirm the download request.</li><li>After you’ve made a download request, it will appear as Pending in the Available Files section of the Download Your Information Tool. It may take several days for us to finish preparing your download request 2. Post a message explaining why you delete your Facebook account 3. Wait for 48 hours, so everyone has a change to read your message 4. Delete your Facebook account</li><li>Head to Facebook’s <a href="https://www.facebook.com/help/delete_account">Delete Account page</a></li><li>Select Delete My Account 5. Do not login for 30 days</li><li>Otherwise your account is activated again</li><li>It can take 90 days before your account is removed from all Facebook systems</li></ul></li></ol><h3>How to delete Instagram?</h3><ol><li>Download all the data Instagram has of you<ul><li>Go to instagram.com.</li><li>Click on the gear icon next to your Edit Profile option and select Privacy and Security.</li><li>Scroll down to Data Download.</li><li>Click Request Download.</li><li>Type in your email address if it doesn’t automatically pop up, then click Next.</li><li>Enter your password and click Request Download. 2. Post a message explaining why you delete your Instagram account 3. Wait for 48 hours, so everyone has a change to read your message 4. Delete your Instagram account</li><li>Head to Instagram’s <a href="https://www.instagram.com/accounts/login/?next=%2Faccounts%2Fremove%2Frequest%2Fpermanent%2F">Delete Account page</a></li><li>Login with your account details</li><li>Select ‘Privacy concerns’ at “Why are you deleting your account?”</li><li>Re-enter password</li><li>Permanently delete my account</li></ul></li></ol><h3>How to delete WhatsApp?</h3><ol><li>Download all the data WhatsApp has of you<ul><li>Go to Settings &gt; Account</li><li>Request info on my account.</li><li>Could take between 1-3 days to complete</li><li>Once you receive the report, download it. You’ll then have a .ZIP file in your hands. 2. Post a message explaining why you delete your WhatsApp account 3. Wait for 48 hours, so everyone has a change to read your message 4. Delete your WhatsApp account</li><li>Open WhatsApp</li><li>Tap the Menu Button &gt; Settings &gt; Account &gt; Delete my account.</li><li>Enter your phone number in full international format and tap Delete my account.</li></ul></li></ol><h3>Block Facebook in the browser</h3><p>With <a href="https://petercammeraat.net/projects/quiet/">Quiet</a> you can block Facebook in Safari. This blocks/removes all the like buttons and tracking scripts from Facebook.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2018/experience-rot/</guid><title>Experience Rot</title><description>Experience Rot</description><link>https://petercammeraat.net/journal/2018/experience-rot/</link><pubDate>Sun, 12 Aug 2018 05:00:00 +0200</pubDate><content:encoded><![CDATA[<blockquote><p>Here’s a counter-intuitive fact: Chances are all those features you’ve been adding to your design are hurting your user experience. Every feature that’s squeezed in, in the name of giving your design a competitive edge, has been making your design less competitive.</p></blockquote><blockquote><p>Welcome to the effects of <strong>Experience Rot</strong>. As you add features, you’re adding complexity to the design, and decreasing the quality of the experience.</p></blockquote><blockquote><p>Steve Jobs once said, “You have to pick carefully. I’m actually as proud of the things we haven’t done as the things I have done. Innovation is saying ‘no’ to 1,000 things.”</p></blockquote><p>→ <a href="https://articles.uie.com/experience_rot/">https://articles.uie.com/experience_rot/</a></p><p>I wholeheartedly agree with this article. Absolutely worth the read and makes you think about the next feature you want to add.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2018/food-rules-by-michael-pollan/</guid><title>Food Rules by Michael Pollan</title><description>Food Rules by Michael Pollan</description><link>https://petercammeraat.net/journal/2018/food-rules-by-michael-pollan/</link><pubDate>Fri, 23 Mar 2018 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>The book presents a set of simple, easy-to-follow rules for eating well and avoiding processed foods. The rules are based on traditional diets and aim to help readers navigate the modern food landscape. The book is divided into three sections: "What should I eat?" "What kind of food should I eat?" and "How should I eat?" and it's goal is to give people a simple and practical guide to eating healthy.</p><blockquote><p>“Don’t eat anything your great-grandmother wouldn’t recognize as food.”</p></blockquote><blockquote><p>“...There's a lot of money in the Western diet. The more you process any food, the more profitable it becomes. The healthcare industry makes more money treating chronic diseases (which account for three quarters of the $2 trillion plus we spend each year on health care in this country) than preventing them. ”</p></blockquote><blockquote><p>“What an extraordinary achievement for a civilization: to have developed the one diet that reliably makes its people sick!”</p></blockquote><p>→ <a href="https://michaelpollan.com/books/food-rules/">https://michaelpollan.com/books/food-rules/</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2017/ted-talks-of-2017/</guid><title>TED Talks of 2017</title><description>TED Talks of 2017</description><link>https://petercammeraat.net/journal/2017/ted-talks-of-2017/</link><pubDate>Sun, 31 Dec 2017 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>The 4 superpowers of design</h3><blockquote><p>Design veteran Kevin Bethune argues that designers' talents are often undervalued in business. He says that all designers have four key superpowers: x-ray vision, shapeshifting, extrasensory perception (ESP) and the ability to make others superhuman. Sound unbelievable? Watch and learn what can happen when designers are given space in the workplace to thrive and grow.</p></blockquote><p>→ <a href="https://www.ted.com/talks/kevin_bethune_the_4_superpowers_of_design">https://www.ted.com/talks/kevin<em>bethune</em>the<em>4</em>superpowers<em>of</em>design</a></p><h3>The human insights missing from big data</h3><blockquote><p>Well, we have a new oracle, and it's name is big data, or we call it "Watson" or "deep learning" or "neural net." And these are the kinds of questions we ask of our oracle now, like, "What's the most efficient way to ship these phones from China to Sweden?" Or, "What are the odds of my child being born with a genetic disorder?" Or, "What are the sales volume we can predict for this product?"</p></blockquote><blockquote><p>Now, despite the size of this industry, the returns are surprisingly low. Investing in big data is easy, but using it is hard. Over 73 percent of big data projects aren't even profitable, and I have executives coming up to me saying, "We're experiencing the same thing. We invested in some big data system, and our employees aren't making better decisions. And they're certainly not coming up with more breakthrough ideas."</p></blockquote><blockquote><p>You have to keep in mind, iPhones had just come out, it was 2009, so this was, like, eight years ago, and Androids had just started looking like iPhones. And a lot of very smart and realistic people said, "Those smartphones -- that's just a fad. Who wants to carry around these heavy things where batteries drain quickly and they break every time you drop them?" But I had a lot of data, and I was very confident about my insights, so I was very excited to share them with Nokia. But Nokia was not convinced, because it wasn't big data. They said, "We have millions of data points, and we don't see any indicators of anyone wanting to buy a smartphone, and your data set of 100, as diverse as it is, is too weak for us to even take seriously." And I said, "Nokia, you're right. Of course you wouldn't see this, because you're sending out surveys assuming that people don't know what a smartphone is, so of course you're not going to get any data back about people wanting to buy a smartphone in two years. Your surveys, your methods have been designed to optimize an existing business model, and I'm looking at these emergent human dynamics that haven't happened yet. We're looking outside of market dynamics so that we can get ahead of it." Well, you know what happened to Nokia? Their business fell off a cliff. This -- this is the cost of missing something. It was unfathomable.</p></blockquote><p>→ <a href="https://www.ted.com/talks/tricia_wang_the_human_insights_missing_from_big_data">https://www.ted.com/talks/tricia<em>wang</em>the<em>human</em>insights<em>missing</em>from<em>big</em>data</a></p><h3>Using corporate data to improve our lives</h3><blockquote><p>Technology researcher Stefaan Verhulst thinks there might be a potential silver lining to the fact that corporations will collect all our data until the end of time. Citing examples like Twitter helping to data-map flooding in Indonesia and Uber helping Boston plan public transportation, Verhulst explains how corporations can serve the public interest and unleash insights while also protecting privacy.</p></blockquote><p>→ <a href="https://www.ted.com/talks/stefaan_verhulst_using_corporate_data_to_improve_our_lives">https://www.ted.com/talks/stefaan<em>verhulst</em>using<em>corporate</em>data<em>to</em>improve<em>our</em>lives</a></p><h3>Why our screens make us less happy</h3><blockquote><p>What are our screens and devices doing to us? Psychologist Adam Alter studies how much time screens steal from us and how they're getting away with it. He shares why all those hours you spend staring at your smartphone, tablet or computer might be making you miserable -- and what you can do about it.</p></blockquote><p>→ <a href="https://www.ted.com/talks/adam_alter_why_our_screens_make_us_less_happy">https://www.ted.com/talks/adam<em>alter</em>why<em>our</em>screens<em>make</em>us<em>less</em>happy</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2016/ted-talks-of-2016/</guid><title>TED Talks of 2016</title><description>TED Talks of 2016</description><link>https://petercammeraat.net/journal/2016/ted-talks-of-2016/</link><pubDate>Sat, 31 Dec 2016 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>A delightful way to teach kids about computers</h3><blockquote><p>Computer code is the next universal language, and its syntax will be limited only by the imaginations of the next generation of programmers. Linda Liukas is helping to educate problem-solving kids, encouraging them to see computers not as mechanical, boring and complicated but as colorful, expressive machines meant to be tinkered with. In this talk, she invites us to imagine a world where the Ada Lovelaces of tomorrow grow up to be optimistic and brave about technology and use it to create a new world that is wonderful, whimsical and a tiny bit weird.</p></blockquote><p>→ <a href="https://www.ted.com/talks/linda_liukas_a_delightful_way_to_teach_kids_about_computers">https://www.ted.com/talks/linda<em>liukas</em>a<em>delightful</em>way<em>to</em>teach<em>kids</em>about_computers</a></p><h3>How better tech could protect us from distraction</h3><blockquote><p>How often does technology interrupt us from what we really mean to be doing? At work and at play, we spend a startling amount of time distracted by pings and pop-ups -- instead of helping us spend our time well, it often feels like our tech is stealing it away from us. Design thinker Tristan Harris offers thoughtful new ideas for technology that creates more meaningful interaction. He asks: "What does the future of technology look like when you're designing for the deepest human values?"</p></blockquote><p>→ <a href="https://www.ted.com/talks/tristan_harris_how_better_tech_could_protect_us_from_distraction">https://www.ted.com/talks/tristan<em>harris</em>how<em>better</em>tech<em>could</em>protect<em>us</em>from_distraction</a></p><h3>Why we must protect the digital rights of children</h3><blockquote><p>On any given day, the rights of millions of children are routinely ignored as they are surveilled, exploited and manipulated by private entities via their digital interactions. Filmmaker and activist Baroness Beeban Kidron makes the case that the rights enshrined by the United Nations Convention on the Rights of the Child should extend to the digital realm. To this end, she lays out the framework of 5rights, the initiative she founded to deliver children's rights online.</p></blockquote><p>→ <a href="https://www.ted.com/talks/baroness_beeban_kidron_why_we_must_protect_the_digital_rights_of_children">https://www.ted.com/talks/baroness<em>beeban</em>kidron<em>why</em>we<em>must</em>protect<em>the</em>digital<em>rights</em>of_children</a></p><h3>Your smartphone is a civil rights issue</h3><blockquote><p>Apple has built security features into its mobile products which protect data on its devices from everyone but the owner. That means that criminals, hackers and yes, even governments are all locked out. For Apple's customers, this is a great thing. But governments are not so happy. You see, Apple has made a conscious decision to get out of the surveillance business. Apple has tried to make surveillance as difficult as possible for governments and any other actors.</p></blockquote><blockquote><p>We must remember that surveillance is a tool. It's a tool used by those in power against those who have no power. And while I think it's absolutely great that companies like Apple are making it easy for people to encrypt, if the only people who can protect themselves from the gaze of the government are the rich and powerful, that's a problem. And it's not just a privacy or a cybersecurity problem. It's a civil rights problem.</p></blockquote><p>→ <a href="https://www.ted.com/talks/christopher_soghoian_your_smartphone_is_a_civil_rights_issue">https://www.ted.com/talks/christopher<em>soghoian</em>your<em>smartphone</em>is<em>a</em>civil<em>rights</em>issue</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2016/superintelligence/</guid><title>Superintelligence: The Idea That Eats Smart People</title><description>Superintelligence: The Idea That Eats Smart People</description><link>https://petercammeraat.net/journal/2016/superintelligence/</link><pubDate>Tue, 27 Dec 2016 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>Today we're building another world-changing technology, machine intelligence. We know that it will affect the world in profound ways, change how the economy works, and have knock-on effects we can't predict. But there's also the risk of a runaway reaction, where a machine intelligence reaches and exceeds human levels of intelligence in a very short span of time.</p></blockquote><blockquote><p>At that point, social and economic problems would be the least of our worries. Any hyperintelligent machine (the argument goes) would have its own hypergoals, and would work to achieve them by manipulating humans, or simply using their bodies as a handy source of raw materials. Last year, the philosopher Nick Bostrom published Superintelligence, a book that synthesizes the alarmist view of AI and makes a case that such an intelligence explosion is both dangerous and inevitable given a set of modest assumptions.</p></blockquote><p>→ <a href="https://idlewords.com/talks/superintelligence.htm">https://idlewords.com/talks/superintelligence.htm</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2016/why-i-developed-fletta/</guid><title>Why I developed Fletta?</title><description>Why I developed Fletta? I work part time in one of the biggest hotels of Amsterdam at the reception desk where peoples with various profiles including tourists and business delegation are visiting. Although there is a big diversity in the profession of the hotel visitors, they have one thing in common; they all need to print their boarding passes and find information on the internet.</description><link>https://petercammeraat.net/journal/2016/why-i-developed-fletta/</link><pubDate>Tue, 5 Jan 2016 05:00:00 +0100</pubDate><content:encoded><![CDATA[<p>I work part time in one of the biggest hotels of Amsterdam at the reception desk where peoples with various profiles including tourists and business delegation are visiting. Although there is a big diversity in the profession of the hotel visitors, they have one thing in common; they all need to print their boarding passes and find information on the internet.</p><p>In order to provide better customer experience, we decided to install iPads on a large table in the lobby with a printer connected to them, and let our guests use them for free. Everyone liked the idea and the setup got a big popularity. The guests were using the whole setup for printing tickets, boarding passes, and other documents.</p><p>Later we found that our guests started using our iPads to connect with their friends and families through Facebook, Twitter, and email. Because of the lazy nature of people, they usually left the iPads with their accounts logged-in; they just forget to log off their accounts. This gave the receptionists another duty, to cross check iPads for already logged-in accounts and if found log out of them</p><p>This gave me the idea of developing a browser that automatically erases history and login details after a certain time. Of course, there should be the option to print documents as well as erase personal data manually. And tada Fletta 1 was born.</p><p>One year later the hotel introduced the idea of displaying bookmarks to our hotel visitors so they can be provided with useful links such as train and metro schedules, excursion booking portals, and more. This gave me an opportunity to rewrite Fletta.</p><p>Fletta 2 is written in Swift (an intuitive programming language for iOS, OS X, and watchOS), which enables me to use the latest technologies which Apple provides in iOS.</p><p>Result: <a href="../../../projects/fletta/">Fletta</a> is twice as fast and has less errors. And with the new bookmark feature</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2016/the-website-obesity-crisis/</guid><title>The Website Obesity Crisis</title><description>The Website Obesity Crisis</description><link>https://petercammeraat.net/journal/2016/the-website-obesity-crisis/</link><pubDate>Sun, 3 Jan 2016 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>In conversations with web performance advocates, I sometimes feel like a hippie talking to SUV owners about fuel economy. They have all kinds of weirdly specific tricks to improve mileage. Deflate the front left tire a little bit. Put a magnet on the gas cap. Fold in the side mirrors. Most of the talk about web performance is similarly technical, involving compression, asynchronous loading, sequencing assets, batching HTTP requests, pipelining, and minification. All of it obscures a simpler solution. If you're only going to the corner store, ride a bicycle. If you're only displaying five sentences of text, use vanilla HTML. Hell, serve a textfile! Then you won't need compression hacks, integral signs, or elaborate Gantt charts of what assets load in what order. Browsers are really, really good at rendering vanilla HTML. We have the technology.</p></blockquote><p>→ <a href="https://idlewords.com/talks/website_obesity.htm">https://idlewords.com/talks/website_obesity.htm</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2015/ted-talks-of-2015/</guid><title>TED Talks of 2015</title><description>TED Talks of 2015</description><link>https://petercammeraat.net/journal/2015/ted-talks-of-2015/</link><pubDate>Thu, 31 Dec 2015 05:00:00 +0100</pubDate><content:encoded><![CDATA[<h3>The way we think about work is broken</h3><blockquote><p>You may be asking yourselves that very question. Now, I know of course, we have to make a living, but nobody in this room thinks that that's the answer to the question, "Why do we work?" For folks in this room, the work we do is challenging, it's engaging, it's stimulating, it's meaningful. And if we're lucky, it might even be important.</p></blockquote><blockquote><p>So, we wouldn't work if we didn't get paid, but that's not why we do what we do. And in general, I think we think that material rewards are a pretty bad reason for doing the work that we do. When we say of somebody that he's "in it for the money," we are not just being descriptive.</p></blockquote><p>→ <a href="https://www.ted.com/talks/barry_schwartz_the_way_we_think_about_work_is_broken">https://www.ted.com/talks/barry<em>schwartz</em>the<em>way</em>we<em>think</em>about<em>work</em>is_broken</a></p><h3>Think your email is private? Think again</h3><blockquote><p>Now, many of us probably think, well, one email, there's nothing in there, right? But if you consider a year's worth of emails, or maybe even a lifetime of email, collectively, this tells a lot. It tells where we have been, who we have met, and in many ways, even what we're thinking about. And the more scary part about this is our data now lasts forever, so your data can and will outlive you. What has happened is that we've largely lost control over our data and also our privacy.</p></blockquote><blockquote><p>Let's take a look at one of the most widely used forms of communication in the world today: email. Before the invention of email, we largely communicated using letters, and the process was quite simple. You would first start by writing your message on a piece of paper, then you would place it into a sealed envelope, and from there, you would go ahead and send it after you put a stamp and address on it. Unfortunately, today, when we actually send an email, we're not sending a letter. What you are sending, in many ways, is actually a postcard, and it's a postcard in the sense that everybody that sees it from the time it leaves your computer to when it gets to the recipient can actually read the entire contents.</p></blockquote><blockquote><p>So, the solution to this has been known for some time, and there's many attempts to do it. The most basic solution is to use encryption, and the idea is quite simple. First, you encrypt the connection between your computer and the email server. Then, you also encrypt the data as it sits on the server itself. But there's a problem with this, and that is, the email servers also hold the encryption keys, so now you have a really big lock with a key placed right next to it. But not only that, any government could lawfully ask for and get the key to your data, and this is all without you being aware of it.</p></blockquote><p>→ <a href="https://www.ted.com/talks/andy_yen_think_your_email_s_private_think_again">https://www.ted.com/talks/andy<em>yen</em>think<em>your</em>email<em>s</em>private<em>think</em>again</a></p><h3>The first secret of design is ... noticing</h3><blockquote><p>So there's a good reason why our brains habituate things. If we didn't, we'd notice every little detail, all the time. It would be exhausting, and we'd have no time to learn about new things. But sometimes, habituation isn't good. If it stops us from noticing the problems that are around us, well, that's bad. And if it stops us from noticing and fixing those problems, well, then that's really bad.</p></blockquote><blockquote><p>Comedians know all about this. Jerry Seinfeld's entire career was built on noticing those little details, those idiotic things we do every day that we don't even remember. He tells us about the time he visited his friends and he just wanted to take a comfortable shower. He'd reach out and grab the handle and turn it slightly one way, and it was 100 degrees too hot. And then he'd turn it the other way, and it was 100 degrees too cold. He just wanted a comfortable shower. Now, we've all been there, we just don't remember it. But Jerry did, and that's a comedian's job.</p></blockquote><blockquote><p>Almost every product back then did that. When it had batteries in it, you had to charge it before you used it. Well, Steve noticed that and he said, "We're not going to let that happen to our product." So what did we do? Typically, when you have a product that has a hard drive in it, you run it for about 30 minutes in the factory to make sure that hard drive's going to be working years later for the customer after they pull it out of the box. What did we do instead? We ran that product for over two hours. Why? Well, first off, we could make a higher quality product, be easy to test, and make sure it was great for the customer. But most importantly, the battery came fully charged right out of the box, ready to use. So that customer, with all that exhilaration, could just start using the product. It was great, and it worked. People liked it.</p></blockquote><p>→ <a href="https://www.ted.com/talks/tony_fadell_the_first_secret_of_design_is_noticing">https://www.ted.com/talks/tony<em>fadell</em>the<em>first</em>secret<em>of</em>design<em>is</em>noticing</a></p><h3>Take back control of your personal data</h3><blockquote><p>Whether buying a bottle of wine, making an online purchase or going to a movie, most of us share far more information than is necessary: birthdates, credit card numbers, addresses. At a time when our personal information is at risk every day, cryptographer Dr. Maria Dubovitskaya is part of a team which has designed a system that shares only what's absolutely necessary while closely guarding the rest.</p></blockquote><p>→ <a href="https://www.ted.com/talks/maria_dubovitskaya_take_back_control_of_your_personal_data">https://www.ted.com/talks/maria<em>dubovitskaya</em>take<em>back</em>control<em>of</em>your<em>personal</em>data</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2015/what-happens-next-will-amaze-you/</guid><title>What Happens Next Will Amaze You</title><description>What Happens Next Will Amaze You</description><link>https://petercammeraat.net/journal/2015/what-happens-next-will-amaze-you/</link><pubDate>Fri, 25 Sep 2015 05:00:00 +0200</pubDate><content:encoded><![CDATA[<blockquote><p>Given this list, let me ask a trick question. What was the most damaging data breach in the last 12 months? The trick answer is: it's likely something we don't even know about.</p></blockquote><blockquote><p>When the Snowden revelations first came to light, it felt like we might be heading towards an Orwellian dystopia. Now we know that the situation is much worse.</p></blockquote><blockquote><p>Advertising-related surveillance has destroyed our privacy and made the web a much more dangerous place for everyone. The practice of serving unvetted third-party content chosen at the last minute, with no human oversight, creates ideal conditions for malware to spread. The need for robots that can emulate human web users drives a market for hacked home computers.</p></blockquote><p>→ <a href="https://idlewords.com/talks/what_happens_next_will_amaze_you.htm">https://idlewords.com/talks/what<em>happens</em>next<em>will</em>amaze_you.htm</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2015/internet-with-a-human-face/</guid><title>The Internet With A Human Face</title><description>The Internet With A Human Face</description><link>https://petercammeraat.net/journal/2015/internet-with-a-human-face/</link><pubDate>Tue, 28 Jul 2015 05:00:00 +0200</pubDate><content:encoded><![CDATA[<blockquote><p>I've come to believe that a lot of what's wrong with the Internet has to do with memory. The Internet somehow contrives to remember too much and too little at the same time, and it maps poorly on our concepts of how memory should work.</p></blockquote><blockquote><p>Anyone who works with computers learns to fear their capacity to forget. Like so many things with computers, memory is strictly binary. There is either perfect recall or total oblivion, with nothing in between. It doesn't matter how important or trivial the information is. The computer can forget anything in an instant. If it remembers, it remembers for keeps.</p></blockquote><blockquote><p>This doesn't map well onto human experience of memory, which is fuzzy. We don't remember anything with perfect fidelity, but we're also not at risk of waking up having forgotten our own name. Memories tend to fade with time, and we remember only the more salient events.</p></blockquote><blockquote><p>Every programmer has firsthand experience of accidentally deleting something important. Our folklore as programmers is filled with stories of lost data, failed backups, inadvertently clobbering some vital piece of information, undoing months of work with a single keystroke. We learn to be afraid.</p></blockquote><p>→ <a href="https://idlewords.com/talks/internet_with_a_human_face.htm">https://idlewords.com/talks/internet<em>with</em>a<em>human</em>face.htm</a></p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2015/kill-all-browser-plugins/</guid><title>Kill all browser plugins</title><description>Kill all browser plugins. When you read browser plugin you think immediately about Flash.</description><link>https://petercammeraat.net/journal/2015/kill-all-browser-plugins/</link><pubDate>Wed, 15 Jul 2015 05:00:00 +0200</pubDate><content:encoded><![CDATA[<p>When you read browser plugin you think immediately about Flash. But there are many more browser plugins like:</p><ul><li>Flash Player</li><li>Java</li><li>Silverlight</li><li>RealPlayer</li><li>Adobe Reader</li><li>Unity 3D</li><li>Google Earth Plug-in</li><li>ActiveX</li></ul><p>They are all plugins for the browser you hardly use and replaceable by HTML5. Adobe Reader is replaceable by built-in pdf readers from browsers.</p><p>In the last few years all big players on the internet, started adopting HTML5 for video streaming. Like YouTube, Netflix and all kinds of news websites. So there is no need for plugins anymore. All big players are adopting new technologies. But we also need the small players on board.</p><p>I used Netflix for one hour on Silverlight. It was horrible. My laptop was like an heavy attack helicopter. Luckily I could use Netflix without Silverlight again :-)</p><p>It usages a lot of energy. Final but not least security, plugins needs to update for known and unknown security breaches. And that’s a freaking slow process. Without plugins the browser vendor is responsible for security updates. And making the browser run as smoothly as possible on the devices they support.</p><p>In 2010 Steve Jobs already <a href="https://web.archive.org/web/20151028220642/https://www.apple.com/hotnews/thoughts-on-flash/">told</a> the world why there would never be any browser plugins supported on iOS devices. Since then there popularity and usages also declined. This year there was a big security issue in flash.</p><p>So bad even Mozilla Firefox blocked the current and all past versions of flash. Only an updated flash would work in Firefox again.</p><p>The <a href="https://www.theverge.com/2015/7/13/8948459/adobe-flash-insecure-says-facebook-cso">chief security officer of Facebook suggested</a> all browser vendors should introduce killbits. After killbits are activated by a specific date for example the code stops working. That way the small players are forced to update their products to work without any browser plugins.</p><p>My favorite news website ‘BBC’ still has videos only in flash. The day they stop with flash videos is a good day for the Internet. And there are for sure many more news website who only have flash videos right now. They really should adopt HTML5 video technology now. No more excuses, the technology is proven. The biggest video website is working without plugins!</p><p>There are also a lot of web applications still use plugins. It’s a shame some developers (or better there managers) don’t look forward. It is possible to build beautiful web applications without the need of plugins!</p><p>We the people of the Internet should send them a message. We like our browsers plugin free. No more security issues because of plugins. No more overheated devices without any reason. No more drained batteries. Upgrade your website or web application so we don’t have to use browser plugins anymore.</p><p>A advances for you is. Your website or web application is also accessible on mobile devices. And all other devices with a browser like watches, televisions, smart mirrors etc it’s also future proof. Webbrowers and Internet will always exist. Only the technology behind it will change. You need to adapt and embrace those technologies.</p><p>When you see a website or web application that makes you use browser plugins please contact, email, tweet, or call them. They need to know you don’t want any browser plugins any more. You want your browser secure and optimized for your device.</p>]]></content:encoded></item><item><guid isPermaLink="true">https://petercammeraat.net/journal/2015/about-labels-and-icons/</guid><title>About labels and icons</title><description>About labels and icons</description><link>https://petercammeraat.net/journal/2015/about-labels-and-icons/</link><pubDate>Fri, 27 Mar 2015 05:00:00 +0100</pubDate><content:encoded><![CDATA[<blockquote><p>In the battle of clarity between icons and labels, labels always win.</p></blockquote><p>→ <a href="http://bokardo.com/archives/labels-always-win/">http://bokardo.com/archives/labels-always-win/</a></p><blockquote><p>In addition to conveying brand personality through color and style, icons must first and foremost communicate meaning in a graphical user interface. Icons are, by definition, a visual representation of an object, action, or idea. If that object, action, or idea is not immediately clear to users, the icon is reduced to mere eye candy — confusing, frustrating, eye candy — and to visual noise that hinders people from completing a task.</p></blockquote><blockquote><p>A user’s understanding of an icon is based on previous experience. Due to the absence of a standard usage for most icons, text labels are necessary to communicate the meaning and reduce ambiguity.</p></blockquote><p>→ <a href="https://www.nngroup.com/articles/icon-usability/">https://www.nngroup.com/articles/icon-usability/</a></p><blockquote><p>Previously I wrote about clarity being the most important characteristic of a great interface. Let’s talk about icons now. They’re an essential part of many user interfaces. The thing is: more often than not, they break clarity. Pictograms have been in use since the early days of mankind. They are often seen as the first expressions of a written language. Some non-literate cultures still use them today as their main medium of written communication.</p></blockquote><blockquote><p>Moreover, an icon can often replace a long descriptive group of words. As screens get smaller, this is much welcomed. But herein lies the design trap, because most icons are unclear. They make people think. What good has a beautiful interface if it’s unclear? Hence it’s simple: only use an icon if its message is a 100% clear to everyone. Never give in.</p></blockquote><blockquote><p>I hope all of this made clear that icons can easily break the most important characteristic of a good user interface: clarity. So be very careful, and test! And when in doubt, always remember this: the best icon is a text label.</p></blockquote><p>→ <a href="https://thomasbyttebier.be/blog/the-best-icon-is-a-text-label">https://thomasbyttebier.be/blog/the-best-icon-is-a-text-label</a></p>]]></content:encoded></item></channel></rss>