|
|
|||||||||||||||||||||||||||||||||||||||||||||||
require 'lockfile'
def interval(msec, block_each_exec = false)
key = rand
if not(iterator?)
msg = 'interval method must be called with block.'
raise ArgumentError.new(msg)
else
while(true)
begin
lockfile = '/tmp/' + Process::pid.to_s + '.' + key.to_s
lock = Lockfile.new(lockfile)
lock.lock if(block_each_exec)
thread = Thread.new(lock) do |lockref|
Thread::pass
yield
lockref.unlock
end
thread.abort_on_exception = true
rescue Lockfile::LockFailedError
# ingore.
end
sleep(msec.to_f / 1000)
end
end
end
んで、こうやって使う。
msec = 1000 # every 1 sec. interval(msec) do puts ' Time is come!: ' + Time.new.to_s endこんなものがさくさく作れてしまう ruby はすごいなぁ:)
class Foo endとして、
load('foo.rb', true)
Foo.new
とすると、Foo を知らないと怒られてしまいます。
name = 'なんらかの文字列'
sjisname = NKF::nkf('-s', name)
capname = sjisname.gsub(/./) { $&[0]>=0x80 ? format(":%x", $&[0]) : $& }
capname = sjisname.gsub(/[:\x80-\xff]/) {|x| sprintf("%x", x[0])}
とするとよいようです:) 普通のパソコン計測の場合は、単体計測器(オシロとかデジボル(DMM)とか)を GPIBでつないでコントロールしますよね。ただ、それだとパフォーマンスやら、 配置(ラッキング)やらで、ちょっとした規模のシステムを組もうとすると、 大変になってくるのは想像できると思います。 パソコンでの計測でもA/D変換ボードとDIOボードを使って計測しよう、などと 考えるのと同様に、VXIなるシャーシにカード型の計測ボードをさして1つの ユニットを作ってしまおう、といった発想だと思っていただければよいです。 # キーワードとしては NI, Agilent, VISA, VXI PnP, VME, PXI, CompactPCI と # かでしょうか。 でも、こうやってGPIBだけでない複雑なモノが出てくるとソフトを書く側は大変 なので、NIやHP(Agilent)など、GPIBボードメーカが独自に規定してたライブラ リやVXI計測ボードを標準的な形(Plug & Play で) で使えるように、VXIコンソー シアムという組織を作り、標準的なルールを作ったのです。VISAはその中で通信 部分の共通化(抽象化)を担っています。 VXIは既に終りの見えているシステムですが、VXI PnPの成果は計測関連のいろい ろなところで引続き継承されているため、かなり有用なものです。 で、VISAなのですが、一般的なGPIB通信の使い方に絞り、シリアル通信のような stream 風の扱いが出来るように考慮されたもので、およそ以下の関数だけで 大抵の計測は満足できます。 viOpenDefaultRM() ... ライブラリの初期化のようなもの viOpen() ... デバイスのオープン viClose() ... デバイスのクローズ viWrite() ... データの書き込み viRead() ... データの読み込み viReadSTB() ... ステータスバイトの取得 viInstallHandler() ... SRQ(などの) イベントハンドラの登録 viEnableEvent() ... SRQ(などの) イベントのハンドラ呼び出し許可 また、上記のVISA のAPIが規定されており、HP(Agilent)やNIがVISA ライブラリ として提供しているため、ユーザはVISAのAPIを使ってプログラミングしていれ ば、HPのGPIBボードとを使おうがNIのボードを使おうが、プログラムを変更する 事無しに(同じプラットフォームであればバイナリ互換で)動作させる事が出来る、 というのが利点です。それに、GPIBライブラリは1種類覚えれば良い、という点 でもメリットはあるでしょう。
10.times do |i|
p /#{i}/o
end
とすると、/0/ という正規表現だけが出力されます。
10.times do |i|
p /#{i}/
end
と比べてみれば違いは一目瞭然ですね。
foo bar do ... end #=> foo(bar) do ... end
foo bar { ... } #=> foo(bar{...})
などがそうです。 うへぇ:pグローバル変数は三代祟るとか、親の死に目に会えないとか、 一つ使うと三日寿命が縮むとかってのは迷信でしょうか。:-)
# /etc/init.d/freqship start Starting FREQUPS monitoring daemon: FREQSHIP: Failed to communicate with UPS. Stopped freqshpd.まぁいいや。後日だな(^^;
def `(command) ... endとすることで、
`cmd`の再定義が出来るようです。
class Foo
def bar # (1)
puts 'bar'
end
end
という class があったとき、
class Foo
def bar # (2)
puts 'barbar'
end
end
のようにすると Foo#bar の override が出来ます。
class Foo
alias :old_bar :bar # old_bar is bar(1)
private :old_bar
def bar # (2)
puts 'barbar'
old_bar # bar(1)
end
end
のようにして、Foo#bar(1) を alias しておくと ok のようです。
class Foo_derived < Foo
def bar
puts 'barbar'
super
end
end
とすれば済むことが多いでしょうから。
class OracleEx < Oracle
def initialize(uid = nil, pswd = nil, conn=nil)
@logon = true
super
end
def logoff
@logon = false
super
end
def islogon?
@logon
end
def islogoff?
not @logon
end
end
次に、Oracle class を再定義してみました。
class Oracle
alias :old_initialize :initialize
private :old_initialize
def initialize(uid = nil, pswd = nil, conn=nil)
@logon = true
old_initialize(uid, pswd, conn)
end
alias :old_logoff :logoff
private :old_logoff
def logoff
@logon = false
old_logoff
end
def islogon?
@logon
end
def islogoff?
not @logon
end
end
とりあえず、code をいじらなくて済む後者を採用。
module SingletonEx
def SingletonEx.append_features(klass)
klass.private_class_method(:new)
klass.instance_eval %{
@__instance__ = nil
def instance
Thread.critical = true
unless(@__instance__ &&
defined?(@__instance__.isused?) &&
(not @__instance__.isused?))
begin
@__instance__ = new
ensure
Thread.critical = false
end
end
return @__instance__
end
}
end
end
とかやった方が便利なのかも、と考えてみる。
class String
def omit(size)
length > size - 3 ? sprintf("%.#{size - 3}s...", self) : self
end
end
とかいうのがあると便利であるなぁ、とか思ってみたり。 monochrome.jpとかなんとか。
[Wed May 9 20:56:45 2001] [error] Cannot remove module mod_ruby.c: not found in module listこんなことを言われてしまいました。
AddHandler cgi-script .rb AddType application/x-httpd-eruby .rhtml Action application/x-httpd-eruby /cgi-bin/erubyとかして回避。
シンボリックリンクは歴史的には4.2BSDのBerkley Fast File Systemに伴って
導入されたものですが、当初はlstat(2)あたりを除いて殆んどのシステムコー
ルはシンボリックリンクを辿る様になっていました。
4.4BSDの後、386BSD以降の紆余曲折(注)を経て、今時のFreeBSD/NetBSDあたり
では、シンボリックリンク自身が所有者やモードを持つ様になっています。こ
の結果lstat(2)の他に、lchmod(2), lchown(2), lutimes(2)といったシステム
コールが用意されています。これらによってシンボリックリンク自身の、
o 所有者を変更する。
o アクセス権を変更する。
o 最終のアクセス日時と修正日時を設定する。
(実際には、シンボリックリンクの修正日時はシンボリックリンクを作成し
た日時ですが。)
といったことができます。(また、シンボリックリンクをハードリンクできた
りもします。)
NetBSDのオンライン・マニュアルのchown(2)によると、このうちlchown(2)は、
X/Open Portability Guide Issue 4 Version 2 (``XPG4.2'')
に準拠しているとあり、少なくともlchown(2)はBSD独自ではなく標準で規定さ
れているものということになります。
このあたりのシステムコールを File#lchmod, File#lchown, File#lutimes(or
File#lutime ?)といったメソッドとして使えると嬉しいです。というか、これ
らがあると、ファイル階層をrubyでコピーすることができます。
ちなみに私の本業の方では、
o 元々root権限で実行するスクリプトなので、実効ユーザを一時的に
変更してシンボリックリンクを作成する。
o ターゲットが古いFreeBSD 2.2.8で、実はシンボリックリンクのサ
ポートが完全ではないため、lchown(2)/lutimes(2)の処理はあきら
めた。
という形で解決をみました。
なお、4.4BSDではfile flags(chflags(2)/fchflags(2)/lchflags(2))というの
もありますが、これらは完全にBSD独自なので拡張モジュールが適当でしょう
ね。
symbolic link の属性があるとなにがうれしいんだろう?
o シンボリックリンクを辿らないシステムコールは、lchmod(2), lchown(2),
lstat(2), lutimes(2), readlink(2), rename(2), unlink(2)の7つである。
o かつてchown(2)はシンボリックリンクを辿らない時代があった。(4.3BSDあ
たりまで。)
o マウントのオプションに symperm というのがあり、指定すると以下の挙動
をする様になる。
1. readlink(2)ができるためには、シンボリックリンクに読み込み権
限が必要となる。
2. シンボリックリンクを辿るシステムコールは、辿るすべてのシン
ボリックリンクに対して実行(検索)権限がなければならない。
3. シンボリックリンクのアクセス権の書き込み、sticky, setuid,
setgidといったビットは意味を持たない。
ということでした。
http = Net::HTTP.new(...) req = Net::HTTP::Get.new(path) http.request(req) do |response| p response endのように使うことが出来るらしい。
http.open_timeout = 60 http.read_timeout = 60とすることで、timeout も設定することが出来るようになっています。so good!
「Rajah」は、Ruby 言語と Java 言語のブリッジを提供する、 オープンソースのプロジェクトです。だそうな。
<% if defined?(MOD_RUBY) Apache::request["Content-Type"] = "text/html" else CR = "\015" LF = "\012" EOL = CR + LF print "Content-Type: text/html" + EOL print EOL end %>のようにして MOD_RUBY が定義されているかどうか調べるのがよいようです。
<% require 'eruby/jcode.rb' ERuby.charset = "ISO-2022-JP" %>とすると、charset の指定と出力される文書の文字コードをそろえることが出来ます。
require "nkf"
module ERuby
module CodeConv
PROC_TABLE = {}
module_function
def add_proc(charset, proc = Proc.new)
PROC_TABLE[charset.downcase] = proc
end
def exec
charset = ERuby.charset.downcase
if PROC_TABLE.key?(charset)
$>.replace(PROC_TABLE[charset].call($>.to_s))
end
end
add_proc("iso-2022-jp") { |s|
NKF::nkf('-j', s)
}
add_proc("euc-jp") { |s|
NKF::nkf('-e', s)
}
add_proc("shift_jis") { |s|
NKF::nkf('-s', s)
}
at_exit { exec }
end
end
dpkg --extract <debfile> <directory>とするとよいみたい。
public static String raw2String(String raw, String encoding)
throws UnsupportedEncodingException {
return (new String(raw.getBytes("8859_1"), encoding));
}
のようにするとよいみたい。
File f = new File(".lock");
File f.deleteOnExit();
for(int i = 0 ; i < 600 ; i++){
try {
if(f.createNewFile()){
break;
}
Thread.sleep(100);
} catch(Exception e){
throw e;
}
}
if(i == 600){
throw IOException("処理中だよ。。。");
}
try{
//any process
} catch(Exception){
//error process
} finally {
f.delete();
}
悩むより考えよ、そして heart に聞けかな。
ipchains -A input -p tcp -d 0/0 80 -j REDIRECT 3128と ipchains の rule を書き足すだけで ok です:)
if(not defined?(Oracle))
class Oracle
class Cursor
def initialize(cursor)
@cursor = cursor
end
def fetch
if(iterator?)
@cursor.result.each(Proc::new)
else
@cursor.result.shift
end
end
def close
@cursor.clear
end
end
def initialize(uid, pwd)
host = 'localhost'
db = 'database-name'
@cn = PGconn::connect(host, 5432, nil, nil, db, uid, pwd)
end
def exec(sql, *bindvar)
if(bindvar == nil)
cursor = @cn.exec(sql)
Cursor.new(cursor)
else
bindvar.each_with_index do |var, index|
sql.gsub!(/:#{index}/, "'#{var.to_s}'")
end
cursor = @cn.exec(sql)
Cursor.new(cursor)
end
end
def self::Binary(var)
''
end
end
end
最近、こういう妙な ruby script ばっか書いてるような…(;_; apt-get source rio500 dpkg-source -x rio500.dsc cd rio500-* dpkg-buildpackageあたりでいけるのでは? *1 ダメなら debian/control あたりをいじって retry!
% dpkg -L rio500 | grep bin /usr/bin /usr/bin/rio_add_directory /usr/bin/rio_add_folder /usr/bin/rio_add_song /usr/bin/rio_del_song /usr/bin/rio_font_info /usr/bin/rio_format /usr/bin/rio_get_song /usr/bin/rio_statだそうな。まんまですねぃ。
=begin
= class name
description of class.
it's a nice class, hmm?
== methods (headline)
: foo_method
this is method description
: bar_method
this is, too.
=end
javadoc のように method の直上に書くのではなくて、 % nmap localhost Starting nmap V. 2.54BETA22 ( www.insecure.org/nmap/ ) Interesting ports on localhost (127.0.0.1): (The 1534 ports scanned but not shown below are in state: closed) Port State Service 22/tcp open ssh 23/tcp open telnet 25/tcp open smtp 53/tcp open domain 80/tcp open http 139/tcp open netbios-ssn 953/tcp open rndc 5432/tcp open postgres Nmap run completed -- 1 IP address (1 host up) scanned in 1 second不必要な port が開いている場合はすぐ確認すべきでしょう。
tar: ./var/lib/bind-chroot/dev/null: Cannot mknod: Operation not permittedとか言われるし:p
#!/bin/sh echo 'Content-Type: application/octet-stream' echo '' cat filenameというふうにただ単純に cat しただけではファイル名が download.cgi に
#!/usr/bin/ruby require 'cgi' require 'resolve' cgi = CGI.new id = cgi['id'][0].to_i filename = resolveid(id) printf "Location: download.cgi/%s?id=%d\n", CGI::unescape(filename), id print "\n"download.cgi を
#!/usr/bin/ruby require 'cgi' require 'resolve' print "Content-Type: application/octet-stream\n\n" id = CGI.new['id'][0].to_i print getcontents(id)として保存して resolveid を適当に実装すると動くようです:)
#!/usr/bin/ruby
def resolveid(id)
case id
when 1
"seek.cgi"
when 2
"download.cgi"
when 3
"test.lzh"
else
"menu.html"
end
end
def getcontents(id)
open(resolveid(id)).read
end
とか、手抜きにかいてあります。