2026
2025
2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
全12件 (12件中 1-12件目)
1
通販で買ったHDDも放っておくわけにもいかないので、インストールを始めました。linuxのディストリビューションも悩ましいですが、Ubuntu9.04の日本語版デスクトップをCD-Rに焼いてインストールしてみました。H/WはAsus P5E- HDMI+C2D E6300。とりあえず、HDDは一台のみ接続。な~んにも問題なしで、ネットワークにもつながります。 openssh-serverとsambaを入れて、ほかのPCから、sshで接続できるのを確認して今日はおしまい。
2009.07.30
コメント(0)
![]()
不調になった、メインの録画システムの対策で、サブ機と同じ自作のプログラムを動かして対策してみました。チューナーの制御が問題で、サブ機は【リニューアル記念★ポイント最大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のレベルで考える必要がある。くらいかな.今回は本当に「やっつけしごと」なので、すこし整理してからコードは載せます。では、では。
2009.07.27
コメント(0)
![]()
前に書いたように、録画の倉庫用の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)でも、肝心の録画サーバーの方が不調なので、そちらを先にメンテしなくては…(正確にはチューナーの制御なのですが・・・)
2009.07.24
コメント(0)
メインの録画機は、Windowx XPのメディアセンターを使っています。この上で、録画中のファイルを監視して、同時にHD-PVRを制御してハイビジョン録画をしています。どうも、メディアセンターで直接制御しているキャプチャーが死んでしまったみたい。パイロットランプもつかないので、ACアダプタが一番あやしい(前科一犯)きがするのだが…しおしおのパ~ ・・・
2009.07.22
コメント(0)
んー、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に移行した方が早いかも・・・う~む…
2009.07.17
コメント(2)
![]()
ΔΣ型アナログ/デジタル変換器入門えー、こんな本買ってみました。まあ、仕事4割、シュミ6割です。Amazon.comで原書買うほうが安いですが、急いで欲しかったのと、監修者の安田先生(デルタシグマの生みの親)に敬意を表して翻訳版を買いました。いまや、A/D、D/Aコンバータの主流といってもよい、デルタ・シグマ型のコンバータの入門書です。まだ、2/3くらいしか読んでませんが、いままで、定性的には理解していたことをちゃんと勉強するにはよい本です。どちらかというとA/D変換の方が主にかかれてますが、デルタ・シグマではA/DもD/Aも基本的な考え方は同じ、という興味深い対象性があるので、あれこれ考えを巡らせるのは楽しいです。余談ですが、なぜか海外ではSigma-Deltaと呼ばれることが多いのですが、「本来は『デルタ・シグマ』である」と、安田先生は主張していますな。 ただ、一応ラプラス変換(というか正確にはZ変換)くらいは使えないとすらすらとは読めません。学生時代にやったはず(一応私は、電子・情報系)なのですが、全くおぼえていないので、ちょっと苦戦中。orzこれでも買おうかな・・・ やり直しのための工業数学(Vol.7)
2009.07.17
コメント(0)
どうも、ルーターがお亡くなりになったっぽい。orzNECの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のモデルにするか・・・ 悩ましい。物入りよのう・・・
2009.07.13
コメント(0)
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で試してみましょう。
2009.07.09
コメント(2)
すっかり「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 DigitalAudioclass DigitalAudioElement include Math include DigitalAudio @@S48k = 48000end #class DigitalAudioElementclass 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 < DigitalAudioElementclass 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
2009.07.08
コメント(0)
![]()
パナソニック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】これとかつかえそうですね。
2009.07.07
コメント(0)
録画を保存しているハードディスクが一杯になってきてしまいました。基本的には、「見て消し」なのですが、見る方の速度が追いついていないのが敗因です(笑)。 2TBのドライブ×3台でRaid5、としたいところですがさすがにまだ高価です。orz現実的には、SamsungのHD154UIですかね。これなら、今日現在で1万円強です。私が初めて500Gのドライブを買ったときは4万円を切った頃ですから安くなったものです。問題は、マザーボードというか、システムの方です。LinuxでのRaid5の実験をして見なければなりません。実用的に使われているようですから、soft Raidの信頼性には問題はないとおもいますが、Atomとかで十分な性能がでるかどうか?まあ、どうせ「倉庫用」ですが…遅くとも今月中にはディスクの追加は必須だし、う~ん、どうしよう・・・
2009.07.04
コメント(0)
録画の予約を管理するためのデータベースです。デバッグが楽になるかと思い、ディレクトリ(データベース)にiEPGデータをファイル形式で入れてあります。ファイル名がキーになっているハッシュみたいな感じ。あとでちゃんとしたデータベースエンジンを利用する方がいいでしょうね。当初は、録画の予約時間順にデータが取り出せればよいと思っていたので、キューみたいなものを想定していたのですが、録画予約の確認のためにはソートした一覧とかが必要で、むしろArrayに近いI/Fになっています。参考、Rubyで利用できるデータベース機能http://www.gesource.jp/programming/ruby/database/index.html----## Class ReserveDB (C)2009 B.O.# refer below for MonitorMixin# http://www.ruby-lang.org/ja/man/html/MonitorMixin.htmlrequire( "monitor")require( "IEPGD")require( 'to_WinFileName' )class ReserveDB include To_WinFileName include Enumerable @@EXT = "tvpid" def initialize( workFolder ) @workFolder = File::expand_path( workFolder) self.extend(MonitorMixin) if ! FileTest::directory?( @workFolder) Dir::mkdir( @workFolder ) end end #def initialize def to_s "ReserveDB[#{@workFolder}]" end #def to_s def clear synchronize { Dir::glob( "#{@workFolder}/*.#{@@EXT}").each {|f| File.delete( f ) } } end #def clear def length to_a().length() end # def length def empty? length() == 0 end #def empty? # adding an iEPGD data # needs to check if the same program has existed already def push( iEPGo ) synchronize { del( iEPGo) fname = iEPGo.to_s("%D__%T_%eT_%program-title:_%station-name:_%station:" ) fname = to_WinFileName(fname ) fname += ".#{@@EXT}" fh = File.open("#{@workFolder}/#{fname}",'w') fh.puts( iEPGo.to_s ) fh.close } end # def push( iEPG ) # delete # if successful, returns true # if not returns nil def del( iEPGo ) ret = false # gather all data in the DB synchronize { Dir::glob( "#{@workFolder}/*.#{@@EXT}").each {|f| if (arrayiEPG= IEPG.File2Array( f)) if arrayiEPG[0].sameProgram?( iEPGo ) File.delete( f ) ret = true end end } } ret end # def _del( oiEPG ) def to_a ar = Array.new synchronize { # gather all data in the DB Dir::glob( "#{@workFolder}/*.#{@@EXT}").each {|f| if (arrayiEPG= IEPG.File2Array( f)) ar += arrayiEPG end } } ar end #def to_a def each ar = to_a ar.each{|prof| yield(prof) } end # def each def top() min() end # def top def pop synchronize { if (tmp = top()) del( tmp ) return tmp else return nil end } end #def pop end # class ReserveDB
2009.07.03
コメント(0)
全12件 (12件中 1-12件目)
1
![]()
![]()
![]()