|
![]() |
|||||||||||||||||||||||||||||||||||||||||||||||
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とかして回避。
symbolic link の属性があるとなにがうれしいんだろう?シンボリックリンクは歴史的には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独自なので拡張モジュールが適当でしょう ね。
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. =endjavadoc のように 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とか、手抜きにかいてあります。