blog.kotamiyake.me

為せば成る、為さねば成らぬ何事も

アカウントにアバター画像を設定できるようになりました!

複数のアカウントに登録していた場合に、各アカウントを識別しやすいようにアカウントにアバター画像を設定できるようにしました。

最初はデフォルト画像が設定されてるので、アカウントトップページのロゴ、またはアカウント設定画面から画像を変更してください。

継続的に開発を続けていきますので、ぜひお試しください!

また不具合などありましたら、問い合わせフォームよりご連絡いただければ幸いです。

先日、個人プロジェクトで「Seamless」というプロジェクト管理ツールをリリースしました。

プロジェクト管理のすべてを、一つの場所で – Seamless
https://seamless.jp/

動機としては

  • リモートワーク中心の会社で抱える問題を解決したい
  • 自分のプロダクトをリリースしたい
  • 自分の手でマネタイズしてみたい

などがあります。

まだまだ開発途上で足りない機能もたくさんありますが、興味のある方はぜひ利用してみてください!

 

個人的に動かしているサービスでcapistrano-sidekiqを利用しているのですが、リリースの際に以下のようなエラーがでてmonitの起動に失敗しました。

sudo /usr/bin/monit monitor sidekiq_app_production_0
Invalid action "action=monitor"

どうやらUbuntuのパッケージのバグらしく、古いバージョンを使うようにしたらうまく動きました。

sudo apt-get install monit=1:5.16-2

Bug #1787623 “monit monitor <foo> fails after upgrade to 1:5.16-…” : Bugs : monit package : Ubuntu
https://bugs.launchpad.net/ubuntu/+source/monit/+bug/1787623

 

 

個人的に動かしているアプリでsidekiqを利用しているのですが、先日以下のようなエラーが発生しました。

Redis::CommandError: ERR Error running script (call to f_7b91ed9f4cba40689cea7172d1fd3e08b2efd8c9): @user_script:7: @user_script: 7: -MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
  File "/home/deploy/apps/commerce/shared/bundle/ruby/2.5.0/gems/redis-4.0.1/lib/redis/client.rb", line 119, in call
# snip...

Googleで検索してみると、結論としてはどうやらメモリ不足だった模様。

Redisで発生したメモリ不足エラーの調査メモ | ソシャゲの作り方
http://www.24w.jp/blog/

RailsではSQLを発行する際に同じクエリがリクエストされるとSQLキャッシュが利用されます。

Rails のキャッシュ: 概要 | Rails ガイド
https://railsguides.jp/caching_with_rails.html#sql-%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5

キャッシュを利用すると高速化されますが、その分メモリを多く使用します。

今回はそれほどスピードを優先していないため、省メモリを優先してSQLキャッシュをオフにすることにしました。

def perform(shop, url)
  ActiveRecord::Base.connection.uncached do
    # code...
  end
end

ActiveJob Memory bloat · Issue #27002 · rails/rails
https://github.com/rails/rails/issues/27002#issuecomment-260086170

他にもやることはあるとは思いますが、一旦はこれで様子を見ることにします。

 

 

以前MessageEncryptorを使った暗号化を紹介したのですが、Rails 5.2では若干使い方が変わっていたので紹介します。

ドキュメントに従い、以下のように書き直します。

pry(main)> len = ActiveSupport::MessageEncryptor.key_len
=> 32
pry(main)> salt = SecureRandom.random_bytes(len)
=> "\x10\x8D\xCC\x19%\xD0\x9F{_\xB9\x9C\xDF\xEC\xE9\x10\xA3\xF9\x82\"\r\xE1\xAF\x01.\x17\x00\xAD\xA3=\xA6\xD2\x00"
pry(main)> key = ActiveSupport::KeyGenerator.new('salary').generate_key(salt, len)
=> "\"<\xE7\xC7-Z\xB6\xEA\xB29\x8B\xEBY\x9E\xEF!2\xFCL\x98\x02\xC7\x98;p'@6\xE0gV\xE9"
pry(main)> crypt = ActiveSupport::MessageEncryptor.new(key)
=> #<ActiveSupport::MessageEncryptor:0x00007fe0bd1540f0
 @aead_mode=true,
 @cipher="aes-256-gcm",
 @options={},
 @rotations=[],
 @secret="\"<\xE7\xC7-Z\xB6\xEA\xB29\x8B\xEBY\x9E\xEF!2\xFCL\x98\x02\xC7\x98;p'@6\xE0gV\xE9",
 @serializer=Marshal,
 @sign_secret=nil,
 @verifier=ActiveSupport::MessageEncryptor::NullVerifier>
pry(main)> encrypted_data = crypt.encrypt_and_sign(10000)
=> "vIhnJ/+b--dVcRCewozcXpKK8c--4UyU9gWcUa46EdjtLBx3vQ=="
pry(main)> crypt.decrypt_and_verify(encrypted_data) 
=> 10000

なぜ使い方が変わったのかと言うと、

これまではkeyに長過ぎる値を渡した場合は勝手に正しい長さに切り取ってくれたが、「想定外の結果(unexpected encryption/decryption results)」を引き起こすとして、正しい長さのkeyを渡さないと例外がraiseされるようになった。

ActiveSupport::MessageEncryptorを慎重に使う – nisshieeのブログ – https://nisshiee.hatenablog.jp/entry/2017/04/17/192703

ということらしい。

そのため以前のコードを実行するとエラーになります。

pry(main)> salery = 10000
=> 10000
pry(main)> secret = SecureRandom.hex(128)
=> "b991b09ab1a52e6649e5f836c4efcb28ec0d7e899e88be7b072cf752bf2194e8d2600dc524748f67d400a831f967a3a7b7c0b64d0af7b19cc2ee92300aa8c028699ca35ed9bb28f45d6238bf37476832e89638c200efb9ef8dccdf368f920d9d4a6ad941402a6c0ebb078e5b80d2ce76e3dafe45c3d44389c9c3633e710afde2"
pry(main)> encryptor = ::ActiveSupport::MessageEncryptor.new(secret)
=> #<ActiveSupport::MessageEncryptor:0x00007fe0c1bd3f68
 @aead_mode=true,
 @cipher="aes-256-gcm",
 @options={},
 @rotations=[],
 @secret=
  "b991b09ab1a52e6649e5f836c4efcb28ec0d7e899e88be7b072cf752bf2194e8d2600dc524748f67d400a831f967a3a7b7c0b64d0af7b19cc2ee92300aa8c028699ca35ed9bb28f45d6238bf37476832e89638c200efb9ef8dccdf368f920d9d4a6ad941402a6c0ebb078e5b80d2ce76e3dafe45c3d44389c9c3633e710afde2",
 @serializer=Marshal,
 @sign_secret=nil,
 @verifier=ActiveSupport::MessageEncryptor::NullVerifier>
pry(main)> encrypt_salery = encryptor.encrypt_and_sign(salery)
ArgumentError: key must be 32 bytes
from /Users/kotamiyake/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/activesupport-5.2.0/lib/active_support/message_encryptor.rb:169:in `key='

 

 

日頃の開発でpumaを使うことが多くなってきたので新たにpuma-devを使い始めることにしました。

puma/puma-dev: A tool to manage rack apps in development with puma
https://github.com/puma/puma-dev

以前使ったことがあったので、とりあえず手元の環境を新しくします。

$ brew upgrade puma-dev
$ puma-dev -uninstall
$ puma-dev -install -d test
$ sudo puma-dev -setup

これでシンボリックリンクを貼り直すだけで.testドメインでアプリを動かすことができるようになりました。

puma-devのREADMEにはHSTSの影響で.testがデフォルトになっていると書かれていたのですが、どうやらhomebrew経由のインストールだと最新版になっていない模様です。

Homebrew pulling older version (default domain is .dev, not .test) · Issue #168 · puma/puma-dev
https://github.com/puma/puma-dev/issues/168

HSTSとはなんぞやというのはWikipediaを参考にしました。

HTTP Strict Transport Security (エイチティーティーピー・ストリクト・トランスポート・セキュリティ、略称 HSTS)とは、WebサーバーがWebブラウザに対して、現在接続しているドメイン(サブドメインを含む場合もある)に対するアクセスにおいて、次回以降HTTPの代わりにHTTPSを使うように伝達するセキュリティ機構である。RFC 6797 で規定されている。

要はセキュリティ上の理由から強制的にHTTPSへリダイレクトする機能らしいです。

その対象に.devドメインも含まれていたので、利便性の理由から.testをデフォルトにしたようです。

$ bin/rails -v
Rails 5.2.0.rc1

/Rails5のアプリケーションでWerckerを使ってCIを利用としたところ、bin/rails testしたところで以下のようなエラーが発生しました。

/usr/local/lib/ruby/site_ruby/2.4.0/bundler/spec_set.rb:88:in `block in materialize': Could not find rake-12.3.0 in any of the sources (Bundler::GemNotFound)

bundle install は成功しているのになぜかrakeが見つからないと言われてしまいます。

wercker.ymlの設定は以下のようになっています。(一部省略)

box: ruby:2.4.3

services:
  - id: mysql
    env:
      MYSQL_ROOT_PASSWORD: root_password
      MYSQL_USER: test_user
      MYSQL_PASSWORD: test_password
      MYSQL_DATABASE: test_database

build:
  steps:
    - install-packages:
      name: Install build-essential
      packages: build-essential

    - script:
      name: install node
      code: |
        curl -sL https://deb.nodesource.com/setup_7.x | sudo bash -
        sudo apt-get install -y nodejs

    - script:
      name: install yarn
      code: |
        curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
        echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
        sudo apt-get update && sudo apt-get install yarn

    - bundle-install:
      jobs: 4

    - script:
      name: install npm packages
      code: bin/yarn

    - rails-database-yml

    - create-file:
        name: write master.key
        filename: ./config/master.key
        overwrite: true
        hide-from-log: true
        content: $WERCKER_MASTER_KEY

    - script:
      name: Set up db
      code: |
        RAILS_ENV=test bin/rails db:schema:load

    - script:
      name: Run Test
      code: bin/rails test

原因はどうやらbinstubsの内容と実際に実行ファイルが置かれている場所が異なるからのようです。

そこでbundle-installステップの後にbinstubsを更新するコマンドを追加します。

    - script:
      name: Update bin
      code: bin/rails app:update:bin

これで無事にテストが実行されるようになりました。

参考

導入メモです。

webpacker 3.2.1時点ではコマンドからstimulusをインストールできないのでmasterブランチを使います。

gem 'webpacker', github: 'rails/webpacker', branch: :master

先にwebpackerをインストールする必要があるので以下のコマンドを叩きます。

$ bundle exec rails webpacker:install

その後stimulusを指定して再度コマンドを実行します。

$ bundle exec rails webpacker:install:stimulus

これでRails上でStimulusが使えるようになります。

長らくneocomplete.vimを使っていた(と言ってもREADMEの設定のまま)のですが、既に開発が終わっているということで次期バージョン?のdeoplete.nvimを導入することにしました。

Note: Active development on neocomplete.vim has stopped. The only future changes will be bug fixes.

Shougo/neocomplete.vim: Next generation completion framework after neocomplcache

事前準備

deoplete.nvimを使うにはif_python3が必要ということなので確認してみます。

:echo has("python3")
0

どうやら入っていないようなので、vimをインストールし直すことにします。

MacにインストールされているPythonは2系なので、homebrewで3系をインストールします。

$ brew install python3
Error: python3 3.5.2 is already installed
To upgrade to 3.6.4_2, run `brew upgrade python3`

どうやら既にインストールされているようです…せっかくなのでアップグレードしておきます。

次にvimのPython3を有効にした状態でインストールし直します。

まずはオプションを確認します。

$ brew info vim
vim: stable 8.0.1450 (bottled), HEAD
Vi 'workalike' with many additional features
https://vim.sourceforge.io/
Conflicts with:
  ex-vi (because vim and ex-vi both install bin/ex and bin/view)
/usr/local/Cellar/vim/8.0.0055 (1,710 files, 23.3MB)
  Built from source on 2016-11-03 at 01:39:22 with: --with-lua
/usr/local/Cellar/vim/8.0.1250 (1,419 files, 25.3MB)
  Built from source on 2017-11-16 at 08:33:37 with: --with-lua
/usr/local/Cellar/vim/8.0.1300 (1,423 files, 25.4MB) *
  Built from source on 2017-11-21 at 11:43:30 with: --with-lua
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/vim.rb
==> Dependencies
Required: perl ✘, ruby ✘
Recommended: python ✘
Optional: gettext <img draggable="false" data-mce-resize="false" data-mce-placeholder="1" data-wp-emoji="1" class="emoji" alt="✔" src="https://s.w.org/images/core/emoji/2.4/svg/2714.svg">, lua ✘, luajit ✘, python3 <img draggable="false" data-mce-resize="false" data-mce-placeholder="1" data-wp-emoji="1" class="emoji" alt="✔" src="https://s.w.org/images/core/emoji/2.4/svg/2714.svg">
==> Options
--with-client-server
        Enable client/server mode
--with-gettext
        Build vim with National Language Support (translated messages, keymaps)
--with-lua
        Build vim with lua support
--with-luajit
        Build with luajit support
--with-override-system-vi
        Override system vi
--with-python3
        Build vim with python3 instead of python[2] support
--with-tcl
        Build vim with tcl support
--without-python
        Build vim without python support
--HEAD
        Install HEAD version

–with-python3とすれば良さそうです。

$ brew uninstall vim
Uninstalling /usr/local/Cellar/vim/8.0.1300... (1,423 files, 25.4MB)
vim 8.0.0055, 8.0.1250 2 are still installed.
Remove all versions with `brew uninstall --force vim`.

brew install vim --with-python3

Python3が有効になったかを確認してみます。

echo has("python3")
1

無事有効になっていることが確認できました。

続いてneovimというPythonのパッケージをインストールします。

$ pip3 install neovim

deoplete.nvimをインストール

ようやくdeoplete.nvimをインストールします。

今はneobundle.vimを使っているのですが、こちらもそのうちdein.vimに乗り換えようかと思います。

NeoBundle 'Shougo/deoplete.nvim'
NeoBundle 'roxma/nvim-yarp'
NeoBundle 'roxma/vim-hug-neovim-rpc'

最後に設定を追加して完了です。

let g:deoplete#enable_at_startup = 1

とりあえず大きく変わった感触はないのですが、使いながら最適化していこうかと思います。

Ubuntuサーバーへssh接続でwarning発生

MacからUbuntuサーバーにssh接続したら以下のようなwarningが発生しました。

manpath: can't set the locale; make sure $LC_* and $LANG are correct

どうやらMacから送られるLC_CTYPEの形式が不正らしいです。

まずはUbuntuにインストールされているロケールを確認してみます。

$ locale -a
C
C.UTF-8
POSIX
en_US.utf8
ja_JP.utf8

ではMacから送っているロケールを確認してみましょう。

$ echo $LC_CTYPE
UTF-8

そもそもUTF-8というロケールは正しくないみたいです。

サーバー側の設定に任せて良いので、Terminalの環境変数を修正しましょう。

Preferences > Profiles > Advanced > InternationalにあるSet locale environment variables on startupのチェックを外してしまいます。

これでssh接続してもwarningが発生しなくなりました。

参考