2026
2025
2024
2023
2022
2021
2020
2019
2018
2017
2016
2015
2014
2013
全22件 (22件中 1-22件目)
1
やっと、Jimdoの使い方が判ってきたので、公開します。こちらからどうぞ。特徴複数のHD PVRデバイス対応 入力解像度が変化した場合も追従 マルチスレッドにより相対的にロードが重い環境でも安定して動作 ドライバのインストールのヒント もReadMeに入れました。
2009.04.29
コメント(0)
![]()
刈高を7.5mmに落とす。まだ、去年の古い芝を刈っている感じ。我が家の芝刈り機はこれ_▲●春の新生活応援SALE開催中!●▲【送料無料!】Panasonic(パナソニック)庭園芝刈機(芝刈り機)▼EY2273P-W(白)なのだが、3年目にして調子が悪い。刈高の調整のところが壊れた。バラしてみると、調整のメカがおかしいみたい。ノブを止めているねじを緩め、調整後ネジを締めれば問題ないようなので、それでいいことにする。
2009.04.28
コメント(0)
Hauppauge HD PVRの簡易キャプチャソフトの話を前にも書いたけど、その後もチマチマと直したりしている。マルチバッファリングの個々のバッファのサイズはどれくらいが適切か?とか、アダプティブに変える?とか悩んでたのだが、よく考えてみればUSBデバイスなのだから、MaxPacketSizeが決まっているはず(あほくさ)。問題は、どうやってMaxPacketSizeを知るかだが、WindowsでChapter9テストとかやればいいのだろうか?と思ったらこの手のツールはlinuxにはちゃんとあるんですね。lsusb -v での結果をみると、512でいいようだ。ついでに、キャプチャのプロセスの優先度を自分で上げるように変更してみた。もちろんroot権限で実行する分には問題ないのだけれど、chmod +s とかで、権限を与えても一般ユーザーではうまくいかない…ナゼ?。要調査%lsusb -v (途中省略)Bus 004 Device 050: ID 2040:4900 HauppaugeDevice Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x2040 Hauppauge idProduct 0x4900 bcdDevice 0.00 iManufacturer 1 iProduct 2 iSerial 3 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 32 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xc0 Self Powered MaxPower 4mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 2 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 2 Transfer Type Bulk Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 0can't get device qualifier: Operation not permittedcan't get debug descriptor: Operation not permittedcannot read device status, Operation not permitted (1)
2009.04.24
コメント(0)
![]()
私にとっての本命のAtomとIONの載ったマザーボードが今週中にも発売されるらしいが、デュアルコアの330の方は30000円弱になるという… orzこの値段だと、GeForce 9300のマザーボード高性能グラフィックス機能内蔵チップセット『GeForce 9300 mGPU』採用高性能グラフィックス機能内蔵 マイクロATXマザーボード MSI P7NGM-DigitalとE7200あたりの方が安い。Mini-ITXにこだわるとしてもnVIDIA GeForce9300チップセット搭載 IEEE802.11b/g WiFi搭載 LGA775対応 MiniITXマザーボード【ZOTAC】GeForce 9300-ITX WiFi GF9300-D-Eこれあたりの値段を考えると、びみょ~・・・・Atomならファンレスだが、ケース全体も含めて完全ファンレスには一工夫必要だろう。そうするとやっぱりGeforce9300のほうがいいような・・・悩ましい。
2009.04.23
コメント(0)
玄箱HGのパフォーマンスの低さに業を煮やし、目的が変わって使わずにほっておいたマザーボードにUbuntuデスクトップ(8.0.10)を入れてみました。もちろん快調。このPCはRegzaの録画用NASとして、Sambaをいれ、Hapupauge HD PVRも2台つないであります。C2D E7200+メモリ2Gなのでまだまだ余裕がある状態です。 もったいないので、ubuntuをホストOSにして、VMPlayer(2.5.2)をいれ、Windows XPをゲストOSにしてみました。VMWareのダウンロードページには、.rpmというファイルと.bundleというファイルがあります。.rpmはRedHat系のパッケージのようです。ubuntuはdebian系なので、apt-getで取得できるパッケージがあれば簡単なのですが…調べてみると、.bundleの方で良いようです。早速ダウンロードして、viで開いてみると、シェルスクリプトのようですが、ファイルの後半の方がバイナリになってますね。時々見かけるlinux用の自己解凍プログラム/スクリプトのようです。 早速、実行権限を設定して、デスクトップのターミナルから実行するとGUIで設定してインストールは簡単にできました。別途用意したWindowsのVMを起動するとまったく問題ありません。ただ、X-Window上で動かすのはちょっともっさりしていて、ゲストOSのWindows上でリモートデスクトップ(RDP)のサービスを動作させて、LANの別のPCからアクセスするのでもパフォーマンスは変わらない感じ。だったらRDPの方がいいですね。ついでに、TeamViewerとWOLのプログラムもゲストOSに入れて、快適に動作を確認。(もともとのホストOSはRegzaの録画用に電源入れっぱなしなので、)これで、家の外からも家庭内のPCを自由に使えるようになりました!
2009.04.19
コメント(0)
今年2回目の芝刈りを実施。刈り足は10mm芝刈り機の歯がダメになりかかっているのか、一気にはここまで下げられず、2回芝刈りをかけることに。この時期刈っているのは、去年の枯れた芝…今年の育成のためにはできるだけ刈り足を下げたい。
2009.04.19
コメント(0)
Hauppauge HD-PVRのLinuxでキャプチャですが、2台あるうちの一台がイマイチ。WindowsXPをホストOSとして、ubuntuをVMPlayer上で動かしている方がなぜか安定しなくなってしまった。症状としては、デバイスからの読み出しができない(一度HHDPVRの電源を切れば問題なし)かったり、ホストOSそのものの挙動がアヤシクなったり…以前は、3ヶ月以上、快調だったのですが、どうしても元にもどりません。仕方ないので、フツーにubuntuデスクトップが動作している、もう一台の方に移して、「2本挿し」に挑戦してみました。結果として、あっさり何にも問題なく動作しました。もちろん同時キャプチャもできます。複数同時にキャプチャはWindows用のオマケソフトではできない(はず)なので、これはウレシイ
2009.04.19
コメント(0)
まえにbashスクリプトでそのスクリプト自体をバックグラウンドで実行するには、 #!/bin/bash( やりたいこと) &でできるという話を書きましたが、()カッコのなかは、サブシェルで実行されるので、ことなるPID(プロセスID)を持つはずです。今日のお題はこれを取得するには?です。普通にやってみる。% cat ./test1.sh#!/bin/bashecho $$( echo $$ sleep 10) &% ./test1.sh36503650% ps PID TTY TIME CMD 12337 pts/5 0:00 csh 3652 pts/5 0:00 sleep 3653 pts/5 0:00 ps 3651 pts/5 0:00 test1.sh%うまくいきませんね...親シェルのPIDと同じ...要はシェルスクリプトを親用、子用でわけてしまえばいいわけだから、% cat ./test2.sh#!/bin/bashecho $$./test2_sub.sh &% cat ./test2_sub.sh#!/bin/bashecho $$sleep 10% ./test2.sh37123713% ps PID TTY TIME CMD 12337 pts/5 0:00 csh 3714 pts/5 0:00 sleep 3713 pts/5 0:00 test2_su 3715 pts/5 0:00 psうまく、いっているようです。ファイルが2つに別れているのはイマイチ・・・evalを使ってみる、 % cat ./test3.sh#!/bin/bashecho $$( eval echo \$\$ sleep 10) &% ./test3.sh38053805% ps PID TTY TIME CMD 12337 pts/5 0:00 csh 3807 pts/5 0:00 sleep 3808 pts/5 0:00 ps 3806 pts/5 0:00 test3.shキーっ、うまくいかない。orzこうなりゃ () なんか使わないで、 ヒアドキュメントで直にbashに喰わせてやるっ!&はどこに書けばいいんだっ?!% cat ./test4.sh#!/bin/bashecho $$/bin/bash << EoS & eval echo \$\$ sleep 10EoS% ./test4.sh52575258% ps PID TTY TIME CMD 5260 pts/5 0:00 ps 12337 pts/5 0:00 csh 5259 pts/5 0:00 sleep 5258 pts/5 0:00 bash はぁ、はぁ・・・うまくいったみたい・・・ほんとうはどうやるの?
2009.04.17
コメント(2)
![]()
日立 iVポケット搭載 デジタルチューナー 【Wooo】 IV-R1000 地上波/CS110・BSデジタルチューナー内蔵 iVDR-S ビデオレコーダー 【送料無料】【あす楽対応_関東】IV-R1000買いました。Hapupauge HD-PVRのチューナー用です。簡単にレビューのそのまえに…「ちくそー、こんなもの、こんなもの、こんなもの~っ! こうして、こうして、こうしてくれるわっ! ハァ、ハァ、ハァ・・・」取り乱して、すみません・・・BufferloのLT-H90DTVはあきらめることにします。わたしが遭遇した問題。(1) 電源を入れっぱなしにしておくと、数日で固まる。D端子経由だが、絵が止まったままになったり、青一色になる。(2) 地上デジタル受信時に、チャンネルを変えると、「受信状況を確認しています」のメッセージがでて固まる。AC電源入力をはずし、再度接続すると以上の不具合からの復帰する。(3) AC電源入力をはずし、再度接続すると、S/PDIF出力(設定は「パススルーなし」)がでない場合がある。(4) 地上D⇔BS(CSはチェックしていない)の切り替え時にメッセージが表示され(メッセージはメモし忘れ)、2分近くたっても切り替わらないことがある。(まれに起きる)(5) トップメニューで、テレビ視聴とLinkTheaterモードを行き来しようとすると、異常に時間がかかる(一度リモコンとかで電源を切って、入れなおす方が早い)。(6) 不具合とはいえないのかもしれないが、放熱設計が間違ってると思う。待機状態にしておいても筐体が結構熱くなる。金属ケースなのはいいが、せめて、「スリット」をつけておいてほしかった。(1)の不具合は、熱のせいじゃないかと邪推。もちろん、使い方によってはダメ商品ではのないかもしれないけど久々に地雷踏んだ。 「どんな駄馬でも乗りこなしてみせる」というプライドもちょぱみじんに打ち崩された感じのする、LT-H90DTV。人にはとても薦められない。とりあえずバッファロー問い合わせはするけど、ダメでしょうな・・・オレの青春(=金と時間)を返して欲しい。 orz.人生は短いので、チューナーを買い換えることにしました。まさに、安物買いの銭失いです。でも、単体のチューナーって少なくなってんですよねー。地デジ/BS/110°CS対応、ディジタルオーディオ出力、D3/4映像出力、HDMI出力で安い方から探すと、次は、YAGIのDCT110あたりなんだけど、これもあんまり評判よくないみたい。「魔改造」の材料にはなるみたいだけど。いっそのことHDレコーダーを買う方がイイのだけれど、HDD壊れるとチューナー単体としても使えないだろうし・・・起動遅いらしいし・・・で、日立のIV-R1000。メーカーサイトをみると、もう製造中止。新製品が出るのかもしれないが、iVDR-Sもそれほど流行っていると思えないので、このままディスコンかな。実勢価格では28000円を切っているところも簡単に見つかります。ちなみに、iVDR-S自体は、まったく興味無しです。HDDカートリッジがちっと高価すぎ。自分でHDDを交換できるカートリッジでも出れば話は別ですけど。以下、簡単な感想(1) 思ったよりでかい。LT-H90DTVより長さが少し短く、幅は1.3倍、高さは1.5倍くらい。ACアダプタなので、結構、実質的な体積でかい。(2) Hauppauge HD-PVRでキャプチャした画像(D4)同士で比較しても、LT-H90DTVより綺麗。HDMIはやってない。(3)そこそこ暑い。正面から向かって、右奥側の天板と底板がそこそこ熱を持つ。ちなみにファン付。ファンの音は、何台かPCが動いている私の部屋では、聞こえないけど、環境によっては、気になるかも。でも、LT-H90DTVよりマシ。(4)BCASカードが出っ張る。orz。子供のいるうちでは困るんではなかろうか?なに考えてんだろう?2日ほど使っただけだが、安定感はさすが、家電の老舗Hitachiという感じ。家電業界が儲からない、という状況に対して「オーバークオリティ」と揶揄する向きもあるが、LT-H90DTVでの苦労を考えると、「オーバークオリティ」大歓迎。
2009.04.12
コメント(0)
え~、今日のお題は「未来時計」です。PCでテレビの録画をしているとPCの時計(結構狂う)あわせが気になります。わたしはメインの録画ソフトはWindows XP MCEのメディアセンターを元にしています。っていうか、メディアセンターの録画開始を別のプロセスで監視して、録画開始を検出したら、Hauppauge HD-PVRで録画開始(チューナーの制御はメディアセンター任せ)という、「ドン臭いこと」をしています。メディアセンターでは、単独の録画に関して、数分前に録画開始、数分後に停止というような設定ができるのですが、ある録画の終了と次の録画の開始が同じ、つまり2つの録画が連続している場合には、あとの録画の3秒くらい前にチューナーの制御と録画の切り替えをします。結果としてHD-PVRでの録画は頭が1~2秒程度切れてしまうことがあります。気にしなければいいのですが、ちょっとねぇ・・・多くの録画用ソフトも本質的には同じ問題があると思うのですが、皆さんどうしてるのでしょう?インターネットを利用したPCの時計あわせとしては、NTPとかあって、「桜時計」とかが有名でしたし、net time コマンドでも時計合わせできますが、正確な時刻にPCの時計を合わせてしまいます。こんなページもありますね。わたしがやりたいのは、要は、「PCの時計を本来の時間より30秒程度進めておく」ことです。何年も前に考えたことがあるのですが、案(1)NTPのクライアントなりサーバーソフトを、いじってウソの時間をPCに設定する→linuxならntpdのソースコードもあるけどWindowsでは・・・NTPってUDP使ってるらしいし、soketを使ったプログラミングなんてわかんないし、で挫折案(2)録画ソフトがシステムの時刻を参照する際のWindowsへのシステムコールをトラップして、ウソ(30秒くらい先の)の時間を返す。リバースエンジニアリングのページに非常に参考になることが書かれていますが、あまりに面倒くさそうで挫折。でも、よく考えたら、秒単位での正確さを求めなければ、「ネットワーク内の別のPCにログインして、time /Tとかdate +%H:%M:%Sを実行して、返ってきた時刻に30秒足して、PCの時計をセットすりゃいい」と気づきました。TeraTermのマクロとかつかえばなんとかなりそう!なんて、思って、ツールの名前も「未来時計」に決定です(うぉ~っ、なんかやる気でてきたぞっ)。Teratermのマクロと小一時間格闘した結果を最後に張っておきます。これでWindowsからUbuntuにログインして時刻を取得、30秒WindowsのPCの時計を進めてセットできます。予約録画に悪影響しないように、ハンパな時間にセットすることを念頭に毎時17分にセットするようにしています。でも、もう一度インターネットをしらべてみたら、adrasteiaが見つかりました。これでやりたいことはできてますね。 orz ;; FutureClock for Teraterm macro;; (c) 2008-09 BOshow 0 ; *** minimize windowHostName='xxxx'Username='xxxxxxx'Password='xxxxxxxxx'sprintf '%s@%s:' Username HostNamePrompt=inputstrtimeout=5while 1; *** making up params for 'connect' command connectParam=HostName strconcat connectParam ':22 /2 /ssh /KR=UTF8 /KT=UTF8 /auth=password ' strconcat connectParam ' /user=' strconcat connectParam Username strconcat connectParam ' /passwd=' strconcat connectParam Password strconcat connectParam ' /V /timeout=5'; *** open Tera Term and connect to the host connect connectParam if result=2 then wait Prompt sendln 'date +%H:%M:%S' recvln waitregex '([0-9]*):([0-9]*):([0-9]*)' str2int hh groupmatchstr1 str2int mm groupmatchstr2 str2int ss groupmatchstr3 sendln 'exit' if mm=17 then ss=ss+30 if ss>=60 then mm=mm+ss/60 ss=ss%60 endif if mm>=60 then hh=hh+mm/60 mm=mm%60 endif sprintf "%d:%d:%d" hh mm ss ; messagebox inputstr 'new time' settime inputstr interval=60*60 else interval=(17-mm)*60-ss if interval<=0 interval=interval+60*60 endif else interval=60*60 endif pause intervalendwhile
2009.04.09
コメント(0)
私の場合、Haupauge HD PVRの使い方は、キャプチャのみlinuxで再生はもっぱらWindows XP MCEでメディアセンターを使ってます。Linuxもいままでubuntuサーバーだったのですが、今回せっかくubuntuデスクトップを用意したので、こちらでも再生のテストをしてみることにします。ということで、自前コーデックてんこもりのvlcを入れてみました。インストールは例によって、apt-get install vlcで一発です。ちゃんと録画したファイルの再生もできました。で、ここからが本題。linux(というかUNIX系)に多少詳しい方はご存知のように、linuxではI/Oもファイルとしてシステムからは見えます。vlcも入力ファイルの指定で/dev/video0とかを直接していしてみたら、ちゃんと写りました(=プレビューできました)。 いままでは、Window機につなぎ変えて、そちらでプレビューとかしてたので助かります。まあ、USBなので簡単な作業なのですが、使ってるチューナー(LinkTheater LT-H90DTV)が信頼感0でしょっちゅう確認しなければならないので助かります。 vlcってストリームサーバーの機能もあるはずなので、そっちを使うのも面白そう(この話はまた別の機会に)
2009.04.08
コメント(0)
相変わらず、bashでハマってます。本でも買えばいいのだろうけど、いまさらbashに詳しくなってどうする?って感じだし… でも、bashのスクリプトがすらすら書けると、プログラマには尊敬されるかもしれない。今日のお題は、「bashのシェルスクリプトをバックグラウンドで実行するには?」です。&をつけてコマンドを実行する、ではなくて、自分自身(シェルスクリプト自体)をバックグラウンドで実行する、です。#!/bin/bash$0 $* & 実際にやりたい処理 :では、出来の悪い「fork爆弾」だし・・・ ()で囲ったコマンドは子プロセスのshellで実行されるのだから、 ( 実際にしたい処理 ) & でいいのかしら?#!/bin/bashi=0(while [ -n "a" ] ; do echo $i i=$(expr $i + 1 ) sleep 1done) &いいみたい・・・
2009.04.08
コメント(0)
HD-PVR用の簡易キャプチャソフト(linux用)のデータコピー以外の遅くてもいいところは、bashのスクリプトでできています。いわゆるコマンドラインのオプションを使えるようにしようと、スクリプトを少しかきなおすことにしましたが、bashってどうもわかんない。 インターネットを探しても、出てくるのは知っているような話が多い・・・orzここのサイトに書いてあることが結構役に立ったが、exprとか、ヘンタイ的な変数の扱いとか、、、 結局1時間ほど格闘して、コマンドラインオプションのパースをするところを作って見mした。caseまではたどり着けず、if ~ elifの羅列。bashって嫌いだ・・・#!/usr/bin/bashdevice=/dev/video0folder=~/HDPVR_REClog=~/HDPVR_REC/log.logv4lop=( '-A' '-Ab' '-c')while [ -n "$1" ]; do #echo "$1" #echo $( expr "$1" : "\(-device=\).*" ) if [ -n "$( expr "$1" : "\(-device=\).*" )" ]; then device="$(expr "$1" : '-device=\(.*\)' )" elif [ -n "$( expr "$1" : "\(-folder=\).*" )" ]; then folder="$(expr "$1" : '-folder=\(.*\)' )" elif [ -n "$( expr "$1" : "\(-log=\).*" )" ]; then log="$(expr "$1" : '-log=\(.*\)' )" elif [ -n "$( expr "$1" : "\(--opt=\).*" )" ]; then v4lop[ ${#v4lop[@]} ]=$1 elif [ -n "$( expr "$1" : "\(-\).*" )" ]; then echo $(expr "$0" : ".*/\(.*\)\$" ) : usage echo Brabra exit 1 else arg=$1 fi shift doneecho device ${device}echo folder ${folder}echo log ${log}echo arg ${arg}for opt in ${v4lop[@]}; do echo v4l ${opt}done
2009.04.07
コメント(0)
IO DATAのGV-D4VRが発売になったらしいですね.【送料無料】I・O DATA D4入力&フルHD対応 ハードウェアMPEG-2エンコーダ搭載 ビデオキャプチャボード PCIモデル [GV-D4VR] 某掲示板では,早速いわゆる「神設定」を見つけたひとがいるらしい.でも,私的にはスルーかな・・・ もちろん、Hauppauge HD-PVRがあるからだが、 理由・MPEG-2ベースでは再エンコ必須(ファイルがでかい)→今のCPUパワーでは死ぬほど時間掛かる.だいたいディジタル放送を録画(MPEG2→アナログ→MPEG2)だったら「TS抜き」したい・・・・アナログオーディオ入力しかないので,5.1chオーディオが単独では不可.・USBじゃない。やっぱ、便利なのよUSBは。。。価格もHD-PVRに比べると(アメリカで買うことを考えれば)ほぼ差はない。「録画人間の末路」さんにD1⇔D3の自動追従の話が書かれていますが、HD-PVRも付属のWindows用のソフト(TotalMediaExtreamのOEM版)ではできています。実はこの機能は結構重要で、私の視聴しているCATVはHD/SD混在だし、WOWOWやNHK教育も同様。(CanopusのHDRECSの時は苦労しました。サンプルソフトをもとに自分で自動追従するソフト作ったし・・・) ただ、おまけのソフトは解像度が変わったときもそのまま、同じファイルになってしまうので、あとで再編集するときはちょっと不便です。Linux用は自分で作りましたけど、こちらは解像度が変わったときファイルを分けるようにしました。 そういえば、そろそろ自分で作ったソフトも公開しますかねぇ…まあ、なにはともあれ、HDの録画環境が増えるのは喜ばしいことです。。。
2009.04.07
コメント(0)
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" }
2009.04.06
コメント(0)
最後に残った問題として、HD PVR(/dev/video0)が一般ユーザにリードパーミッションが与えられない件です。sudo chmod +r /dev/video0とすればいいんですが、毎回毎回するのも面倒です。いろいろインターネットを調べると、ubuntu(debian)では、/etc/security/access.confあたりのファイルの設定をすればいいようですが、よくわかりません。俄かlinuxユーザーにはキツイところです。仕方ないので、簡易キャプチャ用のソフト自体を sudo chmod +s コマンドでroot権限を与えてしまいました。セキュリティ上好ましくないので、あとでちゃんと調べますけど… 簡易キャプチャソフトのバッファの使い方がイマイチかも知れない件(リードスレッドがきちんとバッファを埋められていないかも知れない件)ですが、リードスレッドでループの待ち時間をアダプティブに変更することを思いつきました。一回の read() 関数の呼び出しでバッファがすべて埋まっていなければ、少し待ち時間を増やす。逆にバッファが埋まっていたら、少し待ち時間を減らす、というのはどうでしょうか? これもそのうち試してみます。。。
2009.04.05
コメント(0)
![]()
実は私は今を去ること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が判ってないとつらい。
2009.04.05
コメント(0)
![]()
にゃんこたちは生後6ヶ月.体重は3.3Kgほどになりました.乳歯の生え変わりも続いています.相変わらず、狭いところが大好きです.写真は私がソファの上に脱ぎ捨てたジーンズのなかを探検して,"Dr. Livingstone, I presume"みたいになっているところ...
2009.04.05
コメント(0)
Linux上で、キャプチャするための簡易ソフトの話。いままで。ずっとvmplayer上のubuntu server 7で動かしていましたが、新しいドライバの不調の原因を突き止めようと、ubuntu desktop 8に移行というか変更して調査していました。不調の原因はつまなるミスで、動くようになりましたが、並行してディスクにアクセスしたりすると、キャプチャが止まってしまう、という新たな問題が出てきました。というのが、ここまでの経緯です。キャプチャ用の簡易ソフトはやってることは、つまるとこファイル間のデータコピーなのですが、ソースとなるHD PVRからはリアルタイムでデータを引き抜く必要があり、一方ディスティネーション側のHDDは本質的にはリアルタイム性はないわけです。で、ソースから一定量データをバッファ読む、ディスティネーションにそれを書く、をシーケンシャルにやっていると瞬間的に間に合わなくなることがある、というのが考察です。このような場合の常套手段としては、バッファを複数もって読み出しと書き込みを並行してやるわけですが、そのためにはスレッド・プログラミングとかをするのですが、なにせ私がc言語を真面目に使っていたのは、MS-DOSの時代なので、概念はわかっているつもりでもちょっとチャレンジングでした。ハイ。プログラムは今のところ問題がないレベルに仕上がったのですが、ものはついでなので、topとか動かしながら、システムに負荷をかけたりしてすこし様子をみてみました。以下、雑多な考察。簡易キャプチャソフトの負荷は、topで見ている限りは1~2%なので、一応合格でしょう。vmplayer上のlinuxでも問題ないでしょう。 意外にsambaが重い。linuxのシステムは、C2D7200,メモリ2GB,HDDはHGSTの725050VLA360とファイルサーバーには豪華仕様です。Windows機からsambaで公開しているボリュームにビデオのファイルのような巨大(数GB)なファイルを読み書きすると、40kB/sec位は出るのですが、このときサーバー機上のsambaデーモンはCPUを30%くらい喰ってます。Atomベースのマザーボードにそのうち切り替えようと思っていたのですがちょっと考え物かもしれません。LANを100Mに設定するとか、Jumboフレームを導入するとかすれば状況は変わるでしょうが、我が家はまだ100Mの機器もあるので、悩ましいです。一番キツクなるタイミングは、数GBとか巨大なファイルをまとめて消したりするときのようです(ファイルシステムはext3)。HDDの音を聞いていても、「カッ、カッ、カッ、」と音がします。バッファサイズの適正量とその運用。いま一本のバッファを4096Byteにし、1024個のバッファを用意しています。プログラムにちょっと細工をしてどれくらいのバッファが埋まっているか調べるようにしました。ピークでは450くらいまでいくのでもう少しバッファの個数を増やしたほうがよさそうです。一本のバッファの大きさは「何の考え」もなく4096にして、スタティック変数にしてあります。ほぼ100%ページバウンダリをまたぐので、I/Oはスキャッタ・ギャザーDMAだとしてもあまりよろしくないかも・・・あと今の実装ではソースデバイスからのデータの読み出しスレッドは全速力で読んでますが、一回のread()関数の読み出しでバッファがすべて埋まらない可能性があります。usleepとかで少し「待ち」をいれた方がいいかもしれません。 で、「PAC3」は本当に当たるのか?
2009.04.03
コメント(0)
前回のプログラムだが、よく考えるとフルmutex,エンプティmutexは獲得できれば、データを書くスペースがある、読み出すべきデータがある、ことをそれぞれ意味するようです。ここでfifoの長さを1とすれば、データの読み書きをする場所は1箇所になり、データバッファへのインデックス変数ももはや不要になります。2つのmutex+データバッファを単位として、この配列をつくった方がスマートな実装になりそうです。(fifo2.c) ついでに言えば、2つのmutex+データバッファの「オブジェクト」とにしたほうが見通しがよくなりそう・・・ c++は古い仕様しかわからない(orz)ので、今回はこれでよしにします…(2009/4/4追記)下のプログラムはいわゆる「スレッド・セーフ」ではないライブラリ関数が使われています。(printfなど)よって、正しく動作しない可能性があります。(実際には試した範囲では問題は起きていませんが) 恥さらしですが、サンプルのプログラムはそのまま、晒しておきます。----- fifo2.c ------// gcc file_name.c -lpthread #include <stdio.h>#include <stdlib.h>#include <pthread.h>// FIFO control#define FIFOSIZE (100)typedef struct { int buf ; pthread_mutex_t wLock, rLock ;} _BufType ;static _BufType fifo[FIFOSIZE] ;void * thread1( void* pParam) { int i, index ; for( i = 0, index=0 ; i < 1000 ; i++ ) { pthread_mutex_lock( &(fifo[index].wLock ) ) ; // start of writing data to buffer fifo[index].buf = i ; // end of writing data to buffer pthread_mutex_unlock( &(fifo[index].rLock ) ) ; if( (++index) >= FIFOSIZE ) { index = 0 ; } printf("push %d %d\n", index, i ) ; usleep( (rand() % 100)) ; }}void * thread2( void* pParam) { int i, index, d ; for( i = 0, index=0 ; i < 1000 ; i++ ) { pthread_mutex_lock( &(fifo[index].rLock ) ) ; // start of reading data from buffer d = fifo[index].buf ; // end of reading data to buffer pthread_mutex_unlock( &(fifo[index].wLock ) ) ; if( (++index) >= FIFOSIZE ) { index = 0 ; } printf("pop_ %d %d\n", index, d ) ; usleep( (rand() % 100) +10) ; }}int main(void) { int i ; pthread_t tid1, tid2; // initialize mutex of FIFOs for( i = 0 ; i < FIFOSIZE ; i++ ) { // fifo[i].wLock = PTHREAD_MUTEX_INITIALIZER // fifo[i].wLock = _Lock pthread_mutex_init( &(fifo[i].wLock), NULL) ; pthread_mutex_unlock( &(fifo[i].wLock )) ; //fifo[i].rLock = pthread_mutexattr_init( NULL ) pthread_mutex_init( &(fifo[i].rLock), NULL) ; pthread_mutex_lock( &(fifo[i].rLock )) ; } pthread_create(&tid1, NULL, thread1, NULL); pthread_create(&tid2, NULL, thread2, NULL); pthread_join(tid1,NULL) ; pthread_join(tid2,NULL) ; return 0 ; }
2009.04.03
コメント(0)
refer http://onishi-lab.jp/programming/thread_linux.htmlここりらあたりに書かれていることを参考にして、fifoを扱う仕掛けを書いてみた(fifo1.c)。 要は、スレッドの開始はpthread_create(),終了待ちはpthread_join()をつかうようだ。あと、mutexはクリティカル・リージョンに入るとき、pthread_mutex_lock()、出る時にpthread_mutex_unlock()をつかうということ。 最後に貼り付けたfifo1.cはとりあえずちゃんと動作するようです。 リード、ライトのindexとフル、エンプティ判定がちょっとわかりにくい&計算コストが高そうと思うかもしれません。もともとはVerilog-HDLで書いたfifoを、長さが2のべぎ乗以外でも使えるように、拡張というか一般化したもの。fifoの長さが2のべき乗ならば、%(剰余)計算はビットアンドでできますし、isFull()のなかの_rPtrの計算は最上位ビットの反転に相当します。インデックスの範囲をバッファの数の倍まで数えるのが巧妙なところです。フルやエンプティのチェックをしたあと、usleep()とか「ちょっと待つ」ことをしているのがややダサいですね。fifoのフル/エンプティに対してlock(=mutex)を用意して、push()の動作は フルmutexをロック(既にfifoがフルならばこの時点でスレッドはブロックされる) 実際にデータをpush エンプティmutexをアンロック フルでなければフルmutexをアンロックpop()の方は エンプティmutexをロック(既にfifoがエンプティならばこの時点でスレッドはブロックされる) 実際にデータをpop フルmutexアンロック エンプティでなければエンプティをアンロックとかすればよさそう・・・---fifo1.c---// refer http://onishi-lab.jp/programming/thread_linux.html// gcc file_name.c -lpthread #include <stdio.h>#include <stdlib.h>#include <pthread.h>// FIFO control#define FIFOSIZE (256)typedef int DATA ;static DATA fifo[FIFOSIZE] ;static int wPtr = 0, rPtr = 0 ;static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;void copyData( DATA *from, DATA *to ) { // this is prototype *to = *from ;}//// inc() must be called inside of critical region//void inc( int *p ) { int a ; a = (*p) + 1; *p = a % (FIFOSIZE * 2) ; }int isFull( void ) { int _rPtr, res ; pthread_mutex_lock( &mutex); _rPtr = rPtr + (FIFOSIZE ) ; _rPtr = _rPtr % (FIFOSIZE * 2) ; res = ( _rPtr == wPtr ) ; pthread_mutex_unlock( &mutex); /****************** if (res) { printf("FIFO is full %d %d,%d\n", _rPtr, rPtr, wPtr) ; } else { printf("FIFO is not full %d %d,%d\n", _rPtr, rPtr, wPtr) ; } *******************/ return ( res ) ;}int isEmpty( void ) { int res ; pthread_mutex_lock( &mutex); res = (rPtr == wPtr ) ; pthread_mutex_unlock( &mutex); /****************** if (res) { printf("FIFO is Empty\n") ; } else { printf("FIFO is not Empty\n") ; } *******************/ return res ;}void push( DATA *p ) { int ptr; ptr = wPtr % FIFOSIZE ; pthread_mutex_lock( &mutex); // start of writing data to buffer copyData( p, &(fifo[ ptr ])) ; // end of writing data to buffer if( (++wPtr) >= (FIFOSIZE * 2)) { wPtr = 0 ; } pthread_mutex_unlock( &mutex); printf("push %d %d\n", ptr, (int) *p ) ; }void pop ( DATA *p ) { int ptr; ptr = rPtr % FIFOSIZE ; pthread_mutex_lock( &mutex); // start of reading data from buffer copyData( &(fifo[ ptr ]), p) ; // end of reading data from buffer if( (++rPtr) >= (FIFOSIZE * 2)) { rPtr = 0 ; } pthread_mutex_unlock( &mutex); printf("pop %d %d\n", ptr, (int)*p ) ; }void * thread1( void* pParam) { int i, j, d, randn ; for( i = 0 ; i < 1000 ; i++ ) { while( isFull()) { usleep( (rand() % 100)) ; } usleep( (rand() % 100)) ; push( (DATA *) &i ) ; }}void * thread2( void* pParam) { int i, j, d, randn ; for( j = 0 ; j < 1000 ; j++ ) { while( isEmpty()) { usleep( rand() % 100) ; } usleep( (rand() % 100)) ; pop( (DATA *) &d ) ; }}int main(void) { pthread_t tid1, tid2; pthread_create(&tid1, NULL, thread1, NULL); pthread_create(&tid2, NULL, thread2, NULL); pthread_join(tid1,NULL); pthread_join(tid2,NULL); return 0 ;}
2009.04.03
コメント(0)
auppauge HD-PVRのLinuxの問題だがやっと原因がわかりました。お恥ずかしい話だが、/dev/video0の読み出しパーミッションが無かった、というだけでした。わかってしまえばなんということも無いのだが、ハマった。(なにせlinuxあんまりわかんないのです。)ターミナルからsudo chmod +r /dev/video0とかすればとりあえず解決するのだが、ホットプラグやブート時に毎回やるのはめんどくさいので、ユーザーアカウントの設定で、「TVやウェブカムに・・・」にチェックをつけておけばOK。ターミナルからはどうすれば、いいのだろう?要調査です。実は別の問題も発覚してしまいました。今までは、Windows XPのVMPlayerで走っているubuntu serverでHD PVRを使っていました。ディスクはlinux(ubuntu)には数Gbしか割り当てていないので、いかにH264とはいえ、録画にはそれなりにディスク容量が必要です。そこでXPのディスクを共有設定して、smbmountでマウントしてるようにしてました。今回、動作不良の原因がまったくわからないためちょうど仮組みしたubuntu 8のデスクトップで試していたのですが、録画中に他のファイルを消したりすると、録画が途切れる症状がでました。どうも、ディスクアクセス中にHD PVRからのデータの引取りが間に合わなくなるようです。推察するに、smbmountでネットワークドライブへ書き込む場合はディスクサーバーのキャッシュで救われていたのだと思います。 いままでのプログラムはバッファを4KByteしか割り当てていないので、12Mbpsの設定とすると、0.6MByte/Secなので、4kB/0.6(MB/sec) = 0.0066・・・ 200分の1秒位しか余裕が無いことになります。これはムリがありますね・・・reniceコマンドとかでnice値を-5とかにしてみましたが、この程度では効果はないようです。 ん~、やっぱりHD PVRからデータを吸い上げる部分と、ディスク出力のthreadを分けて、FIFOみたいなもの間に用意しないとだめかなぁ・・・だいたいthreadとかmutex(排他制御)とかcでどうやってやるんだっけ?
2009.04.02
コメント(0)
全22件 (22件中 1-22件目)
1