停止:
mysql> SET GLOBAL slow_query_log = 0;
再開:
mysql> SET GLOBAL slow_query_log = 1;
現状:
mysql> show variables like "slow_query_%";
mysqldumpしたデータをインポートしていたらことごとくスローログに積もり積もっていって慌てて停止したという次第。オンラインでできてよかった(mysql 5.1から)。
停止:
mysql> SET GLOBAL slow_query_log = 0;
再開:
mysql> SET GLOBAL slow_query_log = 1;
現状:
mysql> show variables like "slow_query_%";
mysqldumpしたデータをインポートしていたらことごとくスローログに積もり積もっていって慌てて停止したという次第。オンラインでできてよかった(mysql 5.1から)。
cat /dev/twitter
で最新のツイートを取得したり、echo ねむい > /dev/twitter
でツイートしたりするのが欲しくなったので試してみてる。
ロードマップとしては次のような感じ。
2までは変なところもありつつなんとかなっているんだけど、3がつらい。もともとユーザ空間ではなくカーネル空間での話になるのでglibcなどのライブラリが使えないためOpenSSLも使えず、かといってHTTPS自体の仕様も詳しくない。幸いKernel 3.7以降でRSAが実装されているので、自力でなんとかなりそうではあるけども…。
ひとまず。
あまり使ってこなかったけど、編集リクエストあるしシンタックスハイライトも見慣れてるしでそっちのほうが便利かと思った次第。
こっちはなんか妄想とかそういうやつに使おう。
やることはおおまかに2つで、
$ chromedriver_helper install
で最新のバージョンを~/.chromedriver-helper/chromedriver
にインストールするchromedriver_helper.BinaryPath()
でインストールされているバイナリのパスを返す詳しくはREADMEを参照。
もともとchromedriver-helperというgemがあったんだけど、Windowsで動かそうとするとzipやwgetが必要だったりと手間だったのをrubyひとつで動くようにikm-chromedriver-helperとしてforkし、そもそもrubyを入れるのが手間になったのでGoで書いてみた、というような流れ。
初めてGoでまともなものを書いたのでコーディング規約とかがよくわからなかった。おおかたvim-goのおかげだと思う。
管理画面にTwitter Bootstrapを使ってボタンっぽいリンクを作っていると、
link_to t(:new), new_user_path, class: "btn btn-success"
みたいなコードがビューにあふれてきてつらい。
なので、
new_link_to User
としたら同じリンクを生成するようなヘルパを作る*1。
module LinksHelper def new_link_to(model, &block) model = model.class unless model.is_a?(Class) options = polymorphic_path(model, action: :new) html_options = { class: "btn btn-success" } link_to t(:new), options, html_options, &block end end
ポイントはpolymorphic_path
*2で、これはurl_for
みたいにモデルからルーティングのヘルパメソッドを呼び出してそれっぽいURLを作ってくれる。上の例だとnew_user_path
が呼び出される。
url_for
と違うのは、url_for
はモデルのインスタンスひとつか:action
や:controller
オプションをすべて渡すかのどちらかなのに対して*3、こちらはインスタンスと同時に:action
オプションを渡せて楽。
:action
は:new
や:edit
以外にもヘルパメソッドが定義されていれば指定できて、例えばsleep_user_path
が定義されているなら、
polymorphic_path(user, action: :sleep)
みたいに指定できる。
[小ネタ]RailsのScaffoldテンプレートを上書きするススメの勝手に追補的な記事。
コントローラのテンプレートはrailties/lib/rails/generators/rails/scaffold_controller/templates/controller.rbあたりから#{Rails.root}/lib/templates/rails/scaffold_controller/controller.rb
にコピーしてくる。
このへんのどこからどこへコピーしてくるみたいなのはこのへんに書いてある(もしかしてRails Guideに公式のものがあるのかな?)。
以上。
ちなみにsave
とかupdate
のコードはRails::Generators::ActiveModel
経由で出力しているんだけど、そこにはsave!
やupdate!
、destroy!
がない。これについては次のようなモンキーパッチを当てれば動く。config/application.rbからrequire
するとか。
if Rails.const_defined?(:Generators) module Rails module Generators class ActiveModel def destroy! "#{name}.destroy!" end def save! "#{name}.save!" end def update!(params=nil) "#{name}.update!(#{params})" end end end end end
例えばモデル的にGraph has_many Entity
だけど、GraphはActiveRecordを使う一方でEntityには素のオブジェクトを使いたい場合。データストアが異なるとか。
class Graph < ActiveRecord::Base after_save :save_entities def entities @entities ||= [] # TODO: entitiesを読み込む end def entities_attributes=(attributes) # attributes = { "0" => { "name" => "foo", "body" => "bar" }, ... } @entities = attributes.map do |i, (attrs)| Entity.new(attrs) end end private def save_entities # TODO: entitiesを保存する処理 end end class Entity include ActiveModel::Model attr_accessor :name, :body end class GraphsController < ActionController::Base def new @graph = Graph.new # 初回表示用にEntityをいくつか初期化 @graph.entities << Entity.new @graph.entities << Entity.new end def create @graph = Graph.new(graph_params) @graph.save! end private def graph_params params.require(:graph).permit( :title, entities_attributes: [:name, :body] ) end end
# new.html.slim = form_for @graph do |f| = f.text_field :title = f.fields_for :entities do |g| = g.text_field :name = g.text_area :body = f.submit
キモはentities_attributes=
が定義してあること。これがあるかどうかでfields_for
の挙動が変わる。
こんな雰囲気。端書きなので間違ってるかも。