There's an echo in my head

日々のメモ。

Mac OSXでMariaDBをソースからビルドする

Mac OSX 10.9.5 MavericksでMariaDB 10.0.13をビルドした。

wget http://archive.mariadb.org//mariadb-10.0.13/source/mariadb-10.0.13.tar.gz
tar zxf mariadb-10.0.13.tar.gz
cd mariadb -10.0.13
cmake . \
   -DCMAKE_INSTALL_PREFIX=$HOME/opt/mariadb/10.0.13 \
   -DDEFAULT_CHARSET=utf8 \
   -DDEFAULT_COLLATION=utf8_general_ci \
   -DENABLED_LOCAL_INFILE=true \
   -DWITH_INNOBASE_STORAGE_ENGINE=1 \
   -DWITH_EXTRA_CHARSETS=all \
   -DWITH_READLINE=ON \
   -DWITHOUT_TOKUDB=1
make
make install

ちなみに

  • 一度tokudbを有効にしたままビルドしようとしたらエラーが出たので無効化した
  • 10.0.16をビルドしようとしたらlibgroonga.a(mrb_id.c.o) has no symbolsというエラーが出たので諦めた

参考

mysqlのスローログの出力をオンラインで停止、再開する

停止:

mysql> SET GLOBAL slow_query_log = 0;

再開:

mysql> SET GLOBAL slow_query_log = 1;

現状:

mysql> show variables like "slow_query_%";

mysqldumpしたデータをインポートしていたらことごとくスローログに積もり積もっていって慌てて停止したという次第。オンラインでできてよかった(mysql 5.1から)。

参考

/dev/twitterでTwitterと通信するようなのを作る

cat /dev/twitterで最新のツイートを取得したり、echo ねむい > /dev/twitterでツイートしたりするのが欲しくなったので試してみてる。

ロードマップとしては次のような感じ。

  1. Linuxカーネルモジュールのキャラクタデバイスとして/dev/twitterを作る
  2. HTTPで通信する
  3. HTTPSで通信する
  4. OAuth 1.0aでTwitterと通信する

2までは変なところもありつつなんとかなっているんだけど、3がつらい。もともとユーザ空間ではなくカーネル空間での話になるのでglibcなどのライブラリが使えないためOpenSSLも使えず、かといってHTTPS自体の仕様も詳しくない。幸いKernel 3.7以降でRSAが実装されているので、自力でなんとかなりそうではあるけども…。

ひとまず。

tipsはQiitaに書こう、そうしよう

http://qiita.com/ikm

あまり使ってこなかったけど、編集リクエストあるしシンタックスハイライトも見慣れてるしでそっちのほうが便利かと思った次第。

こっちはなんか妄想とかそういうやつに使おう。

chromedriverをインストールしてくれるchromedriver_helperをGoで書いた

a2ikm/chromedriver_helper

やることはおおまかに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のおかげだと思う。

参考にした記事

polymorphic_pathを使って定型のリンクを手軽に作る

管理画面に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)

みたいに指定できる。

scaffoldするときのコントローラのテンプレートをカスタマイズする

[小ネタ]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
このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。