Hatena::ブログ(Diary)

gentoopenguin83のメモメモ

2011-05-08

Snow Leopardでdev_appserverがsegfault【未解決】

$ dev_appserver.rb hello
=> Booting DevAppServer
=> Press Ctrl-C to shutdown server
2011-05-07 20:48:43.346 java[1486:1707] [Java CocoaComponent compatibility mode]: Enabled
2011-05-07 20:48:43.347 java[1486:1707] [Java CocoaComponent compatibility mode]: Setting timeout for SWT to 0.100000
2011/05/07 11:48:43 com.google.apphosting.utils.jetty.JettyLogger info
???: Logging to JettyLogger(null) via com.google.apphosting.utils.jetty.JettyLogger
2011/05/07 11:48:43 com.google.apphosting.utils.config.AppEngineWebXmlReader readAppEngineWebXml
???: Successfully processed /Users/****/workspace/GAE/hello/WEB-INF/appengine-web.xml
2011/05/07 11:48:43 com.google.apphosting.utils.config.AbstractConfigXmlReader readConfigXml
???: Successfully processed /Users/****/workspace/GAE/hello/WEB-INF/web.xml
2011/05/07 11:48:43 com.google.apphosting.utils.jetty.JettyLogger info
???: jetty-6.1.x
2011/05/07 11:48:44 com.google.appengine.tools.development.ApiProxyLocalImpl log
???: javax.servlet.ServletContext log: jruby 1.6.1 (ruby-1.8.7-p330) (2011-04-12 85838f6) (Java HotSpot(TM) 64-Bit Server VM 1.6.0_24) [darwin-x86_64-java]
Segmentation fault

segmentation faultって・・・。

同様の問題でひっかかってる人がいた。

Google App Engine for JRuby

どうやらMacJREの含まれるJava Update 4が悪いらしい。Java Update 3にしたら良いかもと言っているが、生活のメインマシンなので躊躇される。

過去のバージョン残ってないかと思って、アプリケーション - ユーティリティ - Java Preferencesから切り替えようとしても昔のバージョンが存在しない。

半日やって、全く進捗がなかった。

GAEデプロイすれば動作は確認出来るものの、デプロイ作業にはとても時間がかかり、デバッグが大変である。

ただし、デプロイして動かすにも以下の工夫が必要だった。

$ cat Gemfile 
# Critical default settings:
disable_system_gems
disable_rubygems
bundle_path ".gems/bundler_gems"

# List gems to bundle here:
gem 'jruby-rack', '<1.0.6'  ★最新の1.0.6は使えない?!
gem 'appengine-rack'
gem 'sinatra'

仕方ないので、今作ろうとしているWebアプリJavaで書く事にした。

ちなみに

Getting Started with JRuby on Google App Engine

を見ると、「DON'T UPGRADE TO appengine-sdk 1.4.2 !!!!!!!!!!!!!!!!!!!」とかも書いてある。色々と環境構築の問題ありすぎな気がする・・・。

また、そのうち再挑戦してみよう。

Herukuでそのままruby動かすのは楽で良かったなあ・・・。

2011-05-07

GAEのデプロイに失敗したときの対処

$ appcfg.rb --enable_jar_splitting  update .
・・・
Ctrl+Cとかで中断

$ appcfg.rb --enable_jar_splitting  update .
・・・
java.io.IOException: Error posting to URL: https://appengine.google.com/api/appversion/create?app_id=****&version=1&
409 Conflict
Another transaction by user **** is already in progress for this app and major version. That user can undo the transaction with appcfg.py's "rollback" command.

rollbackとやらが必要らしい。

$ appcfg.rb rollback .
・・・
0% Rolling back the update.
Success.
Cleaning up temporary files...

これで再度デプロイ作業を進められるようになる。

MacのGAE用環境構築ではまったこと

appengine-jruby

に従って

# Install the google-appengine gem
$ gem install jbundle
$ gem install google-appengine bundle

までは良かったのだが、実際にアプリを作ろうとしたらハマった。

$ appcfg.rb generate_app hello
=> Generating gemfile
=> Bundling gems
ERROR:  While executing gem ... (RuntimeError)
    Unknown command bundle

なんか、gemのバージョンが1.5なのが原因らしい。

森薫の日記

仕方ないのでgemをダウングレードします。

$ gem install -v 1.3.7 rubygems-update
$ update_rubygems

何とかERRORは出なくなりました。

# Start development server
$ dev_appserver.rb hello
・・・
The server is running at http://localhost:8080/

rvmでインストールされてたgemをそのまま使ってただけなんだけどなあ・・・

2011-02-28

rubyで文字コード調べる

require 'nkf'

p NKF.guess(str)

でオッケー。

2011-02-20

google翻訳を利用した英和-和英辞書コンソールコマンド

コマンドライン上で簡易的に英単語を調べるのに使います。

ソースコード変数名で悩んだときとかに使いたくて作りました。

hpricotをgemインストールすれば使えると思います。

ただし、ruby1.9だと英和が出来ません。なんかhpricotにおけるutf8の処理に問題があるようです(TODO:あとで調べる)。

【使い方とか】

$ rvm list
rvm rubies
       ruby-1.8.7-p330 [ x86_64 ]
       ruby-1.9.2-p136 [ x86_64 ]

$ rvm 1.8.7
$ ruby translator.rb こんにちわ
Hello
$ ruby translator.rb hello
こんにちは

$ rvm 1.9.2
$ ruby translator.rb こんにちわ
Hello
$ ruby translator.rb hello

/Users/hoge/.rvm/gems/ruby-1.9.2-p136/gems/hpricot-0.8.3/lib/hpricot/builder.rb:9:in `gsub': invalid byte sequence in UTF-8 (ArgumentError)
	from /Users/hoge/.rvm/gems/ruby-1.9.2-p136/gems/hpricot-0.8.3/lib/hpricot/builder.rb:9:in `uxs'
	from /Users/hoge/.rvm/gems/ruby-1.9.2-p136/gems/hpricot-0.8.3/lib/hpricot/tag.rb:139:in `to_s'
	from /Users/hoge/.rvm/gems/ruby-1.9.2-p136/gems/hpricot-0.8.3/lib/hpricot/traverse.rb:160:in `block in inner_text'
	from /Users/hoge/.rvm/gems/ruby-1.9.2-p136/gems/hpricot-0.8.3/lib/hpricot/traverse.rb:160:in `map'
	from /Users/hoge/.rvm/gems/ruby-1.9.2-p136/gems/hpricot-0.8.3/lib/hpricot/traverse.rb:160:in `inner_text'
	from /Users/hoge/.rvm/gems/ruby-1.9.2-p136/gems/hpricot-0.8.3/lib/hpricot/traverse.rb:160:in `block in inner_text'
	from /Users/hoge/.rvm/gems/ruby-1.9.2-p136/gems/hpricot-0.8.3/lib/hpricot/traverse.rb:160:in `map'
	from /Users/hoge/.rvm/gems/ruby-1.9.2-p136/gems/hpricot-0.8.3/lib/hpricot/traverse.rb:160:in `inner_text'
	from /Users/hoge/.rvm/gems/ruby-1.9.2-p136/gems/hpricot-0.8.3/lib/hpricot/elements.rb:108:in `block in inner_text'
	from /Users/hoge/.rvm/gems/ruby-1.9.2-p136/gems/hpricot-0.8.3/lib/hpricot/elements.rb:108:in `map'
	from /Users/hoge/.rvm/gems/ruby-1.9.2-p136/gems/hpricot-0.8.3/lib/hpricot/elements.rb:108:in `inner_text'
	from translator.rb:40:in `block in <main>'
	from /Users/hoge/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:627:in `start'
	from /Users/hoge/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/net/http.rb:490:in `start'
	from translator.rb:36:in `<main>'

【translator.rb】

#!/usr/bin/env ruby 
#-*- encoding: utf-8 -*- # ruby v1.9
#$KCODE = 'u'            # ruby v1.8

require 'rubygems'
require 'hpricot'
require 'net/http'
require 'kconv'

if ARGV.length == 0
    print "\nUsage : \n"
    print "#{$0} \"query sentense (Japanese or English)\"\n\n"
    exit
end

if ARGV.length>1
    print "\nError : \n"
    print "too many queries\n\n"
    exit
end

if ARGV[0] =~ /^[ -~。-゚]*$/
   # english
   query = "langpair=en|ja&text=#{ARGV[0]}"
else
    # japanese
    query = "langpair=ja|en&text=#{Kconv.kconv(ARGV[0], Kconv::UTF8)}"
end

Net::HTTP.version_1_2

#proxy_class = Net::HTTP::Proxy( 'proxy.hoge.com', 10080 )
#http = proxy_class.new( 'translate.google.com', 80 )
#http.start { |http|
Net::HTTP.start( 'translate.google.com', 80 ) { |http|
    response = http.post('/translate_t', query)
    puts Hpricot(response.body).search("#result_box").inner_text.toutf8
}

【参考にさせて頂きました。(というかただの組み合わせ・・・)】

rubyで半角のみ、全角のみを判定する正規表現

Google 翻訳に問い合わせて英語を日本語に翻訳するプログラムを Ruby で

2011-02-14

ruby 1.9とhpricot

1.8では気軽に使っていたhpricot。1.9ではutf-8の問題に悩まされている。

p doc = Hpricot(response.body).search("#result_box").inner_text

とかやると

hpricot/builder.rb:9:in `gsub': invalid byte sequence in UTF-8 (ArgumentError)

と怒られる。utf-8に対してinner_textが実行出来ないらしい。

文字列にさえしてしまえばencodeする方法があるけど、hpricot内部の問題っぽいのでどうしたら良いのか分からない・・・

ちょっとしたバックアップ方法

以下のスクリプトをbackup.shとか名付けて保存します。

#!/bin/bash

if [ -d archive ]
then
	:
else
	mkdir archive
fi

if [ -f archive/backup_log.txt ]
then
	:
else
	touch archive/backup_log.txt
	echo "[ backup log ]" >> archive/backup_log.txt
fi

tar cvf ./archive/`date +%y%m%d_%H%M`_$1_$2.tar ./$1
gzip ./archive/`date +%y%m%d_%H%M`_$1_$2.tar
echo `date +%y%m%d_%H%M` : $2 >> archive/backup_log.txt

あとはchmodで実行出来るようにし、

% ./backup.sh  バックアップしたいファイルorディレクトリ  コメント(任意)

とすれば、日時のついたtar.gzに固めて、./archive以下に(なければ自動作成し)保存してくれます。

丸ごと入っているので、必要なときはtar zxfvで展開するだけです。

コマメにセーブしたいので、よく使います。