<?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: sugiarto</title>
    <description>The latest articles on DEV Community by sugiarto (@ugifractal).</description>
    <link>https://dev.to/ugifractal</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%2F630941%2F44dbd8ac-7279-4cf6-89a6-9b23cac9683f.jpg</url>
      <title>DEV Community: sugiarto</title>
      <link>https://dev.to/ugifractal</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ugifractal"/>
    <language>en</language>
    <item>
      <title>Got error msgpack on mac M2</title>
      <dc:creator>sugiarto</dc:creator>
      <pubDate>Tue, 10 Mar 2026 22:28:27 +0000</pubDate>
      <link>https://dev.to/ugifractal/got-error-msgpack-on-mac-m2-1i56</link>
      <guid>https://dev.to/ugifractal/got-error-msgpack-on-mac-m2-1i56</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gem &lt;span class="nb"&gt;install &lt;/span&gt;msgpack &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s1"&gt;'1.2.10'&lt;/span&gt; &lt;span class="nt"&gt;--source&lt;/span&gt; &lt;span class="s1"&gt;'https://rubygems.org/'&lt;/span&gt;
Building native extensions. This could take a &lt;span class="k"&gt;while&lt;/span&gt;...
ERROR:  Error installing msgpack:
    ERROR: Failed to build gem native extension.

    current directory: /Users/sugiarto/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/msgpack-1.2.10/ext/msgpack
/Users/sugiarto/.rbenv/versions/3.2.2/bin/ruby extconf.rb
checking &lt;span class="k"&gt;for &lt;/span&gt;ruby/st.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;st.h... no
checking &lt;span class="k"&gt;for &lt;/span&gt;rb_str_replace&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;ruby.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;rb_intern_str&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;ruby.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;rb_sym2str&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;ruby.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;rb_str_intern&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;ruby.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;rb_block_lambda&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;ruby.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;rb_hash_dup&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;ruby.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;rb_hash_clear&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;ruby.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;creating Makefile

current directory: /Users/sugiarto/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/msgpack-1.2.10/ext/msgpack
make DESTDIR&lt;span class="se"&gt;\=&lt;/span&gt; sitearchdir&lt;span class="se"&gt;\=&lt;/span&gt;./.gem.20260311-13292-21e99l sitelibdir&lt;span class="se"&gt;\=&lt;/span&gt;./.gem.20260311-13292-21e99l clean

current directory: /Users/sugiarto/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/msgpack-1.2.10/ext/msgpack
make DESTDIR&lt;span class="se"&gt;\=&lt;/span&gt; sitearchdir&lt;span class="se"&gt;\=&lt;/span&gt;./.gem.20260311-13292-21e99l sitelibdir&lt;span class="se"&gt;\=&lt;/span&gt;./.gem.20260311-13292-21e99l
compiling buffer.c
compiling buffer_class.c
buffer_class.c:261:17: error: incompatible &lt;span class="k"&gt;function &lt;/span&gt;pointer types passing &lt;span class="s1"&gt;'VALUE (VALUE)'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;aka &lt;span class="s1"&gt;'unsigned long (unsigned long)'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; to parameter of &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="s1"&gt;'VALUE (*)(VALUE, VALUE)'&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;aka &lt;span class="s1"&gt;'unsigned long (*)(unsigned long, unsigned long)'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nt"&gt;-Wincompatible-function-pointer-types&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  261 |                 read_until_eof_error, &lt;span class="o"&gt;(&lt;/span&gt;VALUE&lt;span class="o"&gt;)(&lt;/span&gt;void&lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; args,
      |                 ^~~~~~~~~~~~~~~~~~~~
/Users/sugiarto/.rbenv/versions/3.2.2/include/ruby-3.2.0/ruby/internal/iterator.h:388:63: note: passing argument to parameter &lt;span class="s1"&gt;'r_proc'&lt;/span&gt; here
  388 | VALUE rb_rescue2&lt;span class="o"&gt;(&lt;/span&gt;VALUE &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;b_proc&lt;span class="o"&gt;)(&lt;/span&gt;VALUE&lt;span class="o"&gt;)&lt;/span&gt;, VALUE data1, VALUE &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;*&lt;/span&gt;r_proc&lt;span class="o"&gt;)(&lt;/span&gt;VALUE, VALUE&lt;span class="o"&gt;)&lt;/span&gt;, VALUE data2, ...&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      |                                                               ^
1 error generated.
make: &lt;span class="k"&gt;***&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;buffer_class.o] Error 1

make failed, &lt;span class="nb"&gt;exit &lt;/span&gt;code 2

Gem files will remain installed &lt;span class="k"&gt;in&lt;/span&gt; /Users/sugiarto/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/msgpack-1.2.10 &lt;span class="k"&gt;for &lt;/span&gt;inspection.
Results logged to /Users/sugiarto/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/extensions/arm64-darwin-24/3.2.0/msgpack-1.2.10/gem_make.out

A new release of RubyGems is available: 3.4.10 → 4.0.7!
Run &lt;span class="sb"&gt;`&lt;/span&gt;gem update &lt;span class="nt"&gt;--system&lt;/span&gt; 4.0.7&lt;span class="sb"&gt;`&lt;/span&gt; to update your installation.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here the fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gem &lt;span class="nb"&gt;install &lt;/span&gt;msgpack &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s1"&gt;'1.2.10'&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--with-cflags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-Wno-error=incompatible-function-pointer-types"&lt;/span&gt;
Building native extensions with: &lt;span class="s1"&gt;'--with-cflags=-Wno-error=incompatible-function-pointer-types'&lt;/span&gt;
This could take a &lt;span class="k"&gt;while&lt;/span&gt;...
Successfully installed msgpack-1.2.10
Parsing documentation &lt;span class="k"&gt;for &lt;/span&gt;msgpack-1.2.10
Installing ri documentation &lt;span class="k"&gt;for &lt;/span&gt;msgpack-1.2.10
Done installing documentation &lt;span class="k"&gt;for &lt;/span&gt;msgpack after 0 seconds
1 gem installed

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

&lt;/div&gt;



</description>
      <category>cli</category>
      <category>programming</category>
      <category>ruby</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>install pg gem mac m2</title>
      <dc:creator>sugiarto</dc:creator>
      <pubDate>Fri, 22 Nov 2024 11:47:13 +0000</pubDate>
      <link>https://dev.to/ugifractal/install-pg-gem-mac-m2-1g1h</link>
      <guid>https://dev.to/ugifractal/install-pg-gem-mac-m2-1g1h</guid>
      <description>&lt;p&gt;Here my note for installing pg gem on my mac m2.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gem &lt;span class="nb"&gt;install &lt;/span&gt;pg:1.5.9 &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--with-pg-config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;brew &lt;span class="nt"&gt;--prefix&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;/opt/libpq/bin/pg_config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>gem install mysql2 mac m2 error</title>
      <dc:creator>sugiarto</dc:creator>
      <pubDate>Thu, 14 Nov 2024 08:53:46 +0000</pubDate>
      <link>https://dev.to/ugifractal/gem-install-mysql2-mac-m2-error-dcj</link>
      <guid>https://dev.to/ugifractal/gem-install-mysql2-mac-m2-error-dcj</guid>
      <description>&lt;p&gt;Got following error during &lt;code&gt;mysql2&lt;/code&gt; gem installation&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sugiartos-MacBook-Pro:aaero sugiarto&lt;span class="nv"&gt;$ &lt;/span&gt;gem &lt;span class="nb"&gt;install &lt;/span&gt;mysql2
Building native extensions. This could take a &lt;span class="k"&gt;while&lt;/span&gt;...
ERROR:  Error installing mysql2:
    ERROR: Failed to build gem native extension.

    current directory: /Users/sugiarto/.rbenv/versions/3.3.3/lib/ruby/gems/3.3.0/gems/mysql2-0.5.6/ext/mysql2
/Users/sugiarto/.rbenv/versions/3.3.3/bin/ruby extconf.rb
checking &lt;span class="k"&gt;for &lt;/span&gt;rb_absint_size&lt;span class="o"&gt;()&lt;/span&gt;... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;rb_absint_singlebit_p&lt;span class="o"&gt;()&lt;/span&gt;... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;rb_gc_mark_movable&lt;span class="o"&gt;()&lt;/span&gt;... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;rb_wait_for_single_fd&lt;span class="o"&gt;()&lt;/span&gt;... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;rb_enc_interned_str&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;ruby.h... &lt;span class="nb"&gt;yes&lt;/span&gt;
&lt;span class="nt"&gt;-----&lt;/span&gt;
Using &lt;span class="nt"&gt;--with-openssl-dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/opt/homebrew/opt/openssl@3
&lt;span class="nt"&gt;-----&lt;/span&gt;
&lt;span class="nt"&gt;-----&lt;/span&gt;
Using mysql_config at /opt/homebrew/opt/mysql-client/bin/mysql_config
&lt;span class="nt"&gt;-----&lt;/span&gt;
checking &lt;span class="k"&gt;for &lt;/span&gt;mysql.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;errmsg.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;SSL_MODE_DISABLED &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;SSL_MODE_PREFERRED &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;SSL_MODE_REQUIRED &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;SSL_MODE_VERIFY_CA &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;SSL_MODE_VERIFY_IDENTITY &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;MYSQL.net.vio &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;MYSQL.net.pvio &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... no
checking &lt;span class="k"&gt;for &lt;/span&gt;MYSQL_DEFAULT_AUTH &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;MYSQL_ENABLE_CLEARTEXT_PLUGIN &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;SERVER_QUERY_NO_GOOD_INDEX_USED &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;SERVER_QUERY_NO_INDEX_USED &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;SERVER_QUERY_WAS_SLOW &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;MYSQL_OPTION_MULTI_STATEMENTS_ON &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;MYSQL_OPTION_MULTI_STATEMENTS_OFF &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... &lt;span class="nb"&gt;yes
&lt;/span&gt;checking &lt;span class="k"&gt;for &lt;/span&gt;my_bool &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... no
checking &lt;span class="k"&gt;for &lt;/span&gt;mysql_ssl_set&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;mysql.h... no
&lt;span class="nt"&gt;-----&lt;/span&gt;
Don&lt;span class="s1"&gt;'t know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /opt/homebrew/opt/mysql-client/lib
-----
creating Makefile

current directory: /Users/sugiarto/.rbenv/versions/3.3.3/lib/ruby/gems/3.3.0/gems/mysql2-0.5.6/ext/mysql2
make DESTDIR\= sitearchdir\=./.gem.20241114-81402-f1ge80 sitelibdir\=./.gem.20241114-81402-f1ge80 clean

current directory: /Users/sugiarto/.rbenv/versions/3.3.3/lib/ruby/gems/3.3.0/gems/mysql2-0.5.6/ext/mysql2
make DESTDIR\= sitearchdir\=./.gem.20241114-81402-f1ge80 sitelibdir\=./.gem.20241114-81402-f1ge80
compiling client.c
In file included from client.c:15:
./mysql_enc_name_to_ruby.h:43:1: warning: a function definition without a prototype is deprecated in all versions of C and is not supported in C2x [-Wdeprecated-non-prototype]
   43 | mysql2_mysql_enc_name_to_rb_hash (str, len)
      | ^
./mysql_enc_name_to_ruby.h:86:1: warning: a function definition without a prototype is deprecated in all versions of C and is not supported in C2x [-Wdeprecated-non-prototype]
   86 | mysql2_mysql_enc_name_to_rb (str, len)
      | ^
2 warnings generated.
compiling infile.c
compiling mysql2_ext.c
compiling result.c
result.c:304:35: warning: implicit conversion loses integer precision: '&lt;/span&gt;unsigned long&lt;span class="s1"&gt;' to '&lt;/span&gt;int&lt;span class="s1"&gt;' [-Wshorten-64-to-32]
  304 |         precision = field-&amp;gt;length - (field-&amp;gt;decimals &amp;gt; 0 ? 2 : 1);
      |                   ~ ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 warning generated.
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library '&lt;/span&gt;zstd&lt;span class="s1"&gt;' not found
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/sugiarto/.rbenv/versions/3.3.3/lib/ruby/gems/3.3.0/gems/mysql2-0.5.6 for inspection.
Results logged to /Users/sugiarto/.rbenv/versions/3.3.3/lib/ruby/gems/3.3.0/extensions/arm64-darwin-24/3.3.0/mysql2-0.5.6/gem_make.out

A new release of RubyGems is available: 3.5.11 → 3.5.23!
Run `gem update --system 3.5.23` to update your installation.
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And fixed using following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sugiartos-MacBook-Pro:aaero sugiarto&lt;span class="nv"&gt;$ &lt;/span&gt;gem &lt;span class="nb"&gt;install &lt;/span&gt;mysql2 &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--with-cflags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"-Wno-error=implicit-function-declaration"&lt;/span&gt; &lt;span class="nt"&gt;--with-ldflags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;-L&lt;/span&gt;/opt/homebrew/opt/zstd/lib
Building native extensions with: &lt;span class="s1"&gt;'--with-cflags=-Wno-error=implicit-function-declaration --with-ldflags=-L/opt/homebrew/opt/zstd/lib'&lt;/span&gt;
This could take a &lt;span class="k"&gt;while&lt;/span&gt;...
Successfully installed mysql2-0.5.6
Parsing documentation &lt;span class="k"&gt;for &lt;/span&gt;mysql2-0.5.6
Installing ri documentation &lt;span class="k"&gt;for &lt;/span&gt;mysql2-0.5.6
Done installing documentation &lt;span class="k"&gt;for &lt;/span&gt;mysql2 after 1 seconds
1 gem installed

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

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>gem install error: incompatible function pointer types passing</title>
      <dc:creator>sugiarto</dc:creator>
      <pubDate>Wed, 06 Nov 2024 00:17:58 +0000</pubDate>
      <link>https://dev.to/ugifractal/gem-install-error-incompatible-function-pointer-types-passing-2jp0</link>
      <guid>https://dev.to/ugifractal/gem-install-error-incompatible-function-pointer-types-passing-2jp0</guid>
      <description>&lt;p&gt;Few days ago, I bought second macbook pro m2, and need to setup rails projects on my mac.&lt;/p&gt;

&lt;p&gt;One type of error that raised very often was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;error: incompatible function pointer types passing 'VALUE (VALUE)'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the fixed always by adding&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;--with-cflags=-Wno-error=incompatible-function-pointer-types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sample&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gem &lt;span class="nb"&gt;install &lt;/span&gt;msgpack &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s1"&gt;'1.4.2'&lt;/span&gt; &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--with-cflags&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nt"&gt;-Wno-error&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;incompatible-function-pointer-types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I put here, so this will remind me in case I find similar issue.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>gem</category>
      <category>bundler</category>
    </item>
    <item>
      <title>Override java version on flutter</title>
      <dc:creator>sugiarto</dc:creator>
      <pubDate>Sat, 02 Nov 2024 01:05:09 +0000</pubDate>
      <link>https://dev.to/ugifractal/override-java-version-on-flutter-3278</link>
      <guid>https://dev.to/ugifractal/override-java-version-on-flutter-3278</guid>
      <description>&lt;p&gt;Today, I have a requirement to override the Java version on the Flutter project.&lt;/p&gt;

&lt;p&gt;I used &lt;a href="https://sdkman.io/" rel="noopener noreferrer"&gt;sdkman&lt;/a&gt; for switching between multiple Java versions, and in this case I used java 17.0.12. For the Flutter version, I used &lt;a href="https://fvm.app/" rel="noopener noreferrer"&gt;fvm&lt;/a&gt; and used flutter 3.24.0 on this project.&lt;/p&gt;

&lt;p&gt;Here is the command to set java version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fvm flutter config &lt;span class="nt"&gt;--jdkdir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/Users/sugiarto/.sdkman/candidates/java/current
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where &lt;code&gt;jdkdir&lt;/code&gt; should point to your absolute path of the Java directory.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>java</category>
      <category>sdkman</category>
    </item>
    <item>
      <title>Generate tags using gemini AI</title>
      <dc:creator>sugiarto</dc:creator>
      <pubDate>Tue, 01 Oct 2024 03:12:41 +0000</pubDate>
      <link>https://dev.to/ugifractal/generate-tags-using-gemini-ai-1g5g</link>
      <guid>https://dev.to/ugifractal/generate-tags-using-gemini-ai-1g5g</guid>
      <description>&lt;p&gt;A week ago, I was working on a Flutter project to generate tags based on a post sentence.&lt;/p&gt;

&lt;p&gt;The requirement was to generate tags separated by commas using the Gemini API.&lt;/p&gt;

&lt;p&gt;Todo that, I used the &lt;a href="https://pub.dev/packages/flutter_gemini" rel="noopener noreferrer"&gt;flutter_gemini&lt;/a&gt; package to call the Gemini API.&lt;/p&gt;

&lt;p&gt;Here is sample code to call the API.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// main.dart&lt;/span&gt;
&lt;span class="n"&gt;Gemini&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;apiKey:&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'GEMINI_API_KEY'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;sampleText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Thanks for the iPhone and food."&lt;/span&gt;
&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;gemini&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Gemini&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;instance&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;gemini&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;streamGenerateContent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"For this text, return only the name of people or things (separated by commas), that you're highly confident that has a very high positive sentiment: &lt;/span&gt;&lt;span class="si"&gt;$sampleText&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;Candidates&lt;/span&gt; &lt;span class="n"&gt;value&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="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&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="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;!.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;!.&lt;/span&gt;&lt;span class="na"&gt;parts&lt;/span&gt;&lt;span class="o"&gt;!.&lt;/span&gt;&lt;span class="na"&gt;isNotEmpty&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
      &lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;!.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;!.&lt;/span&gt;&lt;span class="na"&gt;parts&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&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="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;parsedTags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;", "&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;setState&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;parsedTags&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
            &lt;span class="c1"&gt;// push to tags variable&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
              &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
          &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;onError&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'streamGenerateContent exception &lt;/span&gt;&lt;span class="si"&gt;$error&lt;/span&gt;&lt;span class="s"&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;The result would be a String with content &lt;code&gt;iPhone, food&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>gemini</category>
      <category>dart</category>
      <category>ai</category>
    </item>
    <item>
      <title>rails system test, save failed screenshots</title>
      <dc:creator>sugiarto</dc:creator>
      <pubDate>Tue, 24 Sep 2024 02:48:32 +0000</pubDate>
      <link>https://dev.to/ugifractal/rails-system-test-save-failed-screenshots-1c0m</link>
      <guid>https://dev.to/ugifractal/rails-system-test-save-failed-screenshots-1c0m</guid>
      <description>&lt;p&gt;When setting up github actions for running system tests, it is sometimes difficult to know or debug when several tests fail to run but are running well locally.&lt;/p&gt;

&lt;p&gt;So why don't you just save the failed screenshots so we know what the actual error was during the test?&lt;/p&gt;

&lt;p&gt;First, we need to change the Rails config, so errors will appear in the browser just like what we get when running locally in development mode.&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="c1"&gt;# config/environments/test.rb&lt;/span&gt;

&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;consider_all_requests_local&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To save screenshots, we can upload the screenshots to &lt;code&gt;artifacts&lt;/code&gt;. Uploads steps only will be performed if the system test fails to run.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Run system test&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bundle exec rails test:system&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upload screenshots&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/upload-artifact@v4&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;failure()&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;screenshots&lt;/span&gt;
          &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tmp/screenshots&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>test</category>
      <category>rails</category>
      <category>screenshot</category>
      <category>github</category>
    </item>
    <item>
      <title>github action services: mysql, redis and elasticsearch</title>
      <dc:creator>sugiarto</dc:creator>
      <pubDate>Tue, 24 Sep 2024 02:30:57 +0000</pubDate>
      <link>https://dev.to/ugifractal/github-action-services-mysql-redis-and-elasticsearch-239g</link>
      <guid>https://dev.to/ugifractal/github-action-services-mysql-redis-and-elasticsearch-239g</guid>
      <description>&lt;p&gt;A few days ago, I needed to setup github actions for running Rails tests that required MySQL, Redis, and Elasticsearch to be installed.&lt;/p&gt;

&lt;p&gt;Here is a is a sample configuration to boot MySQL, Redis, and elasticsearch that can be accessed from &lt;code&gt;127.0.0.1&lt;/code&gt; address.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;    &lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;mysql&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.0&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;3306:3306&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;MYSQL_DATABASE&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;sample_database_test&lt;/span&gt;
          &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
        &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;-&lt;/span&gt;
          &lt;span class="s"&gt;--health-cmd "mysqladmin ping"&lt;/span&gt;
          &lt;span class="s"&gt;--health-interval 10s&lt;/span&gt;
          &lt;span class="s"&gt;--health-timeout 5s&lt;/span&gt;
          &lt;span class="s"&gt;--health-retries 5&lt;/span&gt;
      &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;6379:6379&lt;/span&gt;
        &lt;span class="c1"&gt;# Set health checks to wait until redis has started&lt;/span&gt;
        &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;-&lt;/span&gt;
          &lt;span class="s"&gt;--health-cmd "redis-cli ping"&lt;/span&gt;
          &lt;span class="s"&gt;--health-interval 10s&lt;/span&gt;
          &lt;span class="s"&gt;--health-timeout 5s&lt;/span&gt;
          &lt;span class="s"&gt;--health-retries 5&lt;/span&gt;
      &lt;span class="na"&gt;elasticsearch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker.elastic.co/elasticsearch/elasticsearch:8.13.0&lt;/span&gt;
        &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;9200:9200&lt;/span&gt;
        &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;--health-cmd="curl http://localhost:9200/_cluster/health" -e "discovery.type=single-node" -e "xpack.security.enabled=false"&lt;/span&gt;

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

&lt;/div&gt;



</description>
      <category>github</category>
      <category>actions</category>
      <category>ci</category>
      <category>elasticsearch</category>
    </item>
    <item>
      <title>Recreate shopify webhooks</title>
      <dc:creator>sugiarto</dc:creator>
      <pubDate>Tue, 10 Sep 2024 23:25:44 +0000</pubDate>
      <link>https://dev.to/ugifractal/recreate-shopify-webhooks-193g</link>
      <guid>https://dev.to/ugifractal/recreate-shopify-webhooks-193g</guid>
      <description>&lt;p&gt;When developing custom Shopify apps, I usually use &lt;a href="https://ngrok.com/" rel="noopener noreferrer"&gt;ngrok&lt;/a&gt; as a reverse proxy for webhooks integration. Since I always use a free service plan from Ngrok, then the URL address always changes. Here is the sample generated Ngrok URL when running&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ngrok http 3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generated endpoint&lt;br&gt;
&lt;code&gt;https://73d3-2001-448a-3032-c93e-bc56-f800-e58d-8a98.ngrok-free.app&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When we hit &lt;code&gt;ctrl+c&lt;/code&gt; and rerun the command, we will get a different new URL.&lt;/p&gt;

&lt;p&gt;So what I did was just change the &lt;code&gt;.env&lt;/code&gt; file of my Rails project, go to console, and recreate Shopify webhooks.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bundle &lt;span class="nb"&gt;exec &lt;/span&gt;rails c
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Shop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;recreate_webhooks!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And here is the code for &lt;code&gt;recreate_webhooks!&lt;/code&gt;&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="c1"&gt;# app/models/shop.rb&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;recreate_webhooks!&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="no"&gt;ShopifyAPI&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Webhook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&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;webhook&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;webhook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;destroy&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="no"&gt;ShopifyApp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;webhooks&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;item&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;webhook&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ShopifyAPI&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Webhook&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="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;webhook&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"webhook &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; created."&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"webhook &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; failed."&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So every time you need to regenerate webhooks, you can just run this method from &lt;code&gt;rails console&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>shopify</category>
      <category>webhook</category>
    </item>
    <item>
      <title>searchkick get total records</title>
      <dc:creator>sugiarto</dc:creator>
      <pubDate>Sun, 08 Sep 2024 10:15:39 +0000</pubDate>
      <link>https://dev.to/ugifractal/searchkick-get-total-records-51al</link>
      <guid>https://dev.to/ugifractal/searchkick-get-total-records-51al</guid>
      <description>&lt;p&gt;In one of my projects, I used &lt;code&gt;searchkick&lt;/code&gt; gem and &lt;code&gt;elasticsearch&lt;/code&gt; for implementing &lt;code&gt;search&lt;/code&gt; feature.&lt;/p&gt;

&lt;p&gt;Something weird happens when database records are over 10K records. The total records always show 10K, even though the actual records are 267K.&lt;/p&gt;

&lt;p&gt;I fixed this issue by adding&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="ss"&gt;body_options: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;track_total_hits: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As an argument for the &lt;code&gt;search&lt;/code&gt; method.&lt;/p&gt;

&lt;p&gt;Here is an example&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="n"&gt;collections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;MyModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pagy_search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;fields: &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="ss"&gt;load: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;body_options: &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;track_total_hits: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="n"&gt;pagy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;properties&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pagy_searchkick&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>searchkick</category>
      <category>elasticsearch</category>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>Create supabase database function</title>
      <dc:creator>sugiarto</dc:creator>
      <pubDate>Sun, 08 Sep 2024 09:19:59 +0000</pubDate>
      <link>https://dev.to/ugifractal/create-supabase-database-function-1pfk</link>
      <guid>https://dev.to/ugifractal/create-supabase-database-function-1pfk</guid>
      <description>&lt;p&gt;Two days ago, I had a requirement to create a database function that accepts a single argument, in this case a 'user_id', and returns custom data as a table.&lt;/p&gt;

&lt;p&gt;To create this function, we need to open &lt;code&gt;SQL Editor&lt;/code&gt;.&lt;/p&gt;

&lt;p&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%2Fuploads%2Farticles%2Fm5ax53ylue21x7dtsku9.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%2Fuploads%2Farticles%2Fm5ax53ylue21x7dtsku9.png" alt="sql editor" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the sample code that I used at my function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;create&lt;/span&gt; &lt;span class="k"&gt;or&lt;/span&gt; &lt;span class="k"&gt;replace&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;get_friends&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt;&lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;friend_id&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;updated_at&lt;/span&gt; &lt;span class="n"&gt;timestamptz&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;first_name&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;last_name&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;profile_image_url&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;language&lt;/span&gt; &lt;span class="n"&gt;plpgsql&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;

&lt;span class="k"&gt;BEGIN&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;RETURN&lt;/span&gt; &lt;span class="n"&gt;QUERY&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;friend_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;profile_image_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;location&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;inner&lt;/span&gt; &lt;span class="k"&gt;join&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;friend_id&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_friend_ids&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;friend_status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'approved'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info_complete&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;union&lt;/span&gt;

&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;select&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="n"&gt;friend_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;updated_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;profile_image_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;location&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;inner&lt;/span&gt; &lt;span class="k"&gt;join&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;where&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;friend_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_friends&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;user_status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'approved'&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info_complete&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="err"&gt;$$&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;As I want to function to return a custom table, so I used &lt;code&gt;table&lt;/code&gt; as return values.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;RETURNS&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;friend_id&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;updated_at&lt;/span&gt; &lt;span class="n"&gt;timestamptz&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;first_name&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;last_name&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="n"&gt;profile_image_url&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="err"&gt; &lt;/span&gt; &lt;span class="k"&gt;location&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;
&lt;span class="err"&gt; &lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To call this function within a SQL editor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;select&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;get_friends&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'e7839548-40e8-4c7e-8f6c-2b5cee6bde2d'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We used &lt;code&gt;uuid()&lt;/code&gt; to convert from &lt;code&gt;text&lt;/code&gt; to &lt;code&gt;uuid&lt;/code&gt;.&lt;/p&gt;

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

</description>
      <category>supabase</category>
      <category>database</category>
      <category>postgres</category>
    </item>
    <item>
      <title>searchkick resource_already_exists_exception</title>
      <dc:creator>sugiarto</dc:creator>
      <pubDate>Mon, 02 Sep 2024 22:32:19 +0000</pubDate>
      <link>https://dev.to/ugifractal/searchkick-resourcealreadyexistsexception-2jb2</link>
      <guid>https://dev.to/ugifractal/searchkick-resourcealreadyexistsexception-2jb2</guid>
      <description>&lt;p&gt;Yesterday, I worked on &lt;a href="https://www.elastic.co/downloads/elasticsearch" rel="noopener noreferrer"&gt;elasticsearch&lt;/a&gt; integration with help of &lt;a href="https://github.com/ankane/searchkick" rel="noopener noreferrer"&gt;searchkick&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I did several times adding searchkick to Rails projects but never got this error before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;`__raise_transport_error': [400] {"error":{"root_cause":[{"type":"resource_already_exists_exception","reason":"index [house_development_20240902225059955/3Jvd0sYAT46lRDc8O-CgDQ] already exists"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This error was raised when I ran&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="no"&gt;MyModel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reindex&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From the error description, I can say the problem is &lt;code&gt;index&lt;/code&gt; already exists and failed to recreate the &lt;code&gt;index&lt;/code&gt;. So I tried to delete the index using &lt;code&gt;curl&lt;/code&gt;,&lt;/p&gt;

&lt;h4&gt;
  
  
  show all indexes.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://elastic:ELASTICSEARCH_PASSSWORD@127.0.0.1:9200/_aliases?pretty&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  delete index.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; DELETE http://elastic:CbHBbB9PS5xYB5RdOTQP@127.0.0.1:9200/house_development_20240902225059955
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, then I tried to call &lt;code&gt;MyModel.reindex&lt;/code&gt; again, but the same error still happened.&lt;/p&gt;

&lt;p&gt;Then I tried to check the elasticsearch server log and got this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;high disk watermark [90%] exceeded on [WPlL99sKQ7CnX59V0PiC-Q][cc376a2237d1][/usr/share/elasticsearch/data] free: 47.2gb[9.9%], shards will be relocated away from this node; currently relocating away shards totalling [0] bytes; the node is expected to continue to exceed the high disk watermark when these relocations are complete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After googling, I found this &lt;a href="https://stackoverflow.com/questions/30289024/high-disk-watermark-exceeded-even-when-there-is-not-much-data-in-my-index" rel="noopener noreferrer"&gt;SO question&lt;/a&gt;, and just tried to change &lt;code&gt;threshold_enabled&lt;/code&gt; that made indexing back to work.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-XPUT&lt;/span&gt; &lt;span class="s2"&gt;"http://elastic:ELASTICSEARCH_PASSSWORD@127.0.0.1:9200/_cluster/settings"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
 -H &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;&lt;span class="s1"&gt;'
{
  "persistent": {
    "cluster": {
      "routing": {
        "allocation.disk.threshold_enabled": false
      }
    }
  }
}'&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Hope this helps for you.&lt;/p&gt;

</description>
      <category>searchkick</category>
      <category>elasticsearch</category>
      <category>ruby</category>
      <category>rails</category>
    </item>
  </channel>
</rss>
