2009年03月03日(火) [長年日記]
■ [ruby][dev] Ruby Gnuplotを使った

Ruby Gnuplotを使ったのでメモ。
Ruby GnuplotはgnuplotをRubyから使うためのライブラリ。gnuplot自体を使ったことがない(大昔に使ったかも)ので苦労したが、なんとか動かせた。
星形を描くサンプルプログラムを示す。
#!/usr/bin/ruby
#coding: utf-8
require "rubygems"
require "gnuplot"
# プロットするデータ
triangle1 = [[10, 70, 40], [20, 20, 70],
[60, -30, -30], [ 0, 50, -50]]
triangle2 = [[10, 70, 40], [60, 60, 10],
[60, -30, -30], [ 0, -50, 50]]
Gnuplot.open {|gp|
Gnuplot::Plot.new(gp) {|plot|
# gnuplotにsetできるオプションは全てPlotクラスのメソッドになっている
plot.terminal("png")
plot.output("graph-sample.png")
plot.xrange("[0:80]")
plot.yrange("[0:80]")
plot.size("square 0.5,0.5")
plot.title("Star")
triangle1[0].each_index {|i|
plot.label("\"[#{i}]\" at #{triangle1[0][i]},#{triangle1[1][i]}")
}
# プロットするデータをDataSetへ込めてPlot#dataに設定する
plot.data = [
Gnuplot::DataSet.new(triangle1) {|ds|
ds.with = "vectors"
ds.notitle
},
Gnuplot::DataSet.new(triangle2) {|ds|
ds.with = "vectors"
ds.notitle
}
]
}
}
■ やること
- 請書
2009年03月04日(水) [長年日記]
■ [ruby] RubyGemsでインストールしたライブラリをrequireする方法
昨日のスクリプトでは 'rubygems' をrequireするように書いたが、これは正しい作法ではないように思ったので調べた。
- 3.4 Post-install -- Setting Up the RubyGems Environment (RubyGems User Guide)
に、
- rubyコマンドに「-rubygems」オプションを付与して実行する
- 同じことだが、環境変数RUBYOPTに「rubygems」を追加する
とする方法が書かれていた。
■ [ruby] rcairoを使った

るびま0019号で紹介されていた2次元画像描画ライブラリcairoのRubyバインディングであるrcairoを使ってみた。
まだあまりよく分かっていないけれど、昨日と同じ星形を描いてみたのでメモ。ふむ、show_textを呼ぶと点の位置がずれてしまうのか。
#!/usr/bin/ruby
require 'cairo'
# プロットするデータ
triangle1 = [[10, 20], [70, 20], [40, 70]]
triangle2 = [[10, 60], [70, 60], [40, 10]]
surface = Cairo::ImageSurface.new(200, 180)
context = Cairo::Context.new(surface)
# 座標系の変換。斜めにずらして2倍の大きさに。
context.translate(10 , 10)
context.scale(2, 2)
# 赤い線
context.line_width = 2
context.set_source_color(:red)
context.stroke {
context.move_to(triangle1.last[0], triangle1.last[1])
triangle1.each_with_index {|t, i|
context.line_to(t[0], t[1])
context.save {
# 番号を出力
context.set_source_color(:black)
context.font_size = 10
context.show_text("[#{i}]")
}
}
}
# 緑の点線
context.line_width = 1
context.set_dash([5, 2])
context.set_source_color(:green)
context.stroke {
context.move_to(triangle2.last[0], triangle2.last[1])
triangle2.each {|t|
context.line_to(t[0], t[1])
}
}
surface.write_to_png("star-sample.png")
■ やること
- 請書
2009年03月05日(木) [長年日記]
■ [unix][soft][windows] Sambaをインストールした
いちいちsftpで転送していたが面倒になってきたので、久しぶりにSambaをインストールした。対象はCentOS 5でyumを使ってインストール。設定したことをメモ。
ユーザの追加
Sambaへユーザを追加する必要がある。
# smbpasswd -a kenichi
でOK。
(追記) Samba 3からはsmbpasswdではなくpdbeditコマンドを使う方がいいみたい。
サービスの起動
インストールしただけではSambaのサービスプロセスは起動しない。
# /etc/init.d/smb start
で起動。
が、ホームディレクトリを閲覧できない
これでWindowsからCentOSマシンを見られるようになったが、そこに表示されているkenichiフォルダを開こうとすると
\\xxx\kenichi にアクセスできません。このネットワークリソースを使用するアクセス許可がない可能性があります。アクセス許可があるかどうかこのサーバーの管理者に問い合わせてください。
ネットワーク名が見つかりません。
というエラーダイアログが表示されてしまう。
SELinuxの設定を変更
設定がおかしいのだろうと /etc/samba/smb.conf ファイルを眺めていたら、先頭のコメント部分に「SELINUX NOTES:」というセクションがあり、そこに
# If you want to share home directories via samba please run: # setsebool -P samba_enable_home_dirs on
とあったので意味も分からずこのコマンドを実行したら、Windowsからホームディレクトリを閲覧できるようになった。setsebool コマンドは /usr/sbin にある。
プリンタの設定を削除
Windowsから「プリンタとFAX」というアイコンが見えるのが気に入らなかった。マニュアルに
[printers] セクションが設定されていると、ユーザは、 ローカルホストの printcap ファイルで設定されている各プリンタに接続することが可能となる。
と書かれていたので、このセクションを設定しなければ表示されなくなるのではないかと考え /etc/samba/smb.conf から当該個所をコメントアウトしたら、「プリンタとFAX」は表示されなくなった。
CUPSのエラーが出ていた
/var/log/messages を見てみたら、
Unable to connect to CUPS server localhost:631 - 接続を拒否されました
というエラーがたくさん出力されていた。ribbon の日記に
この現象は printing = bsd にすれば直るのだが、それもなんか変な話。
と書かれていたので printing = bsd を追記してみたらエラーログは出力されなくなった模様。
■ やること
- 請書
2009年03月10日(火) [長年日記]
- 色々な作業を並行して行っていて落ち着かない。
■ [ruby] RubyでSubversionを操作
Subversion本家でRuby用のライブラリが公開されているというので使ってみた。Windows & Apach 2.0用なら http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91 に svn-win32-1.5.6_rb.zip などとして置かれていた。アーカイブ内にあるファイルをRubyから見える場所に配置して使う。gemにはなっていないみたいで不便。
ドキュメントが全然ないようで、みんな困っているみたい。おれは認証回りがうまく動かず難儀したが、色々なサイトを参考にして export を行う処理を書けたのでメモ。
#!/usr/bin/ruby
# config: utf-8
require "svn/client"
# Contextを作って操作するのが基本みたい
svn_ctx = Svn::Client::Context.new
# Contextに認証情報を設定する。
# add_simple_prompt_provider を使うとうまくいった。
# providerの使い方はよく分かっていない。
# username, passwordを設定しないとRubyがSegmentation faultになる...
svn_ctx.add_simple_prompt_provider(0) {|cred, realm, username, may_save|
cred.username = "kenichi"
cred.password = "password" # XXX
}
# exportを実行。戻り値でリビジョン番号を取得できた。
remote = "http://oreore/svn/src/nantoka"
local = "kantoka"
revision_number = svn_ctx.export(remote, local)
puts "Revision #{revision_number} is exported."
■ やること
請書- ゴミ袋
- 換金
2009年03月16日(月) [長年日記]
■ [life] また熱が出た
1月に続き今年2回目。病弱になってきたのかな。
土曜の夜に寒気を感じ、日曜の朝はフラフラな状態。日曜日は少しテレビを観たりしたけどほとんど寝てた。なかなか眠ることができず辛かったが、深夜3時くらいから調子がよくなってきた。今日は仕事できる状態にまで戻れたけど、まだ完治はしていない感じ。
■ [unix][howto] ウィンドウのタイトルを変更する
Puttyのウィンドウタイトルにログイン中のホスト名を表示したくて調べた(何もしなくても接続したホストのホスト名が表示されているが、そこから更に別のホストにログインしたときにウィンドウタイトルを変えたかった)。
xterm は、特定のリソースの設定のために ESC ] (OSC) を受け付ける。 ECMA-48 の文字列終端文字 (ST) に加えて、 xterm(1) は BEL を OSC 文字列を終端するものとして受け付ける。以下は xterm(1) が認識する OSC コントロールシーケンスの一部である。
ESC ] 0 ; txt ST アイコン名とウインドウタイトルを txt にセットする。
ESC ] 1 ; txt ST アイコン名を txt にセットする。
ESC ] 2 ; txt ST ウインドウタイトルを txt にセットする。
とあった。「ST」ってなんだろうと思ったが、「文字列終端文字 (ST) に加えて、 xterm(1) は BEL を OSC 文字列を終端するものとして受け付ける。」とあるのでBEL(^G)を使えばいいようだ。
んで、bashのechoは -e オプションを使うと \e でエスケープ文字を、\a でベルを出力するようなので、
$ echo -ne "\e]2;`hostname`\a"
を実行すればウィンドウタイトルにホスト名が表示される。これを関連ホストの .bash_profile に書いてみた。
■ やること
ゴミ袋- 換金
2009年03月18日(水) [長年日記]
- 昨日はhrくんの送別会。プレゼントの磁石のやつで大喜びしているのが面白かった。
- 体調は大分よい。だがノドが痛いのは治らない。今週は急に暖かくなったりして体に優しくないので気をつけないと。
- WBCやっている。今日は韓国戦だった。原ニッポンではなく侍ジャパンなんだって。
■ [java] Java SE 6 の「新機能と拡張機能」の日本語訳
Java SE 6の日本語ドキュメントにある「新機能と拡張機能」のリンクには「(java.sun.com の Web サイトのみ) 」という注釈が書かれていて英語ページにリンクしている。
が、日本語訳もちゃんとあったのでメモ。
Java SE 6へ移行する理由と移行をとどまる5つの理由の「関連URL」から辿った。
■ [book] ストロベリーナイト (誉田哲也)
凄惨な出だしや殺害シーンと姫川チームの軽いノリのギャップがすごい。登場人物のキャラクターが出来上がっていたのでシリーズ物かと思ったけどこれがシリーズ1作目みたい。ガンテツがぐいぐい出てくるようになってから面白くなった。黒幕の正体は不可解。3.8点。
■ やること
- 換金
2009年03月25日(水) [長年日記]
■ [ruby] Net::SCP を使った
RubyでSCPを使ってファイルをアップロードするサンプルをメモ。Net::SCPライブラリを使う(追記:最新のドキュメントはgithub上にあるみたい)。
サンプルではパスワード認証を使っているが、公開鍵認証も使える。WindowsでPageantが動いているとパスフレーズを与えなくても動いた。
#!/usr/bin/ruby
# coding: utf-8
require "net/scp"
require "net/ssh"
require "net/ssh/prompt"
# Promptをincludeするとpromptメソッドが使えるようになる。
# ただし別途HighLineライブラリをインストールすべき。
# see: http://net-ssh.rubyforge.org/ssh/v2/api/classes/Net/SSH/PromptMethods.html
include Net::SSH::Prompt
unless ARGV.size == 2
$stderr.puts "Usage: #{$0} <local file> <remote host>"
exit 2
end
local_path = remote_path = ARGV[0]
remote_host = ARGV[1]
# ユーザ名とパスワードを入力してもらう。
# promptの第2引数にfalseを指定するとエコーバックしなくなる。
user_name = prompt("Please input user name:", true)
password = prompt("Please input #{user_name}'s password:", false)
puts "Uploading to #{user_name}@#{remote_host} ..."
Net::SCP.start(remote_host, user_name, {:password => password}) {|scp|
scp.upload!(local_path, remote_path) {|ch, name, sent, total|
print "\r #{name}: #{sent}/#{total} (bytes)"
}
}
puts
■ やること
- 換金

