日々の戯言


バックナンバー

1997年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
1998年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
1999年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2000年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2001年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2002年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2003年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2004年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2005年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2006年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2007年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2008年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2009年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2010年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2011年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2012年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2013年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2014年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2015年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2016年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2017年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2018年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2019年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2020年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2021年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2022年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
バックナンバー内のリンクは無保証です

6月2日(土) M1 復活

一応 M1 仮復活です。そのはずです。やはりケーブルモデムが死んでいました。しかもスイッチングハブまで巻き添えにして。無駄に 8 ポートのハブを使ってたのですけど、ケーブルモデムを接続してたカスケードポートから近い順に半分、4つが死んでくれました。

雷のバカと叫びたい気分ですな。ケーブルモデムは即日交換してもらえたものの、ハブはこちらの管轄なので保証外。

保証期間内なんだけど、落雷による破壊も対応してくれるものなのだろうか……、まあ対応して修理して貰えるとしても、それまでケーブルモデムと直接接続のままという訳にはいかないだろうから予備機を買わねばならず……あぁぁクソッたれ。

ケーブルモデムも、自分だけで死んでくれれば良いのに、LAN ケーブルで接続されてるハブまで壊してくれるなんて……。


6月3日(日) デザインパターン

シングルトンパターンとグローバル変数の違いを述べ、その有効性を説明せよ。

……本気でこれぐらいしか思い浮かばない。

例えば MFC の theApp はアプリケーション内に静的に存在するグローバルなオブジェクトだけど、「アプリケーション内で一つしかインスタンスを作っちゃ駄目だよ〜」とプログラマにお願いすることで、シングルトンパターンを実現してる。

  1. アプリケーション内でただ一つだけ存在し
  2. 様々な場所から参照&設定される

実際上記の条件が満たされるならば、それはアクセサメソッドを用意したうえでグローバルなオブジェクトととして置いといた方が良いことは判るのだ。

ただ、私は大域変数排除原理主義者なので、そういう場合でも使いたくないと考えてしまう。もっとすっきりした「様々な場所から参照&設定される」という2番目の条件を成立させずに済む設計があるんじゃないかと考えてしまうわけ。

……今の仕事ではそんな贅沢な時間を取れないのがひたすらに悲しい。


6月5日(火) 負の遺産

忙しさにかまけて考えることを放棄してた先週のツケを払いまくる羽目になっている。昨日今日とメソッド移動やらクラス分割・統合の繰り返し。

平地での散歩が休日のハイキングなみの手間になってきたので、山岳遭難レベルにならないうちにリファクタリング。まあ一人でやってるからあまり厳密にはできないのだけど。

こんなことをする余裕があるのも締め切りが少し延びたおかげ。先週末の段階でそのまま突っ走れとか言われてたら間違いなく遭難していたことだろう。


6月6日(水) 貧乏自慢

注文していた本棚が到着した。……のは良いのだけど、どうやら一つでは足りなかったようで、まだ本がダンボール一箱分あふれている。

6月の給料が振り込まれるころにもう一つ注文することにしよう。今月はもう無理だから。何しろ最後の一線まであと3本しかないことだし。

家賃と借金の返済で月に10万消えていくのが本当に痛い。厚生年金もかなり納得がいかないくらい払わなきゃいけないし。

懐に余裕があれば、あっさり MTV-1000 とか買ってるのだけど、この調子では当分無理かも。夏の茄子が潤沢ならあるいは行けるかもしれないけど……入社3ヶ月じゃあまり期待しないほうがいいよね。


6月7日(木) PC 状況メモ

Intel Ultra ATA Strage Driver 環境では CD-R が安定して焼けないので、Microsoft の標準ドライバに戻す。

セカンダリポートのマスターに CD-R ドライブ、スレーブに DVD-ROM と接続していたのだけど、当初は UDMA-2 で接続されていたものを UDMA-1 に落としても、PIO-4 にしてもうまく焼けず、結局 DVD-ROM を一時的にはずして、CD-R のみにしてやっと焼成に成功。

なお、使用していた CD-R 焼きソフトは B's Recorder Gold 1.97 で、Ultra ATA Driver のバージョンは 6.10。マザーボードは Gigabyte GA8TX-C でチップセットは i850。

セカンダリ IDE ポートは一時 CD-R がテープドライブとして認識されるなどの障害が発生しており、それをケーブル変更によって解決したものなので、ひょっとしたらセカンダリポート自体が何らかの不具合をもつ可能性もあり。

現状は Microsoft の標準 IDE ドライバで CD-R の焼成・DMA 共に異常なし。パフォーマンスは未測定。


6月12日(火) MVC

ああ、こうすれば C++ でも相互参照可能なクラスが作れるのか(初心者丸出し)

model.h
 
class View;
class Control;

class Model
{
public:
	Model();
	virtual ~Model();
	
	virtual void setControl(Control *arg);
	virtual void setView(View *arg);
	
private:
	Control *control;
	View *view;
};
view.h
 
class Model;
class Control;

class View
{
public:
	View();
	virtual ~View();
	
	virtual void setControl(Control *arg);
	virtual void setModel(Model *arg);
	
private:
	Control *control;
	Model *model;
};
control.h
 
class Model;
class View;

class Control
{
public:
	Control();
	virtual ~Control();

private:
	Model *model;
	View *view;
};
model.cpp
 
#include "model.h"
#include "view.h"
#include "control.h"

Model::Model()
{
}

Model::~Model()
{
}

void Model::setControl(Control* arg)
{
	this->control = arg;
}

void Model::setView(View* arg)
{
	this->view = arg;
}
control.cpp
 
#include "model.h"
#include "view.h"
#include "control.h"

View::View()
{
}

View::~View()
{
}

void View::setControl(Control* arg)
{
	this->control = arg;
}

void View::setModel(Model* arg)
{
	this->model = arg;
}
view.cpp
 
#include "model.h"
#include "view.h"
#include "control.h"

Control::Control()
{
	this->model = new Model();
	this->view = new View();
	this->model->setControl(this);
	this->view->setControl(this);
	this->model->setView(this->view);
	this->view->setModel(this->model);
}

Control::~Control()
{
	delete model;
	delete view;
}

一つ勉強になった。……そこまで相互参照が必要なのにわざわざ別クラスに分ける必要があるのかとか考えたらいけないんだろうな〜。


6月13日(水) HDD を持ち歩く日々

10G の HDD を持って、実家と住処の往復をする日々。今日は帰社日なので実家に戻っているのだけど、ついでに実家の PC から延々 20G にもなる動画ファイルの数々を運ぼうと HDD を使ってるわけ。

流石に 2G を超えると CD-R とかでは辛いので旧式の HDD をプチプチに包んで持ち歩いてる。まあ今日で2回目だからこれであらかた運び終わるのだけど、それでも回線を引いていないと、大物を落そうというときに不便なんだよね。

これが W2K SP2 とか DirectX 8.0a SDK とか仕事に少しは関係してるものなら職場で CD-R 借りて焼いてしまう事もできるのだけど、流石に無関係なものだとそれはできないから。

はやく ADSL 引きたいんだけど、それやると通信費(携帯・実家 CATV・部屋 ADSL)だけで 25 k 円になっちゃうんだよね〜。それなりの占有型サーバ借りれてしまうというのがちょっと悲しい。


6月14日(木) 浪費癖

昨日新宿まで出たついでに紀伊国屋書店に寄ってしまったのが運の尽き。以前探していた「データ圧縮ハンドブック」が何故か TCP/IP 関連の棚に並んでいたので正気を失ってしまった。

winsock2 & マルチスレッドサーバ関係の本を求めていたのだけど、そちらも「Winsock2.0 プログラミング」を購入してしまったから……金額を考えたくない。

さらに毒食らわば皿までというか、秋葉原に寄って「月姫読本」(青本)も購入。大量に入荷していたようで、昨日の段階では全然探さずに買えてしまった。

んなもの買ってるぐらいなら先に「C++ 3rd Edition」買えと言われそうだけど……実際はそうした方が良いんだろうな〜。何となく嫌なんだけど


6月15日(金) 作り直したい

作り直したい病が発症。あーうん。ラッパクラスでメッセージ受けてるのになんでまたメッセージ送るの〜とか色々あって作り直したい気持ちで一杯。

単に私が Windows プログラミングに慣れてなくてメッセージが嫌いなだけかもしれないけど……。でも、言語が C++ で、プロセス間通信をしないのならば、メッセージとか言う低レベルなものは表(クラスのインターフェース)に出さなくても済むように組めるはずだし、そうするべきなんじゃないのかな。

作り直したい〜と内心叫びつつ突貫工事でまず動くものを作る日々。旧バージョンのコードをそのまま利用してる。そのせいか、ソースの中に「後で直すこと」とか「アレすぎる」だのという愚痴が増えている。何時になったらこの連鎖から抜け出せるのだろう。

◇◆◇

あ゛〜。何故にデモ中に「不正な処理例外」出すかな。もっと硬いコードにしなきゃ〜とか思いながら、とりあえずデモの間はその操作をしないで回避しようと思ってたことなのに、うっかり忘れてやってしまった。

誰を恨むこともできないのが悲しい。


6月18日(月) そうなっちゃうのね

やっぱり作り直す時間なんて無いのね。まあいいや。どのみち外部からのコントロールを受け付けるように作り直す段階でかな〜り変更する破目になるのだから、その時に苦労することにしよう。

……まさしく問題の先送り。せめてバグだけでも完全に潰しておかなければ。そう……転送中に LAN ケーブルぶち抜いても正常終了するように。(流石に停電とかには対処できないが)

とりあえず明日中に機能追加に一区切りつけて、水曜はテストとバグ取りに専念しよう。先週のような目にはもう会いたくないから。


6月19日(火) 届かず

えーと、まだ動いてない機能が一つあるか……。なかなか間に合わないものやね。あまり持ち帰り残ぎょーとかはしたくないんだけど、仕方ない。

あーうー。とりあえずブラックボックステストとして、チェックリスト作って置かないことにはテストもできないし……。人手が欲しい(無い物ねだり)

GUI からテストのチェックリスト作ってくれる人と、それにしたがってテストして、パスしたかどうか報告してくれる人手が欲しい。無い物ねだりだから言っても無駄なんだけど。


6月21日(木) 実家からこんちわ

ちょいと都心まで出てくる用事があったのと明日は帰社日だというわけで、1週間ちょいぶりに実家に帰ってる。今これを書いてるのは実家。

いつものように、いつもの如く HDD を持ってきている。多分今回で大物は最後のはず。……なのだけど、職場で落すには辛いデータ(純粋にサイズ的な面であり、黒とか灰色のものではないのでその点誤解の無いように)が色々とあるので、今後も実家に戻る時には HDD 手放せなくなるのかも。

実際今日も今日とて何故今更の DirectX 7a を落してたり、G450 のドライバ & BIOS を落していたり。まったく G450 は何故に 1152x864 を超えると MediaPlayer のハードウェアアクセラレータがボロボロになるのでしょう。

P4 だと CVGS は動かないみたいだし……、まったく何のために Windows 2000 でなく 98SE にしたんだか。未だに GPM が遊べないのは辛すぎる。

仕方がないから Meimi で 16 画面スクロール再生でもして楽しもうかと思えば、98SE にいきなり DirectX 8.0a SDK を入れたせいで起動しょっぱなで落ちてくれるし。OS 再インストールしたいのだけど、折角運んだデータの退避先がないから……ああ DeskStar 60GXP がも一つ欲しい。


6月22日(金) ソースは自由に使ってください

久しぶりに動画系掲示板を巡ってみたところ、興味深いスレッドをみつけたのだけど、既に2ページ目に行く寸前なので今更上げるのもあれだしここに書く。MPEG-2 の再生時ブロックノイズ低減アルゴリズムに関して思いつくことあれこれ。

えーと、ブロックノイズの検出自体は DCT 係数領域(逆量子化直後)でなら結構簡単にできそうな気がする。具体的なアルゴリズムは……。

  1. まず、隣接ブロック同士で直流成分(DC Coefficient)だけを比較する。
  2. 閾値以上の差が存在する場合は、対象ブロックの量子化スケール(Quantizer Scale)をチェックする
  3. 量子化スケールが大きい(画質の大幅な劣化を許容する設定)場合、ブロックノイズと判定する

多分こんな形でできると考える。処理順序としては量子化スケールをまずチェックしておいて、ブロックノイズ発生可能性がある場合にブロック(MCU - Minimum Compression Unit)の各四辺について隣接ブロックと DC 係数を比較という形になるかな。(既にどこぞで特許が出願されてるような気もするが……これって特許法第29条2項に該当しないのかしらん)

で……検出自体はこれで良いとしても、問題はブロックノイズをどのように低減するか。多分 DCT 係数を直流成分の差を元にちょいちょいと操作してやれば何とかなるような気がするのだけど具体的にはちょっと思い浮かばない。

本気で調べる場合なら、適当なサンプル作って TMPGEnc で圧縮してからあれこれすることになるのだろうけど、そんな余裕今無いし(涙)

さらに言うと、今の m2v.vfp は DCT 係数を IDCT してすぐに捨ててるから、組み込みまでやるとそこから作り直さなきゃいけないんで、1日15時間のフルタイム労働で1週間〜2週間の仕事量(もちろん週休 0 日制)ってな形になってしまう。

そういう訳で、タイトルのとおりです。はい。ああ時間が山ほどあった学生時代が懐かしい。

□■□

駄目じゃん。イントラブロックのみなら上の検出方法でできるけど、ノンイントラブロックの場合は動き補償が入るから単純にブロック間の DC 係数比較はできない。

DCT 係数レベルでの動き検索&補償は……できなくは無いらしい(インターフェース別冊「画像&音声圧縮技術の全て」にちらっと書いてあった記憶がある)けど、どうやればいいのかさっぱり思い浮かばないからできないも同然。

ノンイントラブロックの場合のブロックノイズってどうやって検出するのだろう。デコード画像を 8x8 ブロック周期でエッジ検出すると、オリジナルから含まれる格子模様もヒットしちゃうから……。う〜ん。


6月23日(土) 己の愚かさを呪うがよい

なんで VTune5.0 の体験版は落としたくせにインテルアーキテクチャ・ソフトウェアデベロッパズマニュアル持ってくるの忘れるかな。

土日に SSE2 最適化版 iDCT 関数作ろうかと思っていたのに、これじゃ無理じゃないか。今度のは中巻(リファレンス)だけで 13M とかあるから、FD じゃ無理だし……。

まあ次に戻ったときには忘れないようにしよう。


6月26日(火) うわぁ、こりゃひどい

どーかんがえてもデコーダのバグだよなぁ、これは。いや某所で話題になった DV CODEC のデコード障害についての話なんだけど。

Pana もな〜。せめてもちっとテストしてから出荷してれば……いや、言うまい。ホントもちっとプライドもって製品つくってほしい。Microsoft じゃないんだから。

というわけでこの症状にピンときたら、はよ直せとサポートに文句を言いましょう(笑)

PDVC
CDVC

えーと、どっちがどっちかはいちいち解説する必要ないよね。はい、一目瞭然 DCT のバグです。どっちかというと逆量子化のあたりのバグなのかもしれないけど。

まあ比較的捕まえやすそうなバグだし、1週間もあれば直せるんじゃないでしょうか。多分。でも、アレの時は2ヶ月ちかくかかってるから……油断はしないほうがいいと思う。


6月27日(水) Lanczos3

なるほど、こういう方法なのね。Lanczos3 というリサンプリングアルゴリズムの名前を AviUtl の掲示板で見かけてちょっと気になってたのだけど、比較的詳しく解説してる PDF ファイルの発見に成功したので、大体の方法は理解する事ができた。

えーと、PDF のオリジナルがあった URI は忘れてしまったけれど、確か GOOGLE で「Lanczos 3-lobed resampling」とか入れて検索したらすぐに見つかったはずなので、探すのはそんなに辛くないと思う。Ken Turkowski "Filter for Common Resampling Tasks" (1990, Apple Computer) というのがその PDF ファイルのタイトル。

アルゴリズムの詳細はそっちを読んでもらうことにして、内容は…… LPF を元に作られてるのは他のと変わらないのだけど、エイリアス・シャープ・リンギングのバランスがとれたよりよいアルゴリズムということらしい。

ただ……これって普通に LPF かけるよりも遅そうな気がするんだけどな〜。1/2 縮小の場合だと 11 タップの FIR フィルタになるし、縮小率によってタップ数が変化するから SIMD 化も面倒だし。

まあぼちぼちと AviUtl のプラグイン作ってみますか。一応拡大(補間)にも使えるアルゴリズムらしいし。帰宅してから1日1時間程度ずつしか作業できないからいつ完成するかわからないけど。


6月28日(木) オチが最高

会社の先輩に教えてもらった URI。The Evolution of a Programmer

実にオチがすばらしい。いや、それだけです。どこが面白いのか判らないという人は……おそらく仕合わせな人生を送ってる方だと思われるので、こちらの世界には踏み込まない方がよいかと。

◇◆◇

困った。この名義でこういうメールをもらったのは初めてなのでどう返事をすれば良いのか判らない。断る場合なら簡単なんだけど。


6月29日(金) 確かに綺麗

なるほど。動かしてみると確かにリンギングは全く見えないうえに、折り返し歪みも小さく、解像感は……3次補間 + LPF の方が高い(タップ数に依存)けど、Lanczos3 に勝てるタップ数だとリンギングが凄い事になるから。

最強といわれてるのも納得。時間がかかるのを除けば、平均画素法よりも良いね。

そういう訳で、lanczos3.auf (未最適化版)です。AUF からどうぞ。

未最適化版というので判ると思いますが、SIMD 等の最適化手法はまだぜんぜん試していないのでかなり遅いはずです。その点は認識しておいてください。

いや、今日中に公開しておかないと、土日はネットから切れてしまうもので、暫定リリースです。流石にアセンブラにまで手を出す余裕はありませんでした。


1997年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
1998年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
1999年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2000年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2001年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2002年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2003年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2004年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2005年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2006年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2007年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2008年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2009年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2010年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2011年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2012年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2013年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2014年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2015年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2016年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2017年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2018年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2019年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2020年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2021年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2022年 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
バックナンバー内のリンクは無保証です

[TOP]