ruby on railsで形態素解析(mecab)が使えるようになるバインド【natto】の設定

前回の記事でrubyからmecabを使える環境を作ったので、railsからも使えるようにする。

ちなみに前回の記事はこちら

Ubuntu Server 14.04にMeCabとMeCab-Rubyをインストール - watariseinの日記

railsアプリケーションを作成

$ rails new mecab

Gemfileに以下を追加

$ vi Gemfile

gem 'natto'

インストール

$ bundle install

rails consoleで動作を確認する

$ bundle exec rails c
irb(main):005:0> mecab = Natto::MeCab.new
=> #<Natto::MeCab:0x00556de5e021c8 @model=#<FFI::Pointer address=0x00556de6692f00>, @tagger=#<FFI::Pointer address=0x00556de605ceb0>, @lattice=#<FFI::Pointer address=0x00556de6bf0f50>, @libpath="/usr/lib/libmecab.so", @options={}, @dicts=[#<Natto::DictionaryInfo:0x00556de5e01160 @filepath="/usr/lib/mecab/dic/ipadic/sys.dic", charset=utf8, type=0>], @version=0.996>  
irb(main):007:0> puts mecab.parse("すもももももももものうち")
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
=> nil

Ochasenも使える

irb(main):020:0> mecab = Natto::MeCab.new("-Ochasen")
=> #<Natto::MeCab:0x00556de7730f78 @model=#<FFI::Pointer address=0x00556de6ba5ba0>, @tagger=#<FFI::Pointer address=0x00556de648fe80>, @lattice=#<FFI::Pointer address=0x00556de7748430>, @libpath="/usr/lib/libmecab.so", @options={:output_format_type=>"chasen"}, @dicts=[#<Natto::DictionaryInfo:0x00556de7746238 @filepath="/usr/lib/mecab/dic/ipadic/sys.dic", charset=utf8, type=0>], @version=0.996>
irb(main):021:0> text="明日は会社行かないでコーディングしていたいな"
=> "明日は会社行かないでコーディングしていたいな"
irb(main):022:0> mecab.parse(text) do |n|
irb(main):023:1* puts "#{n.surface}\t#{n.feature}"
irb(main):024:1> end
明日    明日    アシタ  明日    名詞-副詞可能
は      は      ハ      は      助詞-係助詞
会社    会社    カイシャ        会社    名詞-一般
行か    行か    イカ    行く    動詞-自立       五段・カ行促音便        未然形
ない    ない    ナイ    ない    助動詞  特殊・ナイ      連用デ接続
で      で      デ      で      助詞-接続助詞
コーディング    コーディング    コーディング    コーディング    名詞-一般
し      し      シ      する    動詞-自立       サ変・スル      連用形
て      て      テ      て      助詞-接続助詞
い      い      イ      いる    動詞-非自立     一段    連用形
たい    たい    タイ    たい    助動詞  特殊・タイ      基本形
な      な      ナ      な      助詞-終助詞
        EOS
=> nil

これでrailsからmecabを使うことができるようになった。

ちなみに、ユーザー辞書や辞書ディレクトリを指定する場合は以下のようにする

mecab = Natto::MeCab.new(dicdir: "/usr/lib/mecab/dic/ipadic/", userdic: "/mecab/dic/custom.dic")

参考

MacでRubyを使ってMeCabを利用する準備 - 別館 子子子子子子(ねこのここねこ)

Ubuntu Server 14.04にMeCabとMeCab-Rubyをインストール

mecab自体はapt-get出来る状態だったので、それを利用します。

$ sudo apt-get install mecab
$ sudo apt-get install libmecab-dev
$ sudo apt-get install mecab-ipadic-utf8  

ipaの辞書ファイルを落としてきます

$ wget http://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
$ tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801/

carsetにutf-8を指定してmake

$ sudo ./configure --with-charset=utf8
$ make
$ sudo make install

標準では別の辞書ファイルがインストールされるため、設定を編集してipadicに変更します。

$ sudo vim /etc/mecabrc
- dicdir = /var/lib/mecab/dic/debian
+ dicdir = /usr/lib/mecab/dic/ipadic

mecab-rubyのインストール

mecab-rubyは利用するmecabのバージョンと一致させる必要がある。

mecabのバージョン確認

$ mecab --version
mecab of 0.996

0.996のmecab-rubyをダウンロードしてインストール

$ wget http://mecab.googlecode.com/files/mecab-ruby-0.996.tar.gz
$ tar vxf mecab-ruby-0.996.tar.gz
$ cd mecab-ruby-0.996/
$ gem build mecab-ruby.gemspec
$ gem install mecab-ruby-0.99.gem
$ gem list | grep mecab
mecab-ruby

下記コマンドを実行して形態素解析ができればOK

$ ruby test.rb
この    連体詞,*,*,*,*,*,この,コノ,コノ
本      名詞,一般,*,*,*,*,本,ホン,ホン
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二      名詞,数,*,*,*,*,二,ニ,ニ
郎      名詞,一般,*,*,*,*,郎,ロウ,ロー
を      助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見      動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性    名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し    動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た      助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。      記号,句点,*,*,*,*,。,。,。
EOS

ちなみに、はてなブログwikipediaの辞書を追加するニーズが多いようなので、以下にまとめました。

watarisein.hatenablog.com

CentOS7.1にFluentd+ElasticSearch+Kibana4をインストールする

まずは準備

ここからasticsearch, kibana, logstashをダウンロード、現時点の最新版を取りましょう

# wget https://download.elasticsearch.org/elasticsearch/release/org/elasticsearch/distribution/rpm/elasticsearch/2.1.1/elasticsearch-2.1.1.rpm
# wget https://download.elastic.co/kibana/kibana/kibana-4.3.1-linux-x64.tar.gz
# wget https://download.elastic.co/logstash/logstash/packages/centos/logstash-2.1.1-1.noarch.rpm

Java SE Runtime Environment 8 の 最新RPMパッケージをダウンロードして、インストール

https://java.com/ja/download/manual.jsp

※今回は、jre-8u71-linux-x64.rpm をインストール

# rpm -ivh jre-8u71-linux-x64.rpm

elasticsearchのインストール

# rpm -ivh elasticsearch-2.1.1.rpm
# sudo systemctl daemon-reload
# sudo systemctl enable elasticsearch.service

設定ファイルの末尾に以下を追加。kibana連携に必要

# enable cross-origin resource sharing
http.cors.enabled: true

起動 # sudo systemctl start elasticsearch.service

logstashのインストール

# rpm -ivh logstash-2.1.1-1.noarch.rpm

kibanaのインストール

# tar vxf kibana-4.3.1-linux-x64.tar.gz
# mv kibana-4.3.1-linux-x64 /opt/kibana

kibanaの起動スクリプトを拝借

    # vi /etc/rc.d/init.d/kibana

#!/bin/sh
### BEGIN INIT INFO
# Provides:          kibana
# Required-Start:    $local_fs $remote_fs $network
# Should-Start:      $time
# Required-Stop:     $local_fs $remote_fs $network
# Default-Start:     3 5
# Default-Stop:      0 1 2 6
# Short-Description: Kibana 4
# Description:       Service controller for Kibana 4
### END INIT INFO

INSTALLED_DIR=/opt/kibana
EXEC_SCRIPT="$INSTALLED_DIR/bin/kibana"
LOG_DIR=/var/log/kibana
PID_DIR=/var/run
PID_FILE="$PID_DIR"/kibana.pid
LOG_FILE="$LOG_DIR"/kibana.log

test -d $LOG_DIR || mkdir $LOG_DIR

# Source function library.
. /etc/init.d/functions

RETVAL=0

case "$1" in
    start)
        if [ ! -f "$PID_FILE" ]; then
          echo -n "Starting Kibana"
          nohup $EXEC_SCRIPT 0<&- &> $LOG_FILE &
          echo $! > $PID_FILE
          success
        else
          echo -n "Kibana is already running"
          RETVAL=1
          failure
        fi
        echo
        ;;
    stop)
        if [ -f "$PID_FILE" ]; then
          echo -n "Stopping Kibana"
          test -f $PID_FILE && cat $PID_FILE | xargs kill -s SIGKILL && rm -f $PID_FILE
          success
        else
          echo -n "Kibana is not running"
          RETVAL=1
          failure
        fi
        echo
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    reload)
        $0 restart
        ;;
    status)
        status kibana
        RETVAL=$?
        ;;
*)
echo "Usage: $0 {start|stop|status|restart|reload}"
exit 1
;;
esac
exit $RETVAL

起動スクリプトの実行権限を追加

# chmod 755 /etc/rc.d/init.d/kibana

サービス起動

# systemctl start kibana

アクセス

ブラウザから http://[IP address]:5601/kibanaにアクセスすると、kibanaの設定画面が表示されます。 (firewallの設定は適宜...)

Fluentd (td-agent 2.3.0) インストール

最新版をインストール

# curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

サービス起動

# systemctl start td-agent
# systemctl enable td-agent

あとは、後でElasticsearchにデータを転送できるようにするために、連携用のfluent-plugin-elasticsearchプラグインをインストールしておく。 プラグインはfluent-gemコマンドでインストールできる。

# /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch

Fetching: elasticsearch-api-1.0.15.gem (100%)
Successfully installed elasticsearch-api-1.0.15
Fetching: multipart-post-2.0.0.gem (100%)
Successfully installed multipart-post-2.0.0
Fetching: faraday-0.9.2.gem (100%)
Successfully installed faraday-0.9.2
Fetching: elasticsearch-transport-1.0.15.gem (100%)
Successfully installed elasticsearch-transport-1.0.15
Fetching: elasticsearch-1.0.15.gem (100%)
Successfully installed elasticsearch-1.0.15
Fetching: excon-0.45.4.gem (100%)
Successfully installed excon-0.45.4
Fetching: fluent-plugin-elasticsearch-1.3.0.gem (100%)
Successfully installed fluent-plugin-elasticsearch-1.3.0
Parsing documentation for elasticsearch-1.0.15
Installing ri documentation for elasticsearch-1.0.15
Parsing documentation for elasticsearch-api-1.0.15
Installing ri documentation for elasticsearch-api-1.0.15
Parsing documentation for elasticsearch-transport-1.0.15
Installing ri documentation for elasticsearch-transport-1.0.15
Parsing documentation for excon-0.45.4
Installing ri documentation for excon-0.45.4
Parsing documentation for faraday-0.9.2
Installing ri documentation for faraday-0.9.2
Parsing documentation for fluent-plugin-elasticsearch-1.3.0
Installing ri documentation for fluent-plugin-elasticsearch-1.3.0
invalid options: -SHN
(invalid options are ignored)
Parsing documentation for multipart-post-2.0.0
Installing ri documentation for multipart-post-2.0.0
Done installing documentation for elasticsearch, elasticsearch-api, elasticsearch-transport, excon, faraday, fluent-plugin-elasticsearch, multipart-post after 6 seconds
7 gems installed

試しにfluentにメッセージを飛ばしてログを見る

# curl -X POST -d 'json={"json":"message"}' http://localhost:8888/debug.test

以下のようなログが出力される。

# cat /var/log/td-agent/td-agent.log

2016-01-28 21:08:17 +0900 debug.test: {"json":"message"}

以上で構築は完了です、次は実際にログの収集、解析をして見たいと思います。

【tmuxの設定】ローカルのファイルを端末にドラッグアンドドロップでリモートにコピー

既にそこかしこで設定が晒されているので、今回は他であまり見なかった設定について説明します。

末尾のローカルのファイルをリモートに貼り付ける設定が便利です。 設定は以下です。

#ローカルのファイルをリモートに張り付ける
bind-key i   command-prompt -p "(load-and-paste) file?" "load-buffer %%" \; paste-buffer
bind-key I   command-prompt -p "(load-buffer) file?" "load-buffer %%"

ファイルを端末にドラッグアンドドロップすると、内容を貼り付けることができます。 いちいちコピーしたいファイルを開いてコピペしていた手間が無くなり便利です。

参考までに全体の設定

$ cat ~/.tmux.conf

# prefixキーをC-aに変更する
set -g prefix C-t
#
# # C-bのキーバインドを解除する
unbind C-b
# キーストロークのディレイを減らす
set -sg escape-time 1
#
# # ウィンドウのインデックスを1から始める
set -g base-index 1
#
# # ペインのインデックスを1から始める
setw -g pane-base-index 1
#
# # 設定ファイルをリロードする
bind r source-file ~/.tmux.conf \; display "Reloaded!"
#
# # 256色端末を使用する
set -g default-terminal "screen-256color"
#
# # ステータスバーの色を設定する
set -g status-fg white
set -g status-bg black
#
# # ウィンドウリストの色を設定する
setw -g window-status-fg cyan
setw -g window-status-bg default
set -g pane-border-bg black
# # アクティブなペインを目立たせる
set -g pane-active-border-fg white
set -g pane-active-border-bg yellow
#
# # コマンドラインの色を設定する
set -g message-fg white
set -g message-bg black
set -g message-attr bright
#
# # ステータスバーを設定する
# ## 右パネルを設定する
set -g status-right "#[fg=cyan][%Y-%m-%d(%a) %H:%M]"
# ## ステータスバーのUTF-8サポートを有効にする
set -g status-utf8 on
# ## リフレッシュの間隔を設定する(デフォルト 15秒)
set -g status-interval 60
# ## ヴィジュアルノーティフィケーションを有効にする
setw -g monitor-activity on
set -g visual-activity on
#
# # コピーモードを設定する
# ## viのキーバインドを使用する
setw -g mode-keys vi
# ## コピーモードの操作をvi風に設定する
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"

#ローカルのファイルをリモートに張り付ける
bind-key i   command-prompt -p "(load-and-paste) file?" "load-buffer %%" \; paste-buffer
bind-key I   command-prompt -p "(load-buffer) file?" "load-buffer %%"

【Ruby On Rails】infinit scrollとkaminariによる無限スクロールの実装

javascriptプラグインinfinitscroll.jsとrailsのページネーションプラグイン"kaminari"を使って、いわゆる無限スクロールページを実装します。

環境

$ ruby -v ruby 2.1.5p273 (2014-11-13 revision 48405) [x86_64-linux] $ rails -v Rails 4.1.8

デモ

作成したデモ。ページの最下部にスクロールすると、新たに部分テンプレートのページが読み込まれるようになっている。

デモ

概要

  1. Gemに必要なプラグインを追加
  2. Pictureモデルを作成
  3. Pictureを複数表示する部分テンプレートを作成
  4. 部分テンプレートごとにページネーションを実装
  5. 無限スクロールを実装

手順

Gemに必要なプラグインを追加

以下のGemを追加

# vi Gemfile
gem 'kaminari'
gem 'jquery-turbolinks'

Pictureモデルを作成

例えば以下のようにPictureモデルを作成する

$ rails generate scaffold Picture title:string img:string
$ rake db:migrate

Pictureを複数表示するよう部分テンプレートを作成

パーシャルを表示する大元のページを作成

# vi app/views/pictures/search.html.erb

<div id="pictures">
  <div class="page">
    <%= render 'search_result' %>
  </div>
</div>

<%= javascript_include_tag 'jquery.infinitescroll' %>

写真を表示するテンプレートとしてパーシャルを作成

# vi app/views/pictures/_search_result.html.erb

<div class="pictures">
      <% @pictures.each do |p| %>
          <img src="p.img" alt="photos">
      <% end %>
</div>

部分テンプレートごとにページネーションを実装

コントローラーを以下のように編集

# vi app/controllers/pictures_controller.rb

def search
  @pictures = Picture.order(:created_at).page(params[:page]).per(30)
end

per(30)で、1ページあたり30件表示させている。(デフォルトは25?)

先ほど作成した部分テンプレートに以下を追記

# vi app/views/pictures/_search_result.html.erb

<%= paginate @pictures %>

試しに/pictures/searchにアクセスすると以下のようにページ番号が表示されている

f:id:watarisein:20160102012502p:plain

無限スクロールを実装

まずは、JavaScriptリクエストのために、部分テンプレートをappendするビューを記載する

# vi app/views/pictures/search.js.erb

$("#pictures").append("<div class='page'><%= escape_javascript(render('search_result', :locals => { :tags => @picture.tag_list })) %></div>");

infinitscroll.jsを読み込んで無限スクロール用の設定 先ほど作成したsearchのビューファイルに以下を追加

# vi app/views/pictures/search.html.erb

<%= javascript_include_tag 'jquery.infinitescroll' %>
<script>
$("#pictures .page").infinitescroll({
    loading: {
      img:     "http://www.mytreedb.com/uploads/mytreedb/loader/ajax_loader_blue_48.gif",
      msgText: "loading..."
    },
    navSelector: "nav.pagination",
    nextSelector: "nav.pagination a[rel=next]",
    itemSelector: "#pictures div.pictures" /* このDOMに差し掛かった時に、次のページのロードが始まる*/
});
</script>

これで無限スクロールが完成

参考

How To: Create Infinite Scrolling with jQuery · kaminari/kaminari Wiki · GitHub

Infinite Scroll | jQuery plugin, Wordpress plugin, interaction design pattern

【レビュー】マイクロソフトのエルゴノミクスキーボードがいい感じ Sculpt Ergonomic Desctop(L5V-00022)

マイクロソフトが出している、スカルプト エルゴノミック デスクトップを人目見て衝動買いしてしまったのでレビュー。
 
 
まずは外箱。比較のため500円玉を置いていますが、結構大きいです。
 

f:id:watarisein:20160101194232j:image
 
中身の一覧。キーボード、キーボードの支え、マウス、テンキーに説明書が同梱されています。
 
f:id:watarisein:20160101194947j:image
 
 
キーボードの支えは、こんな感じで磁石でくっつきます。
 
f:id:watarisein:20160101195127j:image
 
くっつけると、手前から奥に向かって緩やかに下る格好になります。

f:id:watarisein:20160101195633j:image
 
マウスはまるっとしていて、とても持ちやすいです。光沢があるので、指紋が目立つかもしれないです。

f:id:watarisein:20160101195826j:image
 
裏面。スイッチは、カチッとスライドしてオンオフを切り替えるようです。

f:id:watarisein:20160101200322j:image
 
自分的にはあまり使わない気がしますが、テンキーです。フィルムもついています。

f:id:watarisein:20160101200435j:image
 
 
電源ですが、すべて電池です。蓋は磁石でついているので、交換は割りと手軽にできそうです。
 
キーボードの電池。単4が2本です。

f:id:watarisein:20160101200632j:image
 
マウスの電池。ちなみに、ここにレシーバーがついています。こちらは単3が2本。
 
f:id:watarisein:20160101200831j:image
 
 
試しに、14型のノートPCに接続してみました。特に自分でドライバをインストールすることなく、レシーバ(USB)を差すだけで使えました。
 

f:id:watarisein:20160101202318j:image
 
感じんの使用感ですが、長時間使っていても疲れにくいです。人体工学に基づいているというだけあります。
 
通常のキーボードですと、端のキーなどを押す場合など、手首を曲げる動作があると思います。私はそのせいで腱鞘炎に…
 
しかし、本キーボードではキー配列が指の長さに沿って扇状に配置されているため手首を動かさずにキーを打てます。

f:id:watarisein:20160101202902j:image
 
手前のクッションもいい感じに手首を支えてくれます。
 
 
マウスには戻るボタンがついていますが、進むボタンがないのが残念です。写真では見にくいかもしれませんが、windowsボタンの左側にあるのが、戻るボタンです。

f:id:watarisein:20160101203244j:image
 
windowsボタンを押すとスタートメニューが開くのは地味に便利です。
 
 
一番気にしていたこの形状ですが、使ってみると以外とすんなり慣れてしまいました。
 
マウスも手にしっくりきて、使いやすいです。
 
総合的にはお値段通りの満足度といった感じです。
 
ギークな見た目が好きなかたは是非