<?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: mmyoji</title>
    <description>The latest articles on DEV Community by mmyoji (@mmyoji).</description>
    <link>https://dev.to/mmyoji</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%2F41553%2F9688b6b0-3cc0-4113-a59b-07d1e3f2af44.gif</url>
      <title>DEV Community: mmyoji</title>
      <link>https://dev.to/mmyoji</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mmyoji"/>
    <language>en</language>
    <item>
      <title>How to use different MySQL database per pull-request with Heroku Review Apps (Rails)</title>
      <dc:creator>mmyoji</dc:creator>
      <pubDate>Thu, 02 May 2019 05:46:36 +0000</pubDate>
      <link>https://dev.to/mmyoji/how-to-use-different-mysql-database-per-pull-request-with-heroku-review-apps-rails-41li</link>
      <guid>https://dev.to/mmyoji/how-to-use-different-mysql-database-per-pull-request-with-heroku-review-apps-rails-41li</guid>
      <description>&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Rails v5.2.x&lt;/li&gt;
&lt;li&gt;Ruby v2.6.x&lt;/li&gt;
&lt;li&gt;Heroku&lt;/li&gt;
&lt;li&gt;MySQL (ClearDB)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;Use &lt;code&gt;CLEARDB_&amp;lt;colorname&amp;gt;_URL&lt;/code&gt; for each Heroku Review Apps&lt;/p&gt;

&lt;p&gt;The sample code is here:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/mmyoji"&gt;
        mmyoji
      &lt;/a&gt; / &lt;a href="https://github.com/mmyoji/hreviewapp"&gt;
        hreviewapp
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      sample Rails app running on Heroku with ClearDB(MySQL)
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
Sample Rails app running on Heroku&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Rails v5.2.3&lt;/li&gt;
&lt;li&gt;Ruby v2.6.3&lt;/li&gt;
&lt;li&gt;MySQL (ClearDB)&lt;/li&gt;
&lt;li&gt;Heroku&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Heroku setup&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Create an app on Heroku&lt;/li&gt;
&lt;li&gt;Connect GitHub and repository&lt;/li&gt;
&lt;li&gt;Add ClearDB Addons&lt;/li&gt;
&lt;li&gt;Add &lt;code&gt;DATABASE_URL&lt;/code&gt; environment variable&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;See &lt;code&gt;config/database.yml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Copy &lt;code&gt;CLEARDB_DATABASE_URL&lt;/code&gt;, but replace the first &lt;code&gt;mysql://&lt;/code&gt; with &lt;code&gt;mysql2://&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Reference: &lt;a href="https://devcenter.heroku.com/articles/cleardb" rel="nofollow"&gt;https://devcenter.heroku.com/articles/cleardb&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Deploy manually&lt;/li&gt;
&lt;li&gt;Run database migration and etc. w/ heroku CLI
&lt;ul&gt;
&lt;li&gt;e.g.) &lt;code&gt;$ heroku run rails db:create -a &amp;lt;app_name&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
Heroku Review Apps&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Create a pipiline (if you don't have it)&lt;/li&gt;
&lt;li&gt;Follow the instruction: &lt;a href="https://devcenter.heroku.com/articles/github-integration-review-apps" rel="nofollow"&gt;https://devcenter.heroku.com/articles/github-integration-review-apps&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;If you wanna use different database per pull-request, see &lt;a href="https://github.com/mmyoji/hreviewapp/commit/7d727740cff709d194d76368642711f4017d8e62"&gt;this commit&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;ClearDB issues unique database URL per review apps like &lt;code&gt;CLEARDB_PURPLE_URL&lt;/code&gt; or &lt;code&gt;CLEARDB_NAVY_URL&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;If it exists, use the URL for the review apps.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In PostgreSQL, I don't know whether this kind of database URL is issued or not.&lt;/p&gt;
&lt;/div&gt;



&lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/mmyoji/hreviewapp"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;Some of my developer teams want to have a different app environment through their development process. Some use their own staging environment, others don't have that and just use local environments.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://devcenter.heroku.com/articles/github-integration-review-apps"&gt;Heroku Review Apps&lt;/a&gt; is a very good choice for that situation, but I didn't know whether it can use different database per pull-request. You might know Rails app development often has database migrations and separating database per pull-request makes developers happier :)&lt;/p&gt;

&lt;p&gt;If you use MySQL (sorry I didn't research PostgreSQL case), YOU CAN DO IT and I explain this in this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&gt;

&lt;p&gt;I don't talk about setup the heroku app, creating a pipeline and setup review apps here.&lt;/p&gt;

&lt;p&gt;They're not difficult, just talk about ClearDB useful feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  CLEARDB_XXX_URL
&lt;/h2&gt;

&lt;p&gt;I found that ClearDB issues unique database URL per review app.&lt;/p&gt;

&lt;p&gt;It is like &lt;code&gt;CLEARDB_NAVY_URL&lt;/code&gt;, &lt;code&gt;CLEARDB_PURPLE_URL&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;And I thought I could use this if it is set in the environment and the dirty script is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/mmyoji/hreviewapp/blob/master/config/database.yml#L54"&gt;https://github.com/mmyoji/hreviewapp/blob/master/config/database.yml#L54&lt;/a&gt;&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;production&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# ...&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;%= ((key = ENV.keys.find { |k| k =~ /^CLEARDB_([A-Z]+)_URL$/ &amp;amp;&amp;amp; k != "CLEARDB_DATABASE_URL" }) &amp;amp;&amp;amp; ENV[key].sub("mysql://", "mysql2://")) || ENV.fetch('DATABASE_URL') %&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code sucks, but you know what is done here.&lt;/p&gt;

&lt;p&gt;If &lt;code&gt;CLEARDB_XXX_URL&lt;/code&gt; exists, replace string &lt;a href="https://devcenter.heroku.com/articles/cleardb"&gt;in proper format&lt;/a&gt;, or use &lt;code&gt;DATABASE_URL&lt;/code&gt; like as a normal app.&lt;/p&gt;

&lt;p&gt;Don't forget to run &lt;code&gt;rails db:schema:load&lt;/code&gt; or &lt;code&gt;db:migrate&lt;/code&gt; after review app deployment.&lt;/p&gt;

&lt;p&gt;see: &lt;a href="https://github.com/mmyoji/hreviewapp/blob/master/app.json#L44"&gt;https://github.com/mmyoji/hreviewapp/blob/master/app.json#L44&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>rails</category>
      <category>heroku</category>
    </item>
    <item>
      <title>Video Processing with AWS Lambda + Elastic Transcoder in Golang</title>
      <dc:creator>mmyoji</dc:creator>
      <pubDate>Wed, 07 Mar 2018 10:11:46 +0000</pubDate>
      <link>https://dev.to/mmyoji/video-processing-with-aws-lambda--elastic-transcoder-in-golang--hf2</link>
      <guid>https://dev.to/mmyoji/video-processing-with-aws-lambda--elastic-transcoder-in-golang--hf2</guid>
      <description>&lt;p&gt;I'm posting this because I could not find any blog posts with sample code for video processing with AWS Lambda + AWS Elastic Transcoder in Golang.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dependencies
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Golang v1.10&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/aws/aws-lambda-go" rel="noopener noreferrer"&gt;aws/aws-lambda-go&lt;/a&gt; v1.1.0&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/aws/aws-sdk-go" rel="noopener noreferrer"&gt;aws/aws-sdk-go&lt;/a&gt; v1.13.8&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Premises
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You know &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/welcome.html" rel="noopener noreferrer"&gt;AWS Lambda&lt;/a&gt; and &lt;a href="https://docs.aws.amazon.com/elastictranscoder/latest/developerguide/introduction.html" rel="noopener noreferrer"&gt;Elastic Transcoder&lt;/a&gt; roughly&lt;/li&gt;
&lt;li&gt;You've already have a &lt;a href="https://docs.aws.amazon.com/elastictranscoder/latest/developerguide/working-with-pipelines.html" rel="noopener noreferrer"&gt;Elastic Transcoder Pipeline&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;You know Golang a little and like it :)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Flow of the operations
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Upload a video file in a S3 bucket&lt;/li&gt;
&lt;li&gt;Lambda is trigger by 1. and create a &lt;a href="https://docs.aws.amazon.com/elastictranscoder/latest/developerguide/working-with-jobs.html" rel="noopener noreferrer"&gt;Elastic Transcoder Job&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

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

&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;p&gt;Create a Lambda function&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Runtime: &lt;code&gt;Go 1.x&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Set an appropriate Role (Elastic Transcoder access is required)&lt;/li&gt;
&lt;li&gt;Set a handler name as the same with the Go binary after &lt;code&gt;go build&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Set a trigger as &lt;code&gt;S3&lt;/code&gt; and choose the Pipeline's input bucket name and event type &lt;code&gt;ObjectCreated&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Set your &lt;code&gt;PIPELINE_ID&lt;/code&gt; environment variable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"context"&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;
    &lt;span class="s"&gt;"os"&lt;/span&gt;

    &lt;span class="s"&gt;"github.com/aws/aws-lambda-go/events"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/aws/aws-lambda-go/lambda"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/aws/aws-sdk-go/aws"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/aws/aws-sdk-go/aws/session"&lt;/span&gt;
    &lt;span class="n"&gt;transcoder&lt;/span&gt; &lt;span class="s"&gt;"github.com/aws/aws-sdk-go/service/elastictranscoder"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="c"&gt;// Generic 720p&lt;/span&gt;
    &lt;span class="n"&gt;presetID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"1351620000001-000010"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;lambda&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s3Event&lt;/span&gt; &lt;span class="n"&gt;events&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S3Event&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="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;s3Event&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Records&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;s3&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;S3&lt;/span&gt;
        &lt;span class="n"&gt;bucket&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bucket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;
        &lt;span class="n"&gt;objKey&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;s3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[%s - %s] Bucket = %s, Key = %s &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EventSource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EventTime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bucket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;objKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;sess&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Must&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewSession&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;aws&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Config&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="c"&gt;// Set supported region&lt;/span&gt;
                    &lt;span class="n"&gt;Region&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ap-northeast-1"&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;svc&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;transcoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sess&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;svc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateJob&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;transcoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateJobInput&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;Input&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;transcoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JobInput&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;objKey&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="n"&gt;Outputs&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;transcoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateJobOutput&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;transcoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateJobOutput&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;PresetId&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;         &lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;presetID&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                        &lt;span class="n"&gt;Key&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;              &lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;objKey&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                        &lt;span class="c"&gt;// If the original filename is "test-file.mp4",&lt;/span&gt;
                        &lt;span class="c"&gt;// this generates "test-file.mp4-00001.png"&lt;/span&gt;
                        &lt;span class="n"&gt;ThumbnailPattern&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%s-{count}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;objKey&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;PipelineId&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"PIPELINE_ID"&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Failed: Create Job, %v&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Job Response: %v&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Job&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;The structs options are at minimum, but you can set &lt;code&gt;CreateJobOutput.ThumbnailPattern&lt;/code&gt; as &lt;code&gt;""&lt;/code&gt; if you don't want to generate thumbnails.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ThumbnailPattern&lt;/code&gt; must contain &lt;code&gt;{count}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;aws.String(str)&lt;/code&gt; is the same with &lt;code&gt;&amp;amp;str&lt;/code&gt;, you can use this as a shorthand.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;strPtr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;aws&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"somestring"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;// the same with above, but you need to set a variable first.&lt;/span&gt;
&lt;span class="n"&gt;str&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"somestring"&lt;/span&gt;
&lt;span class="n"&gt;strPtr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/sdk-for-go/api/service/elastictranscoder/" rel="noopener noreferrer"&gt;elastictranscoder - Amazon Web Services - Go SDK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/elastictranscoder/latest/developerguide/job-settings.html" rel="noopener noreferrer"&gt;Settings that You Specify When You Create an Elastic Transcoder Job - Amazon Elastic Transcoder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/elastictranscoder/latest/developerguide/system-presets.html" rel="noopener noreferrer"&gt;System Presets - Amazon Elastic Transcoder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.classmethod.jp/cloud/aws/amazon-elastic-transcoder-thumbnail/" rel="noopener noreferrer"&gt;Amazon Elastic Transcoderでサムネイル画像を作成してみた ｜ Developers.IO&lt;/a&gt; (JP)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>go</category>
    </item>
    <item>
      <title>touch triggers other touches</title>
      <dc:creator>mmyoji</dc:creator>
      <pubDate>Mon, 05 Mar 2018 02:39:56 +0000</pubDate>
      <link>https://dev.to/mmyoji/touch-triggers-other-touches--4c09</link>
      <guid>https://dev.to/mmyoji/touch-triggers-other-touches--4c09</guid>
      <description>&lt;p&gt;&lt;a href="http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-touch" rel="noopener noreferrer"&gt;ActiveRecord::Persistence#touch&lt;/a&gt; is a useful method and I like it.&lt;/p&gt;

&lt;p&gt;But I didn't really understand its spec well and it caused a deadlock in our Rails project. You have to care about its impact.&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;Post&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&lt;/span&gt;
  &lt;span class="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:post_category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;touch: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
  &lt;span class="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:writer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;touch: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;# This class is a pseudo class&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SomeClass&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;post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="vi"&gt;@post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt;
    &lt;span class="c1"&gt;# ...&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;call&lt;/span&gt;
    &lt;span class="c1"&gt;# ...&lt;/span&gt;
    &lt;span class="vi"&gt;@post&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;touch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:published_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# triggers following:&lt;/span&gt;
    &lt;span class="c1"&gt;# @post.post_category.touch&lt;/span&gt;
    &lt;span class="c1"&gt;# @post.writer.touch&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;In &lt;code&gt;SomeClass#call&lt;/code&gt;, &lt;code&gt;Post#touch&lt;/code&gt; is called and I thought this only update the &lt;code&gt;post.published_at&lt;/code&gt;, but also update &lt;code&gt;post_category.updated_at&lt;/code&gt; and &lt;code&gt;writer.updated_at&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The above code is just an example and it might be a trouble when you use &lt;code&gt;touch&lt;/code&gt; casually in the real application.&lt;/p&gt;

&lt;p&gt;You just care about logs before deployment :)&lt;/p&gt;

</description>
      <category>rails</category>
      <category>activerecord</category>
    </item>
    <item>
      <title>Is it possible to use Windows Subsystem for Linux in web development?</title>
      <dc:creator>mmyoji</dc:creator>
      <pubDate>Sat, 13 Jan 2018 06:54:12 +0000</pubDate>
      <link>https://dev.to/mmyoji/is-it-possible-to-use-windows-subsystem-for-linux-in-web-development-12g8</link>
      <guid>https://dev.to/mmyoji/is-it-possible-to-use-windows-subsystem-for-linux-in-web-development-12g8</guid>
      <description>&lt;p&gt;I got a Windows 10 Home PC for gaming(PUBG) and tried Windows Subsystem for Linux (a.k.a. Bash on Ubuntu on Windows) in web development.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You can use WSL for &lt;em&gt;light&lt;/em&gt; web development.&lt;/p&gt;

&lt;p&gt;For example,&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;web frontend development (using webpack)&lt;/li&gt;
&lt;li&gt;small web app (use Sinatra)&lt;/li&gt;
&lt;li&gt;etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's NOT suitable for heavy or modern development environment.&lt;/p&gt;

&lt;p&gt;At least, Windows10 Home edition can't use Docker in easy way.&lt;/p&gt;

&lt;p&gt;I've never tried Windows10 Pro + Docker for Windows and I read some articles about it, it didn't seem to be easy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Languages
&lt;/h2&gt;

&lt;p&gt;I installed and tried following languages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;li&gt;Golang&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setup Windows Subsystem for Linux
&lt;/h2&gt;

&lt;p&gt;It's not difficult at all! I skip the instruction.&lt;/p&gt;

&lt;p&gt;Japanese&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://qiita.com/Aruneko/items/c79810b0b015bebf30bb" rel="noopener noreferrer"&gt;Windows Subsystem for Linuxをインストールしてみよう！ - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;English&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/windows/wsl/install-win10" rel="noopener noreferrer"&gt;Install the Linux Subsystem on Windows 10 | Microsoft Docs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Editor - VSCode
&lt;/h2&gt;

&lt;p&gt;I'm using NeoVim in my current main dev environment on Xubuntu.&lt;/p&gt;

&lt;p&gt;But I discard NeoVim at this time and chose VSCode.&lt;/p&gt;

&lt;p&gt;It's easy to install and configure, and I wanted to use it a little.&lt;/p&gt;

&lt;p&gt;You just need to care about the terminal and git path setting.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://qiita.com/xerespm/items/ed4d659cfac4a1695f4b" rel="noopener noreferrer"&gt;Visual Studio CodeでWSLのgitを利用してソース管理を行う - Qiita&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Install the latest version of &lt;code&gt;wslgit.exe&lt;/code&gt; from &lt;a href="https://github.com/andy-5/wslgit/releases" rel="noopener noreferrer"&gt;here&lt;/a&gt; and put it wherever you like. (I put it under &lt;code&gt;/mnt/c/Users/mmyoji/&lt;/code&gt;)&lt;/p&gt;

&lt;p&gt;The VSCode setting file are like following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"terminal.integrated.shell.windows"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;WINDOWS&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;System32&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;bash.exe"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"git.path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Users&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;username&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;wslgit.exe"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the &lt;code&gt;&amp;lt;username&amp;gt;&lt;/code&gt; of your name like &lt;code&gt;mmyoji&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Install plugins you like.&lt;/p&gt;

&lt;p&gt;However, Golang integration with VSCode not worked when you install Gplang under WSL. If you want to use VSCode with Golang, it might be better to install to Windows itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup node
&lt;/h2&gt;

&lt;p&gt;The versions of node and npm via apt is too old and the installation process was a bit bothering.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://qiita.com/seibe/items/36cef7df85fe2cefa3ea" rel="noopener noreferrer"&gt;Ubuntuに最新のNode.jsを難なくインストールする - Qiita&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nodejs-legacy npm
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; n

&lt;span class="c"&gt;# Install latest node&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;n stable
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; /usr/local/bin/node /usr/bin/node

&lt;span class="nv"&gt;$ &lt;/span&gt;node &lt;span class="nt"&gt;-v&lt;/span&gt;
v9.2.1
&lt;span class="nv"&gt;$ &lt;/span&gt;npm &lt;span class="nt"&gt;-v&lt;/span&gt;
5.5.1

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt purge &lt;span class="nt"&gt;-y&lt;/span&gt; nodejs-legacy npm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Setup Terminal - Hyper
&lt;/h2&gt;

&lt;p&gt;I cannot stay calm with Command Prompt nor PowerShell and took &lt;a href="https://hyper.is/" rel="noopener noreferrer"&gt;Hyper&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get &lt;code&gt;Hyper&lt;/code&gt; from the official site.&lt;/li&gt;
&lt;li&gt;Install plugins if you want.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The config file was located under &lt;code&gt;/mnt/c/Users/mmyoji&lt;/code&gt; in my environment.&lt;/p&gt;

&lt;p&gt;This is an example:&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="c1"&gt;// .hyper.js&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// ....&lt;/span&gt;
  &lt;span class="nl"&gt;plugins&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="s1"&gt;hyper-dracula&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="c1"&gt;// theme plugin&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And select &lt;code&gt;View&lt;/code&gt; -&amp;gt; &lt;code&gt;Full Reload&lt;/code&gt; from &lt;code&gt;hyper&lt;/code&gt; options.&lt;/p&gt;

&lt;p&gt;It's easy to customize and I like it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup Ruby environment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Worked normal rbenv / ruby-build setup instructions with &lt;code&gt;git&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Install &lt;code&gt;$HOME/.rbenv&lt;/code&gt; and add some script in &lt;code&gt;$HOME/.bashrc&lt;/code&gt; (not &lt;code&gt;$HOME/.bash_profile&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;One thing:

&lt;ul&gt;
&lt;li&gt;before running &lt;code&gt;rbenv install 2.5.0&lt;/code&gt;, you have to install &lt;code&gt;readline&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$ sudo apt install -y libreadline-dev&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setup Golang
&lt;/h2&gt;

&lt;p&gt;You can do the same setup operation like Linux.&lt;/p&gt;

&lt;p&gt;But WSL+VSCode integration is not supported well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setup Docker
&lt;/h2&gt;

&lt;p&gt;If you have to handle dockerized applications, you have to use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows 10 Pro &amp;amp; Docker for Windows (and some customize)&lt;/li&gt;
&lt;li&gt;Docker Toolbox(VirtualBox)&lt;/li&gt;
&lt;li&gt;macOS&lt;/li&gt;
&lt;li&gt;Linux&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There might be a good solution, I couldn't find it for now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion, again
&lt;/h2&gt;

&lt;p&gt;It's a bit difficult to use Windows10 Home for modern web development.&lt;/p&gt;

&lt;p&gt;Linux is better for it.&lt;/p&gt;

&lt;p&gt;But you can use Windows10 Home as &lt;strong&gt;light&lt;/strong&gt; dev environment as I said above.&lt;/p&gt;

&lt;p&gt;Thanks.&lt;/p&gt;

</description>
      <category>windows</category>
      <category>wsl</category>
    </item>
  </channel>
</rss>
