2014年9月27日土曜日

rubyからMecabを使う

ruby-mecabのインストール

別途、Mecabのインストールが必要 参考:  Mecab公式
wget https://mecab.googlecode.com/files/mecab-ruby-0.996.tar.gz
tar zxf mecab-ruby-0.996.tar.gz 
cd mecab-ruby-0.996

ruby extconf.rb
su
make;make install

使ってみる。

require 'MeCab'
require 'csv'

class Parser
  @targger
  def parse(str)
    node=@targger.parseToNode(str)

    while node do
   #助動詞とかの情報はCSV形式だよ。
   #必要なのは1行目のみ
     feature=CSV.parse(node.feature)[0]
      puts node.surface+' '+feature[0].to_s
      node=node.next
    end
  end

  def initialize
    @targger=MeCab::Tagger.new()
  end

end

obj=Parser.new
obj.parse('今宵は月が綺麗ですね')

実行結果

[sato@localhost konbu]$ ruby parser.rb 
 BOS/EOS
今宵 名詞
は 助詞
月 名詞
が 助詞
綺麗 名詞
です 助動詞
ね 助詞
 BOS/EOS

これは便利!

2014年9月23日火曜日

RubyMineの最重要ショートカット

rubyやRoR用IDEのRubyMineの重要ショートカット
これぐらい知っておけば十分
  • command+/
  • コメントアウトを付加/削除
  • control+space
  • 入力補完
  • command+J
  • Live Templates呼びだし
  • F4
  • 選択したクラスやメソッド等にジャンプbr>
  • command+shift+.
  • <%= %>を挿入
  • option+enter
  • Quick Fix呼びだし
  • Ctrl+Alt+U
  • Model dependency diagrambr
  • Alt+enter
  • 正規表現の簡易チェック

rubyプロジェクトのフォルダ構成のベストプラクティス(?)

rubyのプロジェクトのフォルダ構成はこんな形がよいみたい
つーかgemはみんなこんな感じ

crawler/
  lib/
   crawler.rb #動作用モジュールCrawler
   crawler/
    database.rb #必要なクラス
    webpage.rb
    database_connection.yml #DBの接続情報
  bin/
   exec_crawler.rb #動作させるときに実際実行されるファイル


上記の例だと、exec_crawler.rbを実際に叩いて使う
exec_crawler.rbはcrawler.rbにあるメソッドを使う。
exec_crawler.rbが行うのはコマンドライン引数の解釈など
lib/をインクルードするとAPI的に使える。

exec_crawler.rbではこんな感じでロードパスにlib/を追加してreuireする
$LOAD_PATH[0,0] = File.join(File.dirname(__FILE__), '..', 'lib')
require 'crawler'
include Cralwer
この場合、カレントディレクトリがbin/の状態で実行するのでlib/内でのファイルの読み込みはこんな感じ
YAML::load_file(File.join(__dir__, 'database_connection.yml'))

2014年9月21日日曜日

rubyからPostgreSQLへのアクセス その1

pgというgemでPostgreSQLへrubyからアクセスできます。
rubyには史上最強のO/R mapperであるActiveRecordが存在するため、PostgreSQLとのインターフェイスとしてはそちらを先に想定すべきです。
しかし、ちょっとSQLを投げたいだけの場合にはむしろこちらのほうが便利です。


基本:行数を表示するだけ


$LOAD_PATH << "."
require 'pg'

#接続する
db = PG::connect("127.0.0.1",5432 ,"","","mydb","sato","password")

#クエリの定義
sql="select count(*) from tbl";

#クエリの実行
result=@db.exec(sql)

#行数の表示
p result[0]["count"].to_i

注意していただきたいのはSELETしてきた結果の取り出しです。
pgでは結果はレコードを表すハッシュの配列として帰ってきます。
id,name.ageというテーブルがある場合、結果として帰ってくるのは次のような配列です。
result[0]['id']=>1
result[0]['name']=>sato
result[0]['age']=>26


result[1]には次の結果の行が入っています。
select max(id),max(age) のようなクエリを使った場合結果として帰ってくる行の名前が
同名であるため、maxというキーが2つ帰ってきます。
これでハッシュが上書きされるため正常に取り出せません。
AS 句をうまく使いましょう

rubyのopenuriやnet/http でエラーが出ちゃうときの対処

rubyのopenuriやnet/http で503とかのエラーがでるとき、何度かリトライしたいということがあります。 単純にアクセス繰り返すとDOSってると思われてしまいます。 次のようにGETを行うコードのラッパーとなるメソッドを作り、これを呼ぶとよさそう アクセス前の待機時間を引数にとっておき、503エラーが出た場合などは同じメソッドを待機時間を延ばしてリトライします。 400秒待ってダメなような場合はあきらめます。
     def carefulGet(url,waittime)
    begin
      sleep waittime
      charset = nil
      html = open(url, :proxy => nil) do |f|
        charset = f.charset
        f.read
      end
      return html
    rescue => evar
      puts evar
      if waittime<400 then
        puts 'GET error!! retry '
       #ここで同じメソッドを待機時間を上げて再起呼び出し
    carefulGet(url,waittime+20)
      else
        puts 'GET error!! QUIT'
      end
    end
  end

Mongodbへのリモートアクセス

最初にユーザーを作る
Mongodbはデフォルトでユーザーはいないので認証をONにする前に作っておく
ユーザーはDBに所属するので、使用したいDBに切り替えてから作る
use mydb
db.addUser('sato','password')
/etc/mongodb.confの以下の行をコメント解除
auth=true

以下の行をコメントにする
#bind_ip = 0.0.0.0

mongodの再起動
service mongod restart

IPTABLESを設定
iptables -A INPUT -p tcp --dport 27017 -j ACCEPT
iptables -A INPUT -p tcp --sport 27017 -j ACCEPT

IPTABLESの設定を保存
/etc/init.d/iptables save

再起動
service iptables restart


接続
mongo [host_IP]/ -u sato -p password

2014年9月20日土曜日

CentOSでrubyにnokogiri

普通にgem install nokogiriだといろんな依存ライブラリが足りない

こんな感じで
yum install libxslt libxslt-devel libxml2 libxml2-devel -y
gem install nokogiri --use-system-libraries

2014年9月19日金曜日

ブログ開始

いままで、技術的なメモはローカルにに書いてたけど、Webにうつすよ