docker-composeを利用してRailsアプリ開発を楽にしよう

ていうのをうなすけさんに相談したら、解決策を示してくれたのでそれを開発向けに変えてみた。 Dockerとdocker-composeはみなさんごぞんじだと思うので割愛します。

はじめに

Railsアプリ用 Dockerfile を準備します。こちらは、元記事と同じで良いとおもいますが、元記事ではすべての条件を満たすために、不要な DB やミドルウェアのライブライをインストールしてますので必要なものだけにします。 このRailsアプリでは、DB として postgres を利用していますので関連のライブラリをインストールします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
FROM ruby:2.5.3-stretch

ARG NODE_MAJOR_VER=11
ARG BUNDLER_JOBS=4

RUN curl -sL https://deb.nodesource.com/setup_${NODE_MAJOR_VER}.x | bash - \
  && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \
  && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \
  && apt update && apt install --assume-yes \
    postgresql-contrib \
    libpq-dev \
    libxml2 \
    libxml2-dev \
    libxslt1-dev \
    git \
    make \
    nodejs \
    yarn \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*

WORKDIR /rails
COPY . .
RUN bundle install --jobs=${BUNDLER_JOBS}
RUN yarn install

同様に docker-compose.yml を必要なものだけにします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: '3'
services:
  rails:
    build: .
    command: /bin/bash
    environment:
      - NODE_MAJAR_VER=11
      - BUNDLER_JOBS=4
      - DB_HOST=postgres
    volumes:
      - ".:/rails"
    links:
      - postgres
    command: ["bundle", "exec", "rails", "s", "-b", "0.0.0.0"]
    ports:
      - "3000:3000"
  postgres:
    image: postgres:11.1-alpine
    ports:
      - "5432:5432"

こちらも postgres だけにします。

おわり

あとは docker-compose up rails とし、実行することで見れるようになっています。

Hello Language Server

ここ1、2週間、 emacs で lsp-emacs を使いはじめたのでそのメモ

Language ServerLanguage Server Protocol ってなによ?って人はリンクをみてください。

導入

導入は簡単で以下の3つをpackage-installでインストールしてしまえば OK です。

1
2
3
lsp-mode
lsp-ui
lsp-ruby

インストール後は .emacs.d/init.el あたりに、

1
2
3
4
(require 'lsp-mode)
(require 'lsp-ui)
(require 'lsp-ruby)
(add-hook 'ruby-mode-hook #'lsp-ruby-enable)

を追記すると emacs 側の設定はできました。

lsp-ruby(emacs) を起動する前に gem install solargraphsolargraph をインストールしておきましょう。

利用開始!

利用開始するときは利用したいファイルのトップディレクトリ(プロジェクトディレクトリ)に、 Gemfile が必要です。

でこんなかんじに表示してくれます。

matome

lsp-ruby を導入したけど、solargraph だとちょっとあれな表示が出て残念な気分に。 また rubocop も基本的に要求されるようで…

Remove Rails Assets

ひさびさに Ruby on Rails の話で、自作の rails application で rails-assets というところからいくつか gem を利用してたので それを Yarn で同様のパッケージをインストールするように変更した。

なにをやったのか?

単純に一旦 rails-assets からインストールしている gem を Gemfile から削除します。

そのあと、 yarn addpackage.json を生成し node_modules にインストールします。

1
2
3
yarn add [email protected] font-awesome jquery
yarn install
rails s

インストールが終了し、railsを起動したら必要な情報(font-awesome, bootstrap) を app/assets/{javascripts,stylesheets} に記載。

1
2
3
4
5
6
// app/assets/javascripts/application.js
//= require rails-ujs
//= require turbolinks
//= require jquery/dist/jquery.js
//= require bootstrap-sass/assets/javascripts/bootstrap
//= require_tree .
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# app/assets/stylesheets/application.scss
@import 'bootstrap-sass/assets/stylesheets/bootstrap';
@import "font-awesome/scss/variables";
$fa-font-path: "font-awesome/fonts/";
@import "font-awesome/scss/mixins";
@font-face {
  font-family: 'FontAwesome';
  src: font-url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
  src: font-url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
    font-url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'),
    font-url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
    font-url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
    font-url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
  font-weight: normal;
  font-style: normal;
}
@import "font-awesome/scss/core";
@import "font-awesome/scss/larger";
@import "font-awesome/scss/fixed-width";
@import "font-awesome/scss/list";
@import "font-awesome/scss/bordered-pulled";
@import "font-awesome/scss/animated";
@import "font-awesome/scss/rotated-flipped";
@import "font-awesome/scss/stacked";
@import "font-awesome/scss/icons";
@import "font-awesome/scss/screen-reader";
$icon-font-path: "bootstrap-sass/assets/fonts/bootstrap";

ってかいたら使えるようになっています!

おわり

ということで IMASARA ですが rails-assets からの脱却ついでに簡単に yarn を利用した assets の導入をやってみました!

New Keyboard

タイトルのとおり家のキーボードを新調しました。

Iris

機械学習でよく評価されるやつじゃなくてキーボードであるやつです。

keeb.io で売ってます。

購入

欲しい欲しいといってたらいつのまにか復活したのでケースとセットで購入。

組み立て

公式やASCIIにあるのでそれに従い組み立てハンダ付します。特に言うことはないです。

ハンダ付ミスっても近所に電子工作の得意なお兄さんに工具を借りれたのですぐに解決です。

完成

はい。

おわり

この記事は新しいキーボードに慣れるため書いています。

今まで利用していた Kinesis のやつは仕事場に持っていってます。

配列を Kinesis で利用してた時と似せていますが、少し違うのでまだ打ちにくいです。

あと、技術書典5来てくださいた皆さまありがとうございました。 次回も出そうという気が湧いてきましたので次回もよろしくお願いします。

くーも

Rubyで cuda を利用して GPGPU 使いたいの で cumo を導入してみた。

install

はじめに cuda をインストールしておきます。 gem に登録されているので、雑に gem install 実施してみます。

1
2
3
4
5
6
export CUDA_PATH="/opt/cuda"
export CPATH="$CUDA_PATH/include:$CPATH"
export LD_LIBRARY_PATH="$CUDA_PATH/lib64:$CUDA_PATH/lib:$LD_LIBRARY_PATH"
export PATH="$CUDA_PATH/bin:$PATH"
export LIBRARY_PATH="$CUDA_PATH/lib64:$CUDA_PATH/lib:$LIBRARY_PATH"
gem install cumo

とすると以下のようなエラーが出てだめです。

1
2
3
4
5
6
7
8
9
10
gcc -I. -Iinclude -Inarray -Icuda -I/home/katsyoshi/.rbenv/versions/2.5.1/include/ruby-2.5.0/x86_64-linux -I/home/katsyoshi/.rbenv/versions/2.5.1/include/ruby-2.5.0/ruby/backward -I/home/katsyoshi/.rbenv/versions/2.5.1/include/ruby-2.5.0 -I. -I/home/katsyoshi/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/numo-narray-0.9.1.3/ext/numo/narray -DHAVE_NUMO_NARRAY_H -DHAVE_DLFCN_H -DHAVE_DLOPEN -DHAVE_STDBOOL_H -DHAVE_STDINT_H -DHAVE_TYPE_BOOL -DHAVE_TYPE_U_INT8_T -DHAVE_TYPE_U_INT16_T -DHAVE_TYPE_INT32_T -DHAVE_TYPE_U_INT32_T -DHAVE_TYPE_INT64_T -DHAVE_TYPE_U_INT64_T -DHAVE_EXP10 -DHAVE_RB_CCOMPLEX -DHAVE_RB_THREAD_CALL_WITHOUT_GVL -I/opt/cuda/include -I/home/katsyoshi/.rbenv/versions/2.5.1/include -fPIC -O3 -ggdb3 -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wno-tautological-compare -Wno-parentheses-equality -Wno-constant-logical-operand -Wno-self-assign -Wunused-variable -Wimplicit-int -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration -Wdeprecated-declarations -Wmisleading-indentation -Wno-packed-bitfield-compat -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wduplicated-cond -Wno-maybe-uninitialized -o narray/types/bit.o -c narray/types/bit.c
narray/gen/tmpl/lib.c:22:7: エラー: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘/’ token
 #define m_map(x) m_num_to_data(rb_yield(m_data_to_num(x)))
       ^
narray/gen/tmpl/lib.c:23:29: エラー: 終端する > 文字がありません

                             ^
narray/gen/tmpl/lib.c:23:29: 致命的エラー: static ID id_cast;: そのようなファイルやディレクトリはありません
コンパイルを停止しました。
make: *** [Makefile:453: narray/types/bit.o] エラー 1

公式リポジトリ覗いてもとくに問題なさそうなので gem からのインストールは一旦おいてソースからインストールします。

build

公式リポジトリからダウンロードしてコンパイルをはじめます。

1
2
3
4
5
6
7
8
9
10
git clone https://github.com/sonotz/cumo.git
cd cumo
export CUDA_PATH="/usr/local/cuda"
export CPATH="$CUDA_PATH/include:$CPATH"
export LD_LIBRARY_PATH="$CUDA_PATH/lib64:$CUDA_PATH/lib:$LD_LIBRARY_PATH"
export PATH="$CUDA_PATH/bin:$PATH"
export LIBRARY_PATH="$CUDA_PATH/lib64:$CUDA_PATH/lib:$LIBRARY_PATH"
bundle install
rake compile
rake install

ってインストールできますが、その前に僕の環境が gcc-8.2.0 だったりして、これを gcc-6.4.0 に戻したりしてインストールしました。

run

これでインストール終わりましたので、 irb で確認してみようと思います。

1
2
3
4
5
6
7
irb(main):001:0> require 'cumo/narray'
=> true
irb(main):002:0> Cumo::Int32.new(3, 3).fill(0)
=> Cumo::Int32#shape=[3,3]
[[0, 0, 0],
 [0, 0, 0],
 [0, 0, 0]]

とこれで実行されたことを確認できます。

と簡単に書きましたが、インストール後にGPUへのアクセス権が無いユーザーで実行したためエラーが出ます(エビデンス取得忘れ)。 手元のPCではGPUにアクセス権がvideo groupにもあるので利用ユーザーをvideo groupへ追加して再起動することでようやく動作確認ができます。

おわり

簡単にGPGPUを利用したプログラムが書けるようになりましたのでおわりです。 技術書典5はこれを使ったはなしを出展しますのできてみてくださいな。

え37でまってます

SATySFi使って本書いてみてる

技術書典5出しますので、それを書くために OCaml で作成された SATySFi を使いはじめました。

インストール

今回は OPAM を利用してインストールをしています。まあ単純にパッケージが今普段使いしてるOSにないだけなんですけどね。 インストール手順は 公式のREADME.md を参考にしています。

OPAM

OCaml Package Manager の略らしいです。 こいつは OCaml のインストールもしてくれるのでこれを利用します。 OPAM のインストールは簡単で以下のスクリプトを実行するだけです。

1
wget https://raw.github.com/ocaml/opam/master/shell/opam_installer.sh -O - | sh -s /usr/local/bin

OCaml

OPAM のインストールが終ったら、 OCaml をインストールします。

1
2
opam switch 4.06.0
eval `opam config env`

SATySFi

OPAM の準備が整ったら SATySFi の準備、インストールをします。

1
2
3
4
5
6
7
opam repository satysfi-external https://github.com/gfngfn/satysfi-external-repo.git
opam update
git clone https://github.com/gfngfn/SATySFi.git
cd SATiSFi

opam pin add satysfi .
opam install satysfi

compile!!!!

これでインストールされたのでとりあえずリポジトリにある demo/demo.saty をコンパイルしてみましょう。

1
2
cd demo
make

なにも準備していないといきなりエラーがでますのでそれを公式を参考にして解消します。 解消できたら demo.pdf ができますのでこれでつかえるようになります。

おわり

ちょっと簡単でしたが、 satysfi の導入日記でした。

そんなことより技術書典5に出します。ネタは酒に関するネタでやっていく予定です。 仕上がっていれば え37 に居るとおもわれます。

Wireguardをはじめました

title 通り、 wiregaurd で家と さくらのVPS にあるサーバーを繋いでみました

install

導入は簡単で gentoo は公式にあるので

1
sudo emerge wireguard

だけで、 ubuntu の場合もインストールガイドがあるため簡単にインストールできます

1
2
3
4
sudo apt install software-properties-common
sudo add-apt-repository ppa:wireguard/wireguard
sudo apt-get update
sudo apt-get install wireguard

引込

あとは非常にかんたんここを適宜読み替えることで 接続できます。

おわり

あとは、再起動時に自動で接続するように変更する必要がありそうですがつながったし、おそいのでこれでおわり

Hello, Itamae From Docker!!

Itamae の plugin 書いててそろそろ test 欲しいなあとおもって2年くらいたちましたが、 ようやく Docker 使って test 書きました。

方向性

ここでテストを実施するとして何に対しておこなうのかというのを考えましたが、E2Eのテストだけで良いだろうという方向でテストを書くようにしています。 VMを立てて実行することにはチョット大袈裟だろうということでもっと簡単に、楽にということで docker を選択しています。

itamae で E2E のテストなのでここでは serverspec を利用してテストを行います。 E2E のテスト準備として docker 内で最初に目的のレシピを実施し、そのレシピが正しく動作しているかをテストしています。

準備とテスト実施

準備として以下の gem を追加しますが、 docker-api.gem の方はなくてもとくに問題ないです。 serverspec の対象バックエンドで docker指定できるようになりますが、 docker 内 (docker run -t hoge bundle exec serverspec など) で serverspec を実施すれば実行できますので、好みで追加しましょう。

1
2
spec.add_development_dependency "docker-api"
spec.add_development_dependency "serverspec"

次に Dockerfile を作成します。ここでは単純に必要な準備を実施、テストしたいディレクトリの追加、 bundler を利用して gem のインストールを実施してから、対象のディレクトリで itamaelocal を指定して対象の docker にレシピ適用します。そのあと docker runserverspec を実施することでテストをすることが可能となります。

1
2
3
4
5
6
7
8
FROM ruby
RUN echo "gem: --no-rdoc --no-ri" >> /.gemrc
RUN gem install bundler
ADD . /app
WORKDIR /app
RUN bundle install
RUN bundle exec itamae local samples/recipe.rb
CMD bundle exec rake

itamae-plugin-resource-pip

itamae-plugin-resource-pip でできるようになってます。 とくに docker.io とかで公開していませんので、以下に例を

1
2
3
cd /path/to/itamae-plugin-resource-pip
docker build -t katsyoshi/itamae-plugin-resource-pip .
docker run -t katsyoshi/itamae-plugin-resource-pip bundle exec rake

おわり

これやろうと思って調べてたらみつからずに Dockerfile 書き終えて、travis を追加しようとしたときに、@sue445 さんがやってたのをみつけてしまった。。。

RubyKaigi2018

RubyKaigi2018 に行ってきた

1日目

1日目は、 ずっと会場Aにいました。

  1. Matz: Keynote
  2. Aaron Patterson: Analyzing and Reducing Ruby Memory Usage
  3. Kenta Murata, and Yusaku Hatanaka: Deep Learning Programming on Ruby
  4. Bozhidar Batsov: All About RuboCop
  5. Naotoshi Seo: Fast Numerical Computing and Deep Learning in Ruby with Cumo
  6. Emma Haruka Iwao: Exploring Internal Ruby Through C Extensions
  7. Lightning Talks

この日、今年の RubyKaigi 2018 で最も楽しみにしてたのが rubocop の作者のトークで、彼のプロダクト(rubocop, flycheck-ruby)を利用してる身としては非常に楽しみでした。 DLと数値計算のやつは進捗が聞けてよかったっていうのとDeep Learningに関していうと難しいのかなあという感想が… Haruka さんのやつは、やっぱり今の実装十分に速いってのがわかって、これ以上速くするには非常に大変だなってのがよかったですね。 LTはどれもよくて rib も面白いし、 csvの高速化の話が特に好きでした。

2日目

2日目もほとんどA会場できいていたのと、GitHubの電源スペースにいました。

  1. Kouhei Sutou: My way with Ruby
  2. Kouichi Sasada: Guild Prototype
  3. Yuichiro Kaneko: RNode with code positions
  4. Yusuke Endo: Type Profiler: An analysis to guess type signatures
  5. Ruby Commiters vs. the World

この日のトークは特に楽しみにしていたのはなかったのですが、ここ最近毎年聞いていた @v0dro の発表を聞いていなかった。 金子さんの発表がわりとたのしく聞けて、「あーやっぱり型のはなしは興味ないな」って感じで遠藤さんの発表聞いてました。 この日の懇親会で飲みすぎた。

3日目

3日目はパフォーマンス改善を中心として聞いてました。

  1. Benoit Daloze: Parallel and Thread-Safe Ruby at High-Speed with TruffleRuby
  2. Takashi Kokubun: The Method JIT Compiler for Ruby 2.6
  3. Takeshi Watanabe: LuaJIT as a Ruby backend.
  4. Prasun Anand: High Performance GPU computing with Ruby
  5. Vladimir Makarov: Three Ruby performance projects
  6. TRICK 2018 (FINAL)

TuffleRubyとはやくてとてもよさそう。 国分さん、Vladimirの話はいつもどおりで安心した。

TRICK、どうしてこんなプログラムが思いつくのかさっぱりわからんがとにかく凄い以上の感想がうかんでこない。

おわり

RubyKaigi 2018に行ってきてたいへんたのしいイベントでした。

(型のはなしはやはり興味がないというかまだまだ理解が浅いのでTaPL読むべきだな)

API キーが凍結されてら

mikutter の Twitter API キーが凍結された ようです。

回避方法

とりあず、twitter の 開発者ページ から API キーを生成してください。 あとは以下の様に編集してください

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
diff --git a/Gemfile b/Gemfile
index 0a88a191..cb48cd4f 100644
--- a/Gemfile
+++ b/Gemfile
@@ -21,6 +21,7 @@ group :default do
   gem 'pluggaloid', '>= 1.1.1', '< 2.0'
   gem 'delayer-deferred', '>= 2.0', '< 3.0'
   gem 'twitter-text', '>= 2.1.0'
+  gem 'dotenv'
 end

 group :test do
diff --git a/core/config.rb b/core/config.rb
index 6e3d95ba..455e3083 100644
--- a/core/config.rb
+++ b/core/config.rb
@@ -14,8 +14,8 @@ module CHIConfig
   ACRO = "mikutter"

   # 下の2行は馬鹿にしか見えない
-  TWITTER_CONSUMER_KEY = "AmDS1hCCXWstbss5624kVw"
-  TWITTER_CONSUMER_SECRET = "KOPOooopg9Scu7gJUBHBWjwkXz9xgPJxnhnhO55VQ"
+  TWITTER_CONSUMER_KEY = ENV["TWITTER_CONSUMER_KEY"]
+  TWITTER_CONSUMER_SECRET = ENV["TWITTER_SECRET_KEY"]
   TWITTER_AUTHENTICATE_REVISION = 1

   # pidファイル
diff --git a/mikutter.rb b/mikutter.rb
index da302ca1..94025817 100755
--- a/mikutter.rb
+++ b/mikutter.rb
@@ -32,6 +32,8 @@ require 'benchmark'
 require 'webrick'
 require 'thread'
 require 'fileutils'
+require 'dotenv'
+Dotenv.load(".env")

 require_relative 'core/utils'

あとは環境変数TWITTER_CONSUMER_KEYTWITTER_SECRET_KEY を設定してあげると起動できるようになります

dotenv

環境変数を指定して毎回起動したくない、とか .bashrc に書きたくない、とかある場合は dotenv.gem を使うことで良いかんじに読みとってくれるようになります。 つかいかたは Dotenv.load(file_name)file_name にあるファイルのなかに環境変数を書けばよいです。

おわり

おわり。 別に dotenv.gem いらんなこれ