事象の水平線

個人的ブックマーク代わりなメモ書きブログ。 地球は丸いよ。↓このへん。

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

PageTop
epgrec UNAに移行して、tsselectも新規にインストールしたら、いきなり動かない。
どうもFloating point exceptionとか何とか言われる。

で、グーグル先生に聞いたら、某ニチャンのスレで答え発見。
進行状況表示で0割してるらしい。

なるほど、
tsselect.cの312行目と503行目の
n = (int)(10000*offset/total);
が0割になる時があるのかな。

てな訳で、
n = total != 0 ? (int)(10000*offset/total) : (int)(10000*offset);
というお粗末な事をしてコンパイルして終了。動くようになった。
標準出力だけのようなので、全体をif( total != 0 )で囲んでもよかったけど、直接ターミナルで動かした時、何の表示もなく数分固まるのもいやなので、むちゃくちゃだけどこうしておいた。

んー今までなかったのになぜだろう。いいのかな?まぁぃいゃ。cなんてぜんぜんわからんし~~。ドロップとエラーのカウントをしてログ吐いてるだけだし。

と、思ったら今度は
failed on open(/file/name) [src]
がでる。

で、どうやら32bitOSにしたせいらしい。こんな弊害が出るとは・・・・

で、tsselect.cの頭に以下を入れてコンパイル、で、OK
#define _LARGEFILE_SOURCE
#define _FILE_OFFSET_BITS 64


参考『プログラミング/C,C++/2GBより大きなファイルの扱い

スポンサーサイト

PageTop
今更epgrec UNAです。適当な何かの別館さんのepgrecの派生版です。
思いのほかちょこちょこハマッタので自分用メモです。基本的にハマッタところだけ。

環境はEPGrecの時とほぼ同じです。 →PT3 導入 CentOS6.3_64bit epgrec(前半)
ST3000DM001(3TB)を追加したので、そこにOSを入れてシステムを刷新です。
前回との違いは、HDDと、OSがCentOS6.5の32bitになった位です。(32bitに深い意味はないです)

3TBのGPTでAFTなHDDでもCentOS6.5 LiveCDのGUIのインストーラーで普通に問題なくインストールOK
4kセクタも問題なし。
apache、php、mysqlは以前とほぼ同じ。(最後に若干記述あり)

スマートカード関連等々は省略。(うまく動かなかったが、くぁwせdrftgyふじこl (ry)

PT3ドライバは以前と全く同じ

epgdumpはepgrec UNA用のをmake , make install

recpt1は以前入れたhttp版を基本的に使用
最新+epgrec UNA用のhttpパッチを使わないのは、うまく動かなかったから。(gethostbyname failedとかなんとか)
プラス、epgrec UNAのreadmeで
『視聴終了は、プレイヤーを終了するだけでなく録画コマンド終了とチューナー管理のために番組表右上にある「視聴終了」をクリックしてください。
httpサーバー対応録画コマンドを使用している場合、プレイヤーからチャンネル変更をすることが出来ますが放送波変更をともなうチャンネル変更は、チューナー資源管理に支障がでますのでやらないで下さい。』
という事だったので、今の環境より使い勝手が悪くなるのであえて今までのものを使う事にしました。

recpt1は最新のではhttp版のパッチが当たらないので、古いのを使います。
iakdevelの日記さんから
http版パッチ			recpt1.c.patch
を取得

それと、適当な何かの別館さんから
recpt1 BSチャンネル指定追加パッチ			recpt1_bs_ch.diff
recpt1 EPG用TS出力モード追加パッチ recpt1_epg_slim.patch
epgrec UNA (人柱版 2013/06/09)を解凍すると出てくる recpt1ctl.diff
を取得

/usr/local/src/pt1-b14397800eae/recpt1/pt1_dev.h のpt1をpt3にgedit等で書き換え。
(viで開くと文字コードが変わってコメントが文字化ける→geditで文字化け対策
~略~

char *bsdev[NUM_BSDEV] = {
"/dev/pt3video1",
"/dev/pt3video0",
"/dev/pt3video5",
"/dev/pt3video4",
"/dev/pt3video9",
"/dev/pt3video8",
"/dev/pt3video13",
"/dev/pt3video12"
};
char *isdb_t_dev[NUM_ISDB_T_DEV] = {
"/dev/pt3video2",
"/dev/pt3video3",
"/dev/pt3video6",
"/dev/pt3video7",
"/dev/pt3video10",
"/dev/pt3video11",
"/dev/pt3video14",
"/dev/pt3video15"
};
~略~


[root@NAS src]# cd /usr/local/src
[root@NAS src]# unzip '/usr/local/src/b14397800eae.zip'
[root@NAS src]# tar zxvf '/usr/local/src/recpt1_bs_ch.tar.gz'
recpt1_bs_ch.diff
[root@NAS src]# tar zxvf '/usr/local/src/recpt1_epg_slim.tar.gz'
recpt1_epg_slim/
recpt1_epg_slim/readme.txt
recpt1_epg_slim/recpt1_epg_slim.patch
[root@NAS src]# cd '/usr/local/src/pt1-b14397800eae/recpt1'
[root@NAS recpt1]# patch < '/usr/local/src/recpt1ctl.diff'
patching file recpt1ctl.c
[root@NAS recpt1]# patch < '/usr/local/src/recpt1_bs_ch.diff'
patching file recpt1.c
[root@NAS recpt1]# patch < '/usr/local/src/recpt1_epg_slim/recpt1_epg_slim.patch'
patching file tssplitter_lite.c
Hunk #1 succeeded at 536 with fuzz 1 (offset 3 lines).
[root@NAS recpt1]# patch < '/usr/local/src/recpt1.c.patch'
patching file recpt1.c
Hunk #1 succeeded at 85 (offset 7 lines).
Hunk #2 succeeded at 583 (offset 54 lines).
Hunk #3 succeeded at 606 (offset 54 lines).
Hunk #4 succeeded at 991 (offset 54 lines).
Hunk #5 succeeded at 1002 (offset 54 lines).
Hunk #6 succeeded at 1035 (offset 54 lines).
Hunk #7 succeeded at 1099 (offset 54 lines).
[root@NAS recpt1]# ./autogen.sh
Generating configure script and Makefiles for recpt1.
Running aclocal ...
Running autoheader ...
Running autoconf ...
[root@NAS recpt1]# ./configure --enable-b25
checking for gcc... gcc
checking for C compiler default output file name... a.out
checking whether the C compiler works... yes
checking whether we are cross compiling... no
checking for suffix of executables...
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking for create_arib_std_b25 in -larib25... yes
checking for log10 in -lm... yes
checking for pthread_kill in -lpthread... yes
configure: creating ./config.status
config.status: creating Makefile
config.status: creating config.h
[root@NAS recpt1]# make
~略~
[root@NAS recpt1]# make install
install -m 755 recpt1 recpt1ctl checksignal /usr/local/bin


epgrec UNAを/var/www/に解凍 # tar zxvf なんたら~~.tar.gz
/var/www/epgrec/config.php
の地デジチャンネルマップを修正
又、以下も修正
define( "TUNER_UNIT1", 2 );							// 第一チューナーの各放送波の論理チューナ数(地上波・衛星波で共用 ex.PT1が1枚なら2)
define( "TUNER_UNIT2", 0 ); // 上記以外の論理チューナ数(未使用)

// PT1キャラデバ版ドライバー使用時に変更すること
define( "USE_RECPT1", TRUE ); // recpt1使用時はTRUEにすること
define( "RECPT1_EPG_PATCH", TRUE ); // recpt1 EPG単独出力パッチ使用時はTRUE

パーミッション設定
# cd /var/www/epgrec
# chmod -R 777 cache templates_c video thumbs settings
# chmod -R 755 Smarty cron.d imgs install js start templates
# chmod 755 do-record.sh* getepg.php recomplete.php gen-thumbnail.sh

www-data をグループ、ユーザー登録
# /usr/sbin/groupadd www-data
# /usr/sbin/useradd -d /home/www-data -m -g www-data -r -s /bin/bash www-data
とかなんとか。

また同時に、apacehの設定も一部変更
# vi /etc/httpd/conf/httpd.conf
User www-data
Group www-data


あとは、以前のepgrecと同様にブラウザから設定。
cronは www-dataで登録
# vi /etc/cron.d/getepg
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

46 * * * * www-data /var/www/epgrec/shepherd.php
とかとか

CentOSはアパッチユーザーがapacheなのだけど、epgrec UNAはコードの中でアパッチユーザーをwww-dataとして書き込んでいる(config.php)ので、そこを変えるかwww-dataユーザーで動かさないとshepherd.phpがこける
また、最初ユーザー登録の際にログインシェルをnologinにしてatが動かなかったり、相当ハマッタ。
以前のEPGrecの時はまったく躓かなかった部分だけに;;
httpd(アパッチ)をapacheとするのはredhat系だけなのか?どうも世間的にはwww-dataらしい。知らなかった。

それから、OSが32bitだからなのかphpがfilesize関数でエラーを吐くらしい→PHP: filesize
recomplete.phpの86~87行目
if( (int)trim(exec("stat -c %s '".$ts_path."'")) )
// if( filesize( $ts_path ) )
入れ替えること というコメントを安直に信じてfilesizeのほうをコメントアウト
どうやら適当な何かの別館さんの2012-05-30あたりで、出ていたらしい。それでコメントついてたのか。
ついでに、do-record.sh${OUTPUT}"$OUTPUT"にしておいた。

phpのタイムゾーンは忘れずに。

手順を省略したところは以前と同じでいける(たぶん。)

途中、yum install php-process をしたけど多分これは関係ない→参照『php5.3にアップデートしたらepgrecで録画できなくなった件

PageTop
シェルスクリプトの作法が ちょっと独特で、しょっちゅう上手く動かなくなるので 個人的によく使う書き方とかをメモ。

拡張子には.sh  (ローカルルール)
foo.sh

ファイルの中身
頭におまじない
#!/bin/bash

コメント
# 以下はコメントになる
/* comment */は使えない

行終わり セミコロン
; 有ってもなくてもいい     (phpでよく忘れる。phpはないとだめ)
一行で複数のコマンドを書くときは、 ; で区切って可

クオート   文字列 他の大概の言語と同じ(大して知らないけど)
" " ダブルクオート で 普通の文字列 変数は展開される
' ' シングルクオート で まんま文字列 変数は展開されない
(ただの変数には" " ダブルクオートを付けておいた方が吉)

バッククオート   コマンドが実行された結果に置き換わる
result=`command`
以下は ls -la と同じことになる   ls_result=$(ls) に似てる(後述)違いは謎(ぉぃ
option=-la
output=`ls $option`
echo $output
ネストも可 内側のバッククオートにバックスラッシュ¥をつける
result=`command¥`command¥``

変数  シェルスクリプトは変数の型がないらしい。
変数の定義、代入    代入の際『=』の前後にスペースを入れてはダメらしい
hoge=111
呼び出し方    $をつけるらしい (ややこしい・・・・)
$hoge
しかも、基本的に文字列として扱われるらしいので、 (マジかょ・・・・)
num=1
num=$num + 1
echo $num

の結果が 『1 + 1』 という文字列になるらしい。 (勘弁してください・・・)
これを回避するには
num=1
let num="$num + 1"
echo $num
→cf.四則演算
単純なインクリメンタル
let ++num

特殊な変数
シェルスクリプトに引数を渡すには(コマンドラインオプション)
foo.sh hoge fuga piyo
引数の参照
$1,$2,$3
スクリプト名の参照
$0
引数の数
$#
全ての引数を一度に参照する   違いは謎(ぉぃ
$* もしくは $@
シェルスクリプトのPID(プロセスID)
$$
最後に実行したコマンドのexit値
$?

上の例だと
$0 にはfoo.sh
$1 にはhoge
$2 にはfuga
$3 にはpiyo
$# には3
$* で hoge fuga piyo
$$ にはPIDの数字
$? は普通0か1

配列
配列の定義、代入
array[0]=hoge
array[1]=fuga
array[2]=piyo

もしくは
array=(hoge fuga piyo)
要素の追加
array=("${array[@]}" "hogera")
要素の一部を削除
unset array[1]
配列を削除
unset array
コマンドの実行結果が複数行ある時それをすべて配列に格納
ls_result=$(ls)
配列の参照    $は当然、{}が必須らしい。
${array[2]}
配列を全て参照  各要素を単語として
${array[@]}
配列を全て参照  IFS文字でつなげて一つの文字列で
IFS=";"       Internal Field Separatorらしい よーわからん
echo "${array[*]}"
    " "がないとダメみたい
hoge;fuga;piyo
配列の要素数    #をつけて*を入れるらしい。
${#array[*]}

文字列結合  ただくっつける。『.』とか不用
str=$mojiretu1$mojiretu2

四則演算  exprが必要  演算子の前後にスペースも必要  演算子は普通
a=`expr 5 + 3`
b=`expr 5 - 3`
c=`expr $a + $b`
d=`expr 5 ¥* 3` *はワイルドカードなのでバックスラッシュ¥が必要
e=`expr 5 / 3`
f=`expr 5 % 3`

リダイレクト  ファイルの入出力が驚くほど簡単
ファイルに上書き書き込み   bar.txtにhogehogeと言う文字列を上書きで書き込み
echo "hogehoge" >bar.txt
ファイルに追加書き込み   bar.txtにhogehogeと言う文字列を追記で書き込み(最終行)
echo "hogehoge" >>bar.txt
	echoでタブ改行を表現する方法  -e オプションをつける
echo -e "hello¥tworld¥nhello¥nworld"
キーボードからの入力   キーボードの入力を待って、Enterまでの入力を$LINEに格納
read LINE
ファイルから一行読み込み  foo.txtから一行読み込んで$LINEに格納
read LINE <foo.txt
ファイルを1行ずつ処理
while read LINE
do [処理... $LINE]
done <foo.txt

ファイルの各行を配列に格納 とか
i=0
while read LINE
do array[$i]=$LINE
let ++i
done <foo.txt

パイプ
コマンドの出力をコマンドに入れる
command | command
/homeの.txtファイルのみを表示 とか
ls /home | grep "*.txt"
コマンドの出力を一行ずつ処理
command | while read LINE
do [処理... $LINE]
done

パイプの中はサブシェルでスコープが別⇒パイプの中の変数を外から参照できないらしい
サブシェルで動くというより別スレッドで動く挙動らしい      なにその仕様・・・・
逆手に取ればマルチスレッド動作が簡単に??

制御文
if文  [ ]は本来はtestコマンドの略式らしい [ ]の文字の前後はスペースが必要
if [ 条件式 ]
then
[処理...]
elif [ 条件式 ]
then

[処理...]
else
[処理...]
fi

数値比較
if [ $num1 -eq $num2 ]
演算子意味
-eq== equal
-ne!= not equal
-lt< less than
-le<= less equal
-gt> greater than
-ge>= greater equal
文字列比較
演算子意味
===
!=!=
=~左辺の文字列に右辺のパターンによる部分文字列が含まれるか
!~左辺の文字列に右辺のパターンによる部分文字列以外が含まれるか
ファイル比較
演算子 意味
-ntより新しいnewer than
-otより古いolder than
特殊なオプション
オプション使い方意味
-z [ -z string ] string の文字列長が 0 ならば真
-n [ -n string ] string の文字列長が 0 より大ならば真
-d [ -d file ] file がディレクトリならば真
-e [ -e file ] file が存在するならば真
-f [ -f file ] file が普通のファイルならば真
-s [ -s file ] file が 0 より大きいサイズならば真
-r [ -r file ] file が読み取り可能ならば真
-w [ -w file ] file が書き込み可能ならば真
-x [ -x file ] file が実行可能ならば真
-O [ -O file ] file の所有者ならば真
-G [ -G file ] file の所有者と同じグループに属するならば真


一行if文
target=./hoge.txt
if [ -f $target ]; then rm -f $target ;fi
または
[ -f $target ] && rm -f $target

Like三項演算子(条件? 処理1:処理2;)
[ $hoge = $foo ] && echo "true" || echo "false"

if文の応用 らしい
testコマンドや[ ]の変わりに 他のコマンドを使って条件判定する
if echo $hoge | grep -sq "fuga"
then
~~~

grepは一致するパターンがあればそれを表示して戻り値に0(真)を返す
なければ戻り値に1(偽)を返す
ので、$hoge変数のなかにfugaの文字列があれば真、なければ偽になる
-sqはエラー出力と標準出力を抑制するgrepのオプション

for文
for str in ${array[@]}
do
echo $str
done

なにそのforeach・・・ orz
で、foreachは無いらしい。そらそうだ。
それでも、以下の方法でforっぽくできる らしい。
for (( i = 0; i < ${#array[@]}; ++i ))
do
echo ${array[$i]}
done


while文
i=1
while [ $i -le 5 ]
do
echo "$i"
let ++i
done





参考:
Bashで覚えておくとよいデータ構造 - 配列Add Star
IFS てなに?
if 文と test コマンド
bash のアレコレ
bash,dash,zshのreadコマンドと「while read」のループ処理について
BASHでの変数について
bash 超プログラム術
Bash基礎文法最速マスター
簡素なif文は一行で書く
シェルスクリプト入門 [演算・比較]


シェルスクリプトのデバッグ のヒント @IT
シェルスクリプトの一部分をデバッグするには
シェルスクリプトをデバッグするには
シェルスクリプトの文法チェックを行うには

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