ログイン  |  新規登録  |
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
最近のweBLogのコメント
アーカイブ
オンライン状況
7 人のユーザが現在オンラインです。 (5 人のユーザが ブログ を参照しています。)

登録ユーザ: 0
ゲスト: 7

もっと...
アクセスカウンタ
今日 : 1
昨日 : 617617617
今週 : 1289128912891289
今月 : 1381113811138111381113811
総計 : 1946749194674919467491946749194674919467491946749
平均 : 490490490
LogCounterX by taquino
日本ブログ村
にほんブログ村 住まいブログ 一戸建 注文住宅(施主)へ
にほんブログ村 自転車ブログ 中年サイクリストへ
にほんブログ村 IT技術ブログ ソフトウェアへ
広告
ブログ - 最新エントリ
 最新エントリ配信

カテゴリ
書籍(47)


最新エントリ
2014/11/24
カテゴリ: 開発日誌 : Webサービス : 

執筆者: ariki (2:50 pm)
Bootstrapを導入してみる」の続きになります。ちゃんとお化粧してみたいと思います。

views/index.erbを下記のとおり修正しました。Getting startedのExmaplesのStarter template、Jumbotron、Sticky footerを参考に作成しました。

[views/index.erb]
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>カットアップ・マシーン</title>

    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <!-- Customize -->
    <link href="css/bootstrap-custom.css" rel="stylesheet">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>

  <body>
    <nav class="navbar navbar-inverse navbar-fixed-top" role="navigation">
      <div class="container">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="/">カットアップ・マシーン</a>
        </div>
        <div id="navbar" class="collapse navbar-collapse">
          <ul class="nav navbar-nav">
            <li class=<%= "active" if @current_page == "/" %>><a href="/">Home</a></li>
            <li><a href="#Cutup">Cutup</a></li>
            <li><a href="#About">About</a></li>
          </ul>
        </div><!--/.navbar-collapse -->
      </div>
    </nav>

    <div class="container">
      <div class="jumbotron">
        <h2>カットアップ・マシーンとは</h2>
        <p>カットアップとは、「完成された完全な直線的テキストを寸断し、その断片を接続し直すことにより新しいテキストを生み出す。」技法です。文学においてはダダに起源をもち、その後フリオ・コルタサルやウィリアム・S・バロウズらによって用いられた20世紀以降の技法として知られます。カットアップ・マシーンは、このカットアップを行うサービスです。</p>
        <p><a class="btn btn-primary btn-lg" href="#About" role="button">もっと詳しく »</a></p>
      </div>
    </div><!-- /.container -->

    <footer class="footer">
      <div class="container">
        <p class="text-muted">Copyright © 2014 Tomohiko Ariki All Rights Reserved.</p>
      </div>
    </footer>

    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>


public/css/bootstrap-custom.cssを用意して、bodyのパディング設定、jumbotronのカスタマイズを行っているところ、Sinatra側で@current_pageを設定してナビゲーションの活性コントロールを行っているところがポイントです。jumbotronの背景画像はpublic/imagesに配置しました。

[public/css/bootstrap-custom.css]
body {
  padding-top: 80px;
}

.jumbotron {
  background: url("../images/type-writer.jpg");
  background-position: center center;
  background-size: cover;
  min-height: 320px;
  color: white;
}

.footer {
  position: absolute;
  bottom: 0;
  width: 100%;
  /* Set the fixed height of the footer here */
  height: 60px;
  background-color: #f5f5f5;
}

.container .text-muted {
  margin: 20px 0;
}

.footer > .container {
  padding-right: 15px;
  padding-left: 15px;
}


[cutup.rb]
require 'sinatra/base'

class Cutup < Sinatra::Base

  get '/' do
    @current_page = "/"
    erb :index
  end

end

Cutup.run! :host => 'localhost', :port => 4567


こんな感じでさくっとそれっぽいページが出来上がってしまいました。あとはカットアップモジュールを呼び出して、カットアップを行うページを作成すればできあがりです。
2014/11/23
カテゴリ: 開発日誌 : Webサービス : 

執筆者: ariki (10:02 am)
SinatraでHello world!」の続きになります。CSSフレームワークのBootstrapを使うと、さくっと今風のデザインにできるらしいということで導入してみます。

Bootstrapをダウンロードします(悩めるエンジニアがダウンロードしたものはbootstrap-3.3.1-dist.zip)。Sinatraでは静的ファイルをpublic以下に配置するようになっているので、解凍したディレクトリを public にリネームしてSinatraアプリケーションのディレクトリに配置します(public/css、public/fonts、public/js)。

views/index.erbを作成します。「Getting started」の「Basic template」そのままです。

[views/index.erb]
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Bootstrap 101 Template</title>

    <!-- Bootstrap -->
    <link href="css/bootstrap.min.css" rel="stylesheet">

    <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
    <!--[if lt IE 9]>
      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
  </head>

  <body>
    <h1>Hello, world!</h1>

    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="js/bootstrap.min.js"></script>
  </body>
</html>


前回作成したcutup.rbを以下のとおり修正します。Sinatraではhaml、erb、sass、markdown、slim、coffescriptといったテンプレートエンジンが使えますが、今回はerbで。

[cutup.rb]
require 'sinatra/base'

class Cutup < Sinatra::Base

  get '/' do
    erb :index
  end

end

Cutup.run! :host => 'localhost', :port => 4567



アプリケーションを起動しなおして確認すると、Bootstrapの効果は分かりませんが・・・、ちゃんと表示されましたね。

次回はBootstrapでちゃんとお化粧してみたいと思います。




Sinatra: Up and Running
Sinatra: Up and RunningAlan Harris Konstantin Haase

O'Reilly Media 2011-11-21
売り上げランキング :

Amazonで詳しく見る
by G-Tools
まつもとゆきひろ直伝 組込Ruby「mruby」のすべて 総集編 Docker入門 Immutable Infrastructureを実現する Rubyではじめるシステムトレード Vagrant入門ガイド UIまで手の回らないプログラマのためのBootstrap 3実用ガイド
2014/10/12
カテゴリ: 開発日誌 : Webサービス : 

執筆者: ariki (6:06 am)
カットアップモジュールの実装」の続きになります。今回、Webサービス化するにあたりSinatraを使ってみたいと思います。というわけで、まずはHello world!から。

まずはインストール。Gemfileを作成します。

$ bundle init


できあがったGemfileを下記のとおり修正。

[Gemfile]
source "https://rubygems.org"

gem "sinatra"


インストールします。

$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/...........
Resolving dependencies...
Installing rack 1.5.2
Installing rack-protection 1.5.3
Installing tilt 1.4.1
Installing sinatra 1.4.5
Using bundler 1.7.3
Your bundle is complete!
It was installed into ./vendor/bundle



アプリケーションを実装します。GETメソッドで”/”にアクセスすると、"Hello world!"を返す簡単なものです。

[cutup.rb]
require 'sinatra/base'

class Cutup < Sinatra::Base

  get '/' do
    'Hello world!'
  end

end

Cutup.run! :host => 'localhost', :port => 4567


アプリケーションを立ち上げます。

$ bundle exec ruby cutup.rb 
[2014-10-12 05:53:50] INFO  WEBrick 1.3.1
[2014-10-12 05:53:50] INFO  ruby 2.0.0 (2014-05-08) [universal.x86_64-darwin13]
== Sinatra/1.4.5 has taken the stage on 4567 for development with backup from WEBrick
[2014-10-12 05:53:50] INFO  WEBrick::HTTPServer#start: pid=776 port=4567


ブラウザで"http://localhost:4567/"にアクセスすると、無事に"Hello world!"が表示されました。これは手軽でよいですね。

これをベースに、Bootstrapを使って、ちょっとセンスのある?カットアップサービスに仕立てていきたいと思います。


Sinatra: Up and Running
Sinatra: Up and RunningAlan Harris Konstantin Haase

Oreilly & Associates Inc 2011-12-06
売り上げランキング : 64931

Amazonで詳しく見る
by G-Tools
初めてのRuby Rubyベストプラクティス -プロフェッショナルによるコードとテクニック WEB+DB PRESS Vol.73 開眼!  JavaScript ―言語仕様から学ぶJavaScriptの本質 RとRubyによるデータ解析入門
2014/10/06
カテゴリ: 開発日誌 : Webサービス : 

執筆者: ariki (12:17 pm)
MeCab(和布蕪)のRubyバインディングnatto(納豆)を試してみる」の続きになります。「Ruby でマルコフ連鎖やってみた」を参考に、カットアップアルゴリズムを実装します。こちらでは一文字がチェインの一単位になっていますが、これをMeCabとnattoで分かち書きにした単語をチェインの一単位にします。

コードはこちら。

require 'natto'

class Markov
  NONWORD = "n"

  attr_reader :markov_chain

  def initialize(text, chain_length = 2)
    @text = text
    @state = []
    @markov_chain ={}
    @chain_length = chain_length
    make_chain
  end

  def make_chain
    init_state
    tagger = Natto::MeCab.new('-Owakati')
    words = tagger.parse(@text).split(' ')
    words.each do |word|
      push_chain(word)
      next_state(word)
    end
    push_chain(NONWORD)
  end

  def push_chain(word)
    chain = @markov_chain
    (@chain_length - 1).times do |i|
      chain[@state[i]] = {} if chain[@state[i]].nil?
      chain = chain[@state[i]]
    end
    chain[@state[@chain_length - 1]] = [] if chain[@state[@chain_length - 1]].nil?
    chain[@state[@chain_length - 1]].push(word)
  end

  def each
    init_state
    loop do
      p = pick
      if p == NONWORD
        break
      else
        yield p
      end
      next_state(p)
    end
  end

  def pick
    chain = @markov_chain
    @chain_length.times do |i|
      chain = chain[@state[i]]
    end
    r = rand(chain.length)
    chain[r]
  end

  def init_state
    @state = []
    @chain_length.times do |n|
      @state[n] = NONWORD
    end
  end

  def next_state(word)
    (@chain_length - 1).times do |i|
      @state[i] = @state[i + 1]
    end
    @state[@chain_length - 1] = word
  end
end


こちら上記のクラスを使うコード。第一パラメータがカットアップしたいテキストのファイル、第二引数がチェインの長さになります。

require File.expand_path('../markov', __FILE__)

text = File::open(ARGV[0]).read

markov = Markov.new(text, ARGV[1].to_i)
i = 0
markov.each do |word|
  break if i > 1000
  print word
  i += 1
end
puts


例えば、以下のようばテキストのファイルをチェインの長さ2で食わせてみると、

引用:
テロリズム。テロリストを作るのは、貧困じゃなくて退屈なのかも。退屈に所有されないようにしようよ。退屈に所有されないように、飲んで食べてファックろうよ。人間文明って疎外と孤独のことなのかな?それと、もしそうなら知識って何なの?知識なんて何の役にも立たない。知識、つまりは疎外と孤独が退屈を生み出す。退屈に所有されないようにしようよ。飲んで食べてファックろうよ。


以下のように分かち書きされ、

["テロリズム",
 "。",
 "テロリスト",
 "を",
 "作る",
 "の",
 "は",
 "、",
 "貧困",
 "じゃ",
 "なく",
 "て",
 "退屈",
 "な",
 "の",
 "かも",
 "。",
 "退屈",
 "に",
 "所有",
 "さ",
 "れ",
 "ない",
 "よう",
 "に",
 "しよ",
 "う",
 "よ",
 "。",
 "退屈",
 "に",
 "所有",
 "さ",
 "れ",
 "ない",
 "よう",
 "に",
 "、",
 "飲ん",
 "で",
 "食べ",
 "て",
 "ファック",
 "ろう",
 "よ",
 "。",
 "人間",
 "文明",
 "って",
 "疎外",
 "と",
 "孤独",
 "の",
 "こと",
 "な",
 "の",
 "か",
 "な",
 "?",
 "それ",
 "と",
 "、",
 "もし",
 "そう",
 "なら",
 "知識",
 "って",
 "何",
 "な",
 "の",
 "?",
 "知識",
 "なんて",
 "何",
 "の",
 "役",
 "に",
 "も",
 "立た",
 "ない",
 "。",
 "知識",
 "、",
 "つまり",
 "は",
 "疎外",
 "と",
 "孤独",
 "が",
 "退屈",
 "を",
 "生み出す",
 "。",
 "退屈",
 "に",
 "所有",
 "さ",
 "れ",
 "ない",
 "よう",
 "に",
 "しよ",
 "う",
 "よ",
 "。",
 "飲ん",
 "で",
 "食べ",
 "て",
 "ファック",
 "ろう",
 "よ",
 "。"]


以下のようなハッシュが作られます。

{"n"=>["テロリズム"],
 "テロリズム"=>["。"],
 "。"=>["テロリスト", "退屈", "退屈", "人間", "知識", "退屈", "飲ん", "n"],
 "テロリスト"=>["を"],
 "を"=>["作る", "生み出す"],
 "作る"=>["の"],
 "の"=>["は", "かも", "こと", "か", "?", "役"],
 "は"=>["、", "疎外"],
 "、"=>["貧困", "飲ん", "もし", "つまり"],
 "貧困"=>["じゃ"],
 "じゃ"=>["なく"],
 "なく"=>["て"],
 "て"=>["退屈", "ファック", "ファック"],
 "退屈"=>["な", "に", "に", "を", "に"],
 "な"=>["の", "の", "?", "の"],
 "かも"=>["。"],
 "に"=>["所有", "しよ", "所有", "、", "も", "所有", "しよ"],
 "所有"=>["さ", "さ", "さ"],
 "さ"=>["れ", "れ", "れ"],
 "れ"=>["ない", "ない", "ない"],
 "ない"=>["よう", "よう", "。", "よう"],
 "よう"=>["に", "に", "に"],
 "しよ"=>["う", "う"],
 "う"=>["よ", "よ"],
 "よ"=>["。", "。", "。", "。"],
 "飲ん"=>["で", "で"],
 "で"=>["食べ", "食べ"],
 "食べ"=>["て", "て"],
 "ファック"=>["ろう", "ろう"],
 "ろう"=>["よ", "よ"],
 "人間"=>["文明"],
 "文明"=>["って"],
 "って"=>["疎外", "何"],
 "疎外"=>["と", "と"],
 "と"=>["孤独", "、", "孤独"],
 "孤独"=>["の", "が"],
 "こと"=>["な"],
 "か"=>["な"],
 "?"=>["それ", "知識"],
 "それ"=>["と"],
 "もし"=>["そう"],
 "そう"=>["なら"],
 "なら"=>["知識"],
 "知識"=>["って", "なんて", "、"],
 "何"=>["な", "の"],
 "なんて"=>["何"],
 "役"=>["に"],
 "も"=>["立た"],
 "立た"=>["ない"],
 "つまり"=>["は"],
 "が"=>["退屈"],
 "生み出す"=>["。"]}


チェインの長さが2であれば以下のようなハッシュになります。

{"n"=>{"n"=>["テロリズム"], "テロリズム"=>["。"]},
 "テロリズム"=>{"。"=>["テロリスト"]},
 "。"=>
  {"テロリスト"=>["を"],
   "退屈"=>["に", "に", "に"],
   "人間"=>["文明"],
   "知識"=>["、"],
   "飲ん"=>["で"]},
 "テロリスト"=>{"を"=>["作る"]},
 "を"=>{"作る"=>["の"], "生み出す"=>["。"]},
 "作る"=>{"の"=>["は"]},
 "の"=>
  {"は"=>["、"], "かも"=>["。"], "こと"=>["な"], "か"=>["な"], "?"=>["知識"], "役"=>["に"]},
 "は"=>{"、"=>["貧困"], "疎外"=>["と"]},
 "、"=>{"貧困"=>["じゃ"], "飲ん"=>["で"], "もし"=>["そう"], "つまり"=>["は"]},
 "貧困"=>{"じゃ"=>["なく"]},
 "じゃ"=>{"なく"=>["て"]},
 "なく"=>{"て"=>["退屈"]},
 "て"=>{"退屈"=>["な"], "ファック"=>["ろう", "ろう"]},
 "退屈"=>{"な"=>["の"], "に"=>["所有", "所有", "所有"], "を"=>["生み出す"]},
 "な"=>{"の"=>["かも", "か", "?"], "?"=>["それ"]},
 "かも"=>{"。"=>["退屈"]},
 "に"=>{"所有"=>["さ", "さ", "さ"], "しよ"=>["う", "う"], "、"=>["飲ん"], "も"=>["立た"]},
 "所有"=>{"さ"=>["れ", "れ", "れ"]},
 "さ"=>{"れ"=>["ない", "ない", "ない"]},
 "れ"=>{"ない"=>["よう", "よう", "よう"]},
 "ない"=>{"よう"=>["に", "に", "に"], "。"=>["知識"]},
 "よう"=>{"に"=>["しよ", "、", "しよ"]},
 "しよ"=>{"う"=>["よ", "よ"]},
 "う"=>{"よ"=>["。", "。"]},
 "よ"=>{"。"=>["退屈", "人間", "飲ん", "n"]},
 "飲ん"=>{"で"=>["食べ", "食べ"]},
 "で"=>{"食べ"=>["て", "て"]},
 "食べ"=>{"て"=>["ファック", "ファック"]},
 "ファック"=>{"ろう"=>["よ", "よ"]},
 "ろう"=>{"よ"=>["。", "。"]},
 "人間"=>{"文明"=>["って"]},
 "文明"=>{"って"=>["疎外"]},
 "って"=>{"疎外"=>["と"], "何"=>["な"]},
 "疎外"=>{"と"=>["孤独", "孤独"]},
 "と"=>{"孤独"=>["の", "が"], "、"=>["もし"]},
 "孤独"=>{"の"=>["こと"], "が"=>["退屈"]},
 "こと"=>{"な"=>["の"]},
 "か"=>{"な"=>["?"]},
 "?"=>{"それ"=>["と"], "知識"=>["なんて"]},
 "それ"=>{"と"=>["、"]},
 "もし"=>{"そう"=>["なら"]},
 "そう"=>{"なら"=>["知識"]},
 "なら"=>{"知識"=>["って"]},
 "知識"=>{"って"=>["何"], "なんて"=>["何"], "、"=>["つまり"]},
 "何"=>{"な"=>["の"], "の"=>["役"]},
 "なんて"=>{"何"=>["の"]},
 "役"=>{"に"=>["も"]},
 "も"=>{"立た"=>["ない"]},
 "立た"=>{"ない"=>["。"]},
 "つまり"=>{"は"=>["疎外"]},
 "が"=>{"退屈"=>["を"]},
 "生み出す"=>{"。"=>["退屈"]}}


出来上がったハッシュをループさせ、チェインの要素をランダムにピックアップして返す、それをつなぐことでカオスなテキストを生み出すというアルゴリズムであります。それでこちらがチェインの長さ1で実際に出来上がったテキスト。

引用:
テロリズム。退屈を生み出す。退屈なのかなの役に所有されない。人間文明って何なのは疎外と孤独が退屈を生み出す。飲んで食べてファックろうよ。人間文明って疎外と、飲んで食べてファックろうよ。退屈に、つまりは、つまりは疎外と、つまりは疎外と孤独が退屈に、貧困じゃなくて退屈に、つまりは、貧困じゃなくてファックろうよ。退屈に所有されない。退屈なの?それと、つまりは疎外と、飲んで食べて退屈を生み出す。テロリストを作るのは疎外と、貧困じゃなくてファックろうよ。知識って疎外と孤独のは疎外と、飲んで食べてファックろうよ。


うはっ、カオス・・・。複数の入力テキストを用意し、チェインの長さをうまく設定してやれば、おもしろいテキストができそうですね。

というわけで、以降はこれをWebサービス化していこうと思います。
2014/10/05
カテゴリ: 開発日誌 : Webサービス : 

執筆者: ariki (3:31 pm)
MeCab(和布蕪)のインストール」の続きになります。SinatraとBootstrapを利用した簡単なウェブサービスの作成を最初の目標とします。というわけで、MeCabのRubyバインディングであるnattoをまずは試してみたいと思います。

Bundlerを利用することにします。まずは、Gemfileを作成します。

$ bundle init


してから、出来上がったGemfileを下記のとおりに編集します。

source "https://rubygems.org"

gem "natto"


あとは'bundle install'するだけ。

$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/............
Resolving dependencies...
Installing ffi 1.9.5
Installing natto 0.9.6
Using bundler 1.7.3
Your bundle is complete!
It was installed into ./vendor/bundle


下記のようなコードを用意して実行してみます。

require 'natto'

text = <<"EOS"
悪質な業者によるトラブルが全国で急増している。
EOS

nm = Natto::MeCab.new
nm.parse(text) do |n|
  puts "#{n.surface}t#{n.feature}"
end


エラーが発生・・・。

$ bundle exec ruby natto.rb 
/Users/ariki/work/Cutup/markov/vendor/bundle/ruby/2.0.0/gems/ffi-1.9.5/lib/ffi/library.rb:261:in `attach_function': Function 'mecab_model_new2' not found in [libmecab.dylib] (FFI::NotFoundError)
	from /Users/ariki/work/Cutup/markov/vendor/bundle/ruby/2.0.0/gems/natto-0.9.6/lib/natto/binding.rb:56:in `<module:Binding>'
	from /Users/ariki/work/Cutup/markov/vendor/bundle/ruby/2.0.0/gems/natto-0.9.6/lib/natto/binding.rb:7:in `<module:Natto>'
	from /Users/ariki/work/Cutup/markov/vendor/bundle/ruby/2.0.0/gems/natto-0.9.6/lib/natto/binding.rb:2:in `<top (required)>'
	from /Users/ariki/work/Cutup/markov/vendor/bundle/ruby/2.0.0/gems/natto-0.9.6/lib/natto/natto.rb:2:in `require'
	from /Users/ariki/work/Cutup/markov/vendor/bundle/ruby/2.0.0/gems/natto-0.9.6/lib/natto/natto.rb:2:in `<top (required)>'
	from /Users/ariki/work/Cutup/markov/vendor/bundle/ruby/2.0.0/gems/natto-0.9.6/lib/natto.rb:1:in `require'
	from /Users/ariki/work/Cutup/markov/vendor/bundle/ruby/2.0.0/gems/natto-0.9.6/lib/natto.rb:1:in `<top (required)>'
	from mecab.rb:1:in `require'
	from mecab.rb:1:in `<main>'


MacOSにデフォルトでインストールされている'/usr/lib/libmecab.dylib'を参照しているのが原因のですね。インストールしたMeCabは'/opt/local/lib/libmecab.dylib'のはず。これは環境変数を設定すればよいようです。

export MECAB_PATH=/opt/local/lib/libmecab.dylib


改めて実行してみると、

$ bundle exec ruby natto.rb 
悪質	名詞,形容動詞語幹,*,*,*,*,悪質,アクシツ,アクシツ
な	助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
業者	名詞,一般,*,*,*,*,業者,ギョウシャ,ギョーシャ
による	助詞,格助詞,連語,*,*,*,による,ニヨル,ニヨル
トラブル	名詞,一般,*,*,*,*,トラブル,トラブル,トラブル
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
全国	名詞,一般,*,*,*,*,全国,ゼンコク,ゼンコク
で	助詞,格助詞,一般,*,*,*,で,デ,デ
急増	名詞,サ変接続,*,*,*,*,急増,キュウゾウ,キューゾー
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
いる	動詞,非自立,*,*,一段,基本形,いる,イル,イル
。	記号,句点,*,*,*,*,。,。,。
	BOS/EOS,*,*,*,*,*,*,*,*


無事に動きました。次はマルコフ連鎖をRubyでnattoを使って実装してみようと思います。
2014/09/21
カテゴリ: 開発日誌 : Webサービス : 

執筆者: ariki (9:47 am)
カットアップサービス作成の準備で、MeCabをインストールします。MacPortsにあるようなので、まずは検索。

$ port search mecab
mecab @0.996 (textproc, japanese)
    yet another part-of-speech and morphological analyzer

mecab-base @0.996_1 (textproc, japanese)
    yet another part-of-speech and morphological analyzer

mecab-ipadic @2.7.0-20070801 (textproc, japanese)
    ipadic of eucjp encoding for MeCab

mecab-ipadic-eucjp @2.7.0-20070801_1 (textproc, japanese)
    ipadic of eucjp encoding for MeCab

mecab-ipadic-sjis @2.7.0-20070801 (textproc, japanese)
    ipadic of sjis encoding for MeCab

mecab-ipadic-utf8 @2.7.0-20070801 (textproc, japanese)
    ipadic of utf8 encoding for MeCab

mecab-java @0.996 (java, textproc, japanese)
    a Java module for MeCab

mecab-jumandic @7.0-20130310 (textproc, japanese)
    jumandic of eucjp encoding for MeCab

mecab-jumandic-eucjp @5.1-20070304_1 (textproc, japanese)
    Alternate dictionary for MeCab (jumandic/euc-jp)

mecab-jumandic-sjis @7.0-20130310 (textproc, japanese)
    jumandic of sjis encoding for MeCab

mecab-jumandic-utf8 @7.0-20130310 (textproc, japanese)
    jumandic of utf8 encoding for MeCab

mecab-naist-jdic @0.6.3b-20111013 (textproc, japanese)
    naist-jdic of eucjp encoding for MeCab

mecab-naist-jdic-sjis @0.6.3b-20111013 (textproc, japanese)
    naist-jdic of eucjp encoding for MeCab

mecab-naist-jdic-utf8 @0.6.3b-20111013 (textproc, japanese)
    naist-jdic of eucjp encoding for MeCab

mecab-sjis @0.996 (textproc, japanese)
    yet another part-of-speech and morphological analyzer

mecab-utf8 @0.996 (textproc, japanese)
    yet another part-of-speech and morphological analyzer

p5-mecab @0.996.0 (perl, textproc, japanese)
    a Perl module for MeCab

p5.8-mecab @0.996.0 (perl, textproc, japanese)
    a Perl module for MeCab

p5.10-mecab @0.996.0 (perl, textproc, japanese)
    a Perl module for MeCab

p5.12-mecab @0.996.0 (perl, textproc, japanese)
    a Perl module for MeCab

p5.14-mecab @0.996.0 (perl, textproc, japanese)
    a Perl module for MeCab

p5.16-mecab @0.996.0 (perl, textproc, japanese)
    a Perl module for MeCab

py-mecab @0.996 (python, textproc, japanese)
    a Python module for MeCab

py26-mecab @0.996 (python, textproc, japanese)
    a Python module for MeCab

py27-mecab @0.996 (python, textproc, japanese)
    a Python module for MeCab

rb-mecab @0.996 (ruby, textproc, japanese)
    a Ruby module for MeCab

rb19-mecab @0.996 (ruby, textproc, japanese)
    a Ruby module for MeCab

unidic-mecab @2.1.2 (textproc, japanese)
    a dictionary for the Japanese morphological analyzer MeCab

Found 28 ports.


MeCabはデフォルトではEUCのエンコーディングを扱うようですが、UTF-8の方がのちのち都合がよさそうなので、mecab-utf8を入れればよさそうです。

$ sudo port install mecab-utf8


以下のパッケージがインストールされました。

$ port installed |grep mecab
  mecab-base @0.996_1 (active)
  mecab-ipadic-utf8 @2.7.0-20070801_0 (active)
  mecab-utf8 @0.996_0+ipadic (active)


動作確認であります。

$ mecab
私は今朝コーヒーを飲んだ
私	名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
今朝	名詞,副詞可能,*,*,*,*,今朝,ケサ,ケサ
コーヒー	名詞,一般,*,*,*,*,コーヒー,コーヒー,コーヒー
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
飲ん	動詞,自立,*,*,五段・マ行,連用タ接続,飲む,ノン,ノン
だ	助動詞,*,*,*,特殊・タ,基本形,だ,ダ,ダ
EOS


解析されました。わかち書きも。

$ mecab -Owakati
私は今朝コーヒーを飲んだ
私 は 今朝 コーヒー を 飲ん だ


お次はRubyバインディングを試して、マルコフ連鎖を実装してみたいと思います。
2014/09/17
カテゴリ: 開発日誌 : Webサービス : 

執筆者: ariki (10:32 pm)
カットアップという技法を知ってますか?まあ、普通は知らないですよね。悩めるエンジニアはウィリアム・S・バロウズというガンマニアでヤク中のおじさんの作品でカットアップ技法を知ったのであります。

当時はMacintoshのHyperCardで動作するDr. Burroughsなんてソフトもあり、悩めるエンジニアも色々と刻んでみたものであります。今でも”What's up, Doc Burroughs”というサイトで配布されていますね。

こちらのページでカットアップソフトの作り方なんてものも紹介されており、時間があるときにWebサービスでも作ろうかと思っていたのですが、手付かず。ですが、ふと思い立ちまじめに読んでみると、分かち書きの問題をクリアし、マルコフ連鎖を使えばできるなんてことが書いてあります。

分かち書きは形態要素分析ソフトを使えばできますね。ChaSenというものがあることは知っていましたが、今はMeCabがメジャーなようです。こちらと、あとはマルコフ連鎖のアルゴリズムを実装してやればできちゃいそうですね。ちょっと調べてみると世間的には色々とやりつくされた感が・・・。

なのですが、自転車サービスも途中まで作って放置状態で、当時学んだ技術は古くなってきている感もあり、Sinatranode.jsjQueryBootstrapなどの勉強をしたいななんて思っていたところなので、着手してみようと思います。他にもやりたいことがあるので、いつになるか分かりませんけどね・・・。

生あたたかい目で見守ってください。
2012/05/03
カテゴリ: 開発日誌 : Webサービス : 

執筆者: ariki (11:53 pm)
自転車サービスの開発を再開してみたものの、世間はすっかりRails3へ移行している。

そんなわけで、Rails2からRails3へアップグレードしてみることにしたのであります。

3.2が最新のようですが、いきなりそこにジャンプするのはトラブルが多そうなので、2.3.11から3.0.12へアップグレードしてみることに。

まずはRailsのインストール。


$ gem install rails -v 3.0.12


Railsアップグレードプラグインが便利なようなのでインストールします。


$ script/plugin install git://github.com/rails/rails_upgrade.git


主要なファイルをバックアップします。


$ rake rails:upgrade:backup


以下のとおり実行し、Gemfile、config/routes.rb、config/application.rbを生成します。Gemfile、config/application.rbは出力内容で新規作成、config/routes.rbは出力内容に置き換えとなります。内容を確認して適宜編集が必要です。


$ rake rails:upgrade:gems
$ rake rails:upgrade:routes
$ rake rails:upgrade:configuration


以下のとおり実行するとRails2依存コードが指摘されるので、全て修正します。


$ rake rails:upgrede:check


Rails3で必要なファイルを作成します。conflictが表示されるので必要に応じて上書きします。


$ rails new cyclemaintenance -d mysql


サーバーを起動して、エラーが発生したら修正します。後はこの繰り返し。


$ rails s


最後にバックアップファイル、アップグレードプラグインを削除したらアップグレード完了です。


$ find . -name "*.rails2" -print | xargs rm
$ rails plugin remove rails_upgrade


サーバー起動後に修正した主要なものを書いておきます。

gemのロードができない。「Bundler を知らずに Rails3 を使っていて「no such file to load -- xxx(gem パッケージ)」エラーに遭遇したときの対処方法 」にあるとおり、"bundle install"が必要です。

config/initializers/new_rails_defaults.rbは削除しました。

config/initializers/devise.rbに以下の二行を追加しました。


config.encryptor = :sha1
require 'devise/orm/active_record' 


DBに接続できない旨のエラーが出ます。Gemfileに以下を追加し、"bundle install"しました。


gem "mysql2", "~> 0.2.18"


will_paginateはバージョン3.0.0以降が必要なようで、Gemfileに以下を追加し、"bundle install"しました。


gem 'will_paginate', '~> 3.0.3'


fleximageが動作しません。Rails3に対応した https://github.com/giovannelli/fleximage に入れ替えました。


$ rails plugin remove fleximage
$ rails plugins install git://github.com/giovannelli/fleximage.git


f.error_messagesは廃止されたようです。プラグインがある旨のメッセージが出るので、インストールします。


$ rails plugin install git://github.com/rails/dynamic_form.git


最終的なGemfileは以下のとおりです。


source 'http://rubygems.org'

gem 'rails', '3.0.12'

gem 'devise', '~> 1.1.9'
gem 'rmagick', :require => 'RMagick'
gem 'will_paginate', '~> 3.0.3'
gem "mysql2", "~> 0.2.18"
gem "aws-s3", "~> 0.6.2"


config/routes.rbの方は以下のとおり。" devise_for :users "、"root :to => "pages#home"の部分が、アップデートプラグインが生成したものから変わっています。


Cyclemaintenance::Application.routes.draw do
  devise_for :users 
  resources :users, :only => ["index", "show", "destroy"]
  resources :bikes, :only => ["new", "show", "create", "edit", "update", "destroy"] do
    member do
      get :screen
      get :thumbnail
    end
    resources :components, :only => ["new", "create", "destroy"]
    resources :records, :only => ["new", "create", "destroy"]
  end

  resources :infos, :only => ["index", "new", "create", "destroy"]
  resources :questions, :only => ["index", "new", "create", "destroy"]
  match '/about' => 'pages#about', :as => :about
  match '/contact' => 'pages#contact', :as => :contact
  match '/terms' => 'pages#terms', :as => :terms
  root :to => "pages#home"
  match '/:controller(/:action(/:id))'
end


何かの参考になれば幸いです。
2011/04/18
カテゴリ: 開発日誌 : Webサービス : 

執筆者: ariki (3:25 pm)
ユーザ参照、管理ページを作成したい。

ユーザ数が増えてくると、ページ送りができないと見づらい。

will_paginateというプラグインで簡単に実現できるようです。

というわけで、さっそくインストール。


$ sudo gem install will_paginate


次にアプリケーションのenvironment.rbに以下を追加します。


config.gem 'will_paginate', :version => '~> 2.3.11'


:version => '~> 2.3.11'は2.3.11以上の2.3.xでロードという意味。

コントローラーでUser.allとしていたものをpaginateで書き換えます。


class UsersController < ApplicationController
  before_filter :authenticate_user!

  def index
    @users = User.paginate(:page => params[:page], :per_page => 10)
    @title = "All users"
  end

 ・・・


ビューに以下を追加。追加した場所にページネーションが表示されます。


  <%= will_paginate(@users) %>


以上で終わり。簡単にできてしまいましたね。
2011/03/27
カテゴリ: 開発日誌 : Webサービス : 

執筆者: ariki (9:33 pm)
Railsにおけるファイルアップロード、やっぱりプラグインの利用が簡単そうです。

いくつかあるようなのですが、有名どころはfile_columnfleximageあたりですな。

Google先生に聞いたり、ドキュメントをちょっとかじったりしてみて、選択したのはfleximage。こちらの方がシンプルな感じがしました。

お世話になったのは「Railsで画像アップロード」というエントリ。すばらしいです、詳細は悩めるエンジニアが書く必要はありませんな・・・。

正方形のサムネイル画像を作成する際に、比率を変えずにはみ出た部分をカットするためオプション”crop => true”を指定したぐらいですかね。


@bike.operate do |image|
  image.resize('96x96', :crop => true)
end


本当にあっと言う間にできてしまったのであります。

ImageMagicとrmagickのインストールを忘れずに。

(1) 2 3 4 »

寄付のお願い
サイト維持、オープンソースソフトウェア開発継続のため、寄付をお願いします。
Googleで検索
広告
広告
マクロミルへ登録
お財布.com