Dies Aliquanti

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Ububtu 9.04でNAS

通販で買ったHDDも放っておくわけにもいかないので、インストールを始めました。linuxのディストリビューションも悩ましいですが、Ubuntu9.04の日本語版デスクトップをCD-Rに焼いてインストールしてみました。H/WはAsus P5E-  HDMI+C2D E6300。とりあえず、HDDは一台のみ接続。な~んにも問題なしで、ネットワークにもつながります。

openssh-serverとsambaを入れて、ほかのPCから、sshで接続できるのを確認して今日はおしまい。



スポンサーサイト

RemoteStationで複数のチューナーを制御する

 不調になった、メインの録画システムの対策で、サブ機と同じ自作のプログラムを動かして対策してみました。チューナーの制御が問題で、サブ機は


【リニューアル記念★ポイント最大6倍★7/27(月)09:59まで】バッファロー PCastTV2対応 PC用学習リモコンキット RemoteStation [PC-OP-RS1]【在庫目安:お取り寄せ】
これを使っています。もう一台買えばいいのですが、必ずしも安くないですし、同時に動作すると混信の可能性もあります。

複数のプログラムでRemoteStationを共有できたとしても、デジタル放送の選局は多くのチューナーでバンド(地上/BS,CS)+数字ですので、複数のキーに相当する赤外線信号をタイミングよく出す必要があります。つまり、あるチューナーへの複数のキーストロークと別のチューナーへの複数のキーストロークが混ざらないようにしなければなりません。

そこで、今回はdRrubyで、サーバー/クライアント型の共有をするようにしてみました。上記の「複数のキーストローク」単位で排他的にロックをかけることでキーストロークが混ざることを防げますし、サーバー/クライアント型にすることで、物理的に異なるPCでもRemoteStationを使うことができます。

dRubyでは、 サーバー/クライアント型の分散プログラミングはとても簡単にできます。通常のRubyのプログラムで、

foo1 = FOO.new
foo1.bar(...)
などと記述する場面で、サーバー側で、
foo1 = FOO.new
uri='druby://192.168.0.211:12345'

DRb.start_service( uri, foo )
sleep
と書いて(sleepはメインスレッドが停止しないようにするため)、クライアント側では
uri='druby://192.168.0.211:12345'
service = DRbObject.new_with_uri( uri )
service.bar(...)
とかけるのです.注意することは、
(1)サーバー/クライアントともRubyのバージョンが基本的に同じでなければならない。
(2)通常、Rubyでは参照渡しなのに対して、dRubyのサーバー/クライアントの間だけは、値渡しになる。
(3)サーバー/クライアント間の漢字のコードが異なる場合、明示的な変換が必要。
(4)セキュリティが弱い、というかdRubyのレベルで考える必要がある。
くらいかな.
今回は本当に「やっつけしごと」なので、すこし整理してからコードは載せます。
では、では。


HD154UIがついに1万円を切る。

前に書いたように、録画の倉庫用のHDDが逼迫してきました。ということで、HDDをなににするか悩んだのですが、どうせ壊れるときは壊れるし、と投げやりにサムスンHD154Uを3台購入しました。今日見たら、価格.comではついに1万円を切ったようです。

楽天でもほぼ同水準ですね。

EcoGreen F2シリーズ 5400rpm 1.5TB [Buffer:32MB] Serial ATAII/300 3.5インチHDD 【BareDrive ※Bulk】【SAMSUNG】HD154UI (1.5TB SATA300 5400)

でも、肝心の録画サーバーの方が不調なので、そちらを先にメンテしなくては…
(正確にはチューナーの制御なのですが・・・)

 



キャプチャが死んだ(っぽい)

メインの録画機は、Windowx XPのメディアセンターを使っています。この上で、録画中のファイルを監視して、同時にHD-PVRを制御してハイビジョン録画をしています。

どうも、メディアセンターで直接制御しているキャプチャーが死んでしまったみたい。パイロットランプもつかないので、ACアダプタが一番あやしい(前科一犯)きがするのだが…

しおしおのパ~ ・・・




X windowの調子が悪い  orz (2)

んー、X windowの調子が悪い・・・
録画用のサーバになっているPCのx windowのマネージャが気が着くと落ちている。環境としては、ubuntu 8.10+VMPlayerの上でWindows XPを動作させているのだが、2~3日するといつの間にか、x Windowがこけていて、そのためVMPlayerがWindows XPもろとも死んでいる、という現象に悩まされている。Sambaとかは全く問題ないし、SSHでログインもできるのだが・・・VMPlayer上のXPではサブ機としての録画用のプログラム(α版)が動いているのでちょっとこまった。

x windowのコンフィグレーションをやり直せばいいのかも知れないが、素人なのでゼンゼン自信ないし…録画プログラムをubuntuに移行した方が早いかも・・・
う~む…



「ΔΣ型アナログ/デジタル変換器入門」

ΔΣ型アナログ/デジタル変換器入門

えー、こんな本買ってみました。まあ、仕事4割、シュミ6割です。Amazon.comで原書買うほうが安いですが、急いで欲しかったのと、監修者の安田先生(デルタシグマの生みの親)に敬意を表して翻訳版を買いました。

いまや、A/D、D/Aコンバータの主流といってもよい、デルタ・シグマ型のコンバータの入門書です。まだ、2/3くらいしか読んでませんが、いままで、定性的には理解していたことをちゃんと勉強するにはよい本です。どちらかというとA/D変換の方が主にかかれてますが、デルタ・シグマではA/DもD/Aも基本的な考え方は同じ、という興味深い対象性があるので、あれこれ考えを巡らせるのは楽しいです。

余談ですが、なぜか海外ではSigma-Deltaと呼ばれることが多いのですが、「本来は『デルタ・シグマ』である」と、安田先生は主張していますな。

ただ、一応ラプラス変換(というか正確にはZ変換)くらいは使えないとすらすらとは読めません。学生時代にやったはず(一応私は、電子・情報系)なのですが、全くおぼえていないので、ちょっと苦戦中。orz

これでも買おうかな・・・


やり直しのための工業数学(Vol.7)




ルーターが死んだ(っぽい)

どうも、ルーターがお亡くなりになったっぽい。orz

NECのAterm 7800Hというルーターを使っているのだが、調子が悪い。先週の金曜日の朝、最初ファイルサーバーが見えなくて、サーバーがこけた(ubuntu8.10+VMPlayer上でXPを動かしているのだが、X-Window&VMPlayerが時々死んでしまう。Sambaは生きている)と思ってリブートしたがダメ。よくよく調べるとネットワークが自分の部屋においてあるすべてのPCから見えていない。リビングのPCからも見えない。
ということで、ルーターかそのすぐ下手のハブがおかしいらしい。どうも、DHCPサーバーからアドレスが割り当てられないらしい。この時点で復旧をとりあえずあきらめて、録画に関連しているPC3台のIPアドレスをとりあえず固定にした。

帰宅してから、確認するためにノートPCとLANケーブルをもってルーターやハブ周りをうろうろするが、問題は再現せず。しかたないので、あやしいハブをパスする形に配線を変更して様子を見ることにする。

日曜日の早朝に同じ現象がでて、ほぼルーターと断定。しかし、無線ポートは問題なく、どうも有線ポートだけおかしくなるらしい。なんとなく無線の方が信頼性低そうなきがするので、不思議な故障モードな気がするが、よく考えてみると有線ポートはハブを含んでいて、ハブはどうせ安物のASSPだろうから、むしろ無線ポートに使われているだろうNECのASICの方が信頼性は高いのかな・・・

とりあえず、ノートPCはWAN側に出られるので火急的な対応はいらないが、修理するよりは買いなおすことになるだろう。問題は旧モデルのb+gにするか、b+g+nのモデルにするか・・・ 悩ましい。
物入りよのう・・・

 



ファームバージョンアップなど (2)

 Hauppauge HD PVRも我が家では2台とも超安定動作中であまりネタがありません。唯一、SDで録画したものがなぜか、TMPGEncでうまく読めない場合があるのが問題です。いつもダメなわけではなく、まれにダメ。症状は、途中までしか読めないというもの。たとえば1時間の録画が、10程度で切れてしまう、という症状です。よくわからないのは、再生はもんだいない、というところ。そのまま保存しておいてもいいのですが、5Mbps程度になるので、ちょっとビットレートが高すぎで、HDDの容量がもったいないのと、SDのものはiPod Touchで通勤中に消化したいので、再エンコードしたいのです。

ま、それはそれとして、HD PVRのファームウェアがアップデート(1.5.6)されていたので、アップデートしてみました(zipファイルを展開すると、相変わらずβというフォルダ名になのには笑った)。安全のため2台あるうちのサブの方を先週の週末にアップデートしましたが、特に問題がないようなのでメインの方も変更してみます。サブ機は、チューナーがアップコン内蔵のため、すべてHDでの録画になります。メイン機のほうで、SDの問題が解決すればよいのですが。。。

もうひとつは、 HD PVRがWindowsのMediaCenterから使えるようになるという、dvblinkというもの。これが、本当ならばすばらしい。トライアル版ありで、日本円で3200円前後です。さっそく試してみたいところだが、Vista以降の対応のようなので、すぐには無理です。週末にでも、我が家の唯一のVista機のノートPCで試してみましょう。

 



RubyでWavファイルを扱う

すっかり「Ruby猿」になっている私です(笑)が、今度はデジタルオーディオを扱ってみることにします。とりあえず、WAVファイルを扱うところを書いてみました。WAVファイル(というかRIFFフォーマット)は、ここ
http://www.kk.iij4u.or.jp/~kondo/wave/
の記述が参考になります。思ったより、時間がかかりましたが、WAVファイルの読み書きはできました。pack(),unpack()の使い方のいい勉強になりました。 書き込みはとりあえず44.1k、16ビットで決めうちです。

 早速動かしてみます。WAVファイルをコピーしているだけですが、遅いっすね~。 orz
ちゃんとThread化すれば少しはましになるかしら?RubyのTheradって、Native Threadではないからダメかな・・・

----
require "thread"
module DigitalAudio 
  def bytes2value( ar )
      bytePerSample = ar.length
      bitPerSample = bytePerSample * 8
      sum = 0
      (bytePerSample -1).to_i.downto( 0 ) { |i|
        sum = (sum << 8 ) + ar[i]
      }
      if bytePerSample == 1
         return sum - 128
      end
      if sum > ( 0x1 << ( bitPerSample -1 ))
          sum -= ( 0x1 <<  bitPerSample )
      end
      sum
  end #def bytes2value( ar )
end #module DigitalAudio

class DigitalAudioElement
  include Math
  include DigitalAudio
  @@S48k = 48000
end #class DigitalAudioElement

class ToFile < DigitalAudioElement
  def initialize( fspec , inQArray , pHash=nil )
    f = open(fspec , "wb" )
    totalDataChunkByte = 0
    totalByte = totalDataChunkByte +36
    fomatId = 1 # must be 1 (=LPCM)
    noOfChannel = inQArray.length
    samplingRate = 44100 # tentative
    bitPerSample = 16 # tentative
    blockSize = noOfChannel *( bitPerSample /8 )
    bytePerSec = samplingRate * blockSize
    x = ["RIFF", totalByte, "WAVE" ]
    f.write( x.pack( "Z4VZ4"))
    x = [ "fmt ", 16, fomatId, noOfChannel, samplingRate, bytePerSec, blockSize, bitPerSample ]
    p x
    f.write( x.pack( "Z4VvvVVvv"))
    x = [ "data", totalDataChunkByte ]
    f.write( x.pack( "Z4V"))
    d = true
    while d
      for i in 0..(noOfChannel-1)
        lsbArray = Array.new
        d =  inQArray[i].pop
        #p __FILE__, __LINE__, d
        break if !d
        #p __FILE__, __LINE__, d
        d = d.to_i
        for j in 1..( bitPerSample /8 )
          lsbArray << (d & 0xff)
          d >>= 8
        end
        f.write( lsbArray.pack( "C*" ))
        #f.write( "XXXX" )
      end
      break if !d
      totalDataChunkByte += blockSize
    end
    f.seek( 0) # rewind to begin    
    totalByte = totalDataChunkByte +36
    x = ["RIFF", totalByte, "WAVE" ]
    f.write( x.pack( "Z4VZ4"))
    x = [ "fmt ", 16, fomatId, noOfChannel, samplingRate, bytePerSec, blockSize, bitPerSample ]
    p x
    f.write( x.pack( "Z4VvvVVvv"))
    x = [ "data", totalDataChunkByte ]
    f.write( x.pack( "Z4V"))
    f.close
  end #def initialize( fspec , outQ, pHash=nil )
end #class ToFile < DigitalAudioElement

class FromFile < DigitalAudioElement
  include DigitalAudio
  def initialize( fspec , outQ, pHash=nil )
    File::open( fspec ) { |f|
      f.binmode
      p "-----------------"
      if( !(buf = f.read(12 )))
        raise "File read error : #{fspec}"
      end
      riffHeader = buf.unpack("Z4VZ4")
      p riffHeader
      if !((riffHeader[0] == "RIFF") && (riffHeader[2] == "WAVE"))
        raise "File format error error : #{fspec}"
      end
     
      # parse 'chunk'
      while( buf = f.read(8) )
        chunkHeader = buf.unpack("Z4V")
        if chunkHeader[0] == "fmt "
          buf = f.read( chunkHeader[1])
          fmtChunk = buf.unpack("vvVVvvvc*")
        elsif chunkHeader[0] == "fact"
          buf = f.read( chunkHeader[1])
          factChunk = buf.unpack("c*")
        elsif chunkHeader[0] == "data"
          break
        else
          raise "unknown chunk type : #{chunkHeader[0]}"
        end
      end

      p fmtChunk, factChunk
      fomatId, noOfChannel, samplingRate, bytePerSec, blockSize, bitPerSample= fmtChunk[0..6]
      p fomatId, noOfChannel, samplingRate, bytePerSec, blockSize, bitPerSample
      if fomatId != 1
        raise "unknown data format. Only LPCM is supported"
      end
      bytePerSample = bitPerSample / 8
      count = chunkHeader[1] # total bytes in data chunk
      p "--datachunk--" ,count
      while( buf = f.read( blockSize ) )
        d = buf.unpack( "C*" )
        for ch in 0..(noOfChannel -1)
          val = bytes2value( d[0..(bytePerSample-1)])
          outQ[ch].push( val )
          d = d[bytePerSample..-1]
        end
        for ch in noOfChannel..( outQ.length() -1)
          outQ[ch].push( 0 )
        end
        count -= blockSize
        break if count <= 0
      end
      for ch in 0..( outQ.length() -1)
          outQ[ch].push( nil )
      end
    }
    p "----Done"
  end #def initialize( fspec , outQ, pHash=nil )
end # class FromFile < DigitalAudioElement

#-------- test
 w1 = Queue.new
 w2 = Queue.new
 w3 = Queue.new
 w4 = Queue.new
 fm = FromFile.new( "WAVE.WAV", [w1, w2 ] )
 fm1 = ToFile.new( "aaa.WAV", [w1, w2] )
# fm2 = FromFile.new( "aaa.WAV", [w3, w4] )
 exit



DELL 1520にPanasonic UJ-120を交換してみた

パナソニックUJ-120というBDドライブが少し前から各所で投売りになってます。ネットのうわさでは、HPがBTO用に確保した在庫を放出したためで、OEM版が格安に、それにつれてオリジナル版も安くなっているとのこと。一時は5000円台もありましたが、ここへきて在庫が払拭し始めたのか価格が上がってます。楽天での最安値はここですかね?


Blu-ray対応マルチドライブ スリムタイプ!HP(Panasonic製)『Blu-ray対応マルチドライブスリムタイプ』[UJ-120BHC-A]Blu-ray対応マルチドライブスリムタイプ
先週木曜日に、6000円台のところがあったので最後のチャンスと購入してみました。

ノートPC用の「GBAS規格」のベゼルなので結論からいうと簡単に交換できました。
DELL1520の本体底面のDVD-Rドライブを止めているネジ(1本)をはずすと、ドライブを引き抜くことができます。トレイを開けておいたほうがやりやすいです。

次にベゼルをはずします。トレーを開けた状態で、ベゼルが手前に来るようにし、(天地逆に)裏返します。右側にある爪をマイナスドライバーなどで上から押しながらベゼルの右端を手前に引くとはずれます。あとは中央付近と左端にもツメがありますが、これらは特になにもしなくても外れてくれるはずです。UJ-120も同様にはずし、ベゼルを交換します。取り付けは、適当に押し込むだけパチンとはまります。
プラスチック部品ですので最悪、折ってしまうことも考えられます。UJ-120から始めて練習しましょう(笑)

あとは、DVD-Rドライブの固定用の金具をUJ-120に付け替えて元のとおりDELL 1520に取り付けてオシマイ。私はOSはVistaですが、Plug&Playで認識され使えるようになりました。
でも手元にBDのディスクがないのでBD-ROMドライブとしてはチェックしていません。今度の週末にでも、何か借りてきて見てみます。

 

 

USB接続で使うにはいわゆる「殻」が必要です。


内蔵型のスリムドライブを外付けUSBに変換できちゃう優れもの!★新品★USB2.0 外付けスリムドライブ RC-USMCG【PC家電_058P2】【PC家電_059P2】【PC家電_060P2】【PC家電_061P2】
これとかつかえそうですね。



FC2Ad

まとめ

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。