GET /うんたらかんたら
TCP/IP の入門書を読み始めて、何かを C言語化しようと愚策中。
いきなり目標を高くすると、すごい勢いで壁にぶつかって砕けるので、
あんなものや、こんなものを取ってくるものを作成。
というか、未だに C言語は未知の世界なんですが…。
TCP/IP の入門書を読み始めて、何かを C言語化しようと愚策中。
いきなり目標を高くすると、すごい勢いで壁にぶつかって砕けるので、
あんなものや、こんなものを取ってくるものを作成。
というか、未だに C言語は未知の世界なんですが…。
[cc lang="c"] //スレッドの作成 //スレッドの待機 gcc を使う場合、「 -lpthread 」でリンクするべし
#include
pthread_create(pthread_t *thread, const pthread_arrt_t *attr,
void *(start_routine)(void *), void *arg);
pthread_join(pthread_t thread, void **thread_return);
[/cc]
放送そのままの音量だとかなり小さい音量なので、 TvTest で見るときも基本的に
音量増幅 x2 で再生しています。
アンプ通せば良いんですけど、警告音とかが突然大音量で流れるのは心臓に悪いので、
通常利用優先ですね。
エンコード後も、そのままでは音量が小さいので、 AAC な音声を調節するツール
aacgain を使って音量を調節してみました。
aacgain のオプションは、以下のようにしました。
aacgain /g 5.0 /t
3dB 違うと、倍の音量になるのですが、倍でも少し小さいので、 5dB に、
一応、テンポラリファイル作る設定にしました。
ついでにドロップするだけで 5dB 上げるバッチファイルも作ってみました。
[DL] aacgain
同じフォルダに aacgain.exe を入れておくと使えます。
[cc lang="c"]
#include
#include
int main (void) {
FILE *fp;
if ((fp = fopen(“hogehoge.txt”, “r”)) == NULL)
printf(“ファイルが開けないよ!”);
return 0;
}
[/cc]
こんなことをやっていてファイルが開けない場合には fclose(fp) は要らないということ。
[cc lang="c"]
int strpos (char *str, char tar) {
// 初期化
int max = strlen(str);
int cnt = 0;
int flg;
// ターゲットと同じか \0 まで繰り返す
while (*str != tar && *str != ‘\0′) {
str++;
cnt++;
// 文字数を超えたら break
if (len < cnt)
break;
}
// ターゲットがあれば位置を返す
if (*str == '\0' || len < cnt) {
return(-1);
} else {
return(cnt);
}
}
char *rtrim (char *str) {
// 改行コードの位置を取得
int rpos = strpos(str, '\n');
// 改行コードの位置を \0 に置き換え
if (rpos > -1)
str[(rpos-1)] = ‘\0′;
return(str);
}
[/cc]
まだまだ、 C はダメダメです。
ちなみに、 PHP の strpos は、指定文字が見つからない場合 0 を返してきますので、
型の判断を必要とする !== を使って
[cc lang="php"]
$str = “abcdefg”;
if (strpos($str, “c”) !== false) {
print “str の中に c が見つかりました!”;
} else {
print “str の中に c が見つかりませんでした。”;
}
[/cc]
と、してやる必要がありますね。
read.js では、スレッドのファイルサイズに対して 512 加算して表示しています。
前々から、この 512 は一体何なのだろう?と考えていたのですが、
今日、readc.cgi を修正するときに気がつきました。
ずばり、 kB 対策です。
スレッドの kB は、(ファイルサイズ + 512) / 1024 で計算され、
小数点以下は round で四捨五入されるのです。
このとき、スレッドのファイルサイズが 511 だと 1024 で割った際に
0.5 を切ってしまい、 0kB と表示されてしまうのです。
これを防ぐために、あらかじめ 512 を加算し計算しているのではないかと。
大したことではないのですが、何となくスッキリしました。
ということで、容量表示には 512 を加算しましょう運動開始。
ハードディスクがギリギリになったのは、ちょっと理由があって、
2ちゃんねる(N.T.Technology)の有料サービス● のお試し版が株式会社ゼロ運営のゲーム
ニダークエスト2で貰えたため、それを使って過去ログを集めてました。
ざっと、現在までにニュース速報VIPやPCゲーム板など数十万スレッドが収集でき、
当分、読む物には困りそうもありません。
# 前にもこんな事書いた気がする。
これが勉強がてらC言語で書いたディレクトリリストと datファイルの先頭4文字を判断するプログラム。
CodeGearのサイトにあったリファレンスを見つつ作ってみたんだけども、意外と簡単に動くものです。
こうやって少しづつ作っていくことで、段々と作れる物が増えて行ければいいなぁ。
PHPは、関数が豊富なのと、実用的というか、直ぐ使えるような関数が一杯なので、
それと較べると、C言語は結構しんどいです。
「PHPポケットリファレンス」みたいな本がC言語にも有ればいいのになぁ。
「プログラミング言語C」の第2版は読んでみましたが、結構大変。
構造体とかが使えるようになれば、また一段と作れる物が増えるんだろうなぁ。
用途が用途だけに行数をカウントする処理を結構書いたりするのですが、
今まで file 関数で配列に入れて count 関数で取得という方法を主に使っていたんですよね。
最近になって、クローラーの改良時に実は foepn も結構早いんじゃね?
ファイルアクセスも減るんじゃね?という感じでベンチマークを取ってみました。
まずは、 file 関数を使った例。count も sizeof もエイリアスなので、どちらでもOK。
$buf = file(“hogehoge.dat”); //1001行のファイル
$count1 = count($buf);
unset($buf);
これは、1000回ループで 4.653011 秒という結果になりました。
一方 fopen を使ってカウントする例。
$fp = fopen(“hogehoge.dat”, “r”); //1001行のファイル
for ($count2=0;!feof($fp),fgets($fp);$count2++);
fclose($fp);
こちらは、 3.800635 秒とコンマ7程度早くなりました。
しかし、結局1000回実行してやっとコンマ7という結果でした。
早いには変わりないと思いますが…、まぁこんなもんなのかなぁ。
ファイルの中身を配列として読み込む file という便利関数があるんですが、
これにはちょっと使い時があります。
PHP には memory_limit という設定があり、この設定値を超えると
処理が出来ないため、エラーになってしまいます。
実は file 関数とこの設定値は結構リンクしていて、memory_limit をバケツに例えると
バケツに対してバケツの容量以下の水を扱うには良いのですが、
バケツに対して、25mプール一杯の水を注ごうとするとあふれてしまうのと同じように下記のエラーになってしまいます。
Allowed memory size of xxx bytes exhausted (tried to allocate xxx bytes)
つまり、あまりにも大きいデータを読み込む時に file 関数は向いていないのです。
こういった場合、どうしたらいいのか?
答えは簡単で、 fopen でファイルを開いて fgets すれば良いだけです。
fopen はファイルポインタですから、使用した時点ではファイルの内容は読み込みません。
fgets を使用してはじめて読み込むわけですが、 fgets は指定バイト数もしくはEOFまでの読み込みであり、
巨大なデータでも行端で切り刻んで読み込むことが出来るため、前述のようなエラーにはならなかったりします。
file_get_contents も file と同じようなものと考えて組んでいかないと変なところでエラーが出てしまうので、
使い所には注意するべきですね。
あと、 PHP は一度スカラー変数として定義したものは、スカラー変数としてしか使えないので、
<?
$hoge = 1234;
$hoge[0] = 5678;
?>
というようなものを書くと Cannot use a scalar value as an array というエラーになりますよん。