- 症状
- 中身が NUL バイト 2,114個で埋まっていた(真っ白)
- 直した内容
- kodamay.org の同一ページ(EUC-JP)と Wayback の2006年版が完全一致。UTF-8 に変換して復元
- 現在
- 本番で 200・図版も全て表示されることを確認済み
「Visual C++.NET プログラム集」から張られた全73ページを、本番サーバに対して1本ずつ実際に取得し、 ページ本体・図版・ページ内リンクがすべて生きているかを確かめました。 壊れていた 5件 は原因を特定して復元済みです。
73本すべてに本番へ実際にアクセス。HTTP 200 であること、中身が空でないことを確認しました。
各ページが参照する 226 枚(計 6.6 MB)を1枚ずつ取得。404・0バイトが無いことを確認しました。
「つぎ」「うえ」や拡大画像へのリンク 284 本を追跡し、すべて到達できることを確認しました。
プログラムのコンパイル・実行はしていません。ソースコードが JPEG 画像として貼られており、 対象も Windows 専用の MFC アプリのためです。コードの中身は画像を読んで確認しました。
検査は自動化してあります。同じ検査を後からもう一度回せば、リンク切れや図版の消失をいつでも洗い出せます。
4件はファイルの中身が NUL バイトで埋まって真っ白になっていたもの、1件はリンクの綴り間違いでした。
前者は同じページが kodamay.org 側と Internet Archive(2006年の法政サーバ)の両方に残っており、
2つの出所の本文が完全に一致したので、それを EUC-JP から UTF-8 に直して戻しました。
../ex17/ex128.html で 404../17th/ex128.html に修正(上部の同じリンクは元から正しかった)| 状態 | ページ | パス | 図版 | リンク | 文字数 |
|---|---|---|---|---|---|
| 確認済 | ラベルの生成 | 12th/ex105.html |
2 | 4 | 373 |
| 確認済 | イベントの記述 | 12th/ex106.html |
3 | 4 | 1723 |
| 確認済 | ボタンとイベントの記述 | 12th/ex107.html |
6 | 6 | 326 |
| 確認済 | 時間の計算 | 12th/ex108.html |
8 | 4 | 420 |
| 確認済 | 円、球に関する計算 | 12th/ex109.html |
3 | 2 | 197 |
| 確認済 | トグルボタン | 13th/ex110.html |
4 | 5 | 135 |
| 確認済 | 線分の回転 | 13th/ex112.html |
3 | 5 | 181 |
| 確認済 | 一次直線の描画 | 13th/ex113.html |
3 | 2 | 201 |
| 修復 | 円の描画 | 14th/ex116.html |
6 | 5 | 266 |
| 修復 | タートルグラフィックス | 14th/ex117.html |
6 | 5 | 236 |
| 確認済 | 利子計算 | 14th/ex118.html |
3 | 4 | 254 |
| 確認済 | いろいろな図形 | 15th/ex121.html |
3 | 4 | 134 |
| 確認済 | 簡単な図形 | 15th/ex122.html |
3 | 4 | 128 |
| 確認済 | タートルグラフィックス(2) | 15th/ex123.html |
4 | 4 | 276 |
| 確認済 | 繰り返しの基礎 | 16th/ex125.html |
2 | 4 | 134 |
| 確認済 | 繰り返し | 16th/ex126.html |
2 | 4 | 150 |
| 修復 | エラトヌテネスのふるい | 16th/ex127.html |
4 | 4 | 322 |
| 確認済 | 最大公約数と最小公倍数 | 17th/ex127-1.html |
2 | 4 | 157 |
| 確認済 | 素因数分解 | 17th/ex128.html |
2 | 4 | 129 |
| 確認済 | 最大値と最小値 | 17th/ex129.html |
2 | 4 | 186 |
| 確認済 | Nまでの和 | 18th/ex130.html |
3 | 4 | 185 |
| 確認済 | 最大公約数と最小公倍数(2) | 18th/ex131.html |
3 | 4 | 317 |
| 確認済 | swap 関数 | 18th/ex132.html |
3 | 4 | 167 |
| 確認済 | チェックボックスの使用 | 19th/ex135.html |
3 | 4 | 279 |
| 確認済 | ラジオボタンの使用 | 19th/ex136.html |
3 | 4 | 300 |
| 確認済 | 桁数の判定 | 19th/ex137.html |
2 | 4 | 341 |
| 確認済 | 動的配列 | 20th/ex141.html |
3 | 4 | 234 |
| 確認済 | 分数の計算 | 20th/ex142.html |
4 | 4 | 255 |
| 確認済 | 文字列配列と文字列の検索 | 20th/ex143.html |
3 | 4 | 336 |
| 確認済 | 多角形の描画 | 21th/ex145.html |
3 | 4 | 209 |
| 確認済 | リストボックスと文字列 | 21th/ex146.html |
3 | 4 | 381 |
| 確認済 | 文字の検索とカウント | 21th/ex147.html |
4 | 4 | 277 |
| 確認済 | Rectangle の応用 | 22th/ex150.html |
3 | 4 | 165 |
| 確認済 | 再帰定義 | 22th/ex151.html |
2 | 4 | 146 |
| 確認済 | コッホ曲線 | 22th/ex152.html |
4 | 4 | 207 |
| 確認済 | ドラゴン曲線 | 22th/ex153.html |
4 | 4 | 205 |
| 確認済 | 回転体を描く | 23th/ex156.html |
6 | 4 | 274 |
| 確認済 | 回転体を回す | 23th/ex157.html |
6 | 4 | 262 |
| 確認済 | 簡単な整列 | 24th/ex163.html |
3 | 4 | 200 |
| 確認済 | 最小法 | 24th/ex161.html |
5 | 4 | 236 |
| 確認済 | バブルソート | 24th/ex162.html |
3 | 4 | 218 |
| 確認済 | シフト演算 | 25th/ex165.html |
5 | 4 | 271 |
| 確認済 | 挿入法(2) | 25th/ex166.html |
4 | 4 | 218 |
| 確認済 | 挿入法(3) | 25th/ex167.html |
4 | 4 | 237 |
| 確認済 | Visual C++.NETの基礎(2000年版)図版を使わないページ | 11th/index.html |
0 | 9 | 199 |
| 確認済 | はじめに(コンソールプログラミング)図版を使わないページ | 0th/index.html |
0 | 8 | 111 |
| 確認済 | 簡単な整数値計算 | 1st/ex006.html |
3 | 3 | 238 |
| 確認済 | 変数とデータ | 1st/ex007.html |
2 | 4 | 1145 |
| 確認済 | 簡単な浮動小数点数演算 | 1st/ex008.html |
2 | 3 | 229 |
| 確認済 | 標準体重 | 1st/ex009.html |
2 | 1 | 1117 |
| 修復 | 定数図版を使わないページ | 2nd/ex010.html |
0 | 4 | 792 |
| 確認済 | 円の円周、面積、球の表面積、体積 | 2nd/ex011.html |
2 | 4 | 178 |
| 確認済 | 真理表 | 2nd/ex013.html |
3 | 4 | 347 |
| 確認済 | 利子計算 | 2nd/ex014.html |
2 | 2 | 191 |
| 確認済 | さまざまな文字の表示 | 3rd/ex016.html |
2 | 4 | 161 |
| 確認済 | 数列の和 | 3rd/ex018.html |
3 | 4 | 177 |
| 確認済 | 標準体重と利子計算 | 3rd/ex019.html |
4 | 2 | 265 |
| 確認済 | 最大値と最小値 | 4th/ex021.html |
5 | 4 | 253 |
| 確認済 | 選択子の問題 | 4th/ex023.html |
4 | 4 | 361 |
| 確認済 | 月の日数 | 4th/ex024.html |
2 | 2 | 162 |
| 確認済 | Nまでの和 | 5th/ex031.html |
5 | 4 | 204 |
| 確認済 | Nまでの約数 | 5th/ex033.html |
2 | 4 | 184 |
| 確認済 | 最大公約数と最小公倍数、計算のお話し図版を使わないページ | 5th/ex034-1.html |
0 | 4 | 4849 |
| 修復 | 最大公約数と最小公倍数 | 5th/ex034.html |
2 | 2 | 736 |
| 確認済 | 支払い金額 | 6th/ex036.html |
2 | 4 | 293 |
| 確認済 | 九九の表 | 6th/ex038.html |
2 | 4 | 147 |
| 確認済 | 単語のカウント | 6th/ex039.html |
2 | 2 | 249 |
| 確認済 | 身長と体重の検索 | 7th/ex041.html |
4 | 4 | 345 |
| 確認済 | 支払い金額(2) | 7th/ex043.html |
2 | 4 | 218 |
| 確認済 | 文字のカウント | 7th/ex044.html |
3 | 2 | 298 |
| 確認済 | Nまでの和 | 8th/ex046.html |
3 | 4 | 184 |
| 確認済 | 最大公約数と最小公倍数(2) | 8th/ex048.html |
3 | 4 | 218 |
| 確認済 | swap関数 | 8th/ex049.html |
3 | 2 | 180 |
掲載されているのは MFC(Microsoft Foundation Classes)のプログラムです。
CClientDC・CEdit::SetWindowText・OnBnClickedButton1 といった、
Visual C++ .NET 2002/2003 時代の書き方をしています。MFC 自体は現在の Visual Studio でも現役なので、
作り直しではなく手直しで動きます。引っかかるのは次の4点です。
.vcproj は直接は開けない)当時の .vcproj を最新の Visual Studio へそのまま持っていくことはできません。
Visual Studio 2019 を挟んで2段階で変換するのが公式の方法ですが、
これらは1ファイルの小さな例題なので、MFC アプリを新規作成してコードを貼り直す方が速いです。
Visual Studio インストーラーで「C++ によるデスクトップ開発」を選び、オプションで
「最新の v143 ビルド ツール用 C++ MFC」 にチェックを入れます。
これを入れ忘れると afxwin.h が見つかりません で止まります。
現在の既定は Unicode なので、当時のまま char cbuf[80]; を
SetWindowText(cbuf) に渡すと型が合わずコンパイルエラーになります。
プロジェクトのプロパティ →「詳細」→ 文字セットを マルチバイトにすれば当時のコードがそのまま通ります。
新しく書き直すなら CString と TCHAR を使うのが本筋です。
// そのままだと Unicode ビルドで通らない
- char cbuf[80];
- sprintf(cbuf, "%d", kazu);
- hEdit1.SetWindowText(cbuf);
+ CString s;
+ s.Format(_T("%d"), kazu);
+ hEdit1.SetWindowText(s);
sprintf などの警告を通すsprintf・strcpy・atoi は現在は非推奨で C4996 が出ます。
sprintf_s に置き換えるか、プロジェクトのプリプロセッサ定義に
_CRT_SECURE_NO_WARNINGS を足せば当時のまま通ります。
描き直しの落とし穴。「線分の回転」などは CClientDC を使ってボタンのイベントの中で直接描いています。
この描き方だと、ウインドウを最小化したり他の窓を重ねたりすると絵が消えます。
残したい場合は座標を変数に持っておき、OnDraw(または OnPaint)の中で描き直してください。
これは今の Windows に限らず当時からの性質です。