読者です 読者をやめる 読者になる 読者になる

kmasdaの日記

rubyとかrailsとかそれっぽいことを

bulletでn1潰してみて知ったこと

やりたいこと

bullet を入れてn+1 っちゃってる箇所を一斉駆除。 導入とかは全部書いてあるからよく読む。

github.com

特定のコントローラーアクションでskipさせたい場合は

class ApplicationController < ActionController::Base
  around_action :skip_bullet

  def skip_bullet
    Bullet.enable = false
    yield
  ensure
    Bullet.enable = true
  end
end

感じでやっとく。

はまったこと

class ApplicationController < ActionController::Base
  helper_method :current_user$
  def current_user
    @current_user ||= User.find_by(id: session[:user_id])
                          .tap { |u| session.delete(:user_id) unless u }
  end
end

class AdminController < ApplicationController
  def huga
    @piyo = current_user.includes(:user_detail)
  end
end

みたいなことしたくて、、、 nomethoderrorでちょっとはまった。 わかりづらいけどSTI実装してuserからadminを継承してadminのみ関連を持つテーブルをincludesしたい。 わけです。

includesはActiveRecord::QueryMethodsの中にあります。

http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-includes

んで、

ActiveRecord::Relation

where とかでやればActiveRecord::Relationで引っ張ればそこからextendされてるからincludesできる。

でも今回の場合はfind_byでレコードを引っ張ってしまっているからincludesができなかった。

結論としては bulletを黙らせた。 application_controller側でUser.includeとか書くとAdmin以外で参照した時にbulletが騒ぐしめんどう。 n1が怒っている箇所もイテレーターで回ってるわけではない。 ここに関してはそもそも何でbulletが騒いでるのかもわからない。

普段デザインとかからっきしな自分がflex使ってちょっと光が見えた時の備忘録

CSS

日頃デザインなどしないのでcss調整とかなってくると腰が重い。 で、

blog.jnito.com

なんかflexすごそう。 デザイナーじゃないけど最低限これぐらいは押さえておこうと思ってた自分にズッポリ刺さる内容!

他にも色々使えそうなテクニックあってcss実は食わず嫌いしてた感じもしてきた。 細かいプロパティとかは A Complete Guide to Flexbox | CSS-Tricks が分かりやすいからあくまでメモ的な感じで書く。

使い方

.container {
  display: flex; /* or inline-flex */
}

これで構造とその子要素に対して何かしらできる。 で、containerとitemsに分けて考えると理解しやすい。

containerに対してあれこれするやつ

flex-direction

子要素の配置を指定できる。

  • row(default)
  • row-reverse
  • column
  • column-reverse

flex-wrap

要素の中身をwrapするかどうか見たいなfloat的なやつ

  • nowrap(default)
  • wrap
  • wrap-reverse

flex-flow

flex-flow: <‘flex-direction’> || <‘flex-wrap’>

みたいな感じでまとめて書ける。

justify-content

子要素を横軸に対してどのように配置するか

  • flex-start(default)
  • flex-end
  • space-between ※両端に来る子要素にスペースが空いてない。その上で中の子要素同士のスペースが均等になるように配置する
  • space-around ※要素同士のスペースが均等で且つ、両端にスペースが入る。

align-items

子要素縦軸に対してどのように配置するか

  • flex-start
  • flex-end
  • center
  • stretch(default)
  • baseline ※子要素の中の基準

align-content

itemsに対してなんかするやつ

order

子要素の順番を決めれる。

flex-grow

子要素の割合を規定できる。 指定すると指定されていないそれ以外の要素を1として計算される。

frex-shrink

flex-basis

flex

.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}

flex-flowみたいな感じでまとめて指定できる。

align-self

その要素のみ適用させるときに使う。

参考にしたサイト

css-tricks.com

flexboxfroggy.com 最後の問題ができない。誰か教えてケロ。 できた!!!なるほどって感じ。よかったらやってみてください。 f:id:kmasda:20160225230704p:plain

・当分css関連の記事が増えそう ・netflixのテラスハウスはまった。副音声がご馳走。

enumとかenumerizeとか

2/15のsendagaya.rbに参加してenumについての話が出ました。

enumを使った時のDBの型は何を使っているかって話になった。 通常であればinteger型で

class Person < ActiveRecord::Base
  enum :sex { male: 1, female:2 }
end

とかやったりする。 でも、クエリとか組むときこの1とか2が何を表現するのかわからない。 エンジニアであればコードみればいいけど、非エンジニア見たときそれぞれが何を表現するのか不明だ!みたいな切り出しだったと思う。

でそこからenumerizeの話になってそこらへんからよくわからなくなって話についていけなくなった。

からここからは自分で調べて何となく自分で理解した内容をつらつら書く。

enum

rails 4.1以降にrailsに入った機能

Riding Rails: Rails 4.1.0: Spring, Variants, Enums, Mailer previews, secrets.yml

該当箇所には

Enums wraps the pattern of having a status field constrained to just a few options. It's just enough syntactic sugar to make tinyint-backed status fields taste delicious while still reaping the optimization benefit of avoiding repeated status strings. Poor man's state machine? Nah, Just Enough for Most of the Time.

と書いてある。 StateMachineなので多分状態の遷移が前提になってくるってことかな?

だとすると最初に上がった、male, femaleは遷移する状態を表すのには不適切かもしれない。まー変わることもあるけど、、、 それぞれで振る舞いを変えるならSTIでの実装?とかになるのかな?、、、話がそれそう。

アンダースタンディング コンピュテーション――単純な機械から不可能なプログラムまでにはstateMachineについてこんな感じで記述してあった。

幾つかの取り得る状態(state)と現在どの状態にいるかを記録する最小限の機能を備えた機械(finite state machine)

アマゾンの商品注文してから注文履歴で商品の状態を知るのとかenumで管理するみたいなイメージかな。

何かを受け取って特定の状態に遷移するって意味ではこれも多分そう。 https://www.bugzilla.org/docs/2.18/html/lifecycle.html

enumerize

正直使ったことないからわからない。

github.com

Enumerated attributes with I18n and ActiveRecord/Mongoid/MongoMapper/Sequel support

modelの属性についての管理をするgemって認識

まとめ

多分名前似てるし、記述の仕方も似てるがら誤解しそうだけど目的とか用途が違うから混同しないようにしないといけないと思った。 で、最初の問題(DBにどんな型で持つんだ!!)は属性についてはstringでもってシステムの移行リスクを減らたい。 状態の管理については時と場合によるけどinsert,updateの処理が多そうなのでintegerで管理する方がベター。 そのかわり、利用関係者に対しては説明やら理解を得ることが必要っぽい。

dotfileで管理したらもっと捗った。

kmasda.hatenablog.com

zshrcもそうだし、vimrcもそうだし 設定ファイルをいちいちgistにするの面倒で一括でgitにしちゃえば楽だと思った。

初期設定としては

$ mkdir dotfiles
$ mv ~/.zshrc ~/dotfiles/_zshrc
$ mv ~/.vimrc ~/dotfiles/_zshrc

ファイルを移動して

シンボリックリンクを貼る。 もしかしたら複数のパソコンで共有するかもしれないから-fで上書きしとく

 ln -sf ~/dotfiles/_zshrc ~/.zshrc
 ln -sf ~/dotfiles/_vimrc ~/.vimrc

他の設定ファイルが追加されたら都度リンクを貼り直すのか。。。。。 PCぶっ壊れたらまた、、、

考えると色々面倒なきがするので

Webデザイナーの為の「本当は怖くない」”黒い画面”入門 Part.08 « FJORD, LLC

kmasda.hatenablog.com

みたいな感じでまとめちゃえ

~/dotfiles/dotfileLinks.sh

 #!/bin/sh
 ln -sf ~/dotfiles/_zshrc ~/.zshrc
 ln -sf ~/dotfiles/_vimrc ~/.vimrc

source ~/.zshrc
source ~/.vimrc

だいぶ管理が楽になるはず。

github.com

TODO

vimrcを娘のごとく育てていく!!!

zsh使ったら色々捗った。

前回の記事

kmasda.hatenablog.com

「git」コマンドを毎回打つの面倒なので「g」に短縮したいみたいなことを書いた。

今回はzsh使ってみたら前回の内容はaliasで解決したし、色々便利そう。 oh-my-zshは使いたくない。 他人のテーマ入れたくないでござる。

選択肢としては自分で設定するしかないので参考(コピペ先)を色々探して、 とりあえず、以下の設定でなんとなく落ち着いた。

https://gist.github.com/kmasda/6c778793267908df15cd

参考にしたサイト

news.mynavi.jp

もうちょいやりたいこと

補完機能が充実してるのでどうせならrails周りの補完も任せたい。 なーんかこれが良さそう。 github.com

shellでコマンドを短縮してみた

普段shellって何?みたいな人間が Webデザイナーの為の「本当は怖くない」”黒い画面”入門 Part.01 « FJORD, LLC を読んでみた。 黒い画面は怖くないけどshellは怖かった。 読んでみて、色々スッキリした。

読むだけだとあんま身についた気がしないので簡単そうなの試してみた。

普段からあるストレス&やってみたこと

git コマンドってaliasあるけど「git」そのものの短縮できなくね? shellならできそう。

とりあえずやりたいこと

git コマンドをg のみで実行できるようにしたい。

やったこと

#!/bin/sh

git $@
  • 実行権限
  • 環境変数
  • shebang とか あたり気にしておけばなんとかなりそう。

実際に呼び出せた。 shell楽しそう。もうちょい調べて色々やりたい。

参考にしたサイト

Webデザイナーの為の「本当は怖くない」”黒い画面”入門 Part.01 « FJORD, LLC

メモ

zshとかなんか種類あるけど実際どれぐらい使い勝手変わるか調べたい。 news.mynavi.jp

herokuがなんかもっさりしているからやってみたこと(早くなったとは言ってない)

何で

表題通り。herokuがもっさりしてるから

やったこと

計測ツール入れてみた

何かやるにしても導入前後で効果検証できていないと意味がない。 今回はレスポンスがもっさりしてたので直接的には関係ないけど

newrelic.com

入れてみた。 response time やらtransaction の時間計測とかできて何かすごい。 とりあえず入れたのはfreeedition

installの方法とかはここに載ってる。

Installation and Configuration | New Relic Documentation

WEBrickやめたい。

blog.engineyard.com

ちょっと記事古いけどざっくり把握できる。 堅牢なunicornかスレッドベースのpumaで迷った。 (passenger,rehbokってゆー選択もちょっとあった。)

で、pumaにしました。 - heroku推奨 - スレッドベースなのでスロークライアントに対応? - rails5 でモニョモニョ

Rails 5: Action Cable Demo — Medium

で移行方法は

Deploying Rails Applications with the Puma Web Server | Heroku Dev Center

まだローンチしてないのでdefaultの設定

CDN

ドキュメント豊富だしってことでCloudFrontを選択しました。 fastlyも気になるけど、、、

導入は

Using Amazon CloudFront CDN | Heroku Dev Center

はい。

でCDNよくわかってなかったけどこの部分でなんとなく理解。

結果。

気持ちだけ早くなったけど、体感でわかるほどではない。 ってかnewrelic上ではrails アプリのレスポンス結構早い。

太平洋の壁ですかね、、、

って思ってたけど、その後モニョモニョ試しているうちに原因がSSLじゃないかと疑い始めました。 使ってるのは

www.cloudflare.com

試しにhttpで通信したら早い早い!!!

うーん、、、マルチテナントのアプリなんでワイルドカードが使える無料SSL神!!! みたいな話だっただけに悲しい。

まだ、直接の原因か切り分けできてないので本当に使えないのか検証してみまーす・・・ force_ssl = falseにしただけなのでタイトル通り(早くなったとは言ってない)わけです。

自戒

書き溜めてることが多いので早く書きたい。