paranitips

Never stop learning! がモットーのゆるふわエンジニアブログ

group_by のときに使う &:hogehoge ってなに?

User.all.group_by(&:age)

レコードをグルーピングするときgroup_byを使いますが、引数の&(アンパサンド、アンド)の挙動をいまいち理解してなかったので調べてみました。

Rubyではメソッド呼び出しの引数に「&手続きオブジェクト」を渡すと、手続きオブジェクトをブロックとして渡すことができます。Ruby 1.8.7以降では「&シンボル」を渡すと、「シンボル.to_proc」をブロックとして渡すことができます。

to_proc (Symbol) - Rubyリファレンス

つまり、以下のように書けてとっても便利です。

# User.all.group_by{|s| s.age } と同じ
User.all.group_by(&:age)

# ["12", "34", "56"].collect {|s| s.to_i } と同じ
["12", "34", "56"].collect(&:to_i)

# [1, 2, 3, nil, 5, 6].select {|s| s.present? } と同じ
[1, 2, 3, nil, 5, 6].select(&:present?)

これはなかなか使えますね〜。(^^)

参考

autoprefixerを使って快適にコーディングする

SASSを導入してからコーディングがかなり楽ちんになったのですが、CSSでベンダープレフィックスをつけるとき、「このプロパティってプレフィックスいるんだっけ?」「Safariでこれってまだ必要だっけ?」みたいな問題によく遭遇します。

-webkit-border-radius: 4px;
-moz-border-radius: 4px;
-ms-border-radius: 4px;
-o-border-radius: 4px;
border-radius: 4px;

いちいちCan I Useで対象ブラウザを確認するのも手間がかかるし、どうにかならんものかと悩んでいたら、知り合いのコーダーにautoprefixerを教えてもらいました。

autoprefixerってなに?

Can I Useの情報を元に、自動でベンダープレフィックスを付与してくれるツールです。 対象のブラウザの条件を細かく設定できたり、不要なベンダープレフィックスがあれば削除も行ってくれます。

さっそく入れてみる

Gemfileに追記してbundle installでおわり。

# Gemfile
gem "autoprefixer-rails"

適用するためにキャッシュをクリアします。

$ rake tmp:clear

これでもううまいことやってくれます。 例えば、

# これが
:fullscreen a
  display: flex
# こうなります
:-webkit-full-screen a {
    display: -webkit-box;
    display: -webkit-flex;
    display: flex
}
:-moz-full-screen a {
    display: flex
}
:-ms-fullscreen a {
    display: -ms-flexbox;
    display: flex
}
:fullscreen a {
    display: -webkit-box;
    display: -webkit-flex;
    display: -ms-flexbox;
    display: flex
}

便利すぎますね。。

ブラウザバージョンを指定する

browsersで対応ブラウザの条件を指定することもできます。

細かい書き方はai/browserslistを見てください。

# config/autoprefixer.yml
browsers:
    - "> 1%" # 使用率が1%以上
    - "last 2 versions" # 直近2つ前のバージョン
    - "IE >= 8" # IEは8以上

以上です。 これでコーディングが捗りますね〜\(^o^)/

参考

railsを起動しようとしたらlibmysqlclient.18.dylib (LoadError)っていわれた

railsサーバを起動しようとしたらmysqlまわりのエラーが出て起動できず。。

$ rails s
/Library/Ruby/Gems/2.0.0/gems/mysql2-0.3.16/lib/mysql2.rb:8:in `require': dlopen(/Library/Ruby/Gems/2.0.0/gems/mysql2-0.3.16/lib/mysql2/mysql2.bundle, 9): Library not loaded: /usr/local/lib/libmysqlclient.18.dylib (LoadError)
  Referenced from: /Library/Ruby/Gems/2.0.0/gems/mysql2-0.3.16/lib/mysql2/mysql2.bundle
  Reason: image not found - /Library/Ruby/Gems/2.0.0/gems/mysql2-0.3.16/lib/mysql2/mysql2.bundle
    from /Library/Ruby/Gems/2.0.0/gems/mysql2-0.3.16/lib/mysql2.rb:8:in `<top (required)>'
    from /Library/Ruby/Gems/2.0.0/gems/bundler-1.9.4/lib/bundler/runtime.rb:76:in `require'
    from /Library/Ruby/Gems/2.0.0/gems/bundler-1.9.4/lib/bundler/runtime.rb:76:in `block (2 levels) in require'
    from /Library/Ruby/Gems/2.0.0/gems/bundler-1.9.4/lib/bundler/runtime.rb:72:in `each'
...

なんかrubyのgemで変なとこ向いてて読み込みミスってるので、シンボリックリンクを張って対応します。

まず、インストールしているmysqllibmysqlclient.18.dylibを探します。

私のMacmysqlはHomebrewでインストールしたので、詳細を確認します。

$ brew info mysql
mysql: stable 5.7.9 (bottled)
Open source relational database management system
https://dev.mysql.com/doc/refman/5.7/en/
Conflicts with: mariadb, mysql-cluster, mysql-connector-c, percona-server
/usr/local/Cellar/mysql/5.6.23 (9686 files, 339M)
  Poured from bottle
...

ディレクトリがわかったので、エラーになってる箇所にシンボリックリンクを張ります。

$ sudo ln -s /usr/local/Cellar/mysql/5.6.23/lib/libmysqlclient.18.dylib /usr/lib/libmysqlclient.18.dylib

以上でOKです。

参考