SSHトンネル・トンネリング(ポートフォワード)で接続が切れてしまう場合の対策

結論

サーバ側の設定(必須)

  • /etc/ssh/sshd_configの 112行目 くらい*1にある ClientAliveInterval 0 を有効*2にする必要がある
    • その ClientAliveInterval の値として*3適切な値を与える(まずは 60 くらいでしょうか)
  • SSHサーバを再起動する

クライアント側の設定(可能ならば)

  • .ssh/config*4ServerAliveInterval 60 のような設定行を書き加える

備考

  • 両方設定できればベストですが、サーバ側の設定だけでたいてい大丈夫です
  • リトライ回数を設定する ClientAliveCountMax(サーバ側)や ServerAliveCountMax(クライアント側)という項目もありますので適宜設定してください
    • 初期値が与えられているので無理に設定する必要はありません

参考

*1:環境によります(無い場合もある)

*2:コメントイン して 0 より大きい値

*3:初期値は 0

*4:接続時のオプション設定

Active Record で「子(「1対多」の「多」)」から「親(「1対多」の「1」)」のレコードを取得する

前提

アソシエーションは設定済みとします。

テーブル構成

以下のようなテーブル構成とします。User が「親(「1対多」の「1」)」で、Article が「子(「多対1」の「1」)」です。

User

  • id
  • name
  • created_at
  • updated_at

Article

  • id
  • user_id
  • content
  • created_at
  • updated_at

「子」から「親」を取得する

以下のようにすれば「子」から「親」を取得できます。ここで「子」のレコードは「content が『こんにちは。』」となっているレコードとします。そしてそのレコードは複数個あるとします。

[1] pry(main)> child_records = Article.where(content: 'こんにちは。') # 複数のレコードが得られる
[2] pry(main)> child_records[0].user.name #=> child_records[0] に結び付けられている User の name が得られる

GitLab.com に プライベート gem を置いて利用する方法

プライベート gem

外部に公開できない、あるいは公開したくない gem がある場合に、GitLab.com のプライベートリポジトリにプッシュして利用する方法です。

結論

とはいえ、特に難しいところはないです。鍵の設定をしてあることを前提として、以下のとおりに Gemfile に書いて bundle install をしましょう。

gem 'your_private_gem_name', git: 'git@gitlab.com:your_name/your_private_gem_name_repo.git'

補足

鍵を設定していない場合はユーザ名とパスワードで認証することになりますが、その際に対話形式を避ける場合の詳細は以下のとおりです。

Raspberry Pi で Rails を起動しようとしたら少しハマった

環境

  • Raspberry Pi 3 MODEL B
  • Raspbian Stretch Lite
    • Version:October 2018
    • Release date:2018-10-09
    • Kernel version:4.14
  • Ruby 5.2.1
  • Rails 2.5.1
  • sqlite3libsqlite3-dev は入れてある

状況

ごくごく普通に rails new してから rails crails s をすると以下のようなエラーが発生した。

$ bundle exec rails c
(かなり省略)
You may have encountered a bug in the Ruby interpreter or extension libraries.
(かなり省略)

結論

以下の点を修正したところ、期待通りの動作になった。

1. Gemfile で spring の部分をコメントアウト

(省略)
   # gem 'spring'
   # gem 'spring-watcher-listen', '~> 2.0.0'
(省略)

2. config/boot.rb で bootsnap の部分をコメントアウト

(省略)
# require 'bootsnap/setup' # Speed up boot time by caching expensive operations.

結果

$ bundle exec rails c
Loading development environment (Rails 5.2.1)
irb(main):001:0>
$ bundle exec rails s
=> Booting Puma
=> Rails 5.2.1 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.0 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop

f:id:gregminster:20181014220621p:plain

余談

Raspberry Pi 本体のストレージ*1で Rails を動かすのは無謀なので、外付けストレージを使うべきでしょう*2。さらに言えば ARM ではちょっとしたことでもハマったり x86_64 とは異なる処理をしなければならなかったりするので、ロックオンしてしまうのはちょい危険だと思いました。

*1:MicroSD カード

*2:Raspberry Pi で Rails を動かすこと自体がどうかというのは置いておくとして

Powered by はてなブログ