There's an echo in my head

日々のメモ。

El CapitanでSIMBLを有効にする

How to Install SafariStand on El Capitanから勝手に抜粋。

1 Macを再起動し、「ジャーン!」となったらCommand+Rをあるていど押し続けてリカバリモードで起動する

  • 一度押しただけでは切り替わらなかった
  • タイミングの判定がわりと細かい

2 メニューからTerminal.appを起動する

3 次のようにコマンドを叩いてSIPを無効にする

bash3.2# csrutil disable

4 再起動する(rebootでも、メニューからのRestartでもOK)

5 SIMBLのサイトからSIMBL-0.9.9.zipを落としてきて解凍する

6 Terminal.app等で次のようにコマンドを叩いてSIMBLを手動でインストールする

$ cd /path/to/SIMBL-0.9.9 # zipを解凍してできたディレクトリに移動する
$ sudo installer -verbose -pkg SIMBL-0.9.9.pkg -target /
$ sudo rm -rf /System/Library/ScriptingAdditions/SIMBL.osax
$ sudo mv /Library/ScriptingAdditions/SIMBL.osax /System/Library/ScriptingAdditions/
$ sudo cp -p /System/Library/ScriptingAdditions/SIMBL.osax/Contents/Resources/SIMBL\ Agent.app/Contents/Resources/net.culater.SIMBL.Agent.plist /System/Library/LaunchAgents/
$ sudo sed -e "s/Library/System\/Library/" -i "" /System/Library/LaunchAgents/net.culater.SIMBL.Agent.plist

7 リカバリモードで再起動する(先ほどと同じように「ジャーン!」でCommand+R)

8 Terminal.appから次のように叩いてSIPを有効にする

bash3.2# csrutil enable

9 これでSIMBLが有効になったので、あとはこれまでどおり/Library/Application\ Support/SIMBL/Pluginsプラグインをインストールする

手動でRailsのビューをレンダリングする

バッチで生成しておきたいとかそういうときに。

class FooController < AbstractController::Base
  include AbstractController::Rendering
  include AbstractController::Translation
  include AbstractController::AssetPaths
  include ActionView::Layouts

  self.view_paths = "app/views"

  def index
    render template: "foo/index.html.slim"
  end
end

puts FooController.new.index
# => レンダリングされた文字列

もうちょっとActionView側を触るのかと思いきや、パッと調べた感じだとAbstractControllerを用意するやり方が出てきて、なんか無駄な感じもするけど手軽だしまあいいか。

もしかしたらヘルパーメソッドを使うときにはこれ以外にもincludeする必要があるかもしれない。 そのときはaction_controller/base.rbを見てみるといいかも。

参考

Railsのジェネレータを自作する

よく忘れるので。細かい話は他の記事にお任せして、テンプレートからファイルを作れるところまで。

0. こんなのを作りたいとかんがえる

  • 抽象クラスFigureのサブクラスをapp/modelsに作るようなジェネレータがほしい。
  • クラス名は引数で指定したい

こんな感じで使うイメージ:

$ rails g figure triangle --color blue

1. ジェネレータをジェネレートする

 $ rails g generator figure

これでlib/generators/figure以下に

  • USAGE : 使い方を記述するテキストファイ
  • figure_generator.rb : 生成処理を実装するファイル
  • templates/ : テンプレートファイルを置くディレクトリ

が作られる。

2. 作り方を記述する

USAGEファイルに0.のようなことを記述する。

3. 生成処理を記述する

lib/generators/figure/figure_generator.rb に次のように記述する。

class FigureGenerator < Rails::Generators::NamedBase                                               
  source_root File.expand_path('../templates', __FILE__)

  # 引数として受け取る順番に記述する
  # ここで宣言した引数名はそのままその値を返すメソッドとしても使える
  # 追記: NamedBaseの場合はデフォルトでnameが宣言されているのでここではなにもしない
  # argument :name, type: :string, desc: "クラス名。underscoreな形でもOK"

  # オプションを記述する
  # ここで宣言したオプションは`options[:color]`のように参照できる
  class_option :color, type: :string, aliases: "-c", desc: ""

  # 以下に宣言されたpublicなメソッドが上から順に実行される

  def create_model_file
    # テンプレートをもとにapp/modelsにファイルを作る
    template "model.rb.erb", "app/models/#{name.underscore}.rb"
  end

  private

  # このクラス上のメソッドはテンプレートからも呼び出せるので
  # 積極的にprivateメソッドで宣言していきたい
  def class_name
    name.classify
  end
end

4. テンプレートファイルを記述する

figure_generator.rb でtemplateメソッドの引数に渡した model.rb.erb にテンプレートを記述する。ファイル名のとおりERBを使う。 *1

class <%= class_name %> < Figure
  def apexes_count
     # 頂点の数を返す
  end
  def color
    "<%= options[:color] %>"
end

5. 使ってみる

$ rails g figure triangle --color yellow

9/17 追記

class_optionによるオプションの宣言方法を追記した。 ちなみにargumentclass_optionThor::Base::ClassMethodsで定義されているもの。

10/3 追記

NamedBaseの場合はすでにnameargumentで宣言されており別途宣言する必要がないので、ここではコメントアウトした。

*1:もしかしたらファイル名を適切に設定すればERB以外も使えるかもしれない

Capistranoで今処理しようとしているhostの属するroleを判定する

host.rolesを叩くと、role(のSymbol)のSetが返ってくる。

task :foo do
  on release_roles :all do |host|
    host.roles #=> #<Set: {:web, :app, :db}> 
  end
end

git_strategyの中でもcontextを通して同じことができる。

set :git_strategy, MyGitStrategy

module MyGitStrategy
  def release
    context.host.roles #=> #<Set: {:web, :app, :db}> 
  end
end

一定時間だけS3のオブジェクトにアクセスできるURLを生成する

プライベートなバケットなんだけど、特定のURLを知ってる人だけがダウンロードするのを許可したいというときに使うやつ。

aws-sdk-rubyのv1だとAWS::S3Object#url_forで生成できたらしいんだけど、v2ではやり方が変わってるとのことなので試しにv2でやってみた。というかこれのコピペ。

# Gemfile
gem "aws-sdk", "~> 2"

# irbとか
require "aws-sdk"

s3 = Aws::S3::Client.new
signer = Aws::S3::Presigner.new(client: s3)
url = signer.presigned_url(:get_object, bucket: "my-private-bucket", key: "path/to/file.txt")

デフォルトだと15分。presigned_url:expires_inオプションで制限時間を秒数単位で指定できる。なおアクセス回数には制限がなくて、時間内であれば異なるブラウザ等から複数回アクセスできる。

詳しくは公式のドキュメントに記載されている。

で、試しにs3_signed_urlという、S3オブジェクトに対してGETできるURLを発行するコマンドを作ってgemにした。*1

例えばexamplebucketバケットのtest.txtに対してURLを発行するには次のようにする。

$ s3_signed_url s3://examplebucket/test.txt --expire 60
https://s3.amazonaws.com/examplebucket/test.txt?...

--expireオプションでURLが有効な秒数を指定できる。デフォルトだとSDKにもとづいて15分。

新しくファイルをアップロードしたい場合にも対応していて、--uploadオプションでパスを指定する。

$ s3_signed_url s3://examplebucket/test.txt --upload /path/to/test.txt
https://s3.amazonaws.com/examplebucket/test.txt?...

そんな感じ。

こういうコマンド系はaws-sdk-goを使って1ファイルにまとめたほうが便利なんだろうけど、ひとまず習作として。

*1:リネームした関係で2回yankした…。

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というエラーが出たので諦めた

参考

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。