<?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: Liam Barry</title>
    <description>The latest articles on DEV Community by Liam Barry (@worksofbarry).</description>
    <link>https://dev.to/worksofbarry</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%2F337%2F4d55ca0a-f462-408c-8107-56b48a4064c3.png</url>
      <title>DEV Community: Liam Barry</title>
      <link>https://dev.to/worksofbarry</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/worksofbarry"/>
    <language>en</language>
    <item>
      <title>Automating PowerRuby installation</title>
      <dc:creator>Liam Barry</dc:creator>
      <pubDate>Tue, 05 Mar 2019 17:43:46 +0000</pubDate>
      <link>https://dev.to/worksofbarry/automating-powerruby-installation-2ga7</link>
      <guid>https://dev.to/worksofbarry/automating-powerruby-installation-2ga7</guid>
      <description>&lt;p&gt;I've been working with a client who has been using an older version of PowerRuby and has recently wanted to upgrade to PR CE2 (Community Edition 2.0).&lt;/p&gt;

&lt;p&gt;For those that don't know what PowerRuby is, it's Ruby and Ruby on Rails built for the IBM i operating system. They compile Ruby and some gems specifically for use on IBM i.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can see the &lt;a href="https://powerruby.com/"&gt;PowerRuby website here&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;You can see PowerRuby guides and binaries on their &lt;a href="https://github.com/PowerRuby"&gt;GitHub page here&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://github.com/PowerRuby/DE_train_01"&gt;first guide on the org&lt;/a&gt; explains that you need to download the save files and run the &lt;code&gt;RSTLICPGM&lt;/code&gt; (restore licensed program) command manually - ew! In 2018, &lt;a href="https://worksofbarry.github.io/rpg-git-book/3-tooling"&gt;we got yum&lt;/a&gt; on IBM i to install packages like the Ruby runtime (Node.js, python, etc) automatically with the &lt;code&gt;yum&lt;/code&gt; command. PowerRuby has not adopted this method which is very sad.&lt;/p&gt;

&lt;p&gt;Of course, for this to work you will need &lt;code&gt;make&lt;/code&gt; and &lt;code&gt;curl&lt;/code&gt; which is available from the default IBM yum repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;yum install curl.ppc64 make-gnu.ppc64
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I wanted an easy way to get PowerRuby running on IBM i, so I went ahead and created a makefile to run all the commands required to install the PR licensed program from the web. This process will create the save files, download the contents and restore the programs with &lt;code&gt;RSTLICPGM&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nv"&gt;BIN_LIB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;PR_TEST

&lt;span class="nl"&gt;all&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;download install&lt;/span&gt;

&lt;span class="nl"&gt;download&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    system &lt;span class="s2"&gt;"CRTLIB LIB(&lt;/span&gt;&lt;span class="nv"&gt;$(BIN_LIB)&lt;/span&gt;&lt;span class="s2"&gt;)"&lt;/span&gt;
    system &lt;span class="s2"&gt;"CRTSAVF FILE(&lt;/span&gt;&lt;span class="nv"&gt;$(BIN_LIB)&lt;/span&gt;&lt;span class="s2"&gt;/PRUBY_BASE)"&lt;/span&gt;
    system &lt;span class="s2"&gt;"CRTSAVF FILE(&lt;/span&gt;&lt;span class="nv"&gt;$(BIN_LIB)&lt;/span&gt;&lt;span class="s2"&gt;/PRUBY_0001)"&lt;/span&gt;
    system &lt;span class="s2"&gt;"CRTSAVF FILE(&lt;/span&gt;&lt;span class="nv"&gt;$(BIN_LIB)&lt;/span&gt;&lt;span class="s2"&gt;/PRUBY_0006)"&lt;/span&gt;
    curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-k&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /QSYS.LIB/&lt;span class="nv"&gt;$(BIN_LIB)&lt;/span&gt;.LIB/PRUBY_BASE.FILE https://github.com/PowerRuby/DE_train_01/releases/download/V2R0M0/pruby_base.savf
    curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-k&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /QSYS.LIB/&lt;span class="nv"&gt;$(BIN_LIB)&lt;/span&gt;.LIB/PRUBY_0001.FILE https://github.com/PowerRuby/DE_train_01/releases/download/V2R0M0/pruby_0001.savf
    curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-k&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /QSYS.LIB/&lt;span class="nv"&gt;$(BIN_LIB)&lt;/span&gt;.LIB/PRUBY_0006.FILE https://github.com/PowerRuby/DE_train_01/releases/download/V2R0M0/pruby_0006.savf

&lt;span class="nl"&gt;install&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    system &lt;span class="s2"&gt;"RSTLICPGM LICPGM(1PRUBY1) DEV(*SAVF) LNG(2924) SAVF(&lt;/span&gt;&lt;span class="nv"&gt;$(BIN_LIB)&lt;/span&gt;&lt;span class="s2"&gt;/PRUBY_BASE)"&lt;/span&gt;
    system &lt;span class="s2"&gt;"RSTLICPGM LICPGM(1PRUBY1) DEV(*SAVF) LNG(2924) OPTION(1) SAVF(&lt;/span&gt;&lt;span class="nv"&gt;$(BIN_LIB)&lt;/span&gt;&lt;span class="s2"&gt;/PRUBY_0001)"&lt;/span&gt;
    system &lt;span class="s2"&gt;"RSTLICPGM LICPGM(1PRUBY1) DEV(*SAVF) LNG(2924) OPTION(6) SAVF(&lt;/span&gt;&lt;span class="nv"&gt;$(BIN_LIB)&lt;/span&gt;&lt;span class="s2"&gt;/PRUBY_0006)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Then to install PowerRuby CE2 all the developer has to do is run &lt;code&gt;make&lt;/code&gt;!&lt;/p&gt;

&lt;h3&gt;
  
  
  Optional extras
&lt;/h3&gt;

&lt;p&gt;PowerRuby also provides a version the GCC compiler (8.2) which is what they use to compile PR CE2 and some of the gems provided. It's also needed if you want to &lt;a href="https://github.com/PowerRuby/DE_train_02"&gt;compile 'native' gems&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight make"&gt;&lt;code&gt;&lt;span class="nl"&gt;gcc&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="p"&gt;-&lt;/span&gt;system &lt;span class="s2"&gt;"CRTSAVF FILE(&lt;/span&gt;&lt;span class="nv"&gt;$(BIN_LIB)&lt;/span&gt;&lt;span class="s2"&gt;/PRUBY_0002)"&lt;/span&gt;
    curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-k&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /QSYS.LIB/&lt;span class="nv"&gt;$(BIN_LIB)&lt;/span&gt;.LIB/PRUBY_0002.FILE https://github.com/PowerRuby/DE_train_02/releases/download/V2R0M0/pruby_0002.savf
    system &lt;span class="s2"&gt;"RSTLICPGM LICPGM(1PRUBY1) DEV(*SAVF) LNG(2924) OPTION(2) SAVF(&lt;/span&gt;&lt;span class="nv"&gt;$(BIN_LIB)&lt;/span&gt;&lt;span class="s2"&gt;/PRUBY_0002)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>ruby</category>
      <category>powerruby</category>
      <category>ibmi</category>
    </item>
    <item>
      <title>Using acme.sh &amp; Let’s Encrypt on IBM i</title>
      <dc:creator>Liam Barry</dc:creator>
      <pubDate>Tue, 05 Mar 2019 17:11:53 +0000</pubDate>
      <link>https://dev.to/worksofbarry/using-acmesh--lets-encrypt-on-ibm-i-ihm</link>
      <guid>https://dev.to/worksofbarry/using-acmesh--lets-encrypt-on-ibm-i-ihm</guid>
      <description>&lt;p&gt;I recently deployed a Node.js application on IBM i and wanted to use Let’s Encrypt for our certificates. We ran into a few bumps along the way. This post is going to go over the process of installing acme.sh and actually generating certificates.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is acme.sh
&lt;/h2&gt;

&lt;p&gt;Acme.sh is an open-source shell script to automatically call out to Let’s Encrypt to generate a certificate for you to use in your application. The quote on the GitHub repository is “It's probably the easiest &amp;amp; smartest shell script to automatically issue &amp;amp; renew the free certificates from Let's Encrypt.”. The repo can be found at &lt;a href="https://github.com/Neilpang/acme.sh/"&gt;https://github.com/Neilpang/acme.sh/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;First things first, you should install acme.sh with an SSH shell. As a reminder:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You can start the SSH daemon with &lt;code&gt;STRTCPSVR SERVER(*SSHD)&lt;/code&gt; on the 5250 command line.&lt;/li&gt;
&lt;li&gt;You can then log into the IBM i using &lt;code&gt;ssh user@youribmi&lt;/code&gt; from your machine terminal.&lt;/li&gt;
&lt;li&gt;You will want to run these commands in the bash shell.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To install:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Clone the repo: &lt;code&gt;git clone https://github.com/Neilpang/acme.sh.git&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Run the install script:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd acme.sh
./acme.sh --install --force
alias acme.sh=~/.acme.sh/acme.sh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;To use acme.sh you also need to have your domain DNS settings set up to point to your IBM i.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can not init api (error code: 77)
&lt;/h2&gt;

&lt;p&gt;I was following some old slides Aaron Bartell had written when doing this. When I first tried to install a certificate, I was getting a libcurl error.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bash-4.2$ export CURL_CA_BUNDLE=~/certs/cacert.pem
bash-4.2$ acme.sh --issue -d website.com -w /mywebsite/public
Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 77
Can not init api.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;I imagine I was getting this error because the file I am referencing (cacert.pem) did not exist. After some Googling, &lt;a href="https://github.com/zendtech/IbmiToolkit/issues/46"&gt;I found this GitHub issue&lt;/a&gt; on IbmiToolkit repository. There are two important notes on this thread.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;“The certificate bundle in question is typically provided on Linux distributions by default, but this is naturally not the case for IBM i.” - great! /s&lt;/li&gt;
&lt;li&gt;phpdave &lt;a href="https://gist.github.com/phpdave/8d594cfcfd6c11e704af"&gt;sharing this pseudocode&lt;/a&gt; about finding the local CA.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;phpdave’s script actually contains an important link on line 19: &lt;a href="http://curl.haxx.se/ca/cacert.pem"&gt;http://curl.haxx.se/ca/cacert.pem&lt;/a&gt;. I thought: if I download this certificate and make curl use it then I wonder if it will solve my issue.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bash-4.2$ wget http://curl.haxx.se/ca/cacert.pem
bash-4.2$ export CURL_CA_BUNDLE=/home/USER/cacert.pem
bash-4.2$ acme.sh --issue -d website.com -w /mywebsite/public
[Thu Jan 24 15:04:02 EST 2019] Creating domain key
....

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



&lt;h2&gt;
  
  
  How Let’s Encrypt authenticates against your server
&lt;/h2&gt;

&lt;p&gt;Notice in the ache.sh command, we include a URL to our website and a path to a public folder. We do this because acme.sh will&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a directory in the public folder: &lt;code&gt;/mywebsite/public/.well-known/acme-challenge&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create a random file in the &lt;code&gt;acme-challenge&lt;/code&gt; folder with a secret key in it&lt;/li&gt;
&lt;li&gt;Tell Let’s Encrypt to compare your key at &lt;code&gt;website.com/.well-known/acme-challange/randomkey&lt;/code&gt; with the key from the acme.sh script&lt;/li&gt;
&lt;li&gt;If it’s successful, then your keys will be generated.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This does mean that the “public” folder should be accessible on your web server. For example, if you were building a Node.js app with Express and it had this folder structure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mywebsite/
    index.js
    node_modules/
    public/
        index.html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Your index.js would tell the web server that the public directory is for static files: &lt;code&gt;app.use(express.static('public'))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;So when acme.sh generates &lt;code&gt;/mywebsite/public/.well-known/acme-challenge/randomkey&lt;/code&gt;, it will be accessible via &lt;code&gt;website.com/.well-known/acme-challange/randomkey&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Using the generated keys
&lt;/h2&gt;

&lt;p&gt;If all is successful when you run acme.sh it should generate a key and certificate for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bash-4.2$ acme.sh --issue -d website.com -w /mywebsite/public/
…
Your cert is in  /home/USER/.acme.sh/website.com/website.com.cer
Your cert key is in  /home/USER/.acme.sh/website.com/website.com.key
The intermediate CA cert is in  /home/USER/.acme.sh/website.com/ca.cer
And the full chain certs is there:  /home/USER/.acme.sh/website.com/fullchain.cer

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



&lt;p&gt;You can then copy these keys to a location where they’re useful to you: &lt;code&gt;cp /home/USER/.acme.sh/website.com/ /mywebsite/letsencrypt&lt;/code&gt;. In your Node.js Express app, you can then reference the key and certificate when creating your HTTPS server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;express&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="s1"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;https&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="s1"&gt;https&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;http&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="s1"&gt;http&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;fs&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="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// This line is from the Node.js HTTPS documentation.&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;letsencrypt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;website.com.key&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
  &lt;span class="na"&gt;cert&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;letsencrypt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;website.com.cer&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="c1"&gt;// Create a service (the app object is just a callback).&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Create an HTTP service.&lt;/span&gt;
&lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Create an HTTPS service identical to the HTTP service.&lt;/span&gt;
&lt;span class="nx"&gt;https&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;443&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;code&gt;ERR_SSL_VERSION_INTERFERENCE&lt;/code&gt; in Chrome
&lt;/h2&gt;

&lt;p&gt;I noticed when we got the certificates working in our app, the website wouldn’t load in Chrome with the &lt;code&gt;ERR_SSL_VERSION_INTERFERENCE&lt;/code&gt; error. After some research (trusty Google!) it looked like Node.js 8 doesn’t support TLS 1.3 (as noted in the &lt;a href="https://nodesource.com/blog/node-js-security-release-summary-august-2018/"&gt;second paragraph here&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;Luckily, we also have Node.js 10 on IBM i - so a simple uninstall of Node.js 8 and install of Node.js 10 (with yum of course!) we can get around this problem. You may also have to update some of your packages if you upgrade to Node.js 10.&lt;/p&gt;

</description>
      <category>ibmi</category>
      <category>letsencrypt</category>
      <category>node</category>
    </item>
    <item>
      <title>Why I created an IDE</title>
      <dc:creator>Liam Barry</dc:creator>
      <pubDate>Tue, 17 Apr 2018 20:04:12 +0000</pubDate>
      <link>https://dev.to/worksofbarry/why-i-created-an-ide-4cj</link>
      <guid>https://dev.to/worksofbarry/why-i-created-an-ide-4cj</guid>
      <description>&lt;p&gt;Hi. I have been meaning to write a blog post like this for a while and thought it might be a cool idea for my first post on dev.to.&lt;/p&gt;

&lt;p&gt;I have been creating an IDE for the last seven months. For the first few months it was closed source, now it is open-source and will remain that way.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://camo.githubusercontent.com/fb54c5248ef1d455b836b221180b5258dccf3e54/68747470733a2f2f692e696d6775722e636f6d2f5431395a5556702e706e67" class="article-body-image-wrapper"&gt;&lt;img src="https://camo.githubusercontent.com/fb54c5248ef1d455b836b221180b5258dccf3e54/68747470733a2f2f692e696d6775722e636f6d2f5431395a5556702e706e67"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prereqs
&lt;/h2&gt;

&lt;p&gt;First, let me answer why I created it. I am an open-source developer. I don't have a lot of money to purchase large enterprise tools. I am very thankful for Visual Studio Community, Eclipse, Jenkins, among other things. I am in an ecosystem which, when I started almost 4 years ago, didn't have a lot of open-source tech. The ecosystem is around the &lt;a href="https://en.wikipedia.org/wiki/IBM_i" rel="noopener noreferrer"&gt;IBM i&lt;/a&gt; operating system - which has had many names, more notably AS/400. We only recently got access to a mainstream package manager (yum) and it's going to be great for companies that want to use open-source tools in their existing stack.&lt;/p&gt;

&lt;p&gt;It's important to note that most of the development that is done for this OS is done on the platform itself. The operating system has it's own compilers for C, C++, COBOL and &lt;a href="https://en.wikipedia.org/wiki/IBM_RPG" rel="noopener noreferrer"&gt;RPG&lt;/a&gt; (we call these &lt;a href="https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_73/ilec/introc1.htm" rel="noopener noreferrer"&gt;ILE languages&lt;/a&gt;). While you can get compilers for C, C++ and COBOL that run on other operating system - you cannot for RPG. RPG is very platform specific and has language features which are tied to the operating system. There are a lot of industries running this OS and using RPG as their main development language.&lt;/p&gt;

&lt;p&gt;'Local development' isn't really a thing because compilers do not exist for RPG outside of IBM i. The best thing for distributed development right now is developing inside of your &lt;code&gt;/home/&lt;/code&gt; directory, which has your 'local' git repo in it. This does mean that all development is done remotely when writing in an ILE language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Development on IBM i
&lt;/h2&gt;

&lt;p&gt;There are two mainstream development options for writing in an ILE language. Using &lt;a href="https://www.ibm.com/uk-en/marketplace/rational-developer-for-i" rel="noopener noreferrer"&gt;Rational Developer for i&lt;/a&gt; (there is also &lt;a href="https://www.ibm.com/developerworks/downloads/r/rdp/index.html" rel="noopener noreferrer"&gt;Power&lt;/a&gt; and &lt;a href="https://www.ibm.com/developerworks/downloads/r/rdz/index.html" rel="noopener noreferrer"&gt;Z&lt;/a&gt; versions, all based on Eclipse) or using &lt;a href="https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_61/rzasc/sc09250796.htm" rel="noopener noreferrer"&gt;SEU&lt;/a&gt;. SEU is seriously outdated and does not let you use the latest language features in RPG. &lt;/p&gt;

&lt;p&gt;It really is just a text editor with a prompt for RPG and CL development. I really do not want to spend much time even mentioning SEU, so if you want to see more &lt;a href="https://www.youtube.com/watch?v=mhcgg_wHgD8" rel="noopener noreferrer"&gt;check out this video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're a development house that's using SEU and has been for years, moving to RDi (Rational Developer for i) is a haven. You finally get to experience what an IDE can offer. Content-assist, outline view, remote debugging - it even handles the EBCDIC conversions when editing. It really is such an upgrade.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ytimg.com%2Fvi%2FVIgpgGEc5PQ%2Fmaxresdefault.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ytimg.com%2Fvi%2FVIgpgGEc5PQ%2Fmaxresdefault.jpg"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There was a couple of performance issues I had with RDi and it was causing me to be unproductive at times. I guess it doesn't help that I was working with systems in a different continent. This made me feel unproductive.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;I wanted something that I was productive in. Something that wouldn't slow me down. For a few weeks I was creating sample extensions for Visual Studio and VSCode to see if I could add the functionality to them to work with ILE languages. This included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All remote development&lt;/li&gt;
&lt;li&gt;Adding highlighting for languages (RPG, CL and COBOL)&lt;/li&gt;
&lt;li&gt;Eventually adding content assist&lt;/li&gt;
&lt;li&gt;Submitting remote compiles and retrieving the error listing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I had no luck with both because of the nature of IBM i - it has a &lt;a href="https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_73/ifs/rzaaxlibfs.htm" rel="noopener noreferrer"&gt;different file system&lt;/a&gt;. On top of that, everything was remote and it wasn't working well with either environments - it meant creating new file explorers for the file system (that really didn't go down well in VSCode)&lt;/p&gt;

&lt;p&gt;I always follow the idea to work with what you're good with. I am okay with C#, so I started writing an environment in C# to open source code and compile programs. This is what it first looked like, about 7 months ago:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fi.imgur.com%2FN1gE4IL.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/http%3A%2F%2Fi.imgur.com%2FN1gE4IL.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On top of all that I wanted an open-source option for developing in an ILE language. While what I have created is not perfect, it has enough to learn RPG. It has achieved everything I wanted from it - good performance, not a memory hog and fast compile submissions.&lt;/p&gt;

&lt;p&gt;It was first named Idle, but then realised that is also the name of the Python IDE. I renamed it to ILEditor and it has stuck.&lt;/p&gt;

&lt;p&gt;I get the chance to speak about it at conferences at times. The great part is when people submit their ideas because then it helps the direction of the IDE too. It's using the GPLv3 licence and is using other open-source libraries to create the UI. I am very happy so far!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://camo.githubusercontent.com/fb54c5248ef1d455b836b221180b5258dccf3e54/68747470733a2f2f692e696d6775722e636f6d2f5431395a5556702e706e67" class="article-body-image-wrapper"&gt;&lt;img src="https://camo.githubusercontent.com/fb54c5248ef1d455b836b221180b5258dccf3e54/68747470733a2f2f692e696d6775722e636f6d2f5431395a5556702e706e67"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's pretty much it. Hopefully you enjoyed reading about what I have made. Here's a couple of follow up links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/WorksOfBarry/ILEditor" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://worksofbarry.com/ileditor/" rel="noopener noreferrer"&gt;Homepage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thanks!&lt;/p&gt;

</description>
      <category>ide</category>
      <category>ibm</category>
    </item>
  </channel>
</rss>
