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って・・・。
同様の問題でひっかかってる人がいた。
どうやらMac版JREの含まれる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用環境構築ではまったこと
に従って
# 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/
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 }
【参考にさせて頂きました。(というかただの組み合わせ・・・)】
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で展開するだけです。
コマメにセーブしたいので、よく使います。