<?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: Ng Chen Hon</title>
    <description>The latest articles on DEV Community by Ng Chen Hon (@mutatedbread).</description>
    <link>https://dev.to/mutatedbread</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%2F4903%2Feea4d11f-1cf3-4144-a79e-7685dc57a84c.jpeg</url>
      <title>DEV Community: Ng Chen Hon</title>
      <link>https://dev.to/mutatedbread</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mutatedbread"/>
    <language>en</language>
    <item>
      <title>Enumerating collections the Ruby way</title>
      <dc:creator>Ng Chen Hon</dc:creator>
      <pubDate>Sun, 13 Mar 2022 11:03:06 +0000</pubDate>
      <link>https://dev.to/mutatedbread/enumerating-collections-the-ruby-way-lb9</link>
      <guid>https://dev.to/mutatedbread/enumerating-collections-the-ruby-way-lb9</guid>
      <description>&lt;p&gt;Originally posted at my &lt;a href="https://mutatedbread.space/blogs/2022-03-13/enumerating_collectings_the_ruby_way"&gt;blog&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Enumeration"&gt;Enumeration&lt;/a&gt; is the complete and ordered listing/traversing of all items in a collection. To list over something in Ruby, most of us may start with something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Collection&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# OR&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A good follow question will be can we now use the &lt;code&gt;#map&lt;/code&gt; and &lt;code&gt;#reduce&lt;/code&gt; that we all love? We will be horrified to learn that we need to implement them by hand if we follow the way above!&lt;/p&gt;

&lt;p&gt;Fortunately, we can implement our own with the &lt;a href="https://ruby-doc.org/core-3.0.2/Enumerable.html"&gt;&lt;code&gt;Enumerable&lt;/code&gt;&lt;/a&gt; module, as do by the &lt;code&gt;Hash&lt;/code&gt;, &lt;code&gt;Array&lt;/code&gt; and &lt;code&gt;Range&lt;/code&gt; classes. By including the &lt;code&gt;Enumerable&lt;/code&gt; module in our collection class and implementing the &lt;code&gt;#each&lt;/code&gt; method, we will get access to all methods that has an element of listing over elements such as &lt;code&gt;#map&lt;/code&gt;, &lt;code&gt;#reduce&lt;/code&gt; and &lt;code&gt;#each_slice&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;There are two booths in a data collection exercise. The first collects a person's name and the second collects the person's hobbies. After filling up the entire list, the organizer wants to traverse over a person's name and hobbies together. An array of names and a two-dimensional array of hobbies are readied in the same sequence. We can imagine these requirements as a &lt;code&gt;NameHobbiesColletion&lt;/code&gt; class to list over a person's name and hobbies in sequence.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NameHobbiesCollection&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Enumerable&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;array_of_hobbies&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;
    &lt;span class="vi"&gt;@array_of_hobbies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;array_of_hobbies&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="c1"&gt;# This will be the only method we need to implement for traversal.&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vi"&gt;@array_of_hobbies&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hobbies&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hobbies&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Testing Them Out
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Let's setup an instance and see some enumeration methods in action!&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;collection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;NameHobbiesCollection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="sx"&gt;%w(James Joe Tony)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sx"&gt;%w(Talking Baking)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sx"&gt;%w(Science Coding Talking)&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sx"&gt;%w(Coffee)&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;/li&gt;
&lt;li&gt;
&lt;p&gt;We can use &lt;code&gt;#each&lt;/code&gt; to list over the collecitons and do things:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hobbies&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; has hobbies of &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;hobbies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;', '&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; James has hobbies of Taking, Baking&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; Joe has hobbies of Science, Coding, Talking&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; Tony has hobbies of Coffee&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We can use &lt;code&gt;#map&lt;/code&gt; to produce an array of human-readable logs:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hobbies&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="s2"&gt;"name:&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; hobbies:[&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;hobbies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;','&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;]"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; [&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt;   "name:James hobbies:[Talking,Baking]",&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt;   "name:Joe hobbies:[Science,Coding,Talking]",&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt;   "name:Tony hobbies:[Coffee]"&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;#partition&lt;/code&gt; allows us to group chatty people together and the others together:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;partition&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hobbies&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;hobbies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;include?&lt;/span&gt; &lt;span class="s1"&gt;'Talking'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; [&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt;   [["James", ["Talking", "Baking"]], ["Joe", ["Science", "Coding", "Talking"]]],&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt;   [["Tony", ["Coffee"]]]&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We can use &lt;code&gt;#each_slice&lt;/code&gt; to iterate over the collection in chunks, useful for persisting items to the database in batches instead of everything at once:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each_slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to_a&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; [&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt;   [["James", ["Talking", "Baking"]], ["Joe", ["Science", "Coding", "Talking"]]],&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt;   [["Tony", ["Coffee"]]]&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Can we make it chainable?
&lt;/h2&gt;

&lt;p&gt;If we want to chain methods like &lt;code&gt;collection.map.with_index&lt;/code&gt;, the colletion is expected to return an &lt;a href="https://ruby-doc.org/core-3.0.3/Enumerator.html"&gt;&lt;code&gt;Enumerator&lt;/code&gt;&lt;/a&gt;. To do that, we can rely on the &lt;a href="https://www.rubydoc.info/stdlib/core/Object:to_enum"&gt;&lt;code&gt;Object#to_enum&lt;/code&gt;&lt;/a&gt; method to create an enumerator listing over the collection using a specified method from it. Any arguments should be past over.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# When there is no block given, we return an Enumerator that points to this each method!&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;to_enum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__method__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="nb"&gt;block_given?&lt;/span&gt;

    &lt;span class="c1"&gt;# Implementation follows here when there is a block.&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Testing them out
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Chaining &lt;code&gt;#each&lt;/code&gt; with &lt;code&gt;#with_index&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with_index&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hobbies&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"queue &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; has hobbies of &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;hobbies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;', '&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; queue 0: James has hobbies of Talking, Baking&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; queue 1: Joe has hobbies of Science, Coding, Taking&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; queue 2: Tony has hobbies of Coffee&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Iterating over the collection with an arbitrary object with &lt;code&gt;#each&lt;/code&gt; and &lt;code&gt;#with_object&lt;/code&gt; and returns it:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;with_object&lt;/span&gt;&lt;span class="p"&gt;({})&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hobbies&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hobbies&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; {&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt;   "James"=&amp;gt;["Talking", "Baking"],&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt;   "Joe"=&amp;gt;["Science", "Coding", "Talking"],&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt;   "Tony"=&amp;gt;["Coffee"]&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Emitting the entire collections:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entries&lt;/span&gt;
&lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_a&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; [&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt;  ["James", ["Talking", "Baking"]],&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt;  ["Joe", ["Science", "Coding", "Talking"]],&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt;  ["Tony", ["Coffee"]]&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;Enumerator&lt;/code&gt; includes the &lt;code&gt;Enumerable&lt;/code&gt; module. Explore more methods availbale in the &lt;code&gt;Enumerator&lt;/code&gt; module below:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enumerable: &lt;a href="https://ruby-doc.org/core-3.0.2/Enumerable.html"&gt;https://ruby-doc.org/core-3.0.2/Enumerable.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Enumerator: &lt;a href="https://ruby-doc.org/core-3.0.3/Enumerator.html"&gt;https://ruby-doc.org/core-3.0.3/Enumerator.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ruby</category>
      <category>enumerable</category>
      <category>enumerator</category>
      <category>enumerating</category>
    </item>
    <item>
      <title>Integrating DataTables.net into Rails with Webpacker</title>
      <dc:creator>Ng Chen Hon</dc:creator>
      <pubDate>Sun, 15 Nov 2020 08:27:47 +0000</pubDate>
      <link>https://dev.to/mutatedbread/integrating-datatables-net-into-rails-with-webpacker-1aa1</link>
      <guid>https://dev.to/mutatedbread/integrating-datatables-net-into-rails-with-webpacker-1aa1</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally posted at my &lt;a href="https://mutatedbread.space/blogs/2020-11-16/integrating_datatables_net_into_rails_with_webpacker"&gt;blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Hey there,
&lt;/h2&gt;

&lt;p&gt;This article is about an opinionated way to integrate &lt;code&gt;DataTables.net&lt;/code&gt; into a Rails 6 project with &lt;code&gt;Webpacker&lt;/code&gt; for server-rendered views. I hope this article and code bits can help people with similar use cases in setting thing up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Premise
&lt;/h2&gt;

&lt;p&gt;Back then on Ruby on Rails, we could just place every &lt;code&gt;js&lt;/code&gt; files in the &lt;code&gt;/assets&lt;/code&gt; directory and Sprockets will compile everything in it. Then, all methods and symbols will be readily available on the global scope to be used on Rails server-rendered views.&lt;/p&gt;

&lt;p&gt;When I started a new Rails project at work, I discovered that we can use Webpacker to compile our &lt;code&gt;js&lt;/code&gt; files and leverage the abundance of packages from &lt;code&gt;npm&lt;/code&gt; . Also, I quickly found out that Webpacker does not expose all methods and classes included in all &lt;code&gt;js&lt;/code&gt; files globally, while trying to debug it for hours. 😂&lt;/p&gt;

&lt;p&gt;From my crude understanding of how Webpacker works, as &lt;code&gt;js&lt;/code&gt; files are compiled into individual modules, so do the methods and classes defined are packaged into its very own scope. It means that things do not get leaked into other modules unless being required or imported. The same applies to global scope.&lt;/p&gt;

&lt;p&gt;I found ways to import &lt;code&gt;jQuery&lt;/code&gt; at the global scope via a global import but the same approach does not work to expose &lt;code&gt;DataTables.net&lt;/code&gt; at the global scope of &lt;code&gt;$&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I want this to work
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;jQuery&lt;/code&gt; and &lt;code&gt;DataTables.net&lt;/code&gt; compiled and initialised at &lt;code&gt;application.js&lt;/code&gt; level for ease of maintainance.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;jQuery&lt;/code&gt; and initialised &lt;code&gt;DataTables.net&lt;/code&gt; instance must exists at global scope for server-rendered views.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Steps
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installing Dependencies
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Get the necessities&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add jquery datatables.net datatables.net-dt
&lt;/code&gt;&lt;/pre&gt;


&lt;blockquote&gt;
&lt;p&gt;Please refer to &lt;a href="https://datatables.net/download/npm"&gt;https://datatables.net/download/npm&lt;/a&gt; to know which relevant &lt;code&gt;DataTables.net&lt;/code&gt; release to get for your preferred stying framework.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Get &lt;code&gt;webpack&lt;/code&gt; loaders&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add &lt;span class="nt"&gt;-D&lt;/span&gt; css-loader expose-loader imports-loader
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the following &lt;code&gt;js&lt;/code&gt; files that defined the packages we want to load.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;jQuery&lt;/code&gt; loader, save at &lt;code&gt;config/webpack/loaders/jquery.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// expose-loader helps us to expose the jquery module as $ and jQuery at&lt;/span&gt;
&lt;span class="c1"&gt;// the global object, allowing us to access it at Rails server-rendered&lt;/span&gt;
&lt;span class="c1"&gt;// views.&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jquery&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;expose-loader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;exposes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;$&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="s2"&gt;jQuery&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;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;DataTables.net&lt;/code&gt; loader, save at &lt;code&gt;config/webpacker/loaders/datatables.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// datatables.net relies on the jquery global variable to work.&lt;/span&gt;
&lt;span class="c1"&gt;// import-loader helps us to add the necessary require('jquery') so the&lt;/span&gt;
&lt;span class="c1"&gt;// jquery variable is available when any datatables.net packages are loaded.&lt;/span&gt;
&lt;span class="c1"&gt;// refer to https://webpack.js.org/loaders/imports-loader/&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/datatables&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="sr"&gt;net.*/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;imports-loader&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Disables AMD plugin as DataTables.net&lt;/span&gt;
        &lt;span class="c1"&gt;// checks for AMD before CommonJS.&lt;/span&gt;
        &lt;span class="na"&gt;additionalCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;var define = false;&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;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;At &lt;code&gt;config/webpacker/environment.js&lt;/code&gt;, we will append our loaders to &lt;code&gt;webpack&lt;/code&gt; and add a &lt;code&gt;ProviderPlugin&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;environment&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@rails/webpacker&lt;/span&gt;&lt;span class="dl"&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;webpack&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;webpack&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// import our loaders.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;datatables&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./loaders/datatables&lt;/span&gt;&lt;span class="dl"&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;jquery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./loaders/jquery&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// append them to webpack loaders.&lt;/span&gt;
&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loaders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;datatables&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;datatables&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loaders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;expose&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;jquery&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// ProviderPlugin helps us to load jQuery when the variables of $ and jQuery&lt;/span&gt;
&lt;span class="c1"&gt;// are encountered as free variables at other modules.&lt;/span&gt;
&lt;span class="c1"&gt;// Let's say if you want to use Bootstrap 4 and Popper.js.&lt;/span&gt;
&lt;span class="c1"&gt;//&lt;/span&gt;
&lt;span class="c1"&gt;// Refer here https://webpack.js.org/plugins/provide-plugin/&lt;/span&gt;
&lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;plugins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Provide&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;webpack&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ProvidePlugin&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;$&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jquery&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;jquery&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="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;At &lt;code&gt;app/javascript/packs/application.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;dt&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;datatables.net&lt;/span&gt;&lt;span class="dl"&gt;"&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="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;turbolinks:load&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;dt&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;$&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;/li&gt;
&lt;li&gt;

&lt;p&gt;At whatever views you have. Let's say &lt;code&gt;app/views/members/index.html.slim&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;h1&lt;/span&gt; &lt;span class="no"&gt;Member&lt;/span&gt; &lt;span class="no"&gt;List&lt;/span&gt;

&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="c1"&gt;#member-table&lt;/span&gt;
  &lt;span class="n"&gt;thead&lt;/span&gt;
    &lt;span class="n"&gt;tr&lt;/span&gt;
      &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="no"&gt;Member&lt;/span&gt; &lt;span class="no"&gt;ID&lt;/span&gt;
      &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="no"&gt;Family&lt;/span&gt; &lt;span class="no"&gt;Name&lt;/span&gt;
      &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="no"&gt;Given&lt;/span&gt; &lt;span class="no"&gt;Name&lt;/span&gt;
      &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="no"&gt;Birth&lt;/span&gt; &lt;span class="no"&gt;Day&lt;/span&gt;
  &lt;span class="n"&gt;tbody&lt;/span&gt;
    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="vi"&gt;@members&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;member&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;tr&lt;/span&gt;
        &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;member&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;
        &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;member&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;famil_name&lt;/span&gt;
        &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;member&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;given_name&lt;/span&gt;
        &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;member&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;birthdate&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strftime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'%d %B %Y'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="sr"&gt;/ Just slap this in.
javascript:
  document.addEventListener('turbolinks:load', function() {
    $('#member-table').DataTable();
  });
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Import 'datatables.net-dt/css/jquery.datatables.css' with your preferred method.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That should do the trick. Now:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Our &lt;code&gt;DataTables.net&lt;/code&gt; have the needed &lt;code&gt;jquery&lt;/code&gt; variable within its scope.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DataTables.net&lt;/code&gt; is initialised at &lt;code&gt;application.js&lt;/code&gt; level.&lt;/li&gt;
&lt;li&gt;We get to access &lt;code&gt;$(&amp;lt;query&amp;gt;).DataTable()&lt;/code&gt; at the global scope at any Rails server-rendered views.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Example project
&lt;/h2&gt;

&lt;p&gt;I have setup an example projects with the workings &lt;a href="https://github.com/MutatedBread/rails_webpacker_datatables_example"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  References and citations
&lt;/h2&gt;

&lt;p&gt;The approach in this article is a compilation of solutions from many precursors asking and answering the same question.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I might have missed out some references here.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/29080148/expose-jquery-to-real-window-object-with-webpack"&gt;https://stackoverflow.com/questions/29080148/expose-jquery-to-real-window-object-with-webpack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jbox-web/ajax-datatables-rails/blob/master/doc/webpack.md"&gt;https://github.com/jbox-web/ajax-datatables-rails/blob/master/doc/webpack.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webpack.js.org/plugins/provide-plugin/#usage-jquery"&gt;https://webpack.js.org/plugins/provide-plugin/#usage-jquery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webpack.js.org/loaders/expose-loader/#root"&gt;https://webpack.js.org/loaders/expose-loader/#root&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://webpack.js.org/loaders/imports-loader/"&gt;https://webpack.js.org/loaders/imports-loader/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/57964095/rails-6-webpack-datatables-jquery"&gt;https://stackoverflow.com/questions/57964095/rails-6-webpack-datatables-jquery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datatables.net/forums/discussion/57642/installation-issues-rails-yarn-webpacker"&gt;https://datatables.net/forums/discussion/57642/installation-issues-rails-yarn-webpacker&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>rails</category>
      <category>webpacker</category>
      <category>datatables</category>
    </item>
    <item>
      <title>Bidding hello to the world, again!</title>
      <dc:creator>Ng Chen Hon</dc:creator>
      <pubDate>Fri, 02 Oct 2020 10:24:19 +0000</pubDate>
      <link>https://dev.to/mutatedbread/bidding-hello-to-the-world-again-3i0i</link>
      <guid>https://dev.to/mutatedbread/bidding-hello-to-the-world-again-3i0i</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Originally posted at my &lt;a href="https://mutatedbread.space/blogs/2020-10-02/hello_world_again"&gt;blog&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hello there, and welcome to my blog! In the past, I had written on &lt;a href="https://dev.to/"&gt;dev.to&lt;/a&gt; but stopped. Today, this will be my first post on my very own blog after a long hiatus. Hopefully I will write much more often.&lt;/p&gt;

&lt;p&gt;Here I bid hello world to everyone again!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/Nx0rz3jtxtEre/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/Nx0rz3jtxtEre/giphy.gif" alt="Hello There"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A little bit about me.
&lt;/h2&gt;

&lt;p&gt;My full name is Ng Chen Hon. Currently, I mostly mine rubies with Ruby on Rails and flex yoga with React Native. My common tech stacks are on Ruby on Rails, React.JS, React Native and Typescript.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Well &lt;a href="https://rubyonrails.org/"&gt;RoR&lt;/a&gt; runs on &lt;a href="https://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; and React Native runs on &lt;a href="https://yogalayout.com/"&gt;Yoga Layout&lt;/a&gt;, geddit?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I am a developer who puts emphasis on productivity quality, there will be time for quality code writing and time for quality brainstorming. Also, developer-kinds aren't machines 😫, we got to take breaks from writing code.&lt;/p&gt;

&lt;p&gt;As a person, I have this belief that we should learn like a child would and embrace whatever that might be new with an open heart, however, with past experience and your intricate bull💩 sensor attached on.&lt;/p&gt;

&lt;p&gt;My current favourite thing is working with Ruby and with Rails. It was on 2019 when I first came in touch with Ruby. I had fallen in love with the language after learning Ruby and working with Rails after a couple of months. The syntax, at initial glance, was weird and disconnected from the common family of C languages we came to learnt. However, as time went by, only then I discovered how beautiful and elegant the language is. Then, with Rails, I find it handy that development and testing came bundled together within the same hierachy.&lt;/p&gt;

&lt;p&gt;It is so enjoyable, happy and productive to write code with Ruby.&lt;/p&gt;

&lt;p&gt;I am currently working Singapore for a small Rails shop. If you are in Singapore and love to have a beer or kopi, feel free to ping me. 🙂&lt;/p&gt;

</description>
      <category>ngchenhon</category>
      <category>mutatedbread</category>
      <category>firstpostinalongwhile</category>
      <category>helloworld</category>
    </item>
    <item>
      <title>Getting connected status on React Native</title>
      <dc:creator>Ng Chen Hon</dc:creator>
      <pubDate>Thu, 07 Jun 2018 11:02:34 +0000</pubDate>
      <link>https://dev.to/mutatedbread/getting-connected-status-on-react-native-6o8</link>
      <guid>https://dev.to/mutatedbread/getting-connected-status-on-react-native-6o8</guid>
      <description>&lt;p&gt;We may need to know if a device is connected to the internet sometimes on React Native.&lt;/p&gt;

&lt;h1&gt;
  
  
  What the Doc said
&lt;/h1&gt;

&lt;p&gt;We should be using &lt;code&gt;NetInfo.isConnected.fetch()&lt;/code&gt; to get a boolean denoting the device is connected or not.&lt;/p&gt;

&lt;h1&gt;
  
  
  In fact
&lt;/h1&gt;

&lt;p&gt;Up until the current newest v0.55, it is still observed that &lt;code&gt;NetInfo.isConnected.fetch()&lt;/code&gt; works properly on Android only. It tends to return &lt;code&gt;false&lt;/code&gt; on iOS. It is a known bug.&lt;/p&gt;

&lt;h1&gt;
  
  
  Solutions from the internet
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Use Event Listener
We can add an event listener and listen to changes in network status.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;onInitialNetConnection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isConnected&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&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;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Is initially connected: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;isConnected&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;NetInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isConnected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removeEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;connectionChange&lt;/span&gt;&lt;span class="dl"&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;onInitialNetConnection&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&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="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="nx"&gt;NetInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isConnected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;connectionChange&lt;/span&gt;&lt;span class="dl"&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;onInitialNetConnection&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;ul&gt;
&lt;li&gt;Ping a Website
In this case, y'all can try pinging &lt;code&gt;google.com&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://www.google.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;hasConnection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Ugly, but it works.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;NetInfo.isConnected.fetch()&lt;/code&gt; a Few Times ???&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tested on &lt;code&gt;&amp;lt; v0.55&lt;/code&gt;, I discovered that calling &lt;code&gt;NetInfo.isConnected.fetch()&lt;/code&gt; multiple times on &lt;code&gt;componentWillMount&lt;/code&gt; of the root component of the app actually works.&lt;/p&gt;

&lt;p&gt;On &lt;code&gt;v0.55&lt;/code&gt;, this seems to stop working.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;¯\_(ツ)_/¯
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>reactnative</category>
    </item>
    <item>
      <title>Compiling Box2D from source for Codeblock using mingw and cmake</title>
      <dc:creator>Ng Chen Hon</dc:creator>
      <pubDate>Thu, 01 Feb 2018 08:34:12 +0000</pubDate>
      <link>https://dev.to/mutatedbread/compiling-box2d-from-source-for-codeblock-using-mingw-and-cmake-2a2e</link>
      <guid>https://dev.to/mutatedbread/compiling-box2d-from-source-for-codeblock-using-mingw-and-cmake-2a2e</guid>
      <description>&lt;h1&gt;
  
  
  Compiling Box2D Static Lib
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Getting the sauce
&lt;/h2&gt;

&lt;p&gt;Get the latest Box2D release from &lt;a href="https://github.com/erincatto/Box2D/releases" rel="noopener noreferrer"&gt;github link&lt;/a&gt; as the zip form.&lt;/p&gt;

&lt;p&gt;Unzip it and put into any directory you like.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Modifying some stuff
&lt;/h2&gt;

&lt;p&gt;Open &lt;code&gt;Box2D &amp;gt; CMakeLists.txt&lt;/code&gt;, as below :&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%2Fgzupojso5szlt4etepu3.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%2Fgzupojso5szlt4etepu3.png" alt="alt text" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then remove this few lines including glui, freeglut and test bed into the compilation, so that you won't need to add them in, as below :&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%2Fpkp1h6l4u7ktlf19io42.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%2Fpkp1h6l4u7ktlf19io42.png" alt="alt text" width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then save it.&lt;/p&gt;

&lt;p&gt;Then head to &lt;code&gt;Box2D &amp;gt; Box2D &amp;gt; CMakeLists.txt&lt;/code&gt;, add this line on top :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cmake_minimum_required(VERSION 3.10)

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can change to your version of cmake also.&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%2Fvij2qj7s3sl8lb6b1a6c.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%2Fvij2qj7s3sl8lb6b1a6c.png" alt="alt text" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Configure Cmake and generating
&lt;/h2&gt;

&lt;p&gt;Open cmake-gui and set the source and target path, following your box2d directory :&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%2F8358hm6nbljlcy3nl1y6.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%2F8358hm6nbljlcy3nl1y6.png" alt="alt text" width="720" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, click &lt;code&gt;Configure&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Select &lt;code&gt;CodeBlocks - MinGW Makefiles&lt;/code&gt; .&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%2Fwmn63lck6w2a5m0ifukc.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%2Fwmn63lck6w2a5m0ifukc.png" alt="alt text" width="482" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click okay, then you might see something like this and some errors :&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%2Fc0imtm6jy6i0iw1jy8v4.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%2Fc0imtm6jy6i0iw1jy8v4.png" alt="alt text" width="708" height="82"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just ignore them and click &lt;code&gt;Configure&lt;/code&gt; again. You should see it getting configuration done like this :&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%2F47v3mozv2h4oj7nt77od.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%2F47v3mozv2h4oj7nt77od.png" alt="alt text" width="714" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If its done, just click &lt;code&gt;Generate&lt;/code&gt; there. A &lt;code&gt;Generating done&lt;/code&gt; will be logged out.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Compiling
&lt;/h2&gt;

&lt;p&gt;Then go to &lt;code&gt;Box2D &amp;gt; Build&lt;/code&gt;,&lt;/p&gt;

&lt;p&gt;Spawn a terminal there and run &lt;code&gt;mingw32-make&lt;/code&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%2Froqavnqo9g9lt2fb5uc9.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%2Froqavnqo9g9lt2fb5uc9.png" alt="alt text" width="743" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wait until it finished running.&lt;/p&gt;

&lt;p&gt;Then go to &lt;code&gt;Box2D &amp;gt; Build &amp;gt; Box2D&lt;/code&gt;, you will find &lt;code&gt;libBox2D.a&lt;/code&gt; there, as below : &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%2F9vrps42bgfxj4gup9f43.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%2F9vrps42bgfxj4gup9f43.png" alt="alt text" width="800" height="205"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Using it with CodeBlock
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Put &lt;code&gt;libBox2D.a&lt;/code&gt; into &lt;code&gt;MinGW &amp;gt; lib&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Copy &lt;code&gt;Box2D &amp;gt; Box2D&lt;/code&gt;, the &lt;code&gt;Box2D folder&lt;/code&gt; inside &lt;code&gt;root Box2D directory&lt;/code&gt; into `MinGW &amp;gt; include'.&lt;/li&gt;
&lt;li&gt;Then in CodeBlock, open &lt;code&gt;Settings &amp;gt; Compiler &amp;gt; Linker Settings &amp;gt; Add Library&lt;/code&gt; and Select &lt;code&gt;MinGW &amp;gt; lib &amp;gt; libBox2D.a&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  6. Setup is done :)
&lt;/h2&gt;

&lt;p&gt;Test it out, here is a test cpp from my uni course &lt;a href="https://gist.github.com/MutatedBread/3b88095b334d8fdd1fce5c5a4b5c2011" rel="noopener noreferrer"&gt;gist&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Why am I doing this
&lt;/h2&gt;

&lt;p&gt;I am just merely trying to challenge myself to compile it and not following instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Test ?
&lt;/h2&gt;

&lt;p&gt;I tested the compiled lib with a uni provided cpp along with sfml, somehow it works without glui and freeglut.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                ¯\_(ツ)_/¯
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>box2d</category>
      <category>mingw</category>
      <category>cmake</category>
      <category>codeblock</category>
    </item>
    <item>
      <title>Using GvrEditorEmulator Prefab From GoogleVR Package and Not Sinking the Camera Downward Until the Parent Center On Unity Editor</title>
      <dc:creator>Ng Chen Hon</dc:creator>
      <pubDate>Wed, 22 Nov 2017 09:04:06 +0000</pubDate>
      <link>https://dev.to/mutatedbread/using-gvreditoremulator-prefab-from-googlevr-package-and-not-sinking-the-camera-downward-until-the-parent-center-on-unity-editor-9m</link>
      <guid>https://dev.to/mutatedbread/using-gvreditoremulator-prefab-from-googlevr-package-and-not-sinking-the-camera-downward-until-the-parent-center-on-unity-editor-9m</guid>
      <description>&lt;p&gt;If you are making a game targetting &lt;strong&gt;Cardboard&lt;/strong&gt; or &lt;strong&gt;Daydream&lt;/strong&gt; platform. You might need to dump the &lt;strong&gt;GvrEditorEmulator prefab&lt;/strong&gt; came with &lt;strong&gt;GoogleVR package&lt;/strong&gt; into the scene and &lt;strong&gt;pair a camera&lt;/strong&gt; with it. &lt;/p&gt;




&lt;p&gt;Let's say this is how you setup your scene :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You have to &lt;strong&gt;child the camera within&lt;/strong&gt; a GameObject parent.&lt;/li&gt;
&lt;li&gt;The parent have a shape.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;camera&lt;/strong&gt; should be at the "head" of the parent which &lt;strong&gt;deviates away from the center of the parent&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;You have GvrEditorEmulator paired with that camera and enabled.&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;The good thing is that you can pan around to view 360 degrees by tapping &lt;code&gt;Alt + mouse moving around&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;However, it appears that the &lt;strong&gt;camera is sinking downward&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The GvrEditorEmulator script will always try to &lt;strong&gt;default the local position (position relative to the parent) of the camera to Vector3.Zero&lt;/strong&gt; which is (0, 0, 0).&lt;/p&gt;




&lt;p&gt;To prevent that :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// line 90&lt;/span&gt;
&lt;span class="n"&gt;m_camera&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;localPosition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;neck&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// line 103&lt;/span&gt;
&lt;span class="n"&gt;m_camera&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;localPosition&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Vector3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Zero&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open up GvrEditorEmulator script with your favourite IDE and &lt;strong&gt;comment out the lines at 90 and 103.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That should prevent the camera from sinking downward from the intended y position.&lt;/p&gt;

</description>
      <category>unity3d</category>
      <category>vr</category>
      <category>googlevr</category>
    </item>
    <item>
      <title>Lazy Approach to Display YouTube Videos in A React Native App</title>
      <dc:creator>Ng Chen Hon</dc:creator>
      <pubDate>Fri, 17 Nov 2017 15:52:43 +0000</pubDate>
      <link>https://dev.to/mutatedbread/lazy-approach-to-display-youtube-videos-in-a-react-native-app-bfc</link>
      <guid>https://dev.to/mutatedbread/lazy-approach-to-display-youtube-videos-in-a-react-native-app-bfc</guid>
      <description>&lt;p&gt;Sometimes ago, I made an half-baked RN app for an internship job. I would need to display company videos from their YouTube account. Went I was to find plugins on npm. As I did not come across a working plugin at that moment so I decided to go with the laziest method I thought of.&lt;/p&gt;

&lt;h1&gt;
  
  
  WEBVIEW FTW !!!
&lt;/h1&gt;

&lt;p&gt;Yass, I am lazy to write a native plugin so there is WebView :)&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;WebView&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="nx"&gt;ref&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="nx"&gt;videoPlayer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;;}}&lt;/span&gt;
    &lt;span class="nx"&gt;scalesPageToFit&lt;/span&gt;&lt;span class="o"&gt;=&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;source&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt; &lt;span class="na"&gt;html&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;&amp;lt;html&amp;gt;&amp;lt;meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" /&amp;gt;&amp;lt;iframe src="https://www.youtube.com/embed/&lt;/span&gt;&lt;span class="dl"&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;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;navigation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;videoId&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;?modestbranding=1&amp;amp;playsinline=1&amp;amp;showinfo=0&amp;amp;rel=0" frameborder="0" style="overflow:hidden;overflow-x:hidden;overflow-y:hidden;height:100%;width:100%;position:absolute;top:0px;left:0px;right:0px;bottom:0px" height="100%" width="100%"&amp;gt;&amp;lt;/iframe&amp;gt;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt; 
    &lt;span class="nx"&gt;onShouldStartLoadWithRequest&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;onShouldStartLoadWithRequest&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;//for iOS&lt;/span&gt;
    &lt;span class="nx"&gt;onNavigationStateChange&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;onShouldStartLoadWithRequest&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;//for Android&lt;/span&gt;
&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;It has a &lt;code&gt;this.videoPlayer&lt;/code&gt; component reference.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;this.props.navigation.state.params.videoId&lt;/code&gt; is a parameter pass in by Redux using React Navigation &lt;code&gt;NavigationActions.navigate&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It has a source to an embed YouTube player with 100% css height and width.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then, there is a Youtube logo on the bottom which the user can tap to either open the native YouTube app or a new tab in their default browsers to YouTube.&lt;/p&gt;

&lt;p&gt;I did not want the user to leave the app as well. I included a little "hack" that disallow this action.&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="nx"&gt;onShouldStartLoadWithRequest&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;navigator&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;navigator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;indexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;embed&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="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&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="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&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;videoPlayer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stopLoading&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;//Some reference to your WebView to make it stop loading that URL&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&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;For every url change, the WebView will call the function delivered to its &lt;code&gt;onShouldStartLoadWithRequest&lt;/code&gt; and &lt;code&gt;onNavigationStateChange&lt;/code&gt; props. It simply check if the &lt;code&gt;embed&lt;/code&gt; from YouTube web embed url is still there or not.&lt;/p&gt;

&lt;p&gt;Otherwise, the WebView will stop loading.&lt;/p&gt;




&lt;p&gt;Quick and dirty. Ugly but &lt;strong&gt;IT WORKS&lt;/strong&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%2Fejgkve52jo8m9asto7e0.jpg" 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%2Fejgkve52jo8m9asto7e0.jpg" width="407" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
    </item>
    <item>
      <title>Hi, I'm Ng Chen Hon (Mutatedbread)</title>
      <dc:creator>Ng Chen Hon</dc:creator>
      <pubDate>Thu, 23 Feb 2017 05:41:47 +0000</pubDate>
      <link>https://dev.to/mutatedbread/hi-im-ng-chen-hon-mutatedbread</link>
      <guid>https://dev.to/mutatedbread/hi-im-ng-chen-hon-mutatedbread</guid>
      <description>&lt;p&gt;I have been coding for 3 years.&lt;/p&gt;

&lt;p&gt;You can find me on GitHub as &lt;a href="https://github.com/MutatedBread" rel="noopener noreferrer"&gt;MutatedBread&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I live in Kuala Lumpur.&lt;/p&gt;

&lt;p&gt;I still study at Multimedia University Cyberjaya.&lt;/p&gt;

&lt;p&gt;I mostly program in these languages: C++ and JavaScript.&lt;/p&gt;

&lt;p&gt;I am currently learning more about Game Development.&lt;/p&gt;

&lt;p&gt;Nice to meet you.&lt;/p&gt;

</description>
      <category>introduction</category>
    </item>
  </channel>
</rss>
