000000 ランダム
 HOME | DIARY | PROFILE 【フォローする】 【ログイン】

緑のボタンを押せ! Press the green button

PR

全10件 (10件中 1-10件目)

1

Ruby

2010.05.09
XML
テーマ:私のPC生活(7225)
カテゴリ:Ruby

連休の谷間を有休でうめたので、結構長い休みでしたが、それも今日で終わり。ず~っと部屋の片づけをしていたので、家内の不興を買うことになってしまった。


それはともかく、前にも書いたように、我が家のHauppauge HD-PVRの録画システムは、キャプチャそのものは、linuxで動くが、EPGやタイマー制御はWindowsXPという、サイコーにイケてる仕様で、この場合Windows→linuxの制御をなんとかしなければいけないわけです。

いままで、Windowsで動作する、sshクライアントとしてTeratermのマクロ機能版(ttpmacro)を使っていたのですが、これが(私には)いまいち。
マクロ言語を覚えるのがめんどー。所詮マクロなのでたいした量ではないが、オヤジには面倒。あと、時々プロセスがzonbi化し、CPUパワーを100%使う状態になってしまう。作者の方にはリポートしたいと思うのだが、まれな現象で、再現できていないのでどうししようもない状態。

で、前置きが長いが、「ひょっとしてRubyで使えるsshクライアント(のライブラリ)ってないのか?」と、思って探してみたら、あるんですねー、やっぱり。Ruby猿の私にはうれしい。

このページを参考に、まずライブラリをインストールします。Windowsのコマンドプロンプトから、

 

gem install net-ssh

 

で一発。

早速、先のページのサンプルを動かします。

 D:\Devel\ruby_ssh>ruby ssh_test.rb
HDPVR_REC
examples.desktop
繝?繧ヲ繝ウ繝ュ繝シ繝・
繝・Φ繝励Ξ繝シ繝・
繝・せ繧ッ繝医ャ繝・
繝峨く繝・繝。繝ウ繝・
繝薙ョ繧ェ
繝斐け繝√Ε
繝溘Η繝シ繧ク繝・け
蜈ャ髢・

orz... 漢字コードか…kconvをrequireして、結果をSJISに変換して、っと。

D:\Devel\ruby_ssh>ruby ssh_test.rb
HDPVR_REC
examples.desktop
ダウンロード
テンプレート
デスクトップ
ドキュメント
ビデオ
ピクチャ
ミュージック
公開

今度はうまくいきました。やりたいことは、linuxにログインして、コマンドを一発出すだけなので、これでできたも同然。このままだとパスワードを平文で扱わないといけないのが、ちと気になりますが、まあ家庭内LAN限定なのでよしとしましょう。ちなみに、先のページには公開鍵での認証のやり方もかいてあります。


// Original at http://webos-goodies.jp/archives/51357031.html 
require 'rubygems'
require 'net/ssh'
require 'kconv'
Net::SSH.start('host', 'user', :password => 'password') do |ssh|
print(Kconv.tosjis(ssh.exec!('ls ~')))
end

 

 







Last updated  2010.05.09 07:01:53
コメント(0) | コメントを書く


2009.11.03
テーマ:私のPC生活(7225)
カテゴリ:Ruby

いやぁ、私だって

「自動車教習所に通っていた時から、免許を取得したら『カヴァリーノ・ランパンテ』のエンブレムがついている車に乗りたい♪ それ以外の車なら乗りたくないわ、と思っていました」。(大笑)

 (まだ、容疑者でもないのだが)所轄の異なる場所で、しかも手口を変えれば、殺人も結構捕まらないものなんだな… 睡眠導入薬(ハルシオンか?)+練炭火鉢が簡単で繰り返したのが運のつきか…サギのほうで逮捕されたとき、同棲していた男性の家の火災報知機がすべてはずされていた、なんて話を今朝のワイドショーでやっていたけど、命拾いだな。。さしずめ「逆青髭」


それはともかく、Hauppauge HD PVRを使ったPC録画のスクリプトがちょっとバグってるのがわかったので、手直ししようとおもいました。bashスクリプトですが、ん~、なんか完全に忘れてますね。 orz
メンテ性があまりに悪いのrubyで書き直してみますが、なぜかうまく日本語のファイルができません。いろいろ調べていくと、`~`やsystem()を実行する際にsh経由で呼び出しているのがわかりました。Ubuntu 8.10 Desktopのshって、bashだとばかり思っていたのですが、違うんだな。

$ ls -l `which sh`
lrwxrwxrwx 1 root root 4 2009-08-10 20:57 /bin/sh -> dash


orz. 同じことにハマッテいる方がいますね。こちらの方を見習って、

$ sudo dpkg-reconfigure dash

んで、

$ ls -l `which sh`
lrwxrwxrwx 1 root root 4 2009-03-27 21:44 /bin/sh -> bash

これで、スクリプトのほうもちゃんと動くようになりました。

 







Last updated  2009.11.03 18:03:27
コメント(0) | コメントを書く
2009.09.06
テーマ:私のPC生活(7225)
カテゴリ:Ruby
 先週から、だらだらやっていた、録画スケジューラのプログラムの修正(Linuxベース化)だが、だいたい終わりました。Windowsでも動作するように書いているつもりですが果たしてどうですかね。
 いつもながら「漢字」コードの取り扱いが厄介です。RubyではKconvというモジュールを使って漢字コードの変換ができますが、インタプリタの漢字コードは$KCODEというグローバル変数に保持しています。そこで、$KCODEから、Kconvでの漢字コードの指定ができるように変換する関数を作りました。
 さらにStringクラスにkconvAuto()というメソッドを追加して、インタプリタの漢字コードに自動で変換するようにしてみました。こんなことって普通に必要だと思うのですが、実はなにかいい方法があったりするのでしょうか?

#
## Kanji Helper
# (c)2009 BO
#
#
require 'kconv'
module KanjiHelper

  @@KCODE2KCONVCODE = { "EUC" => Kconv::EUC ,
        "SJIS" => Kconv::SJIS ,
        "UTF8" => Kconv::UTF8 ,
        "NONE" => Kconv::ASCII }

  def self.kcode2kconv( kcode = $KCODE )
    @@KCODE2KCONVCODE[ kcode ]
  end #def kcode2kconv( kcode = $KCODE )

end #module To_WinFileName

# adding to String class

class String
  include KanjiHelper

  def kconvAuto( out_code = KanjiHelper::kcode2kconv(), in_code = Kconv::AUTO )
    self.kconv( out_code, in_code )
  end # def kconvAuto( out_code = KanjiHelper::kcode2kconv(), in_code = Kcobv::AUTO )


end # class String








Last updated  2009.09.06 18:08:21
コメント(0) | コメントを書く
2009.09.03
テーマ:私のPC生活(7225)
カテゴリ:Ruby
Windows用に作った、Rubyで書いた録画スケジューラ(PVR)ですが、7月25以降快調に動作しています。実際の録画はlinux上で動いているので、windows→linuxの部分はteratermのマクロ機能で、自動ログインしたうえで録画プログラムを動作させるという、回りくどいことをしています。
どうも、teratermのバグっぽいのですが、時々1スレッドをteratermが思いっきり占有したままzonbi化するし障害がおきています。ということでスケジューラをlinux用にちょっと変更する作業をしています。具体的には、iEPG/iEPGDのファイルを読み込んだとき、文字コードをutf8に変更するのと、プログラム中に埋め込んだsjisの2バイト文字をutfに変更することで、とりあえずはいいことにしました。
動作プラットフォームがwindowsかlinuxかで文字コードを切り替えるようにしたいのですが、コード中に埋め込んでしまいたい多バイトコードの取り扱いはちょっと面倒。Rubyでは、kconvを使って多バイトコードを変換できますが、コードを指定する値が、システムの漢字コード$KCODEと無関係に決まってるみたい。orz
しょうがないので変換する関数をつくって見ました。グローバルな名前にするのはちょっと「品がない」気がして、module化してみたのですが、なぜかうまくmix-inできないです。むぅ~・・・なんで?






Last updated  2009.09.03 06:32:09
コメント(0) | コメントを書く
2009.06.28
テーマ:私のPC生活(7225)
カテゴリ:Ruby

まえに、iniFileを読むためのRubyのクラスを実装したのを書いたけれど、ちょっと直しました。以前のものは、指定した、セクション、キーが存在しない場合、""を返すようにしていたのですが、Rubyっぽく、nilを返すようにしました。

 iniH = IniFile.new( fileSpec)

でファイルから読み、

 hash = iniH[ section名 ]

でセクション全体をハッシュで返します。セクションがない場合、nilが返ります。
セクションの有無を確認の上、キーにアクセスするには、

 raise "NO section" if ! iniH[ セクション名 ]
 value = iniH[セクション名][キー名]

のようにします。
新たにセクション、キーを指定して値を追加する場合には、

 (iniH[ セクション名] || iniH[ セクション名] = Hash.new)[key名] = 値

みたいになります。ほとんどパズルみたいなので、[], []=を定義しなおしてみました。これで、

 val = iniH[ セクション名, キー名]

 と書くことができます。目的とするセクションや、キーがない場合はnilが返ります。
 また、

 iniH[ セクション名、 キー名 ] = value

という、書き方ができます。この場合、指定したセクションが存在しない場合は、新たにセクションを追加し、キーにvalueを関連付けます。

それよりも嵌ったのは、正規表現で、キーと値の抽出は、/(.*)=(.*)/ではなく、/(.*?)=(.*)/,つまり最短一致にしておかないとちょっと動作がまずそうです。

#
# (c)2009 BO
#   inifile
#
 
class IniFile < Hash
  @@ReComment = /^#/
  @@ReSection =/\[(.*)\]/
  @@ReKeyValue =/(.*?)=(.*)/
  def initialize( fileSpec = nil )
    if fileSpec
      File::open( fileSpec) {|f|
        sectionName = ""
        while line = f.gets
          if line =~ @@ReComment  # skip a line
          elsif line =~ @@ReSection
            sectionName = $1.strip
          elsif line =~ @@ReKeyValue
            self[ sectionName,  $1.strip] = $2.strip if sectionName != ""
          end
        end # while
      }
    end
  end #def initialize( fileSpec = nil )

  def write2File( fileSpec )
    fp = File.open( fileSpec ,'w')
    fp.print to_s()
    fp.close
  end #def write2File( filespec )

  def to_s
    str = String.new
    self.each_key{ |section|
      str += "[#{section}]\n"
      if self[section]
        self[section].each_key{|key|
          str += "#{key}=#{self[section][key]}\n" if self[section][key]
        }
      end
    }
    str
  end #def to_s

  def []( section, *rest)
    return super(section) if rest.length == 0
    key=rest[0]
    self[section] ? self[section][key]  : nil
  end # def []( section, *rest)

  def []=( section, *rest )
    if rest.length == 1
      hash = rest[0]
      return super( section, hash)
    elsif rest.length == 2
      key, val = rest[0], rest[1]
      return (self[section] || super(section, Hash.new))[ key ]= val
    else
      raise "invalid number of param"
    end
  end #def []=( section, *rest )
end # class IniFile







Last updated  2009.06.28 18:46:43
コメント(0) | コメントを書く
2009.05.06
テーマ:私のPC生活(7225)
カテゴリ:Ruby
2009/6/29 さらに直しました 
まえにも、書いたんですが、ちょっと直しました。

ini = IniFile.new( "test.ini")

で、ハッシュのハッシュを返します。

ini[section][key]

でセクション、キーで値を参照できます。存在しない、ハッシュ、キーが指定されると""(ヌル文字列)が返ります。

また、

ini[section]

でセクション全体をハッシュとして返します。存在しないセクションを指定すれば、空のハッシュを返します。

iniファイルを書く方も作らなければなりませんね。ま、それはまた今度。


#
# (c)2009 BO
#
class IniFile < Hash
  @@ReComment = /^#/
  @@ReSection =/\[\s*(.*)\s*\]/
  @@ReKeyValue =/\s*(.*)\s*=\s*(.*)\s*/
  def initialize( fileSpec )
    @fileSpec = fileSpec
    File::open( fileSpec) {|f|
      sName = ""
      tmpHash = Hash::new
      tmpHash.default = ""
      while line = f.gets
        if line =~ @@ReComment
        elsif line =~ @@ReSection
          # closing previous section
          if sName != ""
            self[ sName ]= tmpHash
          end # if
          sName = $1.strip
          if ( tmpHash = self[ sName ] ) == nil
            tmpHash = Hash::new
            tmpHash.default = ""
          end
        elsif line =~ @@ReKeyValue
          tmpHash[ $1.strip  ] = $2.strip
        end
      end # while
      # closing final section
      if sName != ""
        self[ sName ]= tmpHash
      end # if
    }
    tmpHash = Hash::new
    tmpHash.default = ""
    self.default = tmpHash
    self
  end #def initialize( fileSpec )

  attr_reader :fileSpec
end # class IniFile

 







Last updated  2009.06.28 18:48:44
コメント(6) | コメントを書く
2009.04.06
カテゴリ:Ruby

 Rubyでファイル中のキーワードの一覧を調べる簡単なプログラムを作ってみました。ファイルの各行は
KeyWord: Content
の形式で出来ています。このようなファイル中のKeyWordの一覧を、'sort' し ‘uniq' したいのです。
こんな感じでしょうか?(プログラムは最後に)

Uniqの機能のためにハッシュを使っています(Contentの方は今回は興味がありません)。あとはハッシュをアレィに変換、ソート、eachでブロック実行としています。Ruby初心者としては上出来(?)

  ha = Hash.new
  re = /^(.*): .*/
  File::open( $*[0]) {|f|
    while line = f.gets
      if line =~ re
        ha[$1] = nil
      end
    end
  }
  ha.keys.sort.each {|key| 
    print key + ":\n"
  }







Last updated  2009.04.06 20:49:36
コメント(0) | コメントを書く
2009.04.05
テーマ:私のPC生活(7225)
カテゴリ:Ruby

 実は私は今を去ること2x年前はシュミのLisperだったのです.夏休みにバイトもせず,Apple LispでPrologインタープリタ(もちろん表記はS式のまま)を書いたりしていた.ピュアPrologあたりまでは,サクッとできたが,カットオペレータを実装するあたりから,見通しの悪さが発覚し,環境をスタックに積んだりで,あまりスマートでなくなってしまい,結局3000行近い「大作」になってしまった.Lispは学業とも仕事ともはまったく関係はなかったのですが,「Symblics3600に触れる」,てんで一度「某研究所」に新人(といっても相手はMやDの人ばかり)研修のお手伝いに行ったことがあります.

 話は変わりますが,eval関数が好きです.Javascriptもそうですがメタプログラミングには必須です(まあ,そんな「たいそう」なプログラムを作っているわけではないですけど).

 Rubyの仕様書(というかライブラリ)をつらつら眺めていたら,socketの機能とかが簡単に使えそうなことが判りました(ちなみに,私はsocketを使ったプログラムの経験はありません)。ともかく,「socketのライブラリとevalを使えば,リモートで何かプログラム動かすの簡単じゃね?」と思ったら,もう何年も前に実装した人がいるんですねぇ...orz

 それがdRuby.
なんか,中学生のころ「すんげぇ定理」を発見した気になって,「オレって天才?」なんて思ったことをおもいだしますな...

ということで、RubyとdRubyの本を買いました.まだ拾い読みだけど、Rubyはまつもとさんに敬意を表して,

プログラミング言語Ruby
 Rubyの「仕様」を理解するのはよい本。新しい本なので1.9系と1.8系の差異が書かれているのもよい。てっとりばやく、Rubyっぽいコードを書くためにはいわゆる「レシピ本」の方がよいかも。


dRubyは「幸福の王子」本.

dRubyによる分散・Webプログラミング
まつもとさんの本と比べると、値段のわりに情報が少ないかも。Rubyを使ったシステムの実装例としては面白いです。分散環境に興味がないと読んで面白くないかも。
もちろん、ある程度Rubyが判ってないとつらい。

 







Last updated  2009.04.05 07:29:16
コメント(0) | コメントを書く
2009.03.25
テーマ:私のPC生活(7225)
カテゴリ:Ruby

 相変わらず,RubyとAutoItで遊んでます.AutoItには,AutoItXというCOMオブジェクト版があります.この2つを繋いでみました.(「.NETじゃだめ?」という,ツッコミはこの際無しね.笑)

 添付のプログラムは,AutoItX 3.3.0.0をインストールした環境で,ActiveScriptRuby(1.8.7)で試しました.実行すると,マウスカーソルが画面上の左上に移動します.それだけです(大笑)

 じゃ,そういうことで...

(2009/3/30追記)
COMオブジェクトの使い方に関していくつか見つけました。
 AutoIt v3.3.0のヘルプファイル
  「るびま」Win32OLE 活用法

-------------------------------
require 'win32ole'
oAutoItX = WIN32OLE.new("AutoItX3.Control")
sleep(0.1)
oAutoItX.MouseMove( 0, 0)







Last updated  2009.03.30 21:28:29
コメント(0) | コメントを書く
2009.03.03
カテゴリ:Ruby
Jscriptで録画用スケジューラ・ソフトを書く試みですが、デバッグで完全にハマりました。WScript.Echo()をあっちこっちに埋め込んでとかやるのですが、イマイチ。なんかいいものないですかねぇ…あと、ベースクラスを継承するクラスがつくれないみたい。

アタマ来て、言語を変えることにします。Javaでもいいんですが、とりあえず候補はRubyとC#。両方とも今ひとつ仕様が安定していないみたい(特にRuby)。C#の拡張版みたいので、cω(「究極のC」でしょうか)なんてのもあるようです。

まあ、Jscript(Javascript)が動的type systemを摂っているので、Rubyに移植する方が簡単そうです。一方C#には.NETがあります。C#はMSがフリー版を出していてIDE(統合環境)もばっちりですが、RubyにもRDEとかがありますので、ちょっと見てみました。

Ruby本体はいろいろなところで、お勧めっぽいActiveScriptRubyを無難に入れました。本家は1.9.1にバージョンアップしてますが、これは1.8系(1.8.7)です。できれば1.9.1系がいいのですが、まあ、いいでしょう。

続いて、RDEをインストール。この説明どうりにやります。

ちょっとハマったところ

(1) RDEで通常実行は問題ないが、なんかデバッガが動作しない。
解決策 [参考]
  1.PATHにrubyのパスを追加
    2.コマンドプロンプトでRDEのインストールディレクトリに移動
    3.ruby.exe install.rb を実行する

(2) VistaでRDEがなんかヘン。(XPでは問題なし)
 対策を模索中

これでなんとかイケそうな感じです。IronRubyとかTurboRubyとかも気になりますが、とりあえず、これでよしっと。






Last updated  2009.03.03 20:54:32
コメント(0) | コメントを書く

全10件 (10件中 1-10件目)

1


© Rakuten Group, Inc.