wancoro blog

学んだことをアウトプットしていきたいと思います

Certificate verification failed: The certificate is NOT trusted. The certificate chain uses expired certificate.

passenger-ruby のdocker imageが突然ビルドに失敗するようになったので調査した。

Dockerfile

FROM phusion/passenger-ruby26@sha256:c187cae81ba7b0b3aba0f67f0aad4c24fb1352857dcbaf598301fdd2220ea32f

RUN apt-get update && apt-get install -y \
        libnginx-mod-http-headers-more-filter shared-mime-info \
    && apt-get clean

...

事象

apt-get update && apt-get install 時に以下エラーが発生する

Err:5 https://oss-binaries.phusionpassenger.com/apt/passenger bionic Release
  Certificate verification failed: The certificate is NOT trusted. The certificate chain uses expired certificate.  Could not handshake: Error in the certificate verification. 

E: The repository 'https://oss-binaries.phusionpassenger.com/apt/passenger bionic Release' does not have a Release file.

原因

passengerでは証明書にLet's Encryptを使用しており、その証明書が2021/9/30で期限切れとなった。
新しい証明書である ISRG RootX1 をサポートしていなかったため証明書エラーが発生した。

letsencrypt.org

対処方法

ca-certificates をアップデートすることで解消できるとのこと。

apt update && apt install -y ca-certificates

github.com

しかし、自分の場合はそもそも apt-get update の段階で証明書エラーが発生してしまいアップデートできなかった。

そのため解消方法を漁っていたところ、以下記事を発見。 github.com

apt updateの前に /etc/apt/sources.list.d を退避させるとうまくいくとのことで、試して見たところビルドに成功した。

RUN mv /etc/apt/sources.list.d /etc/apt/sources.list.d.bak
RUN apt update && apt install -y ca-certificates
RUN mv /etc/apt/sources.list.d.bak /etc/apt/sources.list.d 

修正後のDockerfile

FROM phusion/passenger-ruby26@sha256:c187cae81ba7b0b3aba0f67f0aad4c24fb1352857dcbaf598301fdd2220ea32f

RUN mv /etc/apt/sources.list.d /etc/apt/sources.list.d.back

RUN apt-get update && apt-get install -y \
        libnginx-mod-http-headers-more-filter shared-mime-info \
    && apt-get clean

RUN mv /etc/apt/sources.list.d.back /etc/apt/sources.list.d

...

まとめ

今回の事象の原因は、Let's Encryptの新しい証明書にコンテナが対応していなかったことだった。
事象を解決するには ca-certificates の更新が必要。
docker image として使用していた passenger-ruby の場合、/etc/apt/sources.list.d/passenger.list がデフォルトで含まれているため、 apt update 時にこのファイルが読み込まれ証明書エラーが発生してしまっていた。
そのため ca-certificates の更新前に /etc/apt/sources.list.d/ を退避させて読み込まれないようにすることで解決した。

Package mysql-client is not available, but is referred to by another package

事象

Dockerのベースイメージを openJDK 1.8.0_302 へアップデートしたところ、ビルド時に以下のエラーが発生。

Package mysql-client is not available, but is referred to by another package.
 This may mean that the package is missing, has been obsoleted, or
 is only available from another source

原因

Debian 10 では mysql-client は削除されているらしい。

stackoverflow.com

確かにパッケージ一覧に mysql-client は存在しない。 packages.debian.org

調査

openJDK 1.8.0_302 の Debian バージョンを調べてみた。

# openJDKのコンテナを起動
$ docker container run -it openjdk:8@sha256:74a0711547137cd3787c0b84266a7ba4cb814b98b8950cf95bc2e526bfc05e47 bash

# Debianのバージョンを確認
root@70a6026c6964:/# cat /etc/debian_version 
10.10

対処方法

default-mysql-client をインストールする。

参考

yourmystar-engineer.hatenablog.jp

webkaru.net

GAS触ったこと無いマンが、GASでランダムに数字を出力する機能作ってみた

背景

毎日の定例で雑談枠を設けているのだが、雑談ネタ一覧スプレッドシートを用意しておき、雑談ネタに困った時にそこからピックアップするようにした。

参考記事

www.m3tech.blog

その日のネタをランダムに選択するために、GASでランダムに数字を出力する機能を作ってみた。

やりたいこと

  • ボタンをクリックするとランダムで1つの数字を出力する
  • 出力された数字の行に自動的に移動してくれると嬉しい

作成物

function myFunction() {
  const spreadSheet = SpreadsheetApp.getActiveSheet();

  // 見出しを除いた最小値
  const minLength = 2;

  // ネタ数
  const maxLength = spreadSheet.getLastRow();

  // ランダムに数を生成
  const num = Math.floor(Math.random() * (maxLength + 1 - minLength)) + minLength;

  // D1に結果を出力
  spreadSheet.getRange(1, 4).setValue(num);

  // 結果で出力されたセルをアクティブにする
  const sell = spreadSheet.getRange(num, 1);
  spreadSheet.setActiveRange(sell);
}

こんな感じで、ボタンを押すとD1セルに数字が表示されるようになった。(デザインセンスが糞)

f:id:wancoromochi:20210401181134p:plain

参考にした記事

感想

すごく簡単にマクロ的なものが使える。
Javascriptで書けるので、結構いろんな処理ができるのかなーと予想。
もっといろいろ書いていきたい。

Firefoxの拡張機能「Quick Accept-Language Switcher」使ってみた

Quick Accept-Language Switcherとは?

Firefox拡張機能
名前の通り、 Accept-Language を簡単に切り替えることができる。

使用した経緯

GUIの試験のために、ブラウザの言語をenに変更したい。
Firefoxの言語設定を変更してみたけど、表記が変わらなかった。

使い方

  1. 以下ページから拡張機能を追加する。 addons.mozilla.org

  2. ブラウザの右上に四角いアイコンが表示されるのでクリックし、フォームに設定を入力(今回はenに設定) f:id:wancoromochi:20210401145702p:plain

  3. ブラウザをリロードすると、表示言語がenに切り替わる。

bundle installでグループ内にあるGemをインストールしたい[備忘録]

bundle install --without ${GROUP} を実行すると、次回以降に bundle install をするときも、前回の --without の設定を引き継いでしまうらしい。
(bundle configが書き換えられてしまうと予想)

なので、 --without ${GROUP} で除外したグループのGemをインストールしたい場合、bundle configを書き換える必要がある

(例)testグループのGemをインストールしたい場合

# Gemfile

group :test do
  gem 'rspec-rails'
end
$ vi .bundle/config

---
BUNDLE_PATH: "./vendor/bundle"
BUNDLE_FROZEN: "true"
BUNDLE_WIHTOUT: "test" # この行を削除

これでbundler installを実行すると、全てのグループのGemがインストールできる

Sprockets::FileNotFound: couldn't find file 'font-awesome' with type 'text/css'

事象

Gemを追加し、 asset:precompile を実行したところ上記エラー。

追加したGem
https://github.com/bokmann/font-awesome-rails

application.css に追記した *= require font-awesome を探しているが、
ファイルが見つからずにエラーになっているっぽい。

原因

Gemを書いた場所が問題だった。
group の中にGemを追加していた。

 group :development, :test do
    gem 'font-awesome-rails'
 end

group の外に出すことで解決した。

 gem 'font-awesome-rails'
 
 group :development, :test do 
 end

備考

正常にコンパイルされると、public/assets 配下にコンパイル済みのファイルが作成される

 $ ls public/assets
font-awesome-xxx.css
font-awesome-xxx.css.gz
fontawesome-webfont-xxx.woff2
fontawesome-webfont-xxx.eot
fontawesome-webfont-xxx.eot.gz
fontawesome-webfont-xxx.ttf
fontawesome-webfont-xxx.gz
fontawesome-webfont-xxx.svg
fontawesome-webfont-xxx.svg.gz
fontawesome-webfont-xxx.woff

また、 public/assets に配置されたものについては、HTTPで接続することができる

http://localhost:8080/assets/font-awesome-xxx.css

bundle installでGemfileが作成されない

やりたいこと

GemfileにGemを追加し、Gemfile.lockを更新したい。

事象

Gemfileを更新した後 bundle install を実行すると以下のエラーが表示され、Gemfileが更新されない。

 You are trying to install in deployment mode after changing
 your Gemfile. Run `bundle install` elsewhere and add the
 updated Gemfile.lock to version control.
 
 If this is a development machine, remove the Gemfile freeze 
 by running `bundle config unset deployment`.

bundler -v を実行したところエラーが出た。

 Traceback (most recent call last):
         2: from /home/vagrant/.rbenv/versions/2.6.5/bin/bundler:23:in `<main>'
         1: from /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/site_ruby/2.6.0/rubygems.rb:296:in `activate_bin_path'
 /home/vagrant/.rbenv/versions/2.6.5/lib/ruby/site_ruby/2.6.0/rubygems.rb:277:in `find_spec_for_exe': Could not find 'bundler' (2.0.1) required by your Gemfile.lock. (Gem::GemNotFoundException)
 To update to the latest version installed on your system, run `bundle update --bundler`.
 To install the missing version, run `gem install bundler:2.0.1`

解決策

エラーメッセージ2 に書かれている通り、 gem install bundler:2.0.1 を実行。

再度 bundle install をすると、同じようなエラーが出た。

 You are trying to install in deployment mode after changing
 your Gemfile. Run `bundle install` elsewhere and add the
 updated Gemfile.lock to version control.
 
 If this is a development machine, remove the Gemfile freeze 
 by running `bundle config --delete deployment`.

.bundle/config を見てみる。

 $ cat .bundle/config
 ---
 BUNDLE_DEPLOYMENT: "true"
 BUNDLE_PATH: "./vendor/bundle"
 BUNDLE_FROZEN: "true"
 BUNDLE_WITHOUT: "development:test"

エラーメッセージ書かれている通りbundle config --delete deployment を実行。
また、 BUNDLE_FROZENtrue の場合、Gemfileを変更できなくなるようなので
bundle config set frozen false も実行しておく。
http://ruby.studio-kingdom.com/bundler/bundle_config/

コマンド実行後の .bundle/config

 $ cat .bundle/config
 ---
 BUNDLE_PATH: "./vendor/bundle"
 BUNDLE_WITHOUT: "development:test"

これで bundle instal が成功するようになった!

しかし、そもそもなぜ bundler -vでエラーが出たのかは謎。