<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bob Nadler</title>
    <description>The latest articles on DEV Community by Bob Nadler (@bobnadler).</description>
    <link>https://dev.to/bobnadler</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F61819%2F202d9b80-20a7-4254-8988-fe720e8f2b57.png</url>
      <title>DEV Community: Bob Nadler</title>
      <link>https://dev.to/bobnadler</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bobnadler"/>
    <language>en</language>
    <item>
      <title>VirtualBox 6.1.x Windows 10 2004 Upgrade Problem Resolution</title>
      <dc:creator>Bob Nadler</dc:creator>
      <pubDate>Thu, 28 May 2020 22:08:13 +0000</pubDate>
      <link>https://dev.to/bobnadler/virtualbox-6-1-x-windows-10-2004-upgrade-problem-resolution-4i39</link>
      <guid>https://dev.to/bobnadler/virtualbox-6-1-x-windows-10-2004-upgrade-problem-resolution-4i39</guid>
      <description>&lt;p&gt;Original post: &lt;a href="https://bobonmedicaldevicesoftware.com/blog/2020/05/28/virtualbox-6-1-x-windows-10-2004-upgrade-problem-resolution/"&gt;Virtualbox 6.1.x Windows-10 2004 Upgrade Problem Resolution&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is just a quick note that will hopefully save someone time.&lt;/p&gt;

&lt;p&gt;When I upgraded Windows 10 (64-bit) from 1909 to 2004 I found that Virtualbox 6.1.x no longer worked properly. All of my guest instances (Ubuntu, Mint, etc.) failed to start. Specifically, they just &lt;em&gt;hung with a blinking cursor&lt;/em&gt; and there were no errors in the logs.&lt;/p&gt;

&lt;p&gt;There were no reports on this problem on the &lt;a href="https://forums.virtualbox.org/viewforum.php?f=6"&gt;VirtualBox on Windows Hosts&lt;/a&gt; forum.&lt;/p&gt;

&lt;p&gt;It turns out that when Windows 10 2004 is installed it enables the &lt;strong&gt;Windows Hypervisor Platform&lt;/strong&gt; feature. &lt;/p&gt;

&lt;p&gt;To check this setting run &lt;em&gt;OptionalFeatures.exe&lt;/em&gt; from a Windows command shell. You'll see this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---VDsjnzi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4ktzxj6grrlk9hxl9mbc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---VDsjnzi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/4ktzxj6grrlk9hxl9mbc.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The resolution to the hang problem is to disable this feature. Doing this is simple:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Uncheck&lt;/strong&gt; the Windows Hypervisor Platform checkbox (above).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reboot&lt;/strong&gt;. Even though it's not indicated when you do step #1, a reboot is required to disable the feature.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it!&lt;/p&gt;

</description>
      <category>howto</category>
      <category>windows10</category>
      <category>virtualbox</category>
    </item>
    <item>
      <title>Exploring Clojure (and FP vs OOP)</title>
      <dc:creator>Bob Nadler</dc:creator>
      <pubDate>Tue, 29 Jan 2019 16:15:30 +0000</pubDate>
      <link>https://dev.to/bobnadler/exploring-clojure-and-fp-vs-oop-5d7i</link>
      <guid>https://dev.to/bobnadler/exploring-clojure-and-fp-vs-oop-5d7i</guid>
      <description>&lt;p&gt;I’ve always viewed functional programming (FP) from afar, mostly because object-oriented programming (OOP) is the dominant development methodology I’ve been using (Java, Ruby, C#, etc.) for many years.  A majority of the articles I’ve read on FP have statements like this:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you’ve never tried functional programming development, I assure you that this is one of the best time investments you can make. You will not only learn a new programming language, but also a completely new way of thinking. A completely different paradigm.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Please read the entire article here: &lt;a href="https://bobonmedicaldevicesoftware.com/blog/2019/01/27/exploring-clojure-and-fp-vs-oop/"&gt;Exploring Clojure (and FP vs OOP)&lt;/a&gt;&lt;/p&gt;

</description>
      <category>clojure</category>
      <category>clojurescript</category>
    </item>
    <item>
      <title>Ubuntu 18.04 Upgrade Problem Resolutions</title>
      <dc:creator>Bob Nadler</dc:creator>
      <pubDate>Sat, 18 Aug 2018 21:45:57 +0000</pubDate>
      <link>https://dev.to/bobnadler/ubuntu-1804-upgrade-problem-resolutions-1ni0</link>
      <guid>https://dev.to/bobnadler/ubuntu-1804-upgrade-problem-resolutions-1ni0</guid>
      <description>&lt;p&gt;Original post: &lt;a href="https://bobonmedicaldevicesoftware.com/blog/2018/08/04/ubuntu-18-04-upgrade-problem-resolutions/" rel="noopener noreferrer"&gt;Ubuntu 18.04 Upgrade Problem Resolutions&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.ubuntu.com" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbobonmedicaldevicesoftware.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F08%2Fubuntu-150x150.png" alt=""&gt;&lt;/a&gt;I recently upgraded my 3-year-old Lenovo X1 Carbon from Ubuntu 16.04 TLS to 18.04 LTS. I think I ran into the two most common upgrade issues, and since both of them are show-stoppers, I thought it would be worth sharing the resolutions that worked for me.&lt;/p&gt;

&lt;p&gt;Here are the two problems:&lt;/p&gt;

&lt;ol&gt;
    &lt;li&gt;
&lt;strong&gt;"Login Loop"&lt;/strong&gt;: After a valid authentication on the login screen, the display goes black momentarily, and then returns you to the login screen.&lt;/li&gt;
    &lt;li&gt;
&lt;strong&gt;systemd-udevd CPU usage&lt;/strong&gt;: On my system, it consumed about 20% of the CPU. I've read that it can be much higher on other systems (like 100%).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;The Upgrade&lt;/h3&gt;

&lt;p&gt;Simple: From &lt;em&gt;Software &amp;amp; Updates&lt;/em&gt; on the Updates tab, select 'For any new version':&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbobonmedicaldevicesoftware.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F08%2Fanynewversion.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbobonmedicaldevicesoftware.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F08%2Fanynewversion.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After the next update, the &lt;em&gt;Software Updater&lt;/em&gt; will offer the 18.04 upgrade option.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbobonmedicaldevicesoftware.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F08%2Fupgradeto1804.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbobonmedicaldevicesoftware.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F08%2Fupgradeto1804.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just click on the &lt;code&gt;Upgrade...&lt;/code&gt; button and follow the instructions from there.&lt;/p&gt;

&lt;h3&gt;Login Loop&lt;/h3&gt;

&lt;p&gt;After the upgrade is complete, this problem will prevent you from logging in to a Gnome desktop. Use Alt-Ctrl-F2 to drop to a terminal and login. Execute the following:&lt;/p&gt;

&lt;pre&gt;$ sudo apt-get purge gdm*
$ sudo apt-get purge lightdm
$ sudo apt-get install lightdm
$ sudo apt-get install nvidia-352&lt;/pre&gt;
Just removing &lt;code&gt;gdm&lt;/code&gt; and re-installing &lt;code&gt;lightdm&lt;/code&gt; was not sufficient to resolve this issue for me. Installation of the Nvidia driver (line 4) was the key. Later versions than nvidia-352 (like nvidia-384) will also probably work.
&lt;h3&gt;systemd-udevd CPU Usage&lt;/h3&gt;
Now that you can login to your desktop, you may notice high CPU usage. If &lt;code&gt;top&lt;/code&gt; or &lt;code&gt;htop&lt;/code&gt; show that systemd-udevd is the culprit, confirm that UDEV events are being generated with &lt;code&gt;udevadm&lt;/code&gt;. For me the output looked like this:
&lt;pre&gt;$ udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[33.704228] add      /module/nvidia (module)
KERNEL[33.704784] add      /kernel/slab/:0012288 (slab)
KERNEL[33.705062] remove   /kernel/slab/:0012288 (slab)
UDEV  [33.705332] add      /kernel/slab/:0012288 (slab)
UDEV  [33.705659] remove   /kernel/slab/:0012288 (slab)
KERNEL[33.724214] remove   /module/nvidia (module)
KERNEL[33.755768] add      /module/nvidia (module)
KERNEL[33.756482] add      /kernel/slab/:0012288 (slab)
KERNEL[33.756764] remove   /kernel/slab/:0012288 (slab)
UDEV  [33.757642] add      /kernel/slab/:0012288 (slab)
UDEV  [33.757981] remove   /kernel/slab/:0012288 (slab)
KERNEL[33.772269] remove   /module/nvidia (module)
UDEV  [33.792191] add      /module/nvidia (module)
UDEV  [33.807097] remove   /module/nvidia (module)
KERNEL[33.830290] add      /module/nvidia (module)
...
&lt;/pre&gt;

&lt;p&gt;This can be resolved by stopping the systemd-udevd service:&lt;/p&gt;

&lt;pre&gt;$ sudo systemctl stop systemd-udevd systemd-udevd-control.socket systemd-udevd-kernel.socket&lt;/pre&gt;

&lt;p&gt;The CPU usage will drop and &lt;code&gt;udevadm&lt;/code&gt; stops reporting events.&lt;/p&gt;

&lt;p&gt;If needed, the systemd-udevd service can be started again:&lt;/p&gt;

&lt;pre&gt;$ sudo systemctl start systemd-udevd systemd-udevd-control.socket systemd-udevd-kernel.socket&lt;/pre&gt;

&lt;p&gt;I found that the CPU issue did &lt;strong&gt;not&lt;/strong&gt; re-appear after the service was restarted.&lt;/p&gt;

&lt;h4&gt;Startup Changes&lt;/h4&gt;

&lt;p&gt;This is great, but you don't want to have to manually run a command every time you log into your system. Here is how to execute this command automatically at startup.&lt;/p&gt;

&lt;p&gt;First, you need to be able to execute the &lt;code&gt;systemctl&lt;/code&gt; command as root without having to enter a password.&lt;/p&gt;

&lt;p&gt;Create a script and set the correct permissions as follows:&lt;/p&gt;

&lt;pre&gt;$ echo 'systemctl stop systemd-udevd systemd-udevd-control.socket systemd-udevd-kernel.socket' &amp;gt; stop_systemd_udevd.sh
$ sudo chown root.root stop_systemd_udevd.sh
$ sudo chmod 4755 stop_systemd_udevd.sh&lt;/pre&gt;

&lt;p&gt;Next, run:&lt;/p&gt;

&lt;pre&gt;$ sudo visudo&lt;/pre&gt;

&lt;p&gt;and add the following line &lt;strong&gt;at the bottom&lt;/strong&gt; (this is important) of the &lt;code&gt;/etc/sudoers&lt;/code&gt; file.&lt;/p&gt;

&lt;pre&gt;bob ALL=(root) NOPASSWD: /home/bob/stop_systemd_udevd.sh&lt;/pre&gt;

&lt;p&gt;Of course, change bob and /home/bob as needed.&lt;/p&gt;

&lt;p&gt;Now you should be able to run&lt;/p&gt;

&lt;pre&gt;$ sudo ./stop_systemd_udevd.sh&lt;/pre&gt;

&lt;p&gt;without being prompted for a password.&lt;/p&gt;

&lt;p&gt;The last step is to add execution of this script when your system starts up. Use &lt;em&gt;Startup Application Preferences&lt;/em&gt; and add the follow (change /home/bob, of course).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbobonmedicaldevicesoftware.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F08%2Fstartup-application.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbobonmedicaldevicesoftware.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F08%2Fstartup-application.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That should do it! Reboot your system and the systemd-udevd service should not be running.&lt;/p&gt;

&lt;p&gt;Hope this helps. Enjoy!&lt;/p&gt;

</description>
      <category>ubuntu</category>
      <category>linux</category>
      <category>howto</category>
    </item>
    <item>
      <title>Embedding Angular Components into a Legacy Web App</title>
      <dc:creator>Bob Nadler</dc:creator>
      <pubDate>Wed, 25 Jul 2018 20:36:57 +0000</pubDate>
      <link>https://dev.to/bobnadler/embedding-angular-components-into-a-legacy-web-app-2ff5</link>
      <guid>https://dev.to/bobnadler/embedding-angular-components-into-a-legacy-web-app-2ff5</guid>
      <description>&lt;p&gt;Original post: &lt;a href="http://bobonmedicaldevicesoftware.com/blog/2018/07/25/embedding-angular-components-into-a-legacy-web-app" rel="noopener noreferrer"&gt;Embedding Angular Components into a Legacy Web App&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: Code samples do not include line numbers in this version.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fbobonmedicaldevicesoftware.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F07%2Fembedded-angular-150x150.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fbobonmedicaldevicesoftware.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F07%2Fembedded-angular-150x150.png" alt=""&gt;&lt;/a&gt; In a perfect world, you'd be able to create a greenfield Angular SPA from scratch. In the real world, that's usually not the case. That legacy web application has way too much baggage to realistically convert it to an SPA in a single shot. This is particularly true if you're currently using server-side rendering with (e.g.) JSP or Rails technology.&lt;/p&gt;

&lt;p&gt;The only real solution is to &lt;strong&gt;incrementally&lt;/strong&gt; move/upgrade pieces of UI logic and data access patterns (i.e. converting to REST interfaces). If you are planning a move to Angular&lt;strong&gt;*&lt;/strong&gt;, a good starting point is to first embed small pieces of Angular-implemented logic into your existing application. This approach also allows the new Angular components to share CSS styles for seamless visual integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NgInterop&lt;/strong&gt; is a simple TypeScript class that allows a legacy Web application to have &lt;strong&gt;two-way communications&lt;/strong&gt; (via &lt;a href="https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern" rel="noopener noreferrer"&gt;pub/sub&lt;/a&gt;) with embedded Angular components. The underlying &lt;strong&gt;MessagingSerivce&lt;/strong&gt; class is an implementation of &lt;a href="http://www.processinginfinity.com/weblog/2016/08/18/MessageBus-Pattern-in-Angular2-TypeScript" rel="noopener noreferrer"&gt;Message Bus pattern in Angular 2 and TypeScript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Source code for the demo project is here: &lt;a href="https://github.com/rnadler/embedded-angular" rel="noopener noreferrer"&gt;embedded-angular&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NgInterop.ts&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;NgZone&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;AngularEvent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;EventCallbackFunction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;HtmlEvent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;LogEvent&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./event.types&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;MessagingService&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./messaging.service&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;providedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NgInterop&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;ANGULAR_EVENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AngularEvent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;HTML_EVENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HtmlEvent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nx"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;LOG_EVENT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;LogEvent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kr"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;typeClassMap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;any&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
  &lt;span class="kr"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;readonly&lt;/span&gt; &lt;span class="nx"&gt;initCallback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;any&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kr"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;ngZone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NgZone&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kr"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;messagingService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MessagingService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;typeClassMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;NgInterop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ANGULAR_EVENT&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="nx"&gt;AngularEvent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;typeClassMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;NgInterop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;HTML_EVENT&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="nx"&gt;HtmlEvent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;typeClassMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;NgInterop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;LOG_EVENT&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="nx"&gt;LogEvent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;initCallback&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NgInteropInitCallback&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ngInterop&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kr"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;initCallback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NgInterop.init: No NgInteropInitCallback found!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initCallback&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;subscribeToClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;callBack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;EventCallbackFunction&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;any&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ngZone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messagingService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;typeClassMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;callBack&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="kr"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;publishToClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;any&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ngZone&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messagingService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;typeClassMap&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nx"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Highlights:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;
&lt;strong&gt;6&lt;/strong&gt;: Side note on the new Angular 6 &lt;strong&gt;providedIn&lt;/strong&gt; syntax. This saves from having to add every service to the app.module.ts @NgModule providers list. Very handy!&lt;/li&gt;
    &lt;li&gt;
&lt;strong&gt;19&lt;/strong&gt;: This saves the native JavaScript initialization callback function (see index.html below). This example only has one callback function, but it would be easy to extend this functionality to support multiple initialization callbacks.&lt;/li&gt;
    &lt;li&gt;
&lt;strong&gt;20&lt;/strong&gt;: Add the NgInterop instance into the &lt;code&gt;window&lt;/code&gt; object so that external JavaScript can simply call methods on &lt;code&gt;window.ngInterop&lt;/code&gt; (again, see index.html below).&lt;/li&gt;
    &lt;li&gt;
&lt;strong&gt;32 and 38&lt;/strong&gt;: Wrap the MessagingService subscribe/publish in a &lt;a href="https://angular.io/api/core/NgZone#run" rel="noopener noreferrer"&gt;NgZone.run()&lt;/a&gt; call. This allows the external JavaScript to execute these functions in the Angular zone.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Other notes:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;The &lt;strong&gt;typeClassMap&lt;/strong&gt; object maps a BaseEvent class name (string) to a real class. The public static *_EVENT names provide safer access to the NgInterop functions from the Angular code.&lt;/li&gt;
    &lt;li&gt;There's no way to do type or parameter checking on the native JavaScript side, but it is still good practice to strongly type the BaseEvent derived classes. This provides good documentation and catches problems early on the TypeScript side.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is the stripped down &lt;strong&gt;index.html&lt;/strong&gt; that shows how the external JavaScript code interacts with NgInterop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;index.html (snippet)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;script&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;subscribeToEvents&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ngInterop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribeToClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;AngularEvent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="p"&gt;...&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;clickMe&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ngInterop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;publishToClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;HtmlEvent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;clickMe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;getRandomString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NgInteropInitCallback&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;subscribeToEvents&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/script&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Highlights:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;
&lt;strong&gt;4&lt;/strong&gt;: After &lt;strong&gt;subscribeToEvents()&lt;/strong&gt; is called by the NgInterop constructor, this function subscribes to AngularEvent messages. AngularEvent messages are published when the Angular 'Toggle Remove Button' is clicked in the &lt;strong&gt;AppComponent&lt;/strong&gt; class.&lt;/li&gt;
    &lt;li&gt;
&lt;strong&gt;10&lt;/strong&gt;: On an HTML click event an HtmlEvent message is published. The subscriber to the HtmlEvent messages is also in the AppComponent class.&lt;/li&gt;
    &lt;li&gt;
&lt;strong&gt;13&lt;/strong&gt;: The callback function is added to the &lt;code&gt;window&lt;/code&gt; object. This is executed prior to Angular being started up.&lt;/li&gt;
    &lt;li&gt;All logging is done by publishing LogEvent messages. These are displayed by the &lt;strong&gt;LogComponent&lt;/strong&gt; class.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The example app has two Angular components that interact with the native JavaScript as well as with each other with NgInterop. The rest of the code should be self-explanatory.&lt;/p&gt;

&lt;p&gt;Screenshot of the example app:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rnadler/embedded-angular" rel="noopener noreferrer"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fbobonmedicaldevicesoftware.com%2Fblog%2Fwp-content%2Fuploads%2F2018%2F07%2Fembedded-angular-app.png" alt=""&gt;&lt;/a&gt;&lt;br&gt;
This project uses the following:&lt;/p&gt;

&lt;ul&gt;
    &lt;li&gt;
&lt;a href="https://github.com/angular/angular-cli" rel="noopener noreferrer"&gt;Angular CLI&lt;/a&gt; -- Of course.&lt;/li&gt;
    &lt;li&gt;
&lt;a href="https://rxjs-dev.firebaseapp.com/" rel="noopener noreferrer"&gt;RxJS&lt;/a&gt;  -- Used by the MessagingService.&lt;/li&gt;
    &lt;li&gt;
&lt;a href="https://getbootstrap.com/" rel="noopener noreferrer"&gt;Bootstrap 4&lt;/a&gt; -- For the pretty buttons and "card" layout.&lt;/li&gt;
    &lt;li&gt;
&lt;a href="https://momentjs.com/" rel="noopener noreferrer"&gt;Moment.js&lt;/a&gt;  -- To more easily format the log timestamp.&lt;/li&gt;
    &lt;li&gt;
&lt;a href="https://www.protractortest.org/#/" rel="noopener noreferrer"&gt;Protractor&lt;/a&gt;  -- For running the Angular e2e tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enjoy!&lt;br&gt;
&lt;strong&gt;*&lt;/strong&gt;There are probably similar integration approaches for &lt;a href="https://reactjs.org/" rel="noopener noreferrer"&gt;React&lt;/a&gt; and &lt;a href="https://vuejs.org/" rel="noopener noreferrer"&gt;Vue&lt;/a&gt;. I just don't know what they are.&lt;/p&gt;

</description>
      <category>angular</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Should I accept a Linkedin connection request from a candidate we didn't hire?</title>
      <dc:creator>Bob Nadler</dc:creator>
      <pubDate>Thu, 22 Mar 2018 18:27:36 +0000</pubDate>
      <link>https://dev.to/bobnadler/should-i-accept-a-linkedin-connection-request-from-a-candidate-we-didnt-hire-3nlc</link>
      <guid>https://dev.to/bobnadler/should-i-accept-a-linkedin-connection-request-from-a-candidate-we-didnt-hire-3nlc</guid>
      <description>&lt;p&gt;The candidate wasn't bad but the consensus was thumbs down. There's always the possibility our paths will cross again in the future but for some reason accepting feels awkward. &lt;/p&gt;

&lt;p&gt;What would you do?&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Did you know that Google is an Evil Monopoly?</title>
      <dc:creator>Bob Nadler</dc:creator>
      <pubDate>Sat, 10 Mar 2018 22:47:03 +0000</pubDate>
      <link>https://dev.to/bobnadler/did-you-know-that-google-is-an-evil-monopoly--16ma</link>
      <guid>https://dev.to/bobnadler/did-you-know-that-google-is-an-evil-monopoly--16ma</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gjzaJqxc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/fskrj7dqep77a6l97sot.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gjzaJqxc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/fskrj7dqep77a6l97sot.jpeg" alt="alt text"&gt;&lt;/a&gt;&lt;br&gt;
See: &lt;a href="http://bobonmedicaldevicesoftware.com/blog/2018/03/03/the-problem-with-google-and-why-you-should-care/"&gt;The Problem With Google And Why You Should Care&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reading the &lt;a href="https://www.medgadget.com/2018/03/google-serfdom-publishing-digital-age.html"&gt;Medgadget article&lt;/a&gt; was a real wakeup call for me, but I suspect that most people do not realize that Google's behavior continues to have a significant impact on innovation and online content. This has been going on for a long time but still seems like a well-kept secret.&lt;/p&gt;

&lt;p&gt;Questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;For Google employees: Did you know you work for an Evil Monopoly?&lt;/li&gt;
&lt;li&gt;For everyone else: Did you &lt;strong&gt;even&lt;/strong&gt; know that Google was an Evil Monopoly?&lt;/li&gt;
&lt;li&gt;Have you ever been directly affected by this (e.g. a failed startup)?&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
  </channel>
</rss>
