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

spring of life

技術、ときどき日常のブログ(予定)

kaminari のテンプレートでローカル変数を使う

今日はもう1つ書くよ!

kaminari を使って、テンプレートの中で

<%= paginate @objects %>

みたいにページングする時、第2引数にハッシュを指定して値を_paginator.html.erbに渡せるっぽい

例えば、

# hoge.html.erb
...
<%= paginate @objects, {:hoge => 'fuga'} %>
...

で、

# _paginator.html.erb
<%= paginator.render do -%>
  ...
  <%= hoge %>
  ...
<% end %>

みたいな感じで使える。

あと、ついでにだけど、上の話でいうところの@objectsの中にはいろいろ情報が入ってるらしい。詳しくは↓で

qiita.com

ブロックの上下中央寄せ

少し前から bootstrap を使ってるけど、ブロックの上下中央寄せって用意されてない気がしていろいろ調べてみた。
やっぱり自分で作らないといけないっぽい?みたいで↓のような感じでできた

<div class="row row-center">
  <div> ... </div>
  <div> ... </div>
</div>
.row-center {
    display: flex;
    align-items: center;
}
  • flexrowは bootstrap に用意されてるもの

参考:
stackoverflow.com

plantuml のいろいろ調査メモ

sphinx + plantuml で UML 作ったりしてて、いろいろ使い方とかを調べたのでちょっとまとめとこう

UML を別ファイルに記述

  • .. uml::の下に UML を書いてると1ファイルが長くなっちゃう時がある
  • .. uml:: umls/hoge.umlとファイル名を指定すると、 hoge.uml に plantuml で書いた UML を挿入できる
  • ファイルのパスは相対パスでOK

plantuml-mode

  • ファイルを分けたのは便利だけど、UMLemacs で編集しようとするとインデントやハイライトとかの設定がなくて書きづらい。。。
  • plantuml-mode っていうパッケージを入れるとそこらへんを上手くやってくれる

インストール手順

※ 事前にパッケージをインストールできるようにしてあること

  • emacs のバージョンアップ(M-x package-install が使えるくらいまで)
  • もしかしたらadd-to-listでパッケージを追加しないといけないかもしれない
  • (大丈夫だと思うけど)plantuml.jar をダウンロードして使えるようにしておくこと
  1. emacs 上でM-x package-install [ret] plantuml-mode [ret]を実行してインストール
  2. ↑を実行しただけだと plantuml.jar がないと言われて使えない場合があるのでパスを設定
    • デフォルトだと~/plantuml.jarとなっている(plantuml-mode.el を開いて plantuml.jar で検索したら見つかるはず)
  3. ↓を追記すると .uml ファイルが自動で plantuml-mode になる
    • 拡張子が違う場合は適宜\\.uml$の部分を変える
(add-to-list 'auto-mode-alist '("\\.uml$" . plantuml-mode))
(require 'plantuml-mode)

conf.py での plantuml.jar の場所の指定

  • ここは絶対パスで書いたほうがいいみたい
  • でも sphinx をビルドするサーバーを変えるとパスが変わるかもしれないので、あまり書きたくない
  • そういう時はosモジュール(?)を使うと便利
import os
...
# os.path.abspath で絶対パスを取得
plantuml = ['java', '-jar', os.path.abspath('lib/plantuml.jar')]

Selenium-WebDriver のインストール

前にこんな Capybara-Webkit のインストール方法の記事を書いたんだけど
leonis.hatenablog.com
Selenium-WebDriver も使ってみることにした。

最近は 3.x にアップデートされてるみたいだけど、CentOS 6 だと無理っぽかった。
Firefox を使ったんだけど、Selenium::WebDriver.for :firefoxの所でエラーが出る
WebDriver と Firefox のバージョンが合わないのかなぁといろいろ試したけどどれもダメだった

で、 3.x は諦めて↓の組み合わせだとうまくいった

Capybara-Webkit とだいたい環境構築は同じだけど、一応メモ

環境構築

1. Xvfb のインストール

  • 仮想ディスプレイで実行する場合は必要なのでインストール
  • インストール方法
  # yum groupupdate "X Window System"
  # yum install xorg-x11-server-Xvfb

2. Headless のインストール

  • これは Gemfile とかに書いてbundle install

3. Selenium-WebDriver のインストール

  • これも Gemfile とかに書いてbundle install

4. machine-id の生成

  • これが Capybara-Webkit のインストールの時にやらなかったことで、machine-id がないと怒られる
  • コマンドを実行すればOK
# dbus-uuidgen > /var/lib/dbus/machine-id
使い方
  • Headless を起動
Headless.new.start
driver = Selenium::WebDriver.for :firefox
  • あとはこのdriverを使っていろいろ操作すればOK
  • 操作方法とかはここにいろいろ書いてあるからそれを見ながら実装かな

before(:all) 内でスタブ作成

RSpec でスタブを作ろうとしたら before(:each)の中でしか作れなくて、before(:all)の中で作れないのかな〜といろいろ調べてたらこういうのがあるらしい

relishapp.com

例えばこんな感じ

before(:all) do
  RSpec::Mocks.with_temporary_scope do
    allow(HogeClass).to receive(:fuga).and_return('piyo')
    @actual = HogeClass.fuga #=> 'piyo'
  end
end

it { expect(@actual).to eq 'piyo' }

ちなみに、and_returnに値を複数入れると

allow(HogeClass).to receive(:fuga).and_return('piyo1', 'piyo2')
HogeClass.fuga #=> 'piyo1'
HogeClass.fuga #=> 'piyo2'

て感じで戻り値を変えられる

認証機能を作った時のあれこれ

クライアントアプリの認証機能を作ったんだけど、その時に調べたことをまとめる!

アプリが認証とは、だけど、

  1. サーバ側のアプリにあらかじめIDとキーを発行してもらう
  2. 発行してもらったIDとキーをAuthorizationヘッダに付けてリクエストを送る

ぐらいの簡単なものを作った

SecureRandom
id = SecureRandom.hex(8)
...
key = SecureRandom.hex(16)
Rake タスク
  • アプリのIDとキーをRakeタスクで簡単に発行できるようにした
  • lib/tasksの下に.rakeと最後に付けてファイルを作っておけば自動的に読み込まれるらしい
  • 後で調べて気づいたんだけど、 rails g task xxxでファイルが生成されるらしい
# lib/tasks/client.rake

namespace :client do
  desc 'Create application'
  task :create => :environment do
    id = Client.generate_application_id
    key = Client.generate_application_key
    begin
      Client.create!(:application_id => id, :application_key => key)
      puts "Application id: #{id}"
      puts "Application key: #{key}"
    rescue StandardError => e
      p e
    end
  end
end
  • app/modelsの下で定義したクラスを使うには:environmentを付けないとエラーになる
$ bundle exec rake client:create
rake aborted!
NameError: uninitialized constant Client
...
  • :environmentが何しているかはこちら
    • :createの前に:environmentタスクを実行してロードする感じだね
Rake タスク(引数付き)
  • この後、引数でIDを指定して削除するタスクも作ってみた
desc 'Destroy application'
task :destroy, [:application_id] => :environment do |task, args|
  begin
    Client.find_by(:application_id => args.application_id).destroy
    puts "Destroy #{args.application_id}"
  rescue StandardError => e
    p e
  end
end
  • 引数を指定する場合のコマンド
$ bundle exec rake client:destroy[hoge]
  • だけど、これだと[, ]が原因でエラーが出るので、タスクをクォーテーションで囲むかエスケープする
$ bundle exec rake 'client:destroy[hoge]'

or

$ bundle exec rake client:destroy\[hoge\]

ちょっと気持ち悪いな。。。環境変数で指定する方法とかあるみたいだけど、どれがいいんだろうか(´・_・`)

twitter-bootstrap-rails を使ってみた

しばらく書いてなかったから更新しとこ。。

ビューがあんまりイケてなかったので twitter-bootstrapの力を借りてみた

Rails なので、js をダウンロードしてそのまま使う方法じゃなくて、gem を使ってみた

詳しくはこのあたりかな〜

あとは好きなように html を作っていくだけだけかな

ただ、強制的に適用されるから困る場合が出てきて、

例えば、<hr>とかは勝手に上下に margin が適用されて間隔が空きすぎちゃうことがあったりする

そういう時はrails g bootstrap:installでインストールした時に作成されてるapp/assets/stylesheets/bootstrap_and_overrides.css.lessに新たに<hr>のスタイルを書いて上書きする



おまけ:emacs の less モードのインストール

emacs 上で

M-x package-install [ret]
less-css-mode [ret]

インデントはcss-mode の設定を変えればオッケー

(add-hook 'css-mode-hook
              (lambda ()
                (setq css-indent-offset 2)
              ))