2016年09月09日

rails + postgresqlを動かしたメモ

なんか久々にrails動かしたので手順をメモしておく。何年ぶりだろう。 続きを読む

gnomeの端末でrvmでuseできなかった場合

ちょっとRubyを使う用事があったのでrvm入れてuseとか言ったら下記のエラーが出た。

$ rvm use ruby-2.2.1

RVM is not a function, selecting rubies with 'rvm use ...' will not work.

You need to change your terminal emulator preferences to allow login shell.
Sometimes it is required to use `/bin/bash --login` as the command.
Please visit https://rvm.io/integration/gnome-terminal/ for an example.
続きを読む

2012年01月09日

UbuntuにRedimineをインストールしてみる

この前の日記の週に2回ブログを更新すると言ったヤツの1本目。

Redmineのインストール(Redmine1.3.0/Ubuntu10.04)
http://www.mwsoft.jp/programming/other/redmine_install.html

とりあえずこのくらいの品質でとりとめもなくやってみようと思う。

そういえば最近はあまり冗談は書かないようにしている。真面目路線。

真面目に書くと読者対象が絞れるから安心できる、というのが理由の1つ。

2010年12月19日

ファイルからURLを抽出するいい加減なRubyソース

個人的に良く使う処理なので貼っておく。かなりいい加減。気が向いたらちゃんと書く。

そういえばRubyのURLって新しいRFC使ってたっけ。URI.parseすると現行で使われているURLも弾いたりする。

続きを読む

2010年01月02日

Ubuntuでgemでzlib (LoadError)が出た際

UbuntuにRuby1.9をソースから入れてgem使おうとしたら、zlib (LoadError)が出て動かなかった。

sudo apt-get install zlib1g-dev

をしてから、再度makeからやり直したら、動いた。

2009年09月15日

Railsでstrip_tagsがしたい時

ActionView::Base.full_sanitizer.sanitize( str )
でいけるらしい。

ここが詳しかった。
http://d.hatena.ne.jp/moro/20080416/1208311316

2009年07月13日

2009年07月12日

2009年07月11日

【1日1Rails】script/generate その2

コントローラの自動生成
script/generate controller [action]


続きを読む

2009年07月09日

【1日1Rails】小数点第何位で丸める

Ruby 1.8.7
Rails 2.3.2
小数点第何位かを指定して丸める


続きを読む

2009年07月07日

【1日1Rails】script/destroy

Ruby 1.8.7
Rails 2.3.2
script/destroyについて


続きを読む

【1日1Rails】script/dbconsole

Ruby 1.8.7
Rails 2.3.2
script/dbconsoleについて

続きを読む

2009年07月06日

【1日1Rails】script/console

Ruby 1.8.7
Rails 2.3.2
script/consoleについて


続きを読む

2009年07月05日

【1日1Rails】script/about

Ruby 1.8.7
Rails 2.3.2
script/aboutの実行結果例


続きを読む

2009年07月04日

Ruby on Railsを使ってメリットを感じた瞬間

最近、Railsをガシガシ使ってみて、心根的には「あまり好きになれないな」と感じたわけですが(※素直になれないのではなく、普通にそう思う)、それでもメリットをいくつか感じたので列挙してみました。

※あまりサーバサイドの処理は担当していません。どちらかというと、裏側の処理を書いてました。そういう仕事をしていた人間の所感なので、ちと王道とはズレがあるかも。



requireって書かなくていい
へいへい、無精者ですよ。
デフォルトでいろんなものがインクルードされていて、自前で標準モジュールを呼ぶことが少ないというのは、楽で良いと思います。

日付・時刻の扱いが簡易
元々RubyはDate.parseって書けば、割と空気を読んでくれたりするように、日付処理はかなり簡易ですが、ActiveSupportはそれに輪をかけて便利です。
tomorrowと言えば翌日が出てきたり、next_weekと言えば次週が出てきたりします。

開発途中にDBを変えても損害が少ない
試しにWindows+MySQLで開発したソースをLinux+SQLite3に移しても、特に問題なく。PostgreSQLに移した際も、ActiveRecordを推奨された使い方で(SQLベタ書きとかせずに)使っていれば、差異をほとんど吸収してくれました。
まぁ、途中でDB変えるってことはあまり無いと思いますが、本番環境の選定が決まってない状態で開発スタートしても平気かもしれないってのは、なかなかに興味深いです。

データベースの管理が楽
create文を書くよりgenerateしたmigrationファイルに手を入れる方が数段楽ですし、管理もしやすいです。
あと、DBに関する設定が、必ず決められた場所(config/database.ymlとか)にいるというのもありがたいです。

作業量が減る
script/generateやら、rake db:migrateやら、何かと作業工数を削ってくれる代物が用意されています。
1つ1つの短縮時間は大したものでもないですが、全部足せばけっこうな時間が短縮できます。

RESTで云々する際のコストが限りなく低い
ちょっとしたXMLやJSONを吐き出したい時に、非常に少ないコストで実行できます。
XMLはscaffoldで作った叩き台上で、デフォルトで出力出来るようになっているし、JSONも1行か2行書き変えれば出力されます。

引き継ぎ易い
個人的に、これが一番良いメリットなんじゃないかと思ってます。
Railsで書いたソースは、どの設定ファイルにどんな記述がされているか決まっているし、環境構築もrakeである程度自動生成できます。
オリジナリティ溢れるRubyソースを渡すよりも、Railsで書いたものの方がお互いに共通認識があるので意思疎通がしやすいです。Rails知ってる人の絶対数が少ないということについては、ノーコメント。


もちろん、感じてるデメリットもいくつかあります。

ActiveRecordで大量データ取り扱わせたらやたら重いですし、そもそもRubyの実行速度も芳しくない。C++やJavaなら数秒で終わる処理が数十秒かかったりします。

ちょっと昔のマージソート実行時間比較
http://techtrim.net/2008/01/18_19196.html

それでも、さすがキラーアプリと呼ばれるだけの便利さはあるなぁと、そう思いました。

【1日1Rails】scriptディレクトリのコマンド説明

Ruby 1.8.7
Rails 2.3.2
スクリプトディレクトリのコマンドの機能、用途等


続きを読む

2009年07月02日

【1日1Rails】YAML形式への変換、デコード

Ruby 1.8.7
Rails 2.3.2
YAMLへの変換、デコード
to_yaml
YAML.load


続きを読む

2009年07月01日

【1日1Rails】JSONへの変換、デコード

Ruby 1.8.7
Rails 2.3.2
JSONへの変換、デコード
to_json
ActiveSupport::JSON.decode


続きを読む

2009年06月30日

【1日1Rails】単数形、複数形の変換

Ruby 1.8.7
Rails 2.3.2
英単語の単数形 <=> 複数形変換
命名を大事にするRailsにとってはとても大事な機能

pluralize, singularize


続きを読む

2009年06月28日

【1日1Rails】前月・翌月を取得する

Ruby 1.8.7
Rails 2.3.2

# Dateでやってますが、Timeでも動きます

# 先月=last_month, 翌月=next_month
>> date = Date.new(2009, 1, 1)
  => Thu, 01 Jan 2009
>> date.last_month
  => Mon, 01 Dec 2008
>> date.next_month
  => Sun, 01 Feb 2009

# 2ヶ月後、2ヶ月前
>> date.months_ago(2)
  => Sat, 01 Nov 2008
>> date.months_since(2)
  => Sun, 01 Mar 2009

# monthをyearにすれば、年の扱い
>> date.next_year
  => Fri, 01 Jan 2010
>> date.last_year
  => Tue, 01 Jan 2008
>> date.years_ago(2)
  => Mon, 01 Jan 2007
>> date.years_since(2)
  => Sat, 01 Jan 2011

# 標準関数でやるとこんな感じ
>> date = Date.new(2009, 1, 1)
>> date << 1
  => 20081201

# ちなみに3月31日の1ヶ月前2月28日
>> date = Date.new(2009, 3, 31)
>> date << 1
  => 20090228

2009年06月27日

【1日1Rails】月の末日を取得する

Ruby 1.8.7
Rails 2.3.2

# end_of_monthで取れる
Date.today.end_of_month #=> Tue 30 Jun 2009

# Timeだと末日の最終秒が取れる
Time.now.end_of_month #=> Tue Jun 30 23:59:59 +0900 2009

# Rubyの標準関数のみでやろうとすると、こんな感じ
Date.new( Date.today.year, Date.today.month, -1 ) #=> Tue 30 Jun 2009

【1日1Rails】SQLを直接実行する

# Railsで直接SQLを発行する
# エンコード指定を打ちたい時、
# ActiveRecordの実行速度がボトルネックになる時などに使用
 
# SELECTも実行できる
rs = ActiveRecord::Base.connection.execute( "select * from hoge" )
rs.each { | item |
  puts item[0]
}

2009年06月08日

Ruby + Mysql5.1 = ハマる

SQLiteにも飽きてきたのでMySQLに立ち返ろうと思い、MySql5.1でRailsを動かそうとする。で、ハマった末に以下のような記事に辿り着く。


Windows に Ruby on Rails 2.2 + MySQL 5.x 環境を構築する手順とハマり所
http://d.hatena.ne.jp/seiunsky/20081228/1230485404


5.1はハマりやすいらしい。というか、Windows版は全体的に不安定な気がする。とりあえず面倒になったので、SQLiteにリターン。


ついでにWindowsでSQLite使うときにgemで怒られる件もここに書いておこう。

gem install sqlite3-ruby
とやると、「'nmake' は、内部コマンドまたは外部コマンド……」みたいなエラーが出る。
gem install sqlite3-ruby --version '= 1.2.3'
とすると良いらしい。


参考
http://d.hatena.ne.jp/GARAPON/20081022/1224657975

2009年06月06日

Rubyの定数の動きを確認する

Rubyの定数の動きを把握していなかったので確認をする。

クラス内で宣言された場合はそのクラス内がスコープになり、クラスの外で宣言された場合はObjectクラスの定数になる。

# クラスの外で宣言
HOGE = "uga"

# クラス内で定数を宣言
class Test1
  HOGE = "hoge"
  def initialize
    p HOGE #=> hoge
  end
end

# 継承した場合、定数もちゃんと継承される
class Test2 < Test1
  def initialize
    super  #=> hoge
    p HOGE #=> hoge
  end
end

# 継承して同名の定数を宣言した場合は、上書きされる
# superした場合は継承元を見る
class Test3 < Test1
  HOGE = "fuga"
  def initialize
    super  #=> hoge
    p HOGE #=> fuga
  end
end

# 定数を宣言してない場合は、Objectの定数を見る
class Test4
  def initialize
    p HOGE #=> uga
  end
end


真性オブジェクト指向言語を名乗る(?)だけあって、非常にイメージしやすい動き。こういうところは好きです。

2009年06月02日

Ruby on Railsで前方一致検索をする際に

Ruby on Railsで前方一致検索をしようと思う。LIKE用のメソッドは用意されていないように見えたので(プラグインがあるという記述を見かけたので、きっとないのだろうという判断)、conditionsをベタっぽく書くことにする。

が、普通にlike 'hoge%'と書くと、こんなエラーが出る。

malformed format string - %

どうやら%は置換用の文字になっているので使ってはいけないらしい。サニタイズのこととかもあるので、「?」使うのがとりあえず正解のように見えた。

Hoge.find(:all, :conditions => ["fuga like ?", "moge%"]

Railsのことはまだまだよく分からない。何度も「もうfind_by_sqlでいいか」と思いつつ、それでは学習しないのでやり方を調べる日々。

2009年05月30日

Rubyでn-gram的なことをする

昨日は酔っ払いながらn-gramと遊ぶ。

お陰で、とある自殺回数が多い作家様が書いた斜陽という作品は「お母さま」が325回出きたり(お母さま言い過ぎ)、ギロチンが24回出てくる(そんなに使ってたっけ?)ことが分かった。

分かったからどうだと言われると困る。語尾とかの傾向を見て「女性っぽい小説」、「男性っぽい小説」とかを見分けるくらいはできるかもしれないが。

にしても、文章解析の為にはやるべき下準備が多い。他人様の書いたソース読んだり、知らない概念を勉強したり。自分は頭悪いと1日5回くらい思う。その後、俺って天才と2回くらい思う。そんな日々。


n-gramっぽい簡易なソース

2009年05月29日

RubyでZIPの解凍

青空文庫から文書を読み込んで形態素解析して、結果(出現単語、出現数、当該センテンス)をDBに登録するという処理を書く。

青空文庫は著作権が消滅した作家と、著作権が残っているけど了承を得て掲載している作家の2種類を扱っている。著作権が消滅している作家については再配布や改変も可能らしいので、こういう処理をしても問題ないはず。

青空文庫にいるのはXHTML版とテキスト版(ZIP圧縮)の2つなんだけど、XHTMLは扱うのが面倒なので、ZIPファイルのURLを指定して、解凍、テキストファイルの保存、形態素解析、DB登録という一連の流れを行うプログラムを作ることにする。

で、ZIPファイルをRubyで扱う方法を知らなかったので、調べる。

以下、コードとか

2009年05月27日

RMagickを使ってみる

ImageMagick(語尾のkを忘れて検索したら、間違っていると気づかせない程度に結果が出てきて悩んだ)を入れて、文字の画像化をしてみる。

「あ」

ここに表示している「あ」という文字は画像ではなくテキストであり、文字コードの何番目とかでしかない。プログラムはそれをコードとしては捉えられるけど、形として捉えてはいない。

だからプログラムは片仮名の「ヘ」と平仮名の「へ」を全く違うものとして捉える。けど、画像化して類似画像を検索すれば似たものとして捉えられる。うちの子にはそういう目線で文字を見て欲しい。親である私の希望である。

というわけで、受け取った文字列をその場で画像に変換して、その場で見て、何に近いか連想してもらうという実に意味のないことを考える。

とりあえず画像にするとこまで。Ruby経由なのでRMagick使用。

以下、インストールとかサンプルコード

2009年05月24日

Rails学習中

最近、Ruby on Railsなんていうライトな子と戯れている。

Railsは「設定よりも規約」というキャッチコピーを持つように、プログラマが勝手に名前を付けてweb.xmlやらstruts-config.xmlみたいなものにそれを書き込むのではなく、リクエストとController、テーブルとModelなどが規約通りに命名されていれば勝手に繋がってくれる。

それがあるので「10分で簡単なアプリケーションが出来る」とかいう「売り文句としては上等な」長所を実現できたりする。

「手軽に出来る」こともあるが「手軽にソースを追える」メリットも大きい。URLからrewriteを見て、web.xmlやら何やらを見て、Actionを見つけて、という手間が省けるし、自動生成の雛形から物を作るという経路を皆が経験すれば、誰もが似た構成のアプリケーションを作るようになる。


以下、簡単な使い方

2009年05月19日

RubyでTimeout::Errorを拾う

とあるルールに基いてWEBのリンクを辿りながらページを取得する処理をRubyで書いて、寝ている間にゆったりと回していたのですが、起きたら「Timeout::Error」で止まってました。わーい、やり直しだー。

普通に「begin 〜 rescue」でくくっても「Timeout::Error」は拾わないそうです。(使用バージョン、1.8.7)

begin
hoge
rescue => e
p e
retry
rescue Timeout::Error => e
p e
retry
end

みたいな感じで両方拾ってあげないといけないそうです。今晩は無事に処理を完了してくれますように。

2009年05月15日

Mecabを入れる(Ruby版)

Windows側にしか入れてなかったので、Linux(Fedora10)にもMecabを入れる。その時に打ったコマンド等。(Rubyはインストール済み)


○ダウンロード
ここから、「mecab」(本体)と「mecab-ipadic」(辞書)と「mecab-ruby」(Ruby用モジュール)をダウンロードする
http://sourceforge.net/project/showfiles.php?group_id=177856


○Mecab本体のインストール
$ ./configure
$ make
$ sudo make install
という代わり映えのしないコマンド


○Mecab辞書のインストール
$ ./configure --with-charset=utf8
$ make
$ make install
デフォルトだとEUC-JPになるので、お好みに応じてデフォルトキャラセットを指定。我が家はもっぱUTF-8。


○mecab-rubyのインストール
$ ruby extconf.rb
$ make
$ ruby test.rb

うちでは「ruby test.rb」で以下のようなエラーが出た。
./MeCab.so: libmecab.so.1: cannot open shared object file: No such file or directory - ./MeCab.so (LoadError)

対応
$ sudo vim /etc/ld.so.conf
で、一行目にこれを追加
/usr/local/lib
$ sudo ldconfig

この後、「ruby test.rb」をすれば通った。

最後にこれ
$ sudo make install


○サンプルソース
require 'MeCab'
mecab = MeCab::Tagger.new()
puts mecab.parse("俺たちに明日はない(たぶん)")

これを実行して動けば成功。




【20091012追記】
こちらにもう少し詳しい内容を書きました。
http://www.mwsoft.jp/programming/munou/mecab_linux.html

ブログの記事本文のみを取得する

先日、Googleブログ検索で泳いだ話を書きましたが、そうやって収集した情報を活かそうとした時に、ブログの「記事本文のみを取得する」方法が欲しくなりました。

フィードに本文が全て含まれていれば良いのですが、そうでない場合も多いので、プログラムで抽出することに。車輪の再発明を避けるべく(断じて作るのが面倒だったわけではない)、既に作られていそうなものを探してみた。

その中で精度、手軽さ、共に良かったのがこれ。

ExtractContent(BSDライセンス)
http://labs.cybozu.co.jp/blog/nakatani/2007/09/web_1.html

文中における句読点の存在や、ブロック内の文章の長さなどを元にスコアを付け、スコアが低いものを除去した状態で返してくれる。


これを使ってどの程度の精度が出るのか確認したかったので、テスト用のソースを書く。概要はこんな感じ。

・URLを指定して、HTMLページを取得する
・ExtractContentを使って取得ページを解析する
・取得ページのBODYタグの直下に解析結果を挿入して、ファイルに保存する
・そのファイルをブラウザで見ると、ページの全体と解析結果が一望できる

ソースはこちら(動作確認はかなり適当です。自己責任でご使用ください)
mwextractcontenttest.rb

Hpricot使ったりしてます。あと引数指定するとリンクを辿って解析をしたりします。詳細はソースのコメントにて。


ということをしていたらいつのまにやら午前3時。明日は寝不足気味に出勤すること確定。いかんですな。この世界は楽し過ぎます。