<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Claudio Carnino on Medium]]></title>
        <description><![CDATA[Stories by Claudio Carnino on Medium]]></description>
        <link>https://medium.com/@ccarnino?source=rss-c898eca12fac------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/2*-uEcWRVVqZtVsfW8spM3DQ.jpeg</url>
            <title>Stories by Claudio Carnino on Medium</title>
            <link>https://medium.com/@ccarnino?source=rss-c898eca12fac------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 31 May 2026 22:18:39 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@ccarnino/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[NFT Map Quest Launches Today! ]]></title>
            <link>https://medium.com/@ccarnino/nft-map-quest-launches-today-3c999d5b38d6?source=rss-c898eca12fac------2</link>
            <guid isPermaLink="false">https://medium.com/p/3c999d5b38d6</guid>
            <category><![CDATA[ethereum]]></category>
            <category><![CDATA[web3]]></category>
            <category><![CDATA[nft]]></category>
            <category><![CDATA[optimism]]></category>
            <category><![CDATA[maps]]></category>
            <dc:creator><![CDATA[Claudio Carnino]]></dc:creator>
            <pubDate>Fri, 04 Mar 2022 10:51:12 GMT</pubDate>
            <atom:updated>2022-03-04T10:51:12.554Z</atom:updated>
            <content:encoded><![CDATA[<h4>Rare maps of your favourite places!</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/870/1*XmEfIQmS2yprZHcbEkBCiA.jpeg" /></figure><p>After a few months of work, I just launched <a href="https://nft-map-quest.vercel.app">NFT Map Quest</a>: Rare maps of your favourite places!</p><p>In <a href="https://nft-map-quest.vercel.app">Map Quest</a>, you can navigate a map of the world, zooming in and out as you like until you find the place you want to crystallise into a token. Press mint, and that’s it. You own the place now.</p><p>It’s deployed on Optimism L2, so transactions are less than $2 and mint is only 0.01 ETH. I hope, this way, to promote adoption of L2s so we can start to onboard more and more people to web3.</p><p>You can play with it here <a href="https://nft-map-quest.vercel.app">https://nft-map-quest.vercel.app</a></p><p>I hope you like the idea and if you have any feedback, please reach out!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3c999d5b38d6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Mastering the iOS Interview]]></title>
            <link>https://medium.com/a-swift-misadventure/mastering-the-ios-interview-98e200902fe9?source=rss-c898eca12fac------2</link>
            <guid isPermaLink="false">https://medium.com/p/98e200902fe9</guid>
            <category><![CDATA[interview-preparation]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[job-interview]]></category>
            <category><![CDATA[interview-questions]]></category>
            <dc:creator><![CDATA[Claudio Carnino]]></dc:creator>
            <pubDate>Thu, 14 Jan 2021 15:25:24 GMT</pubDate>
            <atom:updated>2021-01-14T15:25:24.362Z</atom:updated>
            <content:encoded><![CDATA[<h4>A video course to learn how to master your next iOS job interview and get that dream job you’re after.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/750/1*Coxc536OKiJ768PrYPFj0Q.jpeg" /></figure><p>2019 and 2020 have been years of personal transformation. I focused on anything but tech. It was not exciting for me anymore. But in the last few months, I was able to get out of my comfort zone, ask for help to great friends and invest time and effort in building.</p><p>Now, I am finally ready to share my latest creation: <a href="https://www.udemy.com/course/mastering-the-ios-interview/"><em>Mastering the iOS Interview</em></a>. It’s a video course to learn how to master your next iOS job interview and get that dream job you’re after.</p><p><a href="https://www.udemy.com/course/mastering-the-ios-interview/">Mastering the iOS Interview</a></p><p>I hope this is the beginning of a series of video courses to help other software engineers get the jobs they like.</p><p>Let keep 🤞.</p><p>PS: feedback is alway welcome!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=98e200902fe9" width="1" height="1" alt=""><hr><p><a href="https://medium.com/a-swift-misadventure/mastering-the-ios-interview-98e200902fe9">Mastering the iOS Interview</a> was originally published in <a href="https://medium.com/a-swift-misadventure">A Swift misadventure</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Install Multiple Versions of Xcode on the Same macOS Machine]]></title>
            <link>https://medium.com/a-swift-misadventure/how-to-install-multiple-versions-of-xcode-on-the-same-macos-machine-a2836387e57f?source=rss-c898eca12fac------2</link>
            <guid isPermaLink="false">https://medium.com/p/a2836387e57f</guid>
            <category><![CDATA[xcode]]></category>
            <category><![CDATA[old-xcode]]></category>
            <category><![CDATA[version]]></category>
            <category><![CDATA[macos]]></category>
            <dc:creator><![CDATA[Claudio Carnino]]></dc:creator>
            <pubDate>Wed, 11 Nov 2020 22:02:22 GMT</pubDate>
            <atom:updated>2020-11-11T22:02:22.958Z</atom:updated>
            <content:encoded><![CDATA[<p>As an iOS developer, you often have to coordinate and use a specific versions of Xcode as part of a team. Especially if the codebase gets older, bigger and more complex.</p><p>It becomes essential then to install multiple versions of Xcode on the same machine. Here it’s how to do it.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1Qtfw2Wy9-av5BIOiXKOBg.jpeg" /></figure><h3>Latest Xcode version</h3><p>The latest version of Xcode should generally be installed from the AppStore, since Apple does not provide a downloadable version. It will get updated by the AppStore when a new stable version comes out (automatically or manually depending on your AppStore settings).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eORMJQjDHNUfXcUFiuEzDg.png" /></figure><p>This Xcode version will just be named <strong>Xcode</strong> in your <strong>Applications</strong> folder.</p><h3>Older Xcode versions</h3><p>You can download old versions of Xcode and install them on the side of the latest one. So you can just choose which version you want to launch depending on your situation.</p><p>Open <a href="https://developer.apple.com/download/more/">https://developer.apple.com/download/more/</a> and login with your developer account. Then write <strong>Xcode</strong> in the left column’s search bar. You will now be able to dowload older and newer versions Xcode, including betas and RCs.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*XDr0DSZg_0Kfbmzs1zAAKw.png" /></figure><p>After downloading the archive, unpack it. Rename the extracted <strong>Xcode</strong> app something like <strong>Xcode_11.7</strong>. Then, move it into the <strong>Applications</strong> folder.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/522/1*WVqT7I94adLZitug8ebcKQ.png" /></figure><p>You are done. Good development!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a2836387e57f" width="1" height="1" alt=""><hr><p><a href="https://medium.com/a-swift-misadventure/how-to-install-multiple-versions-of-xcode-on-the-same-macos-machine-a2836387e57f">How to Install Multiple Versions of Xcode on the Same macOS Machine</a> was originally published in <a href="https://medium.com/a-swift-misadventure">A Swift misadventure</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Get Started With Swift for WebAssembly on macOS With SwiftWasm]]></title>
            <link>https://medium.com/better-programming/get-started-with-swift-for-webassembly-on-macos-with-swiftwasm-5d588a086120?source=rss-c898eca12fac------2</link>
            <guid isPermaLink="false">https://medium.com/p/5d588a086120</guid>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[mac]]></category>
            <category><![CDATA[webassembly]]></category>
            <category><![CDATA[wasm]]></category>
            <dc:creator><![CDATA[Claudio Carnino]]></dc:creator>
            <pubDate>Thu, 22 Oct 2020 17:10:49 GMT</pubDate>
            <atom:updated>2020-11-11T18:32:29.321Z</atom:updated>
            <content:encoded><![CDATA[<h4>Get to know SwiftWasm</h4><figure><img alt="Swift logo over some flowers" src="https://cdn-images-1.medium.com/max/1024/1*WkgiYCYl-uLMi4Irus6Rsg.png" /><figcaption>Photo by <a href="https://unsplash.com/@gaspanik?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Masaaki Komori</a> on <a href="https://unsplash.com/s/photos/spring?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a>.</figcaption></figure><p>A group of brave souls behind <a href="https://swiftwasm.org/">SwiftWasm</a> are working on adding WebAssembly as a compilation target for the Swift programming language. It’s a work in progress, so it’s not fully ready yet. But we are already able to get Swift code executed in a Wasm runtime (e.g. the browser)!</p><p>Let’s set up SwiftWasm on the latest macOS. Then let’s attempt to create our first Swift-based app!</p><h3>Install Swift Language With Wasm Support</h3><p>The Wasm support is not yet in the official Swift repository. Therefore, we have to install a snapshot of the language with experimental support.</p><p>Download and install the lastest macOS version of SwiftWasm (5.3 at time of writing) for macOS from the <a href="https://github.com/swiftwasm/swift/releases/latest">project GitHub</a>.</p><p>To be able to use the SwiftWasm toolchain from the command line:</p><pre>export PATH=/Library/Developer/Toolchains/swift-latest.xctoolchain/usr/bin:&quot;${PATH}&quot;</pre><p>And to test it has been properly setup:</p><pre>swift --version</pre><h3>Test SwiftWasm</h3><p>Create a HelloWorld Swift file:</p><pre>echo &#39;print(&quot;Hello, world!&quot;)&#39; &gt; hello.swift</pre><p>Compile the Swift source code to Wasm bytecode:</p><pre>swiftc -target wasm32-unknown-wasi hello.swift -o hello.wasm</pre><h3>Run the Output</h3><p>To run the code from the command line, you can use wasmer (a Wasm runtime).</p><p>Install it:</p><pre>curl https://get.wasmer.io -sSfL | sh</pre><p>Execute your Wasm code:</p><pre>wasmer hello.wasm</pre><h3>Make a Swift Package With SwiftPM</h3><p>We can leverage SwiftPM to create a package that will then be compiled to Wasm.</p><p>It’s simple. Let’s create a package named testpack and then just compile and execute it:</p><pre>mkdir testpack &amp;&amp; cd testpack<br>swift package init --type executable</pre><p>Let’s build it:</p><pre>swift build --triple wasm32-unknown-wasi</pre><p>Execute it:</p><pre>wasmer .build/debug/testpack</pre><h3>Next Up, Create a Web App With SwiftWasm</h3><p>We just barely set up the entire thing and executed a mere Hello World. Now <a href="https://medium.com/better-programming/create-a-react-and-swiftui-inspired-web-app-with-swift-for-webassembly-on-macos-with-swiftwasm-7741491b2886">let’s make</a> our first ReactJS- and SwiftUI-inspired web app with Swift!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5d588a086120" width="1" height="1" alt=""><hr><p><a href="https://medium.com/better-programming/get-started-with-swift-for-webassembly-on-macos-with-swiftwasm-5d588a086120">Get Started With Swift for WebAssembly on macOS With SwiftWasm</a> was originally published in <a href="https://betterprogramming.pub">Better Programming</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Create a React and SwiftUI-Inspired Web App With Swift for WebAssembly on MacOS With SwiftWasm]]></title>
            <link>https://medium.com/better-programming/create-a-react-and-swiftui-inspired-web-app-with-swift-for-webassembly-on-macos-with-swiftwasm-7741491b2886?source=rss-c898eca12fac------2</link>
            <guid isPermaLink="false">https://medium.com/p/7741491b2886</guid>
            <category><![CDATA[swiftui]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[webassembly]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[reactjs]]></category>
            <dc:creator><![CDATA[Claudio Carnino]]></dc:creator>
            <pubDate>Tue, 20 Oct 2020 14:23:38 GMT</pubDate>
            <atom:updated>2020-10-20T14:47:48.156Z</atom:updated>
            <content:encoded><![CDATA[<h3>Create a React- and SwiftUI-Inspired Web App With Swift for WebAssembly on MacOS With SwiftWasm</h3><h4>SwiftWasm is experimental but that doesn’t mean we can’t have some fun!</h4><figure><img alt="blossoming tree with Swift logo superimposed" src="https://cdn-images-1.medium.com/max/1024/1*Bqd5qPhAlBZv0EHGyJ641g.png" /><figcaption>Photo by <a href="https://unsplash.com/@meric?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Meriç Dağlı</a> on <a href="https://unsplash.com/s/photos/spring?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>The first step is to set up your macOS machine to use the experimental <a href="https://swiftwasm.org/">SwiftWasm</a> (<a href="https://webassembly.org/">WebAssembly</a> compilation target). <a href="https://medium.com/@ccarnino/get-started-with-swift-for-webassembly-on-macos-with-swiftwasm-5d588a086120">Here is a guide</a> on how to do it.</p><h3>Install the Development Tools</h3><p>We are going to use <a href="https://github.com/TokamakUI/Tokamak">Tokamak</a> to create a web UI using the SwiftUI-inspired syntax. The long-term goal is to create web UIs just like we do for the Apple ecosystem.</p><p>But first, let’s install some development tools to simplify the process:</p><pre>brew install swiftwasm/tap/carton</pre><h3>Create a Tokamak-Based Project</h3><pre>mkdir TokamakApp &amp;&amp; cd TokamakApp<br>carton init --template tokamak</pre><p>Now let’s start the development server with live reloading:</p><pre>carton dev</pre><p>Open in your favourite browser http://127.0.0.1:8080. Now every time you edit the code in the project, carton will reload the browser tab. Very JS-development style. Convenient.</p><h3>Reality Check</h3><p>Now the theory goes that we can write the app UI with Tokamak as if it was SwiftUI code. The reality is that Tokamak is far from finished, so not all SwiftUI entities are fully implemented yet.</p><h3>Using a JavaScript Wrapper to Create Your Website</h3><p>What we can do is go down one level and create DOM elements with the support of JavaScript. We can use <a href="https://github.com/swiftwasm/DOMKit">DOMKit</a>. It is a medium-level Swift wrapper around the browser’s DOM.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/863f7b0fabc4ccc8f6f1ee0e19ceceeb/href">https://medium.com/media/863f7b0fabc4ccc8f6f1ee0e19ceceeb/href</a></iframe><p>Or we can go down two levels, using <a href="https://github.com/swiftwasm/JavaScriptKit">JavaScriptKit</a>. It is a low-level Swift wrapper around the JavaScript API that we use to interface with the DOM directly.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/0ba1c38cabdd9ec57453d828afa25478/href">https://medium.com/media/0ba1c38cabdd9ec57453d828afa25478/href</a></iframe><p>You can find more <a href="https://github.com/swiftwasm/JavaScriptKit/tree/main/Example">examples here</a>.</p><h3>Importing and Exporting Functions</h3><p>Until the Swift web tooling is really solid and features are complete, we will probably still have to develop some part of a web app with JS-based frameworks. Therefore, the need arises to <a href="https://book.swiftwasm.org/examples/importing-function.html">import some JS functions</a> into our Swift app. But probably it will be more useful to <a href="https://book.swiftwasm.org/examples/exporting-function.html">export some Swift functions</a> to the JS app, like exporting a really performing and computing intense Swift function for image manipulation for the JS interface.</p><h3>Conclusion</h3><p>Swift for WebAssembly and for the web in general is clearly immature and incomplete, but it’s a very encouraging start. I really hope that it becomes a real option for full-stack Swift web developers in the not-too-distant future.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7741491b2886" width="1" height="1" alt=""><hr><p><a href="https://medium.com/better-programming/create-a-react-and-swiftui-inspired-web-app-with-swift-for-webassembly-on-macos-with-swiftwasm-7741491b2886">Create a React and SwiftUI-Inspired Web App With Swift for WebAssembly on MacOS With SwiftWasm</a> was originally published in <a href="https://betterprogramming.pub">Better Programming</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to Get Confirmation Alert Before Quitting Safari on macOS]]></title>
            <link>https://medium.com/macoclock/how-to-get-confirmation-alert-before-quitting-safari-on-macos-f76aef37477e?source=rss-c898eca12fac------2</link>
            <guid isPermaLink="false">https://medium.com/p/f76aef37477e</guid>
            <category><![CDATA[safari]]></category>
            <category><![CDATA[productivity]]></category>
            <category><![CDATA[mac]]></category>
            <category><![CDATA[fastscripts]]></category>
            <category><![CDATA[script]]></category>
            <dc:creator><![CDATA[Claudio Carnino]]></dc:creator>
            <pubDate>Sat, 17 Oct 2020 05:50:17 GMT</pubDate>
            <atom:updated>2020-10-17T05:50:17.088Z</atom:updated>
            <content:encoded><![CDATA[<p>One infuriating thing about Safari on macOS is that, from time to time, I quit it unintentionally. It’s when I try to close a tab. I press <em>⌘Q</em> instead of <em>⌘W</em> and boom, 30 tabs are lost. Sure I can reopen them from the previous session, but still. Ffffff…</p><p>After a quick research I have found a good solution. It is a two part tutorial:</p><ol><li>Remap the current <em>⌘Q</em> for Safari to <em>⌥⌘Q</em>, so you will not trigger the Quit unintentionally</li><li>Create a script to show a Quit confirmation alert when ⌘Q is pressed</li></ol><p><em>Note: the second step is optional.</em></p><h3>Remap ⌘Q in Safari</h3><p>Currently Safari has <em>⌘Q</em> as the Quit shortcut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zO1YTIpS1o8FaN5VrPuUew.png" /></figure><p>Open <em>Preferences &gt; Keyboard &gt; Shortcuts</em>. Select <em>App Shortcuts</em>, then tap the <em>+</em> button.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Pu8pyWNNs1hBIJ0kHfcznA.png" /></figure><p>Fill the prompt as follows:</p><ul><li>Select <em>Safari</em> for <em>Application</em></li><li>Type <em>Quit Safari</em> in <em>Menu Title</em> (the title should be this exact one)</li><li>Press <em>⌥⌘Q</em> on your keyboard after tapping in the Keyboard Shortcut field</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2LfjtyEiacYu4e44L5Xsbw.png" /></figure><p>Tap <em>Add</em> button when you’re done.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/833/1*zvqnjhhb8AhPxx9o4Xs_mQ.png" /></figure><p>Now Safari has <em>⌥⌘Q</em> as the Quit shortcut.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0WhbogRq3tEtVsjeLT0f5Q.png" /></figure><h3>Add a confirmation alert for Quit Safari</h3><p>Open the <em>Script Editor</em> app. Copy and paste the following code:</p><pre>tell application &quot;Safari&quot;<br>    set _window_count to count windows<br>    set _tab_count to 0<br>    <br>    repeat with _w in every window<br>        set _tab_count to _tab_count + (count tabs of _w)<br>    end repeat<br>    <br>    -- Make a string like &quot;1 window containing 3 tabs.&quot;<br>    if _window_count is 1 then<br>        set _msg to _window_count &amp; &quot; window containing &quot; as string<br>    else<br>        set _msg to _window_count &amp; &quot; windows containing &quot; as string<br>    end if<br>    if _tab_count is 1 then<br>        set _msg to _msg &amp; _tab_count &amp; &quot; tab.&quot; as string<br>    else<br>        set _msg to _msg &amp; _tab_count &amp; &quot; tabs.&quot; as string<br>    end if<br>    <br>    display alert ¬<br>        &quot;Are you sure you want to quit Safari?&quot; message _msg ¬<br>        buttons {&quot;Quit&quot;, &quot;Cancel&quot;} ¬<br>        giving up after 60<br>    if button returned of result is &quot;Quit&quot; then quit<br>end tell</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*V5FmcdY4SZPE-FAJOZpzkg.png" /><figcaption>Script inspiration from <a href="https://daringfireball.net/2020/01/quit_confirmation_for_safari_on_macos">Daring Fireball</a>.</figcaption></figure><p>Save the script as <em>SafeQuitSafari</em> in some temporary location.</p><p>Download and install the free scripts management app <a href="https://red-sweater.com/fastscripts/">FastScripts</a>. Open it.</p><p>Make sure you have a Safari window open and in focus (important). Then tap on the FastScript top menu bar icon and select the <em>Open Safari Scripts Folder </em>from the <em>FastScripts</em> submenu.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*4BaGwSd-B964oHFMhPJn-A.png" /></figure><p>Move <em>SafeQuitSafari </em>script inside the opened folder.</p><p>By clicking on the <em>FastScripts</em> icon in the top menu bar, you will see the new script listed (if Safari window is in focus).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*m19LjijAS4tYu5lfeDvwWw.png" /></figure><h3>Test it</h3><p>Open Safari again and tap <em>⌘Q</em>. You will now get the confirmation alert. Cheers 🍻</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SACOVrPonZ85ptgxVYkUxg.png" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f76aef37477e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/macoclock/how-to-get-confirmation-alert-before-quitting-safari-on-macos-f76aef37477e">How to Get Confirmation Alert Before Quitting Safari on macOS</a> was originally published in <a href="https://medium.com/macoclock">Mac O’Clock</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Expose Init Parameters and Dependencies in Swift and iOS Please]]></title>
            <link>https://medium.com/a-swift-misadventure/expose-init-parameters-and-dependencies-in-swift-and-ios-please-752497f06073?source=rss-c898eca12fac------2</link>
            <guid isPermaLink="false">https://medium.com/p/752497f06073</guid>
            <category><![CDATA[dependency-injection]]></category>
            <category><![CDATA[programming]]></category>
            <category><![CDATA[swift]]></category>
            <category><![CDATA[ios]]></category>
            <category><![CDATA[code]]></category>
            <dc:creator><![CDATA[Claudio Carnino]]></dc:creator>
            <pubDate>Thu, 08 Oct 2020 16:27:46 GMT</pubDate>
            <atom:updated>2020-10-08T16:27:46.501Z</atom:updated>
            <content:encoded><![CDATA[<p>There is one simple concept to follow when developing Swift or iOS code. The init parameters and the dependencies should be accessible from the outside. Even if from the outside you don’t need them.</p><p>It’s good etiquette because it gives transparency. It’s good practice because it makes the component you created more scalable. It makes sense because it makes code easier to test.</p><p>When creating your future entity store the init parameter as a property with the same access control level of the entity itself. If your entity is public make it public. If internal keep it internal.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cMqZuAw9rVcZopYBiRtVEw.png" /><figcaption>// Photo by Rowan Heuvel on Unsplash</figcaption></figure><p>One last thing. Please be consistent in the codebase. Don’t go for one logic in one place and a different one in another. Consistency makes understanding your codebase much easier. Especially when there are many team members.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=752497f06073" width="1" height="1" alt=""><hr><p><a href="https://medium.com/a-swift-misadventure/expose-init-parameters-and-dependencies-in-swift-and-ios-please-752497f06073">Expose Init Parameters and Dependencies in Swift and iOS Please</a> was originally published in <a href="https://medium.com/a-swift-misadventure">A Swift misadventure</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Strategic benefits of the new Apple Silicon processor for Mac]]></title>
            <link>https://medium.com/macoclock/strategic-benefits-of-the-new-apple-silicon-processor-for-mac-7759c82d649d?source=rss-c898eca12fac------2</link>
            <guid isPermaLink="false">https://medium.com/p/7759c82d649d</guid>
            <category><![CDATA[apple]]></category>
            <category><![CDATA[apple-silicon]]></category>
            <category><![CDATA[arm]]></category>
            <category><![CDATA[processors]]></category>
            <category><![CDATA[soc]]></category>
            <dc:creator><![CDATA[Claudio Carnino]]></dc:creator>
            <pubDate>Fri, 26 Jun 2020 10:50:36 GMT</pubDate>
            <atom:updated>2020-06-28T04:54:05.897Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*WkloYyGgFaR9WAiU" /><figcaption>Photo by <a href="https://unsplash.com/@viazavier?utm_source=medium&amp;utm_medium=referral">Laura Ockel</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Moving from Intel to Apple’s custom made ARM processor is not just about control, quality and performance. It will also transform Mac customers’ upgrade cycles, making them similar to the smartphones’ ones. For a number of reasons.</p><h4>Yearly releases</h4><p>I think Apple will release new Macs every year. Like it’s happening right now for iPhones. Every year there will be a new A-something processor which will debut on iPhone. Then on the new iPads and Macs.</p><p>This is a big deal since…</p><h4>Substantial improvements of performances</h4><p>Every year the new iPhone processors improve of 30–50% on performances. Single task, multi task and graphics. And graphics performance improves at even a higher rate.</p><p>Every year or two, potentially, you will have a real reason to upgrade. Tp software developers, 3D artists, video makers, musicians or photographers that is really appealing.</p><h4>SoC</h4><p>Apple is not calling this <em>ARM processor</em>. They are calling it <em>Apple Silicon</em> for a reason. In a traditional PC you have a CPU, a GPU and then other chips for specific tasks. Generally, they are all communicating through the motherboard. Apple Silicon, instead, will integrate CPU, GPU and a lot of other chips (proximity, security, machine learning, etc) into the same silicon chip.</p><p>All these different units (previously chips) are talking to each other without the bottleneck of the motherboard. So, again, better performances.</p><p>With the new Silicon chip that Apple will release yearly, there will be new set of computations that will become more performant. Take for example Machine Learning. New iPhones are monster at this thanks to the dedicated unit. It allows new use cases like live translation between 12 different languages on device (no internet).</p><h4>Gamers</h4><p>Gamers will love that sweet sweet yearly bump in graphics performances. Especially since game producers will start to seriously target Mac for serious gaming. They will be able to access iPhones, iPad and Mac with one engineering effort. They already have access to a lot of iOS customers. Now they will also have access pro gamers without much more engineering time.</p><h4>Conclusion</h4><p>This is the first time I am excited about a new Mac. I have a late 2013 MacBook pro which works great. Except when I do a Skype call or I try to use Jira…</p><p>But this Xmas I am pretty sure I will upgrade.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7759c82d649d" width="1" height="1" alt=""><hr><p><a href="https://medium.com/macoclock/strategic-benefits-of-the-new-apple-silicon-processor-for-mac-7759c82d649d">Strategic benefits of the new Apple Silicon processor for Mac</a> was originally published in <a href="https://medium.com/macoclock">Mac O’Clock</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How to use Stripe Checkout Javascript SDK in React Native Expo app without ejecting — 2020 SCA]]></title>
            <link>https://medium.com/front-end-weekly/how-to-use-stripe-checkout-javascript-sdk-in-react-native-expo-app-without-ejecting-2020-sca-bb88cbde2ac2?source=rss-c898eca12fac------2</link>
            <guid isPermaLink="false">https://medium.com/p/bb88cbde2ac2</guid>
            <category><![CDATA[stripe]]></category>
            <category><![CDATA[checkout]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[expo]]></category>
            <category><![CDATA[expo-react-native]]></category>
            <dc:creator><![CDATA[Claudio Carnino]]></dc:creator>
            <pubDate>Thu, 24 Oct 2019 18:18:09 GMT</pubDate>
            <atom:updated>2019-10-24T18:18:09.817Z</atom:updated>
            <content:encoded><![CDATA[<h3>How to use Stripe Checkout Javascript SDK in React Native Expo app without ejecting — 2020 SCA ready</h3><h4>Learn how to load the Stripe Checkout webpage for your product or subscription inside your React Native Expo app without ejecting and be SCA conformant from September 2019.</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*HVq-V4R_ENPtmYjG" /><figcaption>Photo by <a href="https://unsplash.com/@kpietrzakweb?utm_source=medium&amp;utm_medium=referral">Kamil Pietrzak</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Before September 2019 there was a simple way to integrate Stripe in your React Native Expo app without ejecting. But now, due to the SCA (Strong Customer Authentication) regulation, that solution is not valid anymore.</p><p>You either have to integrate the official React Native Stripe Javascript SDK which requires ejecting from Expo (not fun). Or you can host and then open a webpage with a “Checkout with Stripe” button which will redirect to a purchase page hosted by Stripe.</p><p>In this article, I will explain the latter with an improvement. You will be able to immediately load the Stripe Checkout page for your product from your app without ejecting from Expo and without having to host a webpage on your server.</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fupscri.be%2Ff%2F788447%3Fas_embed%3Dtrue&amp;dntp=1&amp;display_name=Upscribe&amp;url=https%3A%2F%2Fupscri.be%2F788447%2F&amp;type=text%2Fhtml&amp;schema=upscri" width="800" height="400" frameborder="0" scrolling="no"><a href="https://medium.com/media/18214d8333adbb5668f31791a3202b60/href">https://medium.com/media/18214d8333adbb5668f31791a3202b60/href</a></iframe><h3>The user journey and data flow</h3><p>This is what will happen:</p><ul><li>your user taps on the “Buy now” button inside your React Native Expo app</li><li>you are going to navigate to a PurchaseProduct screen</li><li>PurchaseProduct screen will automatically load a full-screen webview with some HTML</li><li>the HTML code loaded contains the Stripe Checkout loading function that is automatically called</li><li>the webview will be redirected to the Stripe Checkout page for your product</li><li>your user will complete the purchase</li><li>the webview will be redirected to a success or cancelled page URL</li><li>the PurchaseProduct screen will be monitoring the webview current URL to determine the purchase status</li><li>your success or cancelled callbacks will be called</li><li>Stripe will send an event to your backend webhook if setup</li><li>you will (ideally) double-check and confirm with your backend if the purchase has actually been successful or not</li><li>you go on with your life</li></ul><h3>Stripe settings</h3><p>First, you have to go to the <a href="https://dashboard.stripe.com/">Stripe Dashboard</a> and create a <a href="https://stripe.com/docs/payments/checkout/subscriptions/starting#create-products-and-plans">product or subscription</a> that you want to sell (in test mode to start).</p><p>Once you have that data you will be able to create a stripeSettings.js file with these settings.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/8df8206036da89f8f35e10775d81886b/href">https://medium.com/media/8df8206036da89f8f35e10775d81886b/href</a></iframe><h3>The Stripe Checkout HTML</h3><p>As previously said we are going to load a webpage with the HTML/JS code to automatically load your product’s Stripe Checkout page.</p><p>Download or create a file named stripeCheckout.js with the following code.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/1cafada8470ae17e8b1428e09e364411/href">https://medium.com/media/1cafada8470ae17e8b1428e09e364411/href</a></iframe><p>The function is based on the code to create a Subscription Checkout button described <a href="https://stripe.com/docs/payments/checkout/subscriptions/starting#redirect-checkout">here</a>. If you want to create a page for a one-time payment (like buying a product) update the code settings with the info <a href="https://stripe.com/docs/payments/checkout/server#redirect-checkout">here</a>.</p><p><em>Note: In the original HTML code, a “Checkout with Stripe” button is showed. The user has to tap it to actually be redirected to the checkout form. This edited version of the code automatically redirects the user to the checkout form when the page is loaded.</em></p><h3>PurchaseProduct Screen</h3><p>Now let’s create a purchase screen component which contains the webview.</p><p>First, let’s install the webview component:</p><pre>npm install --save react-native-webview<br>or<br>yarn add react-native-webview</pre><p>Then create the component file with the following code.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d77ae3a37423d715b526d03d56da1bb5/href">https://medium.com/media/d77ae3a37423d715b526d03d56da1bb5/href</a></iframe><p>In this code, we are creating a component which renders a webview with the generated HTML. So we do not have to host the HTML somewhere on a server.</p><p>Your backend should be registered for <a href="https://stripe.com/docs/payments/checkout/fulfillment#webhooks">Stripe webhook events</a> to be sure the payment has gone through and everything is successful. So, we are passing the user id in the HTML, because it will be passed as a parameter to the webhook callback. This way the callback event handler on your backend knows who’s the event refers to.</p><h3>Glue it all together</h3><p>You are set. Now if you have customised the Stripe setting object and you navigate to the PurchaseProduct screen, you will be able to see it autoload the Checkout page for your product. Fill the form with mock data and a <a href="https://stripe.com/docs/testing#cards">test credit card</a> and you will see that your success handler is called.</p><p>This should be enough to get going.</p><p><em>Thanks to </em><a href="https://medium.com/@mattia_asti"><em>Mattia</em></a><em> for all the help with React and for his countless advices.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=bb88cbde2ac2" width="1" height="1" alt=""><hr><p><a href="https://medium.com/front-end-weekly/how-to-use-stripe-checkout-javascript-sdk-in-react-native-expo-app-without-ejecting-2020-sca-bb88cbde2ac2">How to use Stripe Checkout Javascript SDK in React Native Expo app without ejecting — 2020 SCA</a> was originally published in <a href="https://medium.com/front-end-weekly">Frontend Weekly</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A Product Development Journey of How I Created Fluidtable and Failed]]></title>
            <link>https://medium.com/@ccarnino/a-product-development-journey-of-how-i-created-fluidtable-and-failed-b220b793271e?source=rss-c898eca12fac------2</link>
            <guid isPermaLink="false">https://medium.com/p/b220b793271e</guid>
            <category><![CDATA[failure-stories]]></category>
            <category><![CDATA[entrepreneurship]]></category>
            <category><![CDATA[product-management]]></category>
            <category><![CDATA[product-development]]></category>
            <category><![CDATA[startup]]></category>
            <dc:creator><![CDATA[Claudio Carnino]]></dc:creator>
            <pubDate>Wed, 23 Oct 2019 15:22:15 GMT</pubDate>
            <atom:updated>2019-10-23T15:22:15.993Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uDvgJ7nsR9vFBUeJCeUV-w.jpeg" /><figcaption>Photo by <a href="https://unsplash.com/@timmarshall?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Tim Marshall</a> on <a href="https://unsplash.com/?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></figcaption></figure><p>It was the beginning of the year. Early in 2019. I had finally found a satisfying side project to work on: a spreadsheet in which you could write javascript code. You would be able to make programs out of a spreadsheet.<br>Without asking myself too many questions, I just started to work on it for the pure joy of it.</p><p>Then it came the point in which I started to dream about people using it to build cool stuff. More and more I thought about it, more it seemed feasible. So, I decided. I resigned from my job and I started to work on it full-time. And the first thing I had to do was to talk to potential users.</p><p><em>“This is so much talking…”</em>. I spent two weeks talking with every person using a spreadsheet to understand what for. I spent time talking with people in the no-code movement. I also spent time with web hacky engineers who made a lot of quick things.</p><p>I quickly realised that my JS-powered-spreadsheet was a bit too technical for the no-code folks, but not flexible enough for hacky engineers. With spreadsheet users, things were a bit less black and white. They used to do a lot of different things. Some used spreadsheets for accounting, others to visually organise information, others to create complex analysis and everything in the between. Not good. I had to dig deeper in some of those verticals.</p><p>After hours and hours spent on the phone with spreadsheet users, I narrowed it down to people working with data. Data analysts, business analysts and data scientists. These people receive data from a colleague, inside a report or as a database dump. Then, they have to analyse it, make some discoveries and create a report of some kind.</p><p>Talking with them some more, I understood that a big part of the data jobs is preparing the data to be analysed. The datasets they receive are sometimes copy-pasted from some other report. Sometimes data is hand filled. So the data is not necessarily consistent. <br>Let’s say in a dataset column there are stock prices. They expect to always find a valid USD price. But sometimes it is a negative number, sometimes it is a “Null” text, sometimes it is missing. They have to decide what to do in these cases, manage the problem and create a new error-free dataset. For example, they could decide that all negative and string entries in this column are invalid and they need to be replaced with zero. Or maybe they decide to remove the entire row.</p><p>All these actions, right now, are performed by hand with search-and-replace inside Excel. Or writing Python scripts with extensive copy-and-paste from the internet.</p><p><em>“This is my opportunity!”</em>. I can make this process easier, more productive and generally better. I’ve found it, I thought.</p><p>So, by now I probably already spent 25 hours on the phone talking with a lot of people and I feel I have a pretty clear idea of what I have to do. I started sketching the user journey to import and export a dataset; user journey to visually apply “Cleaning rules” to clean and fix the values inside a dataset and preview the changes.</p><p>Then wireframing all the different screens and their states. Then I improvised myself a visual designer and with Sketch, I applied what I learned throughout the years. Quite a good result, I thought.<br>Finally, I spent a good deal of time writing code to make all these sketches into a working product. I have been ruthless in trying to cut everything that I thought was not essential to test the core value I wanted to deliver to these data analysts. A month goes by and I am ready to launch and test.</p><p><em>“It is April and the weather starts to be good.”</em>. I am ready. I silently launch. It is exciting for me, irrelevant to everyone else. Then back on the phone. I do some user testing session with people I previously spoke and with some new. In a week I understand that there are pretty big usability issues. Ok, I implement a better user journey for the “Apply a Cleaning Rule and preview the result”. The next calls were still quite negative about it. So, I simplify. I focus on the main use case.</p><p><em>“Cool now in the interview they understand how to use the product.”</em>. The feedback is starting to get positive. But this cleaning rule is missing. And also that one. Ok, I add this and that. Now my users can switch from their not so great solution to my awesome one. Build, ship and interview again. Feedback gets better, but the metrics say still a pretty clear and grim story. Zero usage…</p><p>Ok, let’s look for bottlenecks. Here and there. Although, it seems that people are giving it a pretty good try. But they never come back. Ok, maybe they’ve not understood how powerful this thing is. So, let’s work some more on the documentation, real-life examples and onboarding features. Sketch, code, ship. Still nothing…</p><p><em>“Talk with some more user.”</em>. Make some more user testing sessions. The feedback is good. This solution is better from the status quo. But it’s not 10 times better. I don’t have a silver bullet. I need it to make them switch from their current solution.</p><p><em>“Oh, yeah! Automation!”</em>. Instead of asking them to do 10 steps to clean a particular data column, I achieve the same result with 3 steps. I can automate a few things. I try to validate this assumption in the next calls. It seems a promising path.</p><p><em>“Ok, this is the time”</em>. I invest 2–3 weeks in sketching, coding and shipping… I am tired by now. But I am finally here. The automation works well. The user experience of the product is really good. The communication is clear. I am even quite proud of the visual design I made. They are a good result for a developer. But the thing I am most proud of is that I’ve been able to build and test so many things in so little time.</p><p><em>“Now, it’s the time of the truth…”</em>. I pick up the phone again. And make some more user testing sessions. I do probably other 7 calls. There is no need of talking with more users. The response is quite clear. It did not move the needle. Not a bit…</p><p><em>“I am tired, I just want to go to sleep”</em>. Over the next few weeks, I have tried some spinoff of the technology to apply to a single problem, like Sentiment Analysis. But needless to say that it did not work too.</p><p>It’s now the end of the summer. I’ve invested a lot of months, a lot of savings and missed income. But that does not matter. What matter to me right now is that I still have not been able to make a sustainable business. Not even a really small one. And I have no more ideas or energy.</p><p>This is how I failed in creating Fluidtable.</p><p>And I am not going to draw conclusions and tell you what I learned. I find it quite useless. I will tell you what are the implications for my morale though. It is bad. It cripples your confidence in your abilities. It smashes the ambition. It makes me wary of telling again about my visions, ideas and projects to my family and friends. I feel like I’ve let them down.</p><p>This is not my first product or startup. It is ten years that I have been trying to create a successful business. And this is just how I failed the last one. What scares me is that with every new failure, I feel I am less and less likely to create something successful. I am losing ambition, confidence and to blindly believe in a powerful vision. Which is exactly what you need to be a leader and a founder.</p><p>Something good will come out of this, but for now, I have to deal with yet another failure.</p><p><em>A big thanks to </em><a href="https://medium.com/@simonebertaiola"><em>Simone</em></a><em> and </em><a href="https://medium.com/@mattia_asti"><em>Mattia</em></a><em> for all the help during this year. You are good friends.</em></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b220b793271e" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>