<?xml version="1.0" encoding="UTF-8"?><!-- generator="WordPress/2.8.5" -->
<rss version="0.92">
<channel>
	<title>ものぐさ備忘録</title>
	<link>http://www.ginriki.net/wd</link>
	<description>ソフトウェア関係の話を中心とした備忘録的日記</description>
	<lastBuildDate>Sun, 11 Jul 2010 15:48:08 +0000</lastBuildDate>
	<docs>http://backend.userland.com/rss092</docs>
	<language>ja</language>
	
	<item>
		<title>NetBeansからRuby on Rails(RoR)のリモートデバッグ</title>
		<description>NetBeansには、rubyのデバッガフロントエンドが同梱されています。
今回は、それを使ってRuby on Rails(以下RoR)のリモートデバッグをするためのメモです。

個人的には、RoRが動いてるマシンにsshでログインした後、emacsとrubydb3x.elを使う方がメリットがあるsshのポート(TCP 22)が開いてることは普通にありますが、デバッガ・デバッギ通信用のポートがfirewallで遮断されることは良くあります。と思いますが、emacsの場合デバッガ用GUIはありません。GUIに慣れてる人はNetBeansの方が楽なので、そういう人向けにまとめます。

なお、NetBeansをインストールしたローカルマシンで、RoRも動かす場合のデバッグ方法は、NetBeansのwikiを参照してください。

まあ、ローカルマシン上でデバッグする場合も、リモートマシンと接続してデバッグする場合もやり方はほとんど変わりません。

どちらの場合も、デバッギプロセス（と同じプロセス上で動くruby-debug-ide)がTCP(デフォルトだと1234)をListenし、Netbeansからそこに接続してデバッグを開始します。Netbeansから接続するデバッギプロセスがlocalhostにいるか、リモート先のホストにいるかの違いしかないです。
接続後、Netbeansからruby-debug-ideへbreakpointをしかける場所などを指示します。

デバッグ方法そのものは、ローカル・リモートともに一緒ですが、リモートのホストに対してローカルのNetBeansを接続してデバッグするには、リモート先のホストで以下の作業が必要です。

	rubyインストール (解説略)
	RubyGemsインストール (解説略)
	RoRインストール・プロジェクト作成 (解説略)
	ruby-debug-ideインストール
        リモート先のRoRプロジェクトのソースコードを、ローカルにも展開
	ruby-debug-ide付きでRoRプロジェクトのWebサーバ起動

4, 5, 6の手順は、あまりネット上で見かけないので順に解説します。

ruby-debug-ideインストール
Linuxだと、gemで簡単にインストールできます。(gcc, ruby-develをインストールしておけば。)
Fedora8だと以下で終わりでした。

$ gem install ruby-debug
$ gem install ruby-debug-ide


Windows（のmswin版ruby）の場合、コンパイル環境の用意が面倒なので、コンパイル済みgemをダウンロードした上でインストールします。最近だと、Visual C++は無料で手に入りますがmswin版rubyをコンパイルしたVisual C++と同じバージョンをインストールする必要しないと「MSC version unmatch」エラーが出てめんどくさいです。http://rubyforge.org/tracker/index.php?func=detail&aid=16774&group_id=1900&atid=7436

&#62; gem install -l linecache-0.43-mswin32.gem
&#62; gem install -l ruby-debug-base-0.10.3-mswin32.gem
&#62; del ruby-debug-base-0.10.3-mswin32.gem
&#62; gem install ruby-debug
&#62; gem install ruby-debug-ide -v 0.4.6

コンパイル済みgem (linecache, ruby-debug-base)は以下２つのリンク先から
それぞれダウンロードしてください。

linecache
ruby-debug-base


リモート先のRoRプロジェクトのソースコードを、ローカルにも展開
ローカルにもソースコードを置かないと、breakpointで止まった時にNetbeansにソースコードが読み込まれません。
注意点としては、リモートと同じフルパス上にソースコードを置く必要がある点です。リモート先で、/var/www/railsprjにRoRのプロジェクトコードが置いてあるなら、ローカルでも/var/www/railsprjにプロジェクトコードを置く必要があります。WindowsとLinuxだとフルパスを一致させることが不可能なので、例えば、Windows上のNetBeansからLinux上のRoRがデバッグができないという点でかなりアレな仕様です。誰もやってないなら修正パッチ作るかな。

この辺の挙動理解には、 </description>
		<link>http://www.ginriki.net/wd/2010/07/12/172/</link>
			</item>
	<item>
		<title>バッチファイル作成ノウハウ</title>
		<description>Windowsのバッチファイルを作る機会があったので、その時のノウハウメモ。
サービスの状態確認
サービスの起動・停止状態の出力させるには、sc.exe queryが使える。(ただし、Windows XP／Windows Server 2003以降)
後は、findstr (Windows用のgrep)と合わせて使えばいい。

たとえば、タスクスケジューラが起動しているかどうかの確認バッチファイルを
作ると以下の通り。
@echo off

sc.exe query Schedule &#124; findstr STATE &#124; findstr RUNNING &#62; nul
if %ERRORLEVEL% == 1 echo Scheduler isn't running
if %ERRORLEVEL% == 0 echo Scheduler running
実行結果（タスクスケジューラ起動時）は以下の通り。
C:\&#62;service_check.bat
Scheduler running
上のバッチファイルのコツは、

	無駄なecho表示を消すこと(@echo off)
	findstrの出力をnull deviceに出力させること( &#62; nul)
	findstrのマッチ結果を%ERRORLEVEL%で調べること

ちなみに、nulというnull device名の歴史をたどると、古い順に、

PIP &#62; CP/M &#62; MS-DOS &#62; Windows

という流れで受け継がれてます。PIPのWikipediaページとか、MSDNの予約ファイル名の説明とか参照。

バッチファイル内の特殊記号
バッチファイル上で、特殊記号として扱われるものがいくつかあります。
例えば、括弧()が特殊記号です。このような記号を普通の文字として扱いたいときは、^を特殊記号の前に付ける必要があります。

例は以下の通り。

@echo off
if 1 == 1 (
  echo foo ...</description>
		<link>http://www.ginriki.net/wd/2010/06/21/162/</link>
			</item>
	<item>
		<title>色々なtarフォーマットの確認方法</title>
		<description>tarファイルには、いくつかのフォーマットがあるのだけど、何らかのコマンドで作成したtarファイルが
どのフォーマットで作られているか判断するやり方が見当たらないのでメモしとく。

なお、メジャーなフォーマットは以下らしいPythonのtarfileライブラリのマニュアル参照。。

POSIX.1-1988 ustar format
GNU tar format
POSIX.1-2001 pax format

利用者から見たフォーマット間の大きな違いは、ustar形式のtarフォーマットの場合、tarでまとめる各ファイルのファイル名が256文字制限だったり、各ファイルのサイズ制限が8GBになってること。残りの２つのフォーマットは制限なし。その代わり、他と比べてustar形式は歴史がある形式なので、対応しているツールも多い。

ちなみに、普通のlinux上のtarプログラム(=GNU tar)がデフォルトで使うtarフォーマットは--helpを付ければわかる。
以下のように、最近のtarプログラムならgnuフォーマットのはず。

# tar --help
[...略]
*This* tar defaults to:
--format=gnu -f- -b20 --quoting-style=escape --rmt-command=/sbin/rmt


・tarファイルのフォーマットの見分け方
hexdumpコマンドでtarファイルを出力し、tarファイル内にアーカイブされた各ファイルのtarヘッダ（とpaxヘッダ)で見分けます。ヘッダの概説は </description>
		<link>http://www.ginriki.net/wd/2010/06/14/136/</link>
			</item>
	<item>
		<title>Ruby/Jrubyの実行時フックの低レベルAPI</title>
		<description>メモ。

RubyやJRubyには、特定の条件(コード行が変化したとか、メソッドを呼び出したなど）を満たした時に呼び出されるフック処理を定義することができます。

Ruby-1.8の低レベルなフック追加API(=C言語API)は、
thread.cのrb_add_event_hook関数。シグネチャは以下。

void rb_add_event_hook(rb_event_hook_func_t func, rb_event_flag_t events, VALUE data);


JRuby-1.4.0で上記関数にほぼ対応するのは、Ruby.javaの
Ruby.addEventHookメソッド。シグネチャは以下。

public void addEventHook(EventHook hook)


引数の型であるEventHookやその継承クラスは以下参照。

public abstract class EventHook (runtime/EventHook.java)

public class CallTraceFuncHook extends EventHook (Ruby.java)


フックAPIの挙動についての仕様書って、どこにもない感じだなあ。 </description>
		<link>http://www.ginriki.net/wd/2010/04/08/129/</link>
			</item>
	<item>
		<title>JRuby実行中にjdbでアタッチしてrubyプログラムのbacktrace</title>
		<description>Ruby自身のデバッガだと、任意のタイミングでアタッチしてbacktrace見るといったことができない（はず）なので、もっと低レベルのデバッガを利用して、それを実現する方法についてメモ。今回はJRubyに対してjdbでアタッチ＆backtraceする方法についてのメモです。
なお、CRubyの場合は、以前の記事とか、さらにその先のリンク先を見れば良いです。
ちなみに、今回試したJRubyのversionは以下の通り。OSはCentOS 5.3です。

$ jruby --version
jruby 1.3.1 (ruby 1.8.6p287) (2009-06-15 2fd6c3d) (Java HotSpot(TM) Client VM 1.6.0_16) [i386-java]


jdbによるbacktrace
まず、アタッチ対象例のRubyコードとして以下を用意。

sample.rb
[RUBY]
def foo
  p "abc"
  bar
end

def bar
  p "foge"
  sleep(1000)
end

abc
[/RUBY]

そして、デバッガattach用のポートを開けて起動しますここの「Debugger」の項目を参考にオプション設定しました。。

$ jruby -J-Xdebug -J-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n sample.rb


barメソッド内のsleepの実行をしているうちに、別のターミナルを開いてjdbでアタッチし、スレッドを停止させます。

$ jdb -attach 8000
> suspend
すべてのスレッドが中断されました


そして、backtraceを表示させます。以下の方法で大体表示できます(いい加減なやり方ですが)。

> threads
グループ system:
  (java.lang.ref.Reference$ReferenceHandler)0x9db Reference Handler 状況待機中
  (java.lang.ref.Finalizer$FinalizerThread)0x9da  Finalizer     ...</description>
		<link>http://www.ginriki.net/wd/2010/01/12/114/</link>
			</item>
	<item>
		<title>autoloadで自動読み込みされないファイルをユーザアクセス毎に再読み込みする</title>
		<description>今回はRuby on Railsについてメモ。

autoloadで自動読み込みされないファイルRailsの場合、クラス定義と定義が記述されたファイルの名前が対応づいてないとautoloadで自動読み込みされません（たぶん）。例えば、FooBarというクラスの定義はfoo_bar.rbというファイルの中で行われてないとautoloadにされません。をcontrollerの中などでrequireを使って読み込んだ場合、そのファイルはdevelopmentモード時でもユーザアクセス毎に再読み込みされません。そのため、ファイルを編集してもwebサーバを再起動しないと変更が反映されないので、デバッグがやりづらくて困ってました。

解決策がないかと思って、ググってみたところ、以下のページに解決策が書いてありました。
http://www.pistolfly.jp/weblog/2007/06/require-dependency.html

requireじゃなくて、require_dependencyでファイル読み込みすれば良いということでした。
require_dependencyの挙動については、上のリンク先を参照してください。
この辺り(autoload周辺)って、Ruby on Rails公式なドキュメントが見当たらないですねえ。・・・実装を読めってことか。

以下、問題のコード例と解決方法。(ruby 1.8.5, rails 2.3.3, WEBrick 1.3.1で実験しました。)

ファイル読み込みの対象となるファイルを用意します。

&#060;rails_project&#062;/lib/hoge_fuga.rb
[RUBY]
class Hoge
  def hoge
    return "abc"
  end
end
[/RUBY]

上のファイルを読み込むcontrollerを用意します。
このとき、requireの代わりにrequire_dependencyでファイルを読み込みます。

&#060;rails_project&#062;/app/controllers/test_controller.rb
[RUBY]
#require 'hoge_fuga'
require_dependency 'hoge_fuga'

class TestController < ApplicationController
  def hoge
    a = Hoge.new
    render(:text => a.hoge)
  end
end
[/RUBY]

んで、Webサーバを起動。

$ cd &#060;rails_project&#062;
$ ruby script/server


で、ブラウザからtest/hogeにアクセスすると、ブラウザ上にabcが出力されます。
この状況で、&#060;rails_project&#062;/lib/hoge_fuga.rbを以下のように書き換えてみます。
[RUBY]
class Hoge
  def ...</description>
		<link>http://www.ginriki.net/wd/2009/12/31/102/</link>
			</item>
	<item>
		<title>Hyper Estraierで文書検索 (+ CentOS用rpm作成)</title>
		<description>扱う文章の数が膨大になって管理しづらくなってきたので、Hyper Estraierの導入を検討しました。せっかくなので導入手順をメモ。
ちなみに、自分のローカルマシン(Windows)内の文書を管理したいだけなら、Hyper Estraierをエンジンに積んだDesktopHEを使えば十分と思います。でも、index作成がなんか遅い気がする。まあ、気のせいかも

FedoraやVine LinuxだとEstraierのrpmパッケージが公式に存在するので、yumとかapt-getでインストールすればいいのですが、CentOSにはrpmパッケージがありません。

調べてみると、Vine Linuxのsrpmを使うと楽ということなので、srpmからrpmbuildします。だれかCentOS用hyperestraierのyumリポジトリ作ってくれませんか？(他力本願)

まず、Vine LinuxのSRPMリポジトリからqdbm,mecab,mecab-ipadic,hyperestraierをダウンロードします。
その後、以下のようにrpmbuild & install (rpmbuildなどは、yum install rpm-buildなどで入れておくこと)。

# rpmbuild --rebuild qdbm-1.8.77-1vl5.src.rpm
# rpm -ivh /usr/src/redhat/RPMS/[arch]/qdbm-1.8.77-1.i386.rpm qdbm-devel-1.8.77-1.i386.rpm

# rpmbuild --rebuild mecab-0.97-2vl5.src.rpm
# rpm -ivh /usr/src/redhat/RPMS/[arch]/mecab-0.97-2.i386.rpm mecab-devel-0.97-2.i386.rpm

# rpmbuild --rebuild mecab-ipadic-2.7.0.20070801-1vl5.src.rpm
# rpm -ivh /usr/src/redhat/RPMS/[arch]/mecab-ipadic-2.7.0.20070801-1.i386.rpm

# rpmbuild --rebuild hyperestraier-1.4.13-2vl5.src.rpm
# rpm -ivh /usr/src/redhat/RPMS/[arch]/hyperestraier-1.4.13-2.i386.rpm hyperestraier-perl-1.4.13-2.i386.rpm


これでインストールは完了。

インデックスの作成方法は以下ページ参照。

ローカルマシンの特定のディレクトリ以下の文書をインデックス化する場合(estcmd gather)
Webサーバの文書をcrawlする場合 (estwaver)


/home/user/doc以下の文書をインデックス化して、/var/estraier/indexにインデックス作成する場合のコマンド例は以下。

$ estcmd gather -il ja -sd /var/estraier/index /home/user/doc


後は、検索用のWebページを用意すれば終わり。CentOSの場合は以下の通り。

# yum install httpd
# ...</description>
		<link>http://www.ginriki.net/wd/2009/12/07/94/</link>
			</item>
	<item>
		<title>rubyプロセスのコアファイルからバックトレースする。（おまけ: python）</title>
		<description>某所で、「rubyプロセスがSEGVとかした時のコアファイルから、rubyスクリプトのバックトレースは取れるの？」って聞かれたので、ちょっと調べてみました。

結論としては、「rubyメソッドの呼び出し位置(ファイル名, 行番号)は取れるけど、呼び出し時の実引数を見るのは難しい」っていう感じです。
rubyのスタックフレームは、当然、rubyプロセスのメモリ上に構築されるので、スタックフレームのデータ構造さえわかれば、ある程度は表示できます。

ただ、コアファイルを出力したrubyプロセスはすでに存在しないので、ruby実装に使われているC関数をデバッガで（正確にはrubyプロセス上で）実行することができません。
そのため、オブジェクトのinspectなどを実行することが難しく、実引数のオブジェクトが何か調べることが困難です。ということで、今回はスタックフレームを表示させる方法を以下で説明します。

rubyスタックフレームを表示するGDBスクリプトは以下になります(rb_dump.gdb)。
(moriyoshiさんのブログ「 GDBで実行中のスクリプト言語のスタックフレームをダンプしてみる試み」のコードをほとんどそのまま使わせていただきました。ありがとうございます。)

[code]
define dump_rb_bt_from_core
  set $t = ruby_frame
  while $t
    printf "[0x%08x] ", $t
    if $t->node.nd_file
      printf "(%s:%d)\n", $t->node.nd_file, ($t->node.flags >> 19) & ((1 prev
  end
end

document dump_rb_bt_from_core
  dumps the current frame stack from core file. ...</description>
		<link>http://www.ginriki.net/wd/2009/11/09/80/</link>
			</item>
	<item>
		<title>CentOS 5にAspire Timeline (3810T)の有線LANドライバを入れる</title>
		<description>今年(2009年)の夏に、Aspire Timeline(3810T)を買いました。
元々Windows Vistaが入っていましたが、ついでにCentOS 5.32009/10に、CentOS 5.4がリリースされましたねを入れてデュアルブートできるようにしました。

ただ、CentOS 5.3には (たぶん、CentOS 5.4にも) Aspire Timelineの有線LANドライバが入ってないので、ドライバを探してきて入れました。

ドライバは、http://partner.atheros.com/Drivers.aspxのAR81Family Linux Driverになります。私がダウンロードしたときは、AR81Family-linux-v1.0.0.10.tar.gzっていうバージョンでした。

いつの間にか、リンク切れになってました（partner.atheros.comのサイト自体なくなったようです）。12/2時点では、ドライバはここにあります。（katty9015さん、情報ありがとうございます）
ファイル名もAR81Family-linux-v1.0.0.10.tar.gzからAR81Family-linux-v1.0.1.0.tar.gzに変わったので、以下の記事を読むときは注意してください。

USBメモリとかでAspire TimelineのCentOS上にAR81Family-linux-v1.0.0.10.tar.gzを入れた後は、以下のようにコンパイル/インストールすれば、有線LANが使えるようになります。

$ tar xzvf AR81Family-linux-v1.0.0.10.tar
$ cd src/
$ make
$ make install       # 要root権限
$ reboot             # 再起動


おまけ (Intel VTの有効化)
Aspire Timeline(3810T)のCPUはIntel VTに対応してるのですが、BIOSで有効化できないため、そのままだとIntel VTが使えません。
とはいえ、CentOSのXenでWindowsが起動できないのも味気ないです。
以下の２つのリンク先を参考にいじれば、BIOSでIntel VTを有効にできます。Acerのサポート外になってしまうので、いじるときは自己責任でお願いします。

Acer ...</description>
		<link>http://www.ginriki.net/wd/2009/11/04/73/</link>
			</item>
	<item>
		<title>GPSログと撮影時刻を元に移動経路と写真をGoogle mapへ表示</title>
		<description>
半年ほど前に、ハンディGPSのGarmin Oregon 300を買いました日本語版は高いので、英語版をYahooオークションで45,000円程度で買いました。Amazon.comが使えればもっと安く買えたのですが、日本から電気機器類を注文できないようです。。
私の主な用途は旅行などの移動経路を記録することですが、地図情報をちゃんと入れておけば道に迷った時も重宝します。

今回は記録した移動経路と移動経路上で撮った写真をgoogle mapに表示する方法について説明します。
・・・といっても、フリーソフトの轍 Wadachiを使えば簡単に表示できます轍はWindows専用ソフトのようです。MacやLinuxの人はごめんなさい。。

基本的な使い方は上のリンク先の「標準的な作業の流れ」を見てもらえればよいです。
ロンドン旅行したときの移動経路ログと写真を轍で編集してGoogle mapで表示したものを下記に貼りました表示時刻が日本時間になっているので注意。ロンドン時間では-9時間してください。。移動経路は日付ごとに色分けしてあります。

 ロンドン移動経路[gpxview=all]

轍以外の移動経路ログ編集ツールとして使えるソフトとして下記があります。

GMapWidget
GMM2

個人的には、轍が一番使いやすいです。たぶん、写真の縮小画像を自動生成してWaypointとしてgoogle mapで表示する機能があるからだと思います。

この記事の残りで、轍のサイトに載っていない下記作業手順について書きます。


移動経路ログファイルから一部のログを消す。
HTMLファイルを使わず、kmlのみでgoogle mapを表示する。上のgoogle mapはkmlのみを使用してます。


Oregon 300は、移動経路のログをGPX形式で保存しますOregon 300の設定にもよりますが、通常、10秒ごとに現在位置をtrkタグとして書き込むようになっています。。下記説明もGPX形式のログデータが対象です。まあ、他の形式でも同じだと思います。

移動経路ログファイルから一部のログを消す
ログファイル内の、ある地点のログからGoogle mapで表示したい場合などにこの作業が必要です。
表示を開始したい地点の時刻を調べるためにGoogle Earthを使い、その後、開始地点前のログデータを削除するためにGPSbabelを使いますGPXファイルはXMLで書かれてるので、テキストエディタで手作業で消してもいいですが、GPSBabelの方が楽だと思います。GPX以外のファイル形式にも対応してるし。。
Google Earthを使う利点は、下記２点です。

地図を表示しながら開始地点を探せる。
GPXファイルのtrkpt表示数に制限がないっぽい。Google mapだと、trkptやwptなど合わせて1000件(100件だったかな？規約に書いてある？）しか表示できませんが、Google Earthには制限がないようです。


一部ログを消す手順は下記の通りです。


Google Earthを起動
Google EarthのウインドウにGPXファイルをドラッグ＆ドロップ
「トラック ポイントとルート ポイントにクリック可能なイメージを作成する」にチェックを付けてインポート。チェックしないと、各地点の時刻を調べることができません。
起点となるトラックポイントを探してクリック。すると下記ポップアップが出てくると思います。ここのtimeの値を後で使います。もうGoogle Earthは閉じてよいです。




GPSBabelのgui版を起動。InputとしてGPXファイルを指定し、Outputのファイル名は好きなのを付ける。FormatはInput, Outputともに「GPX XML (.gpx)」です。設定例は下記画像の通り。



Filterボタンを押して、Google Earthで調べた時刻をTracksのStart atに設定する。設定例は下記画像。



「let's go」ボタンをクリックして変換すれば終了。後は、変換したGPXファイルを轍で読み込んで作業すればよいです。ちなみにコマンドラインでgpsbabelを実行する場合は下記のようにすればよい。

gpsbabel.exe -p "" -w -r -t -i gpx -f "MAR-17-09 062255 AM.gpx" -x track,start=20090316153053 -o gpx -F "MAR-17-09_in_london_test.gpx"

HTMLファイルを使わず、kmlのみでgoogle mapを表示する。

基本的には、轍で編集したデータをKMLでエクスポートして、KMLと轍が生成した縮小画像をWebサーバにアップロードすればよいです。
ただし、kml内の縮小画像への相対パスをフルパス（例：　http://www.ginriki.net/～)にする必要があります。
適当に、テキストエディタなどで置換してください。私は下記のようにsedでやりました。
$ sed 's/tour_images\//http:\/\/www.ginriki.net\/wd\/wp-content\/uploads\/maps\/tour_images\//g' tour.kml  ...</description>
		<link>http://www.ginriki.net/wd/2009/07/20/61/</link>
			</item>
</channel>
</rss>
