ESM アジャイル事業部 開発者ブログ

永和システムマネジメント アジャイル事業部の開発者ブログです。

Ruby 2.4.0-(dev|preview1) で Symbol not found: _rb_cFixnum が起きたときの対処

@koic です。 昨日、Ruby 2.4.0-preview1 がリリースされた時事ネタということで、Ruby 2.4.0 にまつわる TIL です。

Ruby 2.4.0 で Fixnum と Bignum が Integer に統合されます。この変更によりネイティブビルドを要した gem の実行時に Symbol not found: _rb_cFixnum あるいは Symbol not found: _rb_cBignum といったエラーが出た場合の対処です。

Ruby 2.4.0-dev or preview1 の環境にして前述のエラーが起きる gem を gem pristine などでネイティブビルドし直すことで解決します。

bundle exec rails c などで、これらのエラーが起きたときご活用ください。

Nginx のリクエスト制限を burst と nodelay で柔軟に設定する

Nginx では ngx_http_limit_req_module を使ってサーバが処理するリクエストの数を制限できます。例えば、同じ $request_filename へのリクエストを1秒に1回に制限する場合は次のようになります。

http {
  limit_req_zone $request_filename zone=foo:10m rate=1r/s;

  # (省略)

  server {
    # (省略)

    location / {
      # limit_req_zone で設定した上限 (1r/s) を超えたリクエストには503が返される
      limit_req zone=foo;
    }
  }
}

この設定では、1秒以内に2回以上のリクエストがあるとサーバは即座に503を返します。 しかし現実的には、一時的なリクエストの増加は許容したいことがあります。 そのためには burstnodelay を使います。

limit_req zone=foo burst=10 nodelay;

burst を指定すると、上限を超えたリクエストは burst に指定した数だけキューイングされ、リクエスト数が burst を超えたときだけ503が返されるようになります。 nodelay は処理を遅延させないためのオプションです。burst だけが指定された場合、キューイングされたリクエストの処理は rate の上限を超えないように遅延されます。一時的なリクエストの増加を許容したいときにこの遅延は不要ですので nodelay を指定します。

Rails のリポジトリにはレポート用の再現コードテンプレートがある

わたしが参加しているプロジェクトでは、今 Rails 5.0.0.rc1 で開発をしています。

先日コードを書いている時、気になる挙動があり、Issue をあげました。 Issue には再現させるためのコード片を記載していました。

この時、コメントで反応を頂いて知ったのですが、Rails には各コンポーネントごとにファイル単体で実行して確認するための再現コードのテンプレートが用意されているのですね。history を見ると 2013 年ごろからあるようですが、わたしは今回初めて気付きました。

中を読んでみると、bundler/inline が使われており、そのコードを Ruby で実行するだけで発生しているバージョンのライブラリがインストールされるようになっています。セットアップとテストを書けば、何をしているのか、何を期待しているのかがわかるようになっていました。

このテンプレートに沿って再現コードをあげれば、事象が発生している環境を揃えるのも実行も簡単だし、意図も伝わりやすくとても良いなぁと思いました。

Rails の気になる挙動に気づいたけど、英語が苦手でレポートを上げるのに躊躇しちゃうような人(例:わたし)には、とても便利なテンプレートだと思います。

絶対パス、相対パス、そしてキーワードによる移動

koic です。こんにちは。

@b4b4r07 さんによるプロダクトである enhancd のユーザー体験が素晴らしいということで、今日はターミナル生活中のディレクトリ移動についての話です。

今回取り上げる enhancd は執筆時点 (2016年5月20日) で、bash / zsh / fish に対応しているため、ツールとの相性次第で多くのターミナル生活者が恩恵を受けることができます。

絶対パス相対パスによる移動への不満点と、それらの解決となるキーワードでの移動といった流れで話を進めます。

絶対パスによる移動

どのパスにいても、絶対パスを入力すれば一発で移動ができる反面、ディレクトリが深い場合は入力が面倒です。

cd /path/to/dir

そして、だいたい目的のディレクトリは深いです。 Ctrl+r で履歴から移動すれば入力の手間は減りますが、cd コマンド以外も履歴の探索対象となる点がいま一歩です。

相対パスによる移動

いまいるパスからの相対分のみ入力すれば移動できるため相対位置が近ければ入力が少ない反面、相対位置が遠いと移動先のパスの入力を考えるのが面倒です。

cd ../to/dir

隣のディレクトリであれば、../path で済みますがそれ以上になると ../../path などと書くことになりツリー構造を頭に浮かべるのが思いのほか疲れます。 tab 補完で頑張ることはできますが、ディレクトリ内のすべてのディレクトリから何度も選択していくのが大変です。

そしてキーワードによるパス移動

「そこで enhancd ですよ!」とここで素敵なツールの紹介です。

もし、以前 /path/to/dir に移動したことがあれば以下のように 移動先のパスのキーワード を入力すれば どこのパスにいても瞬時に移動 できます。

cd dir # どこのディレクトリにいても /path/to/dir ディレクトリに移動できる。複数の候補がある場合は peco などでフィルタリング。

絶対パス移動への不満である長い入力への手間、相対パス移動への不満であるディレクトリツリーの脳内組み立てが解決されました。

一度移動したことのあるディレクトリへの移動に手間を掛けない。『達人プログラマー』にも Don't Repeat Yourself とありますね。

早く導入すると、それだけ早く人生の無駄時間が減る

キーワードでの移動は、絶対パス相対パスに背反するものではなく、むしろ絶対パス相対パスによる移動を背景にしています。

移動履歴のあるパスは ~/.enhancd ディレクトリ内のファイルに保存されてキーワードの探索対象になります。つまり、早く導入すればするほど補完できる機会が増えますので、使ったことのない読者の方は一度お試し頂くと良いと思います。

インストールもとても簡単。私自身、毎日のディレクトリ移動時間をかなり削減する実感を体感できたライフチェンジングなイチオシツールです。

作者による Qiita 記事やプロダクトの README.md がとても丁寧に記されているため、詳しくはそちらをご参照下さい。

`set -e` で、コマンドが失敗したときシェルスクリプトの実行を中断する

シェルスクリプトで途中のコマンドが失敗したら直ちに実行を中断してほしいことがあります。 事前に set -e しておけば、コマンドが失敗したとき (non-zero で終了したとき) にスクリプト自体が異常終了します。

#!/bin/sh

set -e

false     # ここで中断される

echo ':(' # 実行されては困る処理

sh や bash-e を同じように解釈するので、#!/bin/sh -e というように shebang に書くこともできます。 反対に set -o errexit というやや冗長な書き方もあります。

次のような箇所では、コマンドが non-zero を返してもスクリプトは終了しません。

  • パイプラインの途中 (最後のコマンドは除く)。
  • whileuntil if elif の条件式。
  • 複数の式を expr1 && expr2 のように AND や OR でつないだ式。

bash の pipefail オプションを使えばパイプラインで失敗したときにも終了できます。

#!/bin/bash -eo pipefail

false | true # ここで中断される

echo ':('    # 実行されては困る処理

ブログはじめました

永和システムマネジメント アジャイル事業部でも、最近流行り(?)の技術ブログをゆるくはじめることにしました。 弊社メンバーによる、気合の入った熱い記事や、脱力系のゆるい記事、はたまた日々の仕事で学んだ TIL などを自分たちのペースで皆さんに伝えられればと思います。

わたしたちに会った時の話のネタにするなどしていただければ、幸いです。

では、よろしくお願いいたします。