<?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>Forem: Frederik 👨‍💻➡️🌐 Creemers</title>
    <description>The latest articles on Forem by Frederik 👨‍💻➡️🌐 Creemers (@_bigblind).</description>
    <link>https://forem.com/_bigblind</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%2F12652%2F92ba4d26-3658-460b-9c79-7667b2db8389.jpg</url>
      <title>Forem: Frederik 👨‍💻➡️🌐 Creemers</title>
      <link>https://forem.com/_bigblind</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/_bigblind"/>
    <language>en</language>
    <item>
      <title>Are tag follows not used for the home page feeds?</title>
      <dc:creator>Frederik 👨‍💻➡️🌐 Creemers</dc:creator>
      <pubDate>Mon, 08 Sep 2025 02:29:46 +0000</pubDate>
      <link>https://forem.com/_bigblind/are-tag-follows-not-used-for-the-home-page-feeds-288k</link>
      <guid>https://forem.com/_bigblind/are-tag-follows-not-used-for-the-home-page-feeds-288k</guid>
      <description>&lt;p&gt;I've admittedly been a lot les active on dev.to for a while, and so a lot of the people I follow are old accounts who no longer publish much content on dev.to, if any. So when I go to look at my home feed, both "Discover" and "Following", most of what I see are posts from the DEV team.&lt;/p&gt;

&lt;p&gt;I do, however, follow a fair number of tags, ranging from various programming languages, to #explainlikimfive and similar. Those do still get some activity, but I'm not seeing any of their posts on my home feed. Are they not considered? When I look at the top 7 posts overview, I do see that there's still some great stuff being published to the site, but I don't really have a good way to discover it, other than those posts right now.&lt;/p&gt;

</description>
      <category>product</category>
    </item>
    <item>
      <title>Look &amp; Learn: a Google AI Multimodal Challenge Entry</title>
      <dc:creator>Frederik 👨‍💻➡️🌐 Creemers</dc:creator>
      <pubDate>Sun, 07 Sep 2025 21:50:37 +0000</pubDate>
      <link>https://forem.com/_bigblind/look-learn-a-google-ai-multimodal-challenge-entry-34lk</link>
      <guid>https://forem.com/_bigblind/look-learn-a-google-ai-multimodal-challenge-entry-34lk</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-ai-studio-2025-09-03"&gt;Google AI Studio Multimodal Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I created &lt;strong&gt;Look &amp;amp; Learn&lt;/strong&gt;, a daily challenge app for language learners. Each day, one new image is generated, and for every language and skill level, a équiz is created. You can always go back and play quizzes from earlier days, and if a quiz for that day doesn’t exist yet, it will be generated when you first try it. You can also see which days you've already played, so you can get a streak going!&lt;/p&gt;

&lt;p&gt;The app will then ask you some questions about the image, in the language you’re trying to learn. For beginners, all the questions are multiple choice. For intermediate and advanced levels, you’ll have to type out your answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://look-learn-174115661584.us-west1.run.app/" rel="noopener noreferrer"&gt;Try Look &amp;amp; Learn here&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvh1p8iuqnm87qrtjttn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvh1p8iuqnm87qrtjttn.png" alt="Screenshot of the Look &amp;amp; Learn start screen. Here, the user has options to select the language they speak, the language they want to learn, and their level of fluency. A button at the bottom lets them start the quiz."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1s4wtjd7y2g8nuw4fbcn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1s4wtjd7y2g8nuw4fbcn.png" alt="Image showing a multiple choice question where the user has picked the wrong answer. The wrong answer is highlighted in red, while the correct one is shown in green. At the bottom, an explanation in the user's native language is shown."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Screenshot from an intermediate level Dutch quiz:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6uvum1x70c4fc2vcodz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy6uvum1x70c4fc2vcodz.png" alt="Screenshot showing a question where the user had to type in an answer. At the bottom, there's a message indicating that the user has answered correctly, but that there was a grammar issue about verb conjugation, and explaining it."&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Google AI Studio
&lt;/h2&gt;

&lt;p&gt;I wanted to see how far I could take Google AI Studio while touching the code by hand as little as possible. While I'm mostly skeptical of vibe coding, I thought this challenge was an interesting opportunity to give it a try. So, I mostly wrote prompts, and would give the model feedback in natural language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multimodal Features
&lt;/h2&gt;

&lt;p&gt;At the start of each daily challenge, the application always uses the image for that day, generating it if it doesn’t exist yet. That image is then the basis for all the quizzes created that day.&lt;/p&gt;

&lt;p&gt;Gemini-2.5-flash is used to generate questions about the image, with prompts that include guidelines for the questions as well as the user’s fluency level. For multiple choice questions, the correct answer is clear and immediate feedback is given. For text entry questions, the user’s response is sent back to Gemini-2.5-flash to evaluate correctness and provide grammar and vocabulary feedback.&lt;/p&gt;

&lt;p&gt;Finally, the image is also passed to Gemini-2.5-flash to generate an alt text. This description contains all the information needed to answer the quiz questions, but it’s provided in the learner’s native language so that they still have to make the effort of translating and connecting the details. I’ve also made sure that any text in other languages is wrapped with the correct &lt;code&gt;lang&lt;/code&gt; attribute, so screen readers pronounce them properly.&lt;/p&gt;




&lt;p&gt;Would you like me to also add a &lt;strong&gt;short line in the “What I Built” intro&lt;/strong&gt; (something like “This way, the community is sharing the same daily challenge”) to highlight the communal aspect, or do you prefer to keep it focused just on the learner’s experience?&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>googleaichallenge</category>
      <category>ai</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Any tips for making Google AI studio keep existing functionality?</title>
      <dc:creator>Frederik 👨‍💻➡️🌐 Creemers</dc:creator>
      <pubDate>Sat, 06 Sep 2025 20:59:38 +0000</pubDate>
      <link>https://forem.com/_bigblind/any-tips-for-making-google-ai-studio-keep-existing-functionality-4emk</link>
      <guid>https://forem.com/_bigblind/any-tips-for-making-google-ai-studio-keep-existing-functionality-4emk</guid>
      <description>&lt;p&gt;I'm noticing that as I ask AI studio to add features to my app, it sometimes breaks existing ones. Other than maybe being more specific as to how exactly to implement a feature, is there a way to have it ensure that existing functionality I specified in previous instructions keeps working?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>learngoogleaistudio</category>
    </item>
    <item>
      <title>Any good resources on diversity in tech in Europe?</title>
      <dc:creator>Frederik 👨‍💻➡️🌐 Creemers</dc:creator>
      <pubDate>Tue, 16 Mar 2021 15:35:46 +0000</pubDate>
      <link>https://forem.com/_bigblind/any-good-resources-on-diversity-in-tech-in-europe-37mn</link>
      <guid>https://forem.com/_bigblind/any-good-resources-on-diversity-in-tech-in-europe-37mn</guid>
      <description>&lt;p&gt;It seems like a lot of discussions and initiatives around diversity in tech I see online are quite US-centric, and I think there's an important local aspect to diversity, where every region's population is different, as are the issues minorities are facing. Are there job boards like &lt;a href="https://diversifytech.co"&gt;Diversify Tech&lt;/a&gt; that have a European focus? Are there any relevant groups or people to follow?&lt;/p&gt;

&lt;p&gt;I'm asking about Europe because that's where I live and work, but I think it might be useful to share resources for other regions as well.&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Using React Portals in TalkJS HTMLPanels</title>
      <dc:creator>Frederik 👨‍💻➡️🌐 Creemers</dc:creator>
      <pubDate>Fri, 25 Sep 2020 11:45:05 +0000</pubDate>
      <link>https://forem.com/talkjs/using-react-portals-in-talkjs-htmlpanels-2852</link>
      <guid>https://forem.com/talkjs/using-react-portals-in-talkjs-htmlpanels-2852</guid>
      <description>&lt;h1&gt;
  
  
  What are HTML Panels?
&lt;/h1&gt;

&lt;p&gt;TalkJS provides an easy way to add chat functionality to your website, with a nice pre-built user interface that you can customise. But sometimes, you want to add a bit of your own UI to the chat. TalkJS is rendered inside an iframe, so you can't edit the DOM directly, but we have a feature called HTML Panels that lets you load your own web page in a panel above the message field. It lets you do things like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zAdgU7U2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://talkjs.com/docs/img/html-panel.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zAdgU7U2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://talkjs.com/docs/img/html-panel.png" alt="TalkJS chat with an email form" width="394" height="649"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The email form you see there is rendered in an HTML panel.&lt;/p&gt;

&lt;h1&gt;
  
  
  What are React portals?
&lt;/h1&gt;

&lt;p&gt;Portals are a way for a React component to render its children in a different DOM node.&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="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;ReactDOM&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createPortal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Hello&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/p&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;,
&lt;/span&gt;    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;someOtherElement&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can pass anything that's renderable by React to &lt;code&gt;createPortal&lt;/code&gt;, including &lt;code&gt;props.children&lt;/code&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Combining Portals with HTML Panels
&lt;/h1&gt;

&lt;p&gt;So let's say you're writing a &lt;code&gt;Chatbox&lt;/code&gt; component, and you want it to render a TalkJS chatbox, and you want it to contain an email form like above, but you'd also like that form to be part of your main React application.&lt;/p&gt;

&lt;p&gt;To start, let's have a look at what the Chatbox component might look like. I'm assuming that a &lt;a href="https://talkjs.com/docs/Reference/JavaScript_Chat_SDK/Session.html"&gt;&lt;code&gt;Session&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://talkjs.com/docs/Reference/JavaScript_Chat_SDK/ConversationBuilder.html"&gt;&lt;code&gt;ConversationBuilder&lt;/code&gt;&lt;/a&gt; object are passed as props. Read our &lt;a href="https://talkjs.com/docs/Getting_Started/Frameworks/React.html"&gt;Getting started&lt;/a&gt; guide to find out how to set these up.&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="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Chatbox&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Component&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="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&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;chatboxContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createRef&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;componentDidMount&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;chatbox&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;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createChatbox&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;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conversation&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;chatbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mount&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;chatboxContainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="o"&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;chatboxContainer&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;Now let's add a HTML panel to hold our email form. First create an HTML file that just contains a div to hold our HTML Panel contents.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div id="panelContent"&amp;gt;&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Save it somere so that it is served from the same origin as your React application.&lt;/p&gt;

&lt;p&gt;Next, we'll update our Chatbox component. First, we'll add a &lt;code&gt;panelReady&lt;/code&gt; flag in our state.&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="kd"&gt;constructor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;super&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;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;panelReady&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&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;chatboxContainer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createRef&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;Then, create the HTML inside &lt;code&gt;componentDidMount&lt;/code&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="nf"&gt;componentDidMount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;chatbox&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;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;session&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createChatbox&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;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;conversation&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;chatbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mount&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;chatboxContainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;panelPromise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;chatbox&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createHtmlPanel&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;path/to/file.html&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Should point to the file created above.&lt;/span&gt;
    &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;show&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;panelPromise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;panel&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="nx"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DOMContentLoadedPromise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;panelReady&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;panelNode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;panel&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="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;panelContent&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="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;And then it's time to render the portal when the panel is ready. Update the &lt;code&gt;Chatbox&lt;/code&gt;'s render method like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;render() {
  return &amp;lt;div ref={this.chatboxContainer}&amp;gt;
    {this.state.panelReady &amp;amp;&amp;amp; ReactDOM.createPortal(
      this.state.panelNode,
      &amp;lt;EmailForm /&amp;gt;
    )}
  &amp;lt;/div&amp;gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;EmailForm&lt;/code&gt; can be any component you like, and it works just like any other React component, even events bubble from the EmailForm to your Chatbox component.&lt;/p&gt;

&lt;p&gt;If you run into any issues, feel free to get in touch via the popup on &lt;a href="https://talkjs.com"&gt;our website&lt;/a&gt; or send an email to &lt;a href="mailto:dev@talkjs.com"&gt;dev@talkjs.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Where do you draw the line between data structures and abstract data types (ADTs)</title>
      <dc:creator>Frederik 👨‍💻➡️🌐 Creemers</dc:creator>
      <pubDate>Wed, 15 Jul 2020 12:06:20 +0000</pubDate>
      <link>https://forem.com/_bigblind/where-do-you-draw-the-line-between-data-structures-and-abstract-data-types-adts-nc0</link>
      <guid>https://forem.com/_bigblind/where-do-you-draw-the-line-between-data-structures-and-abstract-data-types-adts-nc0</guid>
      <description>&lt;p&gt;I wanted to write an article on this distinction because I think it's a useful one, but as I thought this through there are areas that are still a bit vague to me too.&lt;/p&gt;

&lt;h1&gt;
  
  
  What is an Abstract Data Type (ADT)
&lt;/h1&gt;

&lt;p&gt;An ADT is like an interface in object oriented languages, but it also includes semantics of what these operations do.&lt;/p&gt;

&lt;p&gt;So for example a Stack is an object that has &lt;code&gt;push&lt;/code&gt; and &lt;code&gt;pop&lt;/code&gt; operations for pushing data onto it and popping data off, with first-in-last-out (FILO) semantics, meaning that items are returned by invocations of &lt;code&gt;pop&lt;/code&gt; in the reverse order they were &lt;code&gt;push&lt;/code&gt;ed. &lt;/p&gt;

&lt;p&gt;This says nothing about how the data is stored internally. It could be a linked list, it could be an automatically growing array, or whatever other representation you like.&lt;/p&gt;

&lt;h1&gt;
  
  
  Where do you draw the line
&lt;/h1&gt;

&lt;p&gt;But I'm not sure where you draw the line. For example, a linked list could be seen as an ADT where each list item has a &lt;code&gt;next&lt;/code&gt; operation that yields the next item in the list. But then it's also a data structure as it describes structured data with pointers pointing to the memory address of the next item.&lt;/p&gt;

&lt;p&gt;Come to think of it, maybe the most useful conclusion is that there is both a linked list ADT and a linked list data structure. Because you could implement the linked list ADT with an array, even though that wouldn't be very useful.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>computerscience</category>
    </item>
    <item>
      <title>Why don't database systems have built-in mechanisms for avoiding locks while migrating?</title>
      <dc:creator>Frederik 👨‍💻➡️🌐 Creemers</dc:creator>
      <pubDate>Fri, 03 Jul 2020 12:57:11 +0000</pubDate>
      <link>https://forem.com/_bigblind/why-don-t-database-systems-have-built-in-mechanisms-for-avoiding-locks-while-migrating-2f4g</link>
      <guid>https://forem.com/_bigblind/why-don-t-database-systems-have-built-in-mechanisms-for-avoiding-locks-while-migrating-2f4g</guid>
      <description>&lt;p&gt;As your app or website becomes popular, it becomes tricky to do database migrations that alter columns without downtime. You basically have to create a new table or column, copy all the data over, and then drop the old version.&lt;/p&gt;

&lt;p&gt;Is there any reason why database management systems couldn't do this themselves in many cases? When changing a column's type, why doesn't the database create a new column behind the scenes, write all new values there, while copying old values over in a background process?&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Could Documentation Screenshots Be Part of the Build Process?</title>
      <dc:creator>Frederik 👨‍💻➡️🌐 Creemers</dc:creator>
      <pubDate>Fri, 12 Jun 2020 14:13:16 +0000</pubDate>
      <link>https://forem.com/_bigblind/could-documentation-screenshots-be-part-of-the-build-process-19o</link>
      <guid>https://forem.com/_bigblind/could-documentation-screenshots-be-part-of-the-build-process-19o</guid>
      <description>&lt;p&gt;I was listening to an episode of &lt;a href="https://blog.codepen.io/radio/"&gt;Codepen Radio&lt;/a&gt; where part of the discussion was how hard it is to keep videos and screenshots in the docs up to date.&lt;/p&gt;

&lt;p&gt;So I started wondering. End-to-end tests always go through the same steps to test whether your product works. Could taking screenshots be part of that process? This way, the screenshots always represent the latest version of the app, and if an e2e test breaks, you know you may also need to update the docs about that part of the app.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Dev Humor in a Pandemic</title>
      <dc:creator>Frederik 👨‍💻➡️🌐 Creemers</dc:creator>
      <pubDate>Wed, 08 Apr 2020 07:53:05 +0000</pubDate>
      <link>https://forem.com/_bigblind/dev-humor-in-a-pandemic-1pnl</link>
      <guid>https://forem.com/_bigblind/dev-humor-in-a-pandemic-1pnl</guid>
      <description>&lt;p&gt;During a conversation in Slack&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3a8bwi154km3wgeotu7b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F3a8bwi154km3wgeotu7b.png" alt='Marcin said "ACK", then Egbert said SYN, then Marcin said "Shit, no handshakes"' width="710" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jokes</category>
    </item>
    <item>
      <title>Is Anyone Using Server-Sent Events?</title>
      <dc:creator>Frederik 👨‍💻➡️🌐 Creemers</dc:creator>
      <pubDate>Thu, 19 Dec 2019 08:41:11 +0000</pubDate>
      <link>https://forem.com/_bigblind/is-anyone-using-server-sent-events-1jd0</link>
      <guid>https://forem.com/_bigblind/is-anyone-using-server-sent-events-1jd0</guid>
      <description>&lt;p&gt;A lot of websites are using websockets for real-time communication with the server, even applications that don't need the 2-way communication. Is there a advantage to using Server-Sent Events instead of websockets when you only need one-way communication?&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What IOS shortcuts are you using?</title>
      <dc:creator>Frederik 👨‍💻➡️🌐 Creemers</dc:creator>
      <pubDate>Mon, 30 Sep 2019 17:31:49 +0000</pubDate>
      <link>https://forem.com/_bigblind/what-ios-shortcuts-are-you-using-5bbi</link>
      <guid>https://forem.com/_bigblind/what-ios-shortcuts-are-you-using-5bbi</guid>
      <description>&lt;p&gt;IOS 13 brought a bunch of powerful new features to ths shortcuts app. How are you using them?&lt;/p&gt;

</description>
      <category>watercooler</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Who are some good techies to follow on Twitter for cool/fun(ny) stuff?</title>
      <dc:creator>Frederik 👨‍💻➡️🌐 Creemers</dc:creator>
      <pubDate>Sun, 15 Sep 2019 17:06:50 +0000</pubDate>
      <link>https://forem.com/_bigblind/who-are-some-good-techies-to-follow-on-twitter-for-cool-fun-ny-stuff-5dk0</link>
      <guid>https://forem.com/_bigblind/who-are-some-good-techies-to-follow-on-twitter-for-cool-fun-ny-stuff-5dk0</guid>
      <description>&lt;p&gt;I believe I follow a fairly diverse group of people on Twitter. That way, it helps me understand the perspective of different people in the community. But lately I've felt like twitter has only been showing me what's bad and unjust.&lt;/p&gt;

&lt;p&gt;So I'd like to follow some people who regularly post cool or funny stuff, to brighten up my twitter feed a little.&lt;/p&gt;

&lt;p&gt;Some examples:&lt;/p&gt;

&lt;p&gt;Cassidy Williams posts these wonderful little videos every once in a while:&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1172570005986086913-842" src="https://platform.twitter.com/embed/Tweet.html?id=1172570005986086913"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1172570005986086913-842');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1172570005986086913&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Julia Evans makes these explanatory cartoons that teach me new stuff in a quick, visual way:&lt;br&gt;
&lt;iframe class="tweet-embed" id="tweet-1172872684327383040-316" src="https://platform.twitter.com/embed/Tweet.html?id=1172872684327383040"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1172872684327383040-316');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1172872684327383040&amp;amp;theme=dark"
  }



&lt;/p&gt;

</description>
      <category>watercooler</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
