<?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 Conrad Johnston on Medium]]></title>
        <description><![CDATA[Stories by Conrad Johnston on Medium]]></description>
        <link>https://medium.com/@QueenOliviaStR?source=rss-67270cb499ec------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*B63pT4U4QXLJb7gJVQ-tpg.jpeg</url>
            <title>Stories by Conrad Johnston on Medium</title>
            <link>https://medium.com/@QueenOliviaStR?source=rss-67270cb499ec------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sat, 14 Nov 2026 18:14:31 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@QueenOliviaStR/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[Setup Charles Proxy for Android Emulators]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@QueenOliviaStR/setup-charles-proxy-for-android-emulators-d78366cc569d?source=rss-67270cb499ec------2"><img src="https://cdn-images-1.medium.com/max/600/1*3VEKUC5vXLufXFW6yJkB6g.png" width="600"></a></p><p class="medium-feed-snippet">The information in the help section of Charles proxy for Android emulators is out of date as of Sept.</p><p class="medium-feed-link"><a href="https://medium.com/@QueenOliviaStR/setup-charles-proxy-for-android-emulators-d78366cc569d?source=rss-67270cb499ec------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@QueenOliviaStR/setup-charles-proxy-for-android-emulators-d78366cc569d?source=rss-67270cb499ec------2</link>
            <guid isPermaLink="false">https://medium.com/p/d78366cc569d</guid>
            <category><![CDATA[android-app-development]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[debugging-tools]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <category><![CDATA[charles-proxy]]></category>
            <dc:creator><![CDATA[Conrad Johnston]]></dc:creator>
            <pubDate>Tue, 13 Sep 2022 05:36:47 GMT</pubDate>
            <atom:updated>2022-09-13T05:36:47.043Z</atom:updated>
            <cc:license>http://creativecommons.org/licenses/by/4.0/</cc:license>
        </item>
        <item>
            <title><![CDATA[Using Docker as a Linux emulation layer on MacOS for POSIX compliance to install a Node.js]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@QueenOliviaStR/using-docker-as-a-linux-emulation-layer-on-macos-for-posix-compliance-to-install-a-node-js-5f40d56c9f1a?source=rss-67270cb499ec------2"><img src="https://cdn-images-1.medium.com/max/2600/1*G2jPF1QkcCsQoh64GmkmAw.jpeg" width="2914"></a></p><p class="medium-feed-snippet">Mostly MacOS is compatible with Linux, when it isn&#x2019;t Docker on MacOS runs a Linux VM under the hood, enabling no-fuss compatibility.</p><p class="medium-feed-link"><a href="https://medium.com/@QueenOliviaStR/using-docker-as-a-linux-emulation-layer-on-macos-for-posix-compliance-to-install-a-node-js-5f40d56c9f1a?source=rss-67270cb499ec------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@QueenOliviaStR/using-docker-as-a-linux-emulation-layer-on-macos-for-posix-compliance-to-install-a-node-js-5f40d56c9f1a?source=rss-67270cb499ec------2</link>
            <guid isPermaLink="false">https://medium.com/p/5f40d56c9f1a</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[developer]]></category>
            <category><![CDATA[macos]]></category>
            <category><![CDATA[linux]]></category>
            <dc:creator><![CDATA[Conrad Johnston]]></dc:creator>
            <pubDate>Thu, 01 Oct 2020 02:38:51 GMT</pubDate>
            <atom:updated>2020-10-01T03:27:25.782Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Refactoring a Docker Compose Project Using Mermaid for Documentation Diagrams.]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@QueenOliviaStR/refactoring-a-docker-compose-project-using-mermaid-for-documentation-diagrams-89cdd45cc718?source=rss-67270cb499ec------2"><img src="https://cdn-images-1.medium.com/max/1280/1*A726_zRtr6WdtCFjP8CsUw.jpeg" width="1280"></a></p><p class="medium-feed-snippet">Using MermaidJS to generate easy to update architectural diagrams, and never forget an import decision again.</p><p class="medium-feed-link"><a href="https://medium.com/@QueenOliviaStR/refactoring-a-docker-compose-project-using-mermaid-for-documentation-diagrams-89cdd45cc718?source=rss-67270cb499ec------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@QueenOliviaStR/refactoring-a-docker-compose-project-using-mermaid-for-documentation-diagrams-89cdd45cc718?source=rss-67270cb499ec------2</link>
            <guid isPermaLink="false">https://medium.com/p/89cdd45cc718</guid>
            <category><![CDATA[docker-compose]]></category>
            <category><![CDATA[tts]]></category>
            <category><![CDATA[documentation]]></category>
            <category><![CDATA[mermaidjs]]></category>
            <category><![CDATA[services]]></category>
            <dc:creator><![CDATA[Conrad Johnston]]></dc:creator>
            <pubDate>Wed, 19 Aug 2020 04:04:41 GMT</pubDate>
            <atom:updated>2021-02-04T21:24:00.411Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Async load an audio file and play it with howler.js]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://levelup.gitconnected.com/async-load-an-audio-file-and-play-it-with-howler-js-fefc4f537656?source=rss-67270cb499ec------2"><img src="https://cdn-images-1.medium.com/max/2600/1*yXMoRwhgPNxNpd0D7hUU9w.jpeg" width="2957"></a></p><p class="medium-feed-snippet">How to Download a Binary File Into a Javascript Object using XHR.</p><p class="medium-feed-link"><a href="https://levelup.gitconnected.com/async-load-an-audio-file-and-play-it-with-howler-js-fefc4f537656?source=rss-67270cb499ec------2">Continue reading on Level Up Coding »</a></p></div>]]></description>
            <link>https://levelup.gitconnected.com/async-load-an-audio-file-and-play-it-with-howler-js-fefc4f537656?source=rss-67270cb499ec------2</link>
            <guid isPermaLink="false">https://medium.com/p/fefc4f537656</guid>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[redux]]></category>
            <category><![CDATA[typescript]]></category>
            <category><![CDATA[audio]]></category>
            <category><![CDATA[react]]></category>
            <dc:creator><![CDATA[Conrad Johnston]]></dc:creator>
            <pubDate>Sat, 15 Aug 2020 22:49:15 GMT</pubDate>
            <atom:updated>2020-08-20T01:50:28.512Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[How to Use a Library in Next.JS That Wants Window.Whatever]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/swlh/how-to-use-a-library-in-next-js-that-wants-window-whatever-96c738263d67?source=rss-67270cb499ec------2"><img src="https://cdn-images-1.medium.com/max/2600/1*V6w4C7OfB73EKmsuUHFzAQ.jpeg" width="2876"></a></p><p class="medium-feed-snippet">How to use a library that expects to be running in a browser, but is breaking when rendered server-side in the node.js environment, or&#x2026;</p><p class="medium-feed-link"><a href="https://medium.com/swlh/how-to-use-a-library-in-next-js-that-wants-window-whatever-96c738263d67?source=rss-67270cb499ec------2">Continue reading on The Startup »</a></p></div>]]></description>
            <link>https://medium.com/swlh/how-to-use-a-library-in-next-js-that-wants-window-whatever-96c738263d67?source=rss-67270cb499ec------2</link>
            <guid isPermaLink="false">https://medium.com/p/96c738263d67</guid>
            <category><![CDATA[server-side-rendering]]></category>
            <category><![CDATA[react-chat-widget]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Conrad Johnston]]></dc:creator>
            <pubDate>Fri, 14 Aug 2020 21:15:48 GMT</pubDate>
            <atom:updated>2020-08-16T07:16:25.052Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Hosting a Next.JS App on a Non-Root Path]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/swlh/hosting-a-next-js-app-on-a-non-root-path-2ae461ed1cae?source=rss-67270cb499ec------2"><img src="https://cdn-images-1.medium.com/max/2600/1*PyJK61xEF-qtNA4dfITaNA.jpeg" width="4032"></a></p><p class="medium-feed-snippet">How to serve your next.js app from example.com/front-end instead of the assumed example.com/ root path.</p><p class="medium-feed-link"><a href="https://medium.com/swlh/hosting-a-next-js-app-on-a-non-root-path-2ae461ed1cae?source=rss-67270cb499ec------2">Continue reading on The Startup »</a></p></div>]]></description>
            <link>https://medium.com/swlh/hosting-a-next-js-app-on-a-non-root-path-2ae461ed1cae?source=rss-67270cb499ec------2</link>
            <guid isPermaLink="false">https://medium.com/p/2ae461ed1cae</guid>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[nextjs]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[docker-compose]]></category>
            <dc:creator><![CDATA[Conrad Johnston]]></dc:creator>
            <pubDate>Wed, 12 Aug 2020 22:50:56 GMT</pubDate>
            <atom:updated>2020-08-14T22:40:11.009Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[React Native & React Native Web, one code base for iOS, Android and web.]]></title>
            <link>https://medium.com/swlh/react-native-react-native-web-one-code-base-for-ios-android-and-web-b696d14f6107?source=rss-67270cb499ec------2</link>
            <guid isPermaLink="false">https://medium.com/p/b696d14f6107</guid>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[android-app-development]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[ios-app-development]]></category>
            <category><![CDATA[react-native-web]]></category>
            <dc:creator><![CDATA[Conrad Johnston]]></dc:creator>
            <pubDate>Mon, 15 Jul 2019 03:47:16 GMT</pubDate>
            <atom:updated>2020-08-14T21:38:21.992Z</atom:updated>
            <content:encoded><![CDATA[<h3>Write once run anywhere</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*yKcwH_wZXL2-Nhud07V8Ug.jpeg" /><figcaption>It’s Earth and Mars and a City, three things, like iOS, Android and the Web. Images really make an article according to the “publish” screen in Medium.com</figcaption></figure><p>The once marketing slogan for Java is now the holy grail for mobile development teams across the globe. One code base deployable to iOS, Android and web. As of 2019 React Native/React Native Web is the closest we’ve ever been. This article takes you through using React Native/React Native Web to build <em>News-a-tron 3000</em> a simple news reader.</p><h3>The relationship between React Native, and React Native Web</h3><p>React Native is a set of React components that are also implemented for iOS and Android as bespoke native widgets. This is a step change from a webview approach to building hybrid apps. The native components mean no janky UI issues, weird web-isms creeping into interactions, and generally a nicer experience. Accessibility attributes are supported.</p><p>In a strange full-circle moment, we take the mantra “mobile first” literally, building using React Native for handsets, and then using React Native Web to bridge back to a browser environment.</p><p>There are some compromises, which are mainly around being limited to using the components that are available for all three platforms, but as this article demonstraits, there’s enough out-of-the-box to get a decent class of apps into production.</p><h3>Yarn or NPM, Typescript or Vanilla JS</h3><p>This guide uses <em>Yarn</em> and <em>Typescript</em> because that’s how I roll. If you prefer <em>npm</em> and <em>vanilla Javascript</em>, live your best life and substitute commands were appropriate, the whole thing will still work great for you.</p><h3>Simulator vs Emulator</h3><p>Apple calls it’s iOS simulator a simulator because it is just that, a simulation of an iOS operating system. Android, on the other hand, runs a complete VM, and so calls their technology an Emulator. In this article I’ll be using simulator/emulator as the group noun for these programmes.</p><h3>Getting Started</h3><p>Because we are targeting iOS you will need a Mac; Apple are relentless in their demands that developers use their kit. On said Mac you’ll need have the following software installed:</p><ol><li><a href="https://developer.android.com/studio/install">Android Studio</a></li><li><a href="https://developer.apple.com/xcode/">Xcode</a></li><li><a href="https://yarnpkg.com/lang/en/docs/install/#mac-stable">yarn</a></li></ol><h3>Expo</h3><p>Expo is a kinder version of React Native, which contains everything you need, under package management, to run iOS and Android apps. You are welcome to use React Native directly, but there will be more plumbing involved, trust me, Expo is your friend.</p><p>If you later decide you want more control over your project you can <a href="https://docs.expo.io/versions/latest/expokit/eject/">eject</a> Expo and your project will become a self-managed ExpoKit/React Native situation. So choosing Expo now doesn’t commit you to it for ever and ever.</p><blockquote><em>With Expo tools, services, and React Native, you can build, deploy, and quickly iterate on native iOS and Android apps from the same JavaScript codebase. (from the </em><a href="https://expo.io/"><em>Expo home page</em></a><em>)</em></blockquote><pre>yarn global add expo-cli</pre><h3>Creating the project</h3><p>This interactive command will create a new Expo project.</p><pre>expo init NewsATron3000</pre><p>Following the onscreen prompts, set the following parameters:</p><p>Template: Blank (Typescript) <br>name: News-a-Tron 3000 <br>slug: NewsATron3000 <br>Yarn installs dependencies? Yes</p><p>That’s all there is too it, now, if you’re like me you’ll want to see it running right away, and you’re in luck, there are scripts to launch your first React Native app.</p><h3>Launch in device simulators/emulators</h3><pre>yarn start</pre><p>This will launch a command line tool (which this article will focus on), and a glorious web interface (which you can explore without guidance).</p><p>This technology is under development, so if it doesn’t work first try, restart the simulator/emulator, enable some permission or other, Google the error message. This is when you really want to lean into your developer faux-C-D and hammer away until you get the app running.</p><p>From the terminal you can use the following keyboard shortcut commands to get your app into a device simulator/emulator.</p><p><strong>i</strong> for iOS, launches the iOS simulator, installs the code, enables hot loading and shows you the welcome screen.</p><p><strong>a</strong> for Android, at the time of writing the Android emulator does not launch automatically. To get the emulator up and running:</p><ol><li>Launch <em>Android Studio</em></li><li><em>Configure</em> &gt; <em>AVD Manager</em></li><li><em>Create Virtual Device…</em></li><li>Follow the onscreen prompts to create an emulator image</li><li>In the terminal, get a list of emulator device names ~/Library/Android/Sdk/tools/emulator -list-avds</li><li>~/Library/Android/Sdk/tools/emulator -avd &lt;name of device&gt;</li></ol><p>Now that the Android emulator is running you can hit <strong>a</strong> and see the app be deployed to the emulator.</p><h3>React Native Web</h3><blockquote><em>This section owns a debt of gratitude to Jonny Kalamby, author of </em><a href="https://medium.com/@jonnykalambay/your-first-hybrid-app-in-15-minutes-react-native-on-the-web-2cc2646051e"><em>Your First Hybrid App in Minutes — React Native on the Web</em></a><em>.</em></blockquote><p>To run React Native code in React Native Web, you need a few more packages (of course you do, this is JS development after all).</p><pre>yarn add react-scripts\<br>         react-dom\<br>        @types/react-dom\<br>         react-native-web\<br>         react-art\<br>         react-router-native\<br>         react-router-dom</pre><h3>Harmonizing entry points</h3><p>Expo uses App.tsx as the entry point, but React Native Web uses src/index.tsx. Happily, a bit of a file reshuffle means we can have both entry points point, ultimately, to the same codebase.</p><p>What we are going to do is move the generated App.js into src/ because React Native Web chucks a tantrum about any files above src/ in the hierarchy. The original App.js will point to scr/App.tsx as will src/index.js and all will be well in the world.</p><pre>mkdir src<br>mv App.tsx src/<br>emacs App.tsx # emacs or vi, whatever rocks your world</pre><p>Paste in the following to the newly recreated Apps.tsx</p><pre>import React from &#39;react&#39;<br>import App from &#39;./src/App&#39;</pre><pre>export default () =&gt; {<br>  return &lt;App /&gt;<br>}</pre><p>—</p><pre>emacs src/index.tsx</pre><p>Again, paste the following into the newly created file.</p><pre>import React from &#39;react&#39;;<br>import ReactDom from &#39;react-dom&#39;;<br>import App from &#39;./App&#39;;</pre><pre>ReactDom.render(<br>    &lt;App /&gt;, <br>    document.getElementById(&quot;root&quot;)<br>);</pre><h3>Create an HTML harness</h3><p>The last bit of file creation is the HTML harness that React Native Web will run inside.</p><pre>mkdir public<br>emacs public/index.html</pre><p>Then paste the following in the newly created file:</p><pre>&lt;!DOCTYPE html&gt;<br>&lt;html lang=&quot;en-US&quot;&gt;<br>   &lt;head&gt;<br>      &lt;meta charset=&quot;utf-8&quot; /&gt;<br>      &lt;title&gt;News-a-tron 3000&lt;/title&gt;<br>  &lt;/head&gt;<br>  &lt;body&gt;<br>      &lt;div id=&quot;root&quot;&gt;&lt;/div&gt;<br>   &lt;/body&gt;<br>&lt;/html&gt;</pre><h3>Starting React Native Web</h3><p>Now that the code is set up, a couple commands need to be added to package.json, there are:</p><pre>&quot;scripts&quot;: {<br>    /* There should be some script definitions here already, just append these two at the end */<br>    &quot;start-web&quot;: &quot;react-scripts start&quot;,<br>    &quot;build-web&quot;: &quot;react-scripts build&quot;<br>  },</pre><p>Now you can run</p><pre>yarn start web</pre><p>And a browser will open containing your app. Magic.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b696d14f6107" width="1" height="1" alt=""><hr><p><a href="https://medium.com/swlh/react-native-react-native-web-one-code-base-for-ios-android-and-web-b696d14f6107">React Native &amp; React Native Web, one code base for iOS, Android and web.</a> was originally published in <a href="https://medium.com/swlh">The Startup</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>