二月二二日、金曜日の話
知らんがな、と思う

 最近、職場にて暗黙の前提を持ち出されることが多くなった。

[◆]暗黙の前提

 「ここはこういう取り決めだったでしょ」

 「知らんがな」

 と言うわけにも行かず、「そうでしたね」と知ったかぶりで流すしかない場面が最近増えてきたように思う。職場に存在する暗黙の前提というものが僕にはまだまだ分かっていないらしい。どっかにこういう前提がある、と明言している情報がないものか。存在することすら教えられていない状況では前提なんかわかりっこねーよ。本当、その場にならないと分からないもんだね。

[◆]C言語プログラム、着々開発中

 一昨日の晩にプログラムソースがコンパイルできただけで実はそこで動作テストせずにまた新しい論理を入れてコンパイルエラーを起こして、修正しようとしたら頭が痛くなって寝たのが昨日の晩の話。ひとます、まともに動かないけれども雰囲気だけは CSV 形式のテキストファイルからデータを読み込み、HTML テンプレートファイルを読み込み、HTML 中の変数を書き換えて中身の詰まった HTML ファイルを出力できるようになりそうな感じだ。これができれば小説投稿サイトの末端ページ――小説閲覧ページができあがる。一部制限があるといえばあるものの、僕の知識的な問題で何とかなりそうではある。

 気になるのはメモリの使用量について。実は今、動的な文字配列指定をしていない。malloc 関数について理解が足りていないためで、一行一行のバッファ量は固定されている。ファイルに読み書きするときにはそんなに必要となるものではないが、現在のプログラムの仕様ではかならず、ひとつの小説につき99×20100バイト(最大小説ページ数×1ページ分と定めているデータ量)=1989800バイト(約2MB)の容量を確保する必要がある。理由は小説データを追加したり更新したり削除したりするために全体を把握する必要があるからで、万一百人が一斉に更新しようもんなら200MB〜205MBぐらいが必要になるわけで、別に問題なさそうではあるがメモリの無駄遣いは気になるところである。小説のページ数が5ページであろうが2MB使うわけで、確保しても中身は空。ページ数にあわせて確保する容量を変化させることができればいいんだけれど。

 う〜ん、つまりは fgets 関数で何行あるかを数えさせて、数えられた行分の配列を作るように指定すればいいのか。しかし変数のスコープの問題上、プロシージャを超えてデータを保持できないし、保持したかったら先にグローバル変数で枠を作っておく必要があるわけで、ひとつのプロシージャ、もしくはファンクションの中で該当するデータを使えるかどうかが焦点になりそうだなぁ。新規追加のときは最後に新しいデータを追加するモードがあるからいいとして、更新……ファイルに対して、該当行だけを上書きするような機能はC言語にはない。書き換えるなら、1から100まで全部破棄して作り直すことになる。その場合はいったん、プログラムでデータをすべて保存しなくてはならないが……。

 一旦、別ファイルにデータを保存すればいいじゃないか?

 AファイルからBファイルにデータをすべて移動。

 BファイルからAファイルに指示された行−1行まで移動。

 プログラムからAファイルに一行追加。

 Bファイルから指示された行+1行から残りをすべてAファイルに移動。

 Aファイル完成。Bファイル破棄。

 これでわざわざプログラム側でメモリを確保しなくても、一行ずつの読み書きでデータを完成させられるんじゃない? ついでに99ページの上限もなくなるわね。

 次なる問題は、ファイルの読み書きにより発生する処理遅延であるが……まあ、そんなに気にする必要もない気がするな。メモリ使用量の低下でお釣りが来る。まずは、やってみよう。