コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

「初回は生成処理、それ以降は生成処理の結果を返す」のような記述をRubyで簡便に行う

「毎度計算して求めたくないんだよね」というニーズに答える書き方。前書いた原理の逆引き的な応用編。

環境

書き方

||= を使うことで二回目以降の実行を抑止できる

めちゃくちゃ重い処理 heavy_work があったとして、それを一回だけ実行して、それ以降は行いたくない場合、以下のようにクラスを作る。

class DemoObject
  def create_var
    @view_param ||= heavy_work
  end

  private

  # 一回だけやりたい作業
  # @return [String] 作業の結果
  def heavy_work
    p "Heavy Work Start!"
    # なにかめちゃくちゃ重たい処理
    p "Heavy Work Complete!"
    "Work Result"
  end
end

インスタンスメソッドに持つことによって、二回目以降は行われない 以下のようなプログラムを動かすと…

demo_obj = DemoObject.new
p demo_obj.create_var
p demo_obj.create_var

下記のような結果になる

$ ruby test.rb
"Heavy Work Start!"
"Heavy Work Complete!"
"Work Result"
"Work Result"

原理

原理は昔書いたのでそれを参考のこと

Rubyで初期値設定を行うときは || を使って nil 判定をする自己代入式を使うと便利 - コード日進月歩

Rails.env はどうやって導きだされるのかざっくり調べる

該当コードを調べてみるシリーズ

環境

$ bin/rails -v
Rails 5.2.2

該当コード

rails/railties/lib/rails.rbここらへん

# Returns the current Rails environment.
#
#   Rails.env # => "development"
#   Rails.env.development? # => true
#   Rails.env.production? # => false
def env
  @_env ||= ActiveSupport::StringInquirer.new(ENV["RAILS_ENV"].presence || ENV["RACK_ENV"].presence || "development")
end

読み取れること

  • production? などができるように ActiveSupport::StringInquirer.new をしている
  • 値に関してはいずれかの値を取る
    • 環境変数 RAILS_ENV を見ている
    • 上記が存在しない場合は RACK_ENV を見ている
    • それでも何もない場合は development

関連リンク

MySQL5.7.17のバージョンでデフォルトの設定だとindexの最大バイト数に制約がある

困った、という感じだったので原理をメモる。

環境

mysql> select version();
+------------+
| version()  |
+------------+
| 5.7.17-log |
+------------+
1 row in set (0.01 sec)

事象

indexを貼ろうとしたときに対象のカラムのバイト数が767byteを超えると

Index column size too large. The maximum column size is 767 bytes.

というような表示が出て、エラーとなる。

対策

以下のように設定値を変更する

innodb_large_prefix=ON
innodb_file_format=Barracuda
innodb_file_format_max=Barracuda

それぞれのオプションの意味

項目ごとにドキュメントの記載を見ていく。

なお、ファイル形式のAntelopeとBarracudaの差異に関しては以下のkamipoさんのブログを見ると良い

InnoDBの制限とファイルフォーマットAntelopeとBarracudaの違い - かみぽわーる

innodb_large_prefix

このオプションを有効にすると、DYNAMIC および COMPRESSED 行フォーマットを使用する InnoDB テーブルで、767 バイトよりも長い (最大で 3072 バイトの) インデックスキープリフィクスが許可されます。 - MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.12 InnoDB の起動オプションおよびシステム変数

innodb_file_format

新しい InnoDB テーブルで使用されるファイル形式です。現在は、Antelope および Barracuda がサポートされています。 - MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.12 InnoDB の起動オプションおよびシステム変数

innodb_file_format_max

サーバーの起動時に InnoDB によって、この変数の値がシステムテーブルスペースのファイル形式タグ (Antelope や Barracuda など) に設定されます。 - MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.12 InnoDB の起動オプションおよびシステム変数

参考リンク

MySQLの設定状況をクエリで調べるときは SHOW GLOBAL VARIABLES を使う

設定情報って設定ファイルを見ればいいんだっけか、というときに

環境

mysql> select version();
+------------+
| version()  |
+------------+
| 5.7.17-log |
+------------+
1 row in set (0.01 sec)

やり方

システム変数の値を調べればわかるので以下のクエリを実行すると一覧で出てくる

SHOW GLOBAL VARIABLES;

絞り込む

すべて出てきてしまうので、LIKE文で絞ることができる

mysql> SHOW GLOBAL VARIABLES LIKE 'character_set_ser%';
+----------------------+---------+
| Variable_name        | Value   |
+----------------------+---------+
| character_set_server | utf8mb4 |
+----------------------+---------+
1 row in set (0.00 sec)

参考リンク

MySQLはクエリでもバージョンを調べることができる

豆知識的メモ

環境

$ mysql --version
mysql  Ver 14.14 Distrib 5.7.24, for osx10.14 (x86_64) using  EditLine wrapper

やり方

情報関数である version() を見ればいいので、 SELECT version() すればOK。

実例

mysql> SELECT version();
+-----------+
| version() |
+-----------+
| 5.7.24    |
+-----------+
1 row in set (0.01 sec)

関連リンク

Rubyのぼっち演算子の英訳は lonely operator , 正式名称はsafe navigation operator

英語のコメットコメント書くときに困ったから調べた

出典元

Ruby 2.3.0 Released

上記の内容曰く

A safe navigation operator (so-called lonely operator) &.

と記載があるので、safe navigation operator が正式名称の様子。なおこれはNull条件演算子というカテゴリに入り、演算子の呼称は言語によって違う様子。

元ネタ

Releaseのリンクに元ネタの写真があるので気になる方はそちらを。。

参考リンク

Base64化された画像はブラウザで簡単にDLできる

あ、こんな簡単にできるのね事例

やり方

base64の画像タグを用意する(いつぞややったヤツを転用

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAA3lBMVEU9Q7jT1O////+xs+JKUL3Fx+ry8vrExuo+RLjx8vpSV8BGTLtDSbqkp96usOFCSLpPVb/29vzY2fHDxelOU77i4/RbYMN/g9A/RblJT7zk5PVfZMViZsXOz+1LUL23uuW8vub39/xESrv19fu5u+WXmtmRlNdQVb/3+PxFSrtITrzk5fXKy+xjaMZpbshLUb3t7fhZXsLj5PVRVr/n5/be3/NrcMnu7/lcYcNCR7qrreCwsuKprOCnqd8/RLnLzex+gtCmqd6Okdbw8PlITbzHyOrq6/eUl9hHTbxrb8n+VD9KAAAAAWJLR0QCZgt8ZAAAAAd0SU1FB+MDFQY4O956N5wAAACwSURBVEjH7dC3EoJAFIXhAyqgsigGzIKYEMw55/j+L+TAoGOxBfb7dff83QUYhmH+wfE8HwLCEUEMBytSNBaPywBREgpBoJJUU2o6A2Q1aFl3yHH5QrFEKx/lSrmqG0DNhFn3lkZTb9HLj7YAWDI6lnfZTleiF1+vDwyGQHGE0dhbJtOZTC+++WK5Wm+ALZHIzh32h+PmRC3fv5ydi34FCre7aLvDw8DTedEKwzBMYG/7KBXMD75mAgAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOS0wMy0yMVQxNTo1Njo1OSswOTowMFEJEK0AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTktMDMtMjFUMTU6NTY6NTkrMDk6MDAgVKgRAAAAAElFTkSuQmCC" />

src部分をそのままブラウザに貼ると表示される。

f:id:shinkufencer:20190915183353p:plain
今回はChromeでやりました

あとはコレを画像として保存すればOK

参考サイト