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

技術情報は、Qiita でも書いています。

elasticsearch-model で eager loading を行う

elasticsearch rails

elasticsearch-model v0.1.9 で確認しました。

response = Article.search.tap { |r| r.records.options[:includes] = [:comments] }
response.records.each do |article|
  article.comments  # eager loaded
end

#records の引数で指定することもできます。

Article.search.records(includes: [:comments])

Kaminari で、最大ページ数を指定する

rails ruby

Kaminari v0.17.0 で確認しました。

ページングされすぎて、サーバに負担がかかる場合などに便利です。


config/initializers/kaminari.rb

Kaminari.configure do |config|
  config.max_pages = 100
end

これで、ページネーション用のリンクなどが 100 ページまでしか表示されなくなります。


page パラメータを手動で設定された場合の対策もしておきます。

app/controllers/application.rb

class ApplicationController < ActionController::Base
  before_action :normalize_page

  private
  def normalize_page
    page = params[:page].to_i
    params[:page] = (page <= 1 || page > Kaminari.config.max_pages) ? nil : page
  end
end

新生銀行に自動ログインする Google Chrome の拡張機能を作りました

chrome

以前、新生銀行に自動ログインするユーザースクリプトというものを書いたのですが、Chrome のセキュリティレベルが上がり、動かなくなってしまいました。

そこで今回、拡張機能としてきちんと作りなおしてみました。

Shinsei Power Direct AutoFill - Chrome Web Store

拡張機能の「オプション」でログイン情報を設定することで、自動ログインが可能となります。

ログイン情報は暗号化し、ローカル環境に保存する仕組みです。

ソースコードは GitHub で公開しています。

Chrome 拡張機能の作成には、ドットインストールが大変参考になりました。ありがとうございます。

どうぞご利用ください。

「Elasticsearch: The Definitive Guide」が良い

elasticsearch 入門

検索まわりに強くなりたくて、最近は Elasticsearch の勉強をしています。

ただ、ブログの記事や日本語の書籍 (↓) は、情報が古かったり断片的な情報で、いまいち全体像をつかむことができませんでした。

高速スケーラブル検索エンジン ElasticSearch Server

高速スケーラブル検索エンジン ElasticSearch Server

  • 作者: Rafal Kuc・Marek Rogozin’ski,株式会社リクルートテクノロジーズ,大岩達也、大谷純、兼山元太、水戸祐介、守谷純之介
  • 出版社/メーカー: KADOKAWA/アスキー・メディアワークス
  • 発売日: 2014/03/21
  • メディア: 大型本
  • この商品を含むブログ (4件) を見る

そこで、公式サイトにある Elasticsearch: The Definitive Guide を読んでみたところ、わかりやすくてよかったです。

英語なのでちょっとつらいですが、Getting Started まで読むだけでも役立ちそうです。

情報が新しく、Elasticsearch 2.0 に対応しているのも良い点です。


elasticsearch-rails の入門方法

elasticsearch-rails に関しては、サンプルアプリのソースが参考になりました。

WEB+DB PRESS Vol.87 の Elasticsearch 記事も参考になります。

WEB+DB PRESS Vol.87

WEB+DB PRESS Vol.87

  • 作者: 佐藤鉄平,小林明大,石村真吾,坂上卓史,上原誠,鳥居英,佐藤歩,泉水翔吾,うさみけんた,伊藤直也,高橋侑久,佐藤太一,hayajo,橋本翔,西尾泰和,中島聡,はまちや2,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2015/06/24
  • メディア: 大型本
  • この商品を含むブログ (2件) を見る

elasticsearch:import タスクで eager loading を行う

elasticsearch rails

elasticsearch-rails には、DB のデータを Elasticsearch にインポートするelasticsearch:import という便利な rake タスクがあります。

ただ、has_many などで関連しているデータもインデックスしたい場合に

rake environment elasticsearch:import:all FORCE=y

だけだと、eager loading が行われず、インデックス速度が遅くなってしまいます。

そこで、モデルに

scope :search_import, -> { includes(:categories, :sub_categories) }

のような scope を作ってあげて、

rake environment elasticsearch:import:all SCOPE="search_import" FORCE=y

とすると、eager loading が行われ、インデックス速度を上げることができます。


また、Gemfile に

gem 'ansi'

を追加すると、タスクの実行中にプログレスバーが表示されて便利です。

iTerm2 上の Emacs で、テーマの色を適切に表示する

mac

iTerm2 で Emacs を起動し (emacs -nw)、 テーマを選択すると、適切な色が表示されないことがあります。

調べたところ、iTerm2 の開発版と、パッチを当てた Emacs を使用することで直すことができました。

以下、Homebrew を使用していて、環境変数 TERM が xterm-256color になっている前提です。

使用中の iTerm2、Emacs を削除

brew cask uninstall iterm2
brew uninstall emacs
brew uninstall tmux  # tmux を使っている場合

iTerm2 開発版のインストール

brew tap caskroom/versions
brew cask install iterm2-nightly --appdir=/Applications

パッチを当てた Emacs のインストール

brew install choppsv1/term24/emacs
brew install choppsv1/term24/tmux  # tmux を使っている場合

iTerm2 の再起動

あとは、iTerm2 を起動しなおして、

ITERM_24BIT=1 emacs

とすれば、適切な色が表示されるはずです。

いちいち ITERM_24BIT=1 と打つのは面倒なので、.zshrc などに書いておくと良いと思います。

.zshrc

export ITERM_24BIT=1

参考

できるだけ簡単に ActiveRecord で utf8mb4 を動かす

rails ruby

MySQL で絵文字を扱うのに必要な utf8mb4 の設定方法です。

新規にデータベースを構築する場合向けです。

Rails 4.2.6 で確認しています。

データベースの設定

config/database.yml

default: &default
  adapter: mysql2
  encoding: utf8mb4
  collation: utf8mb4_bin

encoding を utf8mb4 に、collation を utf8mb4_bin にします。

collation を utf8mb4_bin にすることで、「ハハ」と「パパ」などが同一のものとして扱われるのを防ぎます。

ただし、「A」と「a」などのアルファベット大文字・小文字も別のものとして扱われるようになります。

string の文字数を変更する

インデックス長の関係で、string が VARCHAR(255) ではなく VARCHAR(191) になるようにします。

config/initializers/mysql_utf8mb4_fix.rb

require 'active_record/connection_adapters/abstract_mysql_adapter'

module ActiveRecord
  module ConnectionAdapters
    class AbstractMysqlAdapter
      NATIVE_DATABASE_TYPES[:string] = { name: 'varchar', limit: 191 }
    end
  end
end

参考