RoomMaster's Voice

「Visual C++の勉強部屋」筆者の独り言




「Visual C++の勉強部屋」に戻る
「石立 喬のホームページ」に戻る

 最近は、「独り言」をFacebookで語ることが多くなりました。そこで、その一部をご紹介します。プログラム関連以外も語っていますので、ぜひ、ご来訪ください

Facebookより --- Win2Dでの画像処理はやはりC#か?(2017. 7. 9)
 WPで画像処理を始めようとして、大きな壁にぶっつかっています。Win2Dには、豊富な画像処理用クラスがあります。Contrast、EdgeDetection、GammaTransfer、GaussianBlur、ConvolveMatrixなどのクラスです(それぞれ、これらの後ろにEffectが付きます)。具体的な使用例もありますが、すべてC#で、asyncやawaitなどのキーワードによる非同期処理です。ネット上には、なぜC++やC++/CXでの例が無いのか?の意見がありますが、Win2Dを使うのは大多数がC#だからだ、とそっけない回答です。
C++で非同期処理をするPPL(Parallel Patterns Library)で代用できそうですが、この勉強が必要です。
画像処理なら、立派なOpenCVがあり、C++で使えるじゃん、と言われそうですが、Microsoft系のWin2Dにこだわると、やはりC#なのでしょうか?

Facebookより --- UWPを使うと、1ピクセル幅の黒の直線が引けない?(2017. 6. 4.)
 Visual Studio Community 2017によるUWPでの話です。黒で垂直(水平も同じ)の直線を、幅を変えて描くと、奇数幅の線は、それより1だけ多い幅になり、両端がグレイになります。したがって、幅が1の黒線を引こうとすると、幅が2になり、色も黒ではなくグレイになります。幅を2にすると、正常に黒の線が引けます。これは、中心線を正確に中央に保とうとするアンチエリアシング処理のためです。

Facebookより --- OpenCV3.2.0をVisual Studioで使用する際の不具合が解決しました (2017. 1.20.)
 opencv2/flann.hppは、さらにopencv2/flann_base.hppをインクルードします。これに、二か所「fopen」が使われていました。特にバグと言われるようなものではありません。Visual Studio 2015のチェックが厳し過ぎると判断しました。
Visual Studio 2015の「Microsoft.Cpp.x64.userプロパティ」ウインドウで、左欄で「共通プロパティ」→「C/C++」→「コード生成」と選択し、右欄の「セキュリティチェック」を「セキュリティチェックを有効にします」(デフォルト)から「セキュリティチェックを無効にします」に変更しました。これで正常にビルドできるようになりました。

Facebookより --- OpenCV3.2.0をVisual Studioで使用するとビルドエラーになります (2017. 1.16.)
 OpenCV3.2.0が昨年暮れにダウンロード可能になりました。一見したところ、Main modulesはOpenCV3.1.0と変わりがないようですが、Extra momdulesは、若干の追加がありました。
早速、Visual C++ 2015で使用してみましたが、なぜか、簡単なプログラムでもビルドできません。
 OpenCV3.2.0の不具合は、opencv2/opencv.hppが悪いのではなく、それがインクルードするopencv2/flann.hppがおかしいことが分かってきました。
Facebookより --- OpenCV3.1.0の解説は、これで終わりにします (2016.11.27.)
 最近、OpenCVの話題が途絶えていますが、実は、残りの部分は、OpenCV2.4とOpenCV3.1.0でほとんど差がないからなのです。それと、2台のカメラで撮影した画像から、三次元物体の座標値を推定する処理は、高性能のカメラを使って、画像の精度を十分高くしないと、誤差が大きすぎて意味がないことが分かっているからです。
と言うわけで、「OpenCV3.1.0とVisual C++を用いた画像処理と認識」のシリーズは、一応、終わりといたします。

Facebookより --- 「Visual C++の勉強部屋」のページ・ビューが150万を超えました (2016.11.10.)
 「Visual C++の勉強部屋」の目次ページのページ・ビューが150万を超えました。2003年にカウンターを付けて以来、13年ですから、平均して12万 / 年、1万 / 月になります。でも、最近はその1 / 4位になっていますので、最盛期はすごかったです。目次以外の各項目を合計すると、その数倍のアクセスがあるかもしれません。
 大学で、学生にプログラムを教えていたころ、最初はC言語で、MicrosoftのQuick Cを使っていました。その後、Visual C++ 6.0も取り入れましたが、難解で、学生用に学内で作ったのが「Visual C++の勉強部屋」でした。私の退職後、それを一般公開して、今日に至っています。

Facebookより --- OpenCV3.1.0のSVMは、StatModel基底クラスの関数を使う (2016.10. 7.)
 OpenCV3.1.0でSVM(Support Vector Machine)を試しました。これは、ニューラルネットワークのANN_MLPと同様に、Machine Learningに属します。SVMクラスでcreateし、StatModelのtrainとpredictを使うのも、OpenCV3.1.0からの同じやり方です。
OpenCV3.1.0で追加されたCHI2カーネルも使ってみました。gammaを細かく調節しなくてはならない気難しさはあるのですが、従来のRBFカーネルよりも良いくらいで、結果は上々でした。

Facebookより --- OpenCV3.0は幻か? (2016. 9.26.)
 OpenCV3.0とは何ぞや?の疑問が生じます。2014年8月にα版が、同年11月にβ版が、2015年4月にrc版が発表されていて、現在得られる公開資料はOpenCV3.0.0-devしかありません。これが、私の言っているOpenCV3.0です。現在のOpenCV3.1.0と大きく違います。
OpenCV3.0の正式版が2015年6月に出るのですが、現在、この資料を探すと、なんと、OpenCV3.1.0-devへジャンプします。
OpenCV3.0正式版 == OpenCV3.1.0-devなら、話が分かります。もう、OpenCV3.0批判は止めます。

Facebookより --- OpenCV3.0は何だったのだろう?の疑問は続きます (2016. 9.25.)
 OpenCV3.1.0でNeuralNetworkを終わり、SVMを始めています。また同じことを述べますが、OpenCV3.0は何だったのだろう?と言うことです。OpenCV3.0は、その前のOpenCV2.4の目先は変えたものの、思想的には変わっていませんでした。ところが、OpenCV3.1.0は根本的に変わっています。新バージョンだからと言って、すぐ飛びつくと失敗しますね。
ネット上でも、OpenCV3.1.0は歴史が浅く、資料は僅少です。苦労しながら進めています。

Facebookより --- OpenCV3.0は何だったのだろう? (2016. 9.17.)
 OpenCVの2D Feature Frameworkモジュールは、OpenCV2.4 == OpenCV3.0 != OpeCV3.1.0です(プログラム的表現ですみません)。OpenCV3.0まであった「Common Interface of なんとか」のサブモジュールが全部なくなって、特徴点検出・記述器(feature detector / discriptor)のdetectAndCompute関数で、直接、記述子を得ることができるようになり、簡単になりました。
また、OpenCV3.1.0になって、KAZE、AKAZEが使えるようになりました。こうなると、OpenCV3.0は何だったのだろう、と気になります。

Facebookより --- OpenCV3.1.0で大きく変わった特徴点検出器 (2016. 9. 8.)
 特徴点検出器(feature detector)のモジュール構成に関する限り、OpenCV3.1.0はOpenCV3.0から大幅に変わっています。OpenCV3.0からすでに導入されていたKAZE(日本語の「風」から名付けた)、AKAZE(Accelerated KAZE)に加えて、AGAST(Adaptive and Generic --- あとは長いので省略)がOpenCV3.1.0から仲間入りしました。

Facebookより --- OpenCV3.1.0で追加された非写実的画像作成を試みました (2016. 8.21.)
 OpenCV3.0になってphotoモジュールに追加された、Non-Photorealistic Rendering(非写実的画像生成)サブモジュールがあります。エッジ検出の応用と言えるもので、detailEnhance(細かい差を強調して、メリハリのある画像にする)、pencilSketch(鉛筆画のようにする)、stylization(エッジを黒で強調し、エッジ以外は色の階調を落とし、水彩画のようにする)の各関数を使ってみました。
 でも、これらの既製関数を使うよりも、自分で細かくプログラムした方が、良い結果が得られるのではないか?との感想を持ちました。

Facebookより --- OpenCV3.1.0で表色系の変換とヒストグラム平坦化をやりました (2016. 8. 2.)
 OpenCV3.1.0で画像のヒストグラムを採りました。calcHist関数で簡単にできます。と言っても、この関数は上等過ぎて、簡単な用途には、使い方が分かりにくい難点があります。表色系のBGR系(OpenCVは、RGB系ではない)をHSV系に変換し、V(value、明度)ヒストグラムをequalizeHist関数で平坦化して、元に戻すと、画像のコントラストが補正されます。
 compareHistもやってみました。CBIR(Content-Based Image Retrieval、内容による画像検索)への応用があります。ある程度使えますが、これだけでは無理です。

Facebookより --- OpenCV3.1.0で二値化をやりました (2016. 7. 16)
 OpenCV3.1.0で画像の二値化を試みました。画像を白と黒の二色に分ける処理で、文字読み取りの前処理などに使います。OpenCV3.0以降で、グローバルしきい値による二値化にトライアングル法が追加されましたが、あまり一般的でない特定の条件を満たす場合しか有効でありません。
 照明むらのある原稿の場合、グローバル二値化ではうまくいきませんが、ローカル(適応型)しきい値によるとうまく行きます。

Facebookより --- OpenCV3.1.0の新しいシリーズを始めました (2016. 7. 1)
私のウェブサイト「Visual C++の勉強部屋」で、「OpenCV3.1.0とVisual C++ 2015による画像処理と認識」シリーズを始めました。従来のバージョンとあまり変わらないところは簡単にして、なるべく新しいことを盛り込みたいと思っています。平凡ですが、最初は「レナ嬢」と「Hello World!」です。

Facebookより --- OpenCV3.1.0を始めました (2016. 6.27)
 OpenCV3.1.0がVisual Studio Community 2015で動き始めました。OSはWindows10なので、まあ、新しい組み合わせと言えます。従来あった「x86ライブラリ(32bits)」がなくなり、「x64ライブラリ(64bits)」だけになったので、Visual Studioの設定をそれに合わせる必要がありました。いままで個別になっていたライブラリが、opencv_world310d.libなどにまとまっているので、設定が楽になりました。そのほか、ファイル構成がかなり変わっていますので、古いバージョンの情報は、十分注意して参考にしてください。
 詳細は、追って、私のウェブサイトで 紹介します。

Facebookより --- Windows10日本語版の誤訳(不適切訳?)は元の英語版でも問題視されている (2016. 6.22)
 Windows10の誤訳の続報です。アメリカでも問題になっています。Microsoftの討論サイトでは、「Unavailableは、単にサイズや発行元の情報が得られないことを意味し、アプリのunavailableではない」とのユーザーコメントとともに、Microsoftに対して、紛らわしい表現を改めるよう要求しています。
 従来からある、「コントロールパネル」→「プログラム」→「プログラムと機能(ここでも「機能」が使われている)」でも同様の情報が得られ、「利用不可」に対しては、「発行元」や「サイズ」の欄が空白になっています。つまり、Windows10では、空欄を「利用不可」と表現してしまったのです。
「利用不可」は、ユーザーに対して禁止する言い方で誤解を招きやすく、「利用不能」ならば、Windows10が取得しようとしたがダメでした、の意味に取れます。
 前報で、「最終使用日」は間違いで、「インストール日」でした。あるソフトを使用したら、自動的にアップデートされ、インストール日が更新されたので、勘違いしました。

Facebookより --- Windows10日本語版の誤訳(不適切訳?)を発見 (2016. 6.21)
 Windows10の誤訳か? ついに根負けして、Windows10にアップグレードしました。今まで使っていたアプリが使えるかどうか確認するのに、「スタート」→「設定」→「アプリと機能」で調べる方法があるというので、試してみました(下図参照)。「利用不可」という恐ろしい文字が出ました。でも、これらのアプリは正常に使えます。ネット上には、これについての解説もありますが、今一つ良く分かりませんでした。
 そこで、英語で調べることにしました。英語版では、「Settings」→「System」→「Apps and features」で、「unavailable」と出るようです。「features」を「機能」と訳したのが間違いです。それは「特徴」であり、「属性」と呼ぶべきかもしれません。事実、アプリ名、作成者名、容量、最終使用日しかなく、これを「機能」と言えるでしょうか。そうすると、「unavailable」が分かります。属性の「取得不能」、「確認不能」であり、アプリの「利用不可」などではありません。まさか、自動翻訳では?いいえ、「features」に「機能」の例はありません。

Facebookより --- 「画像センシング展2016」で、深層学習用ハードが気になった (2016. 6. 9)
 6月9日、パシフィコ横浜で開催中の「画像センシング展2016」を見てきました。いつものことながら、カメラ、レンズの出展数が多く、実用的な画像処理には、これらの入力機器の高性能化が必要であることが分かります。その他で目を引いたのが「深層学習(Deep Learning)」です。昔からあって、特に珍しいものではないのですが、最近、流行っているようで、NVIDIA DGX-1が「世界初のDeep Learningスーパーコンピュータ」と称して展示されていました。ほかに、DeepLearningBoxもあり、強力なハードを誇っていました。
 やはり、ハードに金をかけなければ・・・。

Facebookより --- OpenMPは、同じ処理を繰り返すと、スレッド数では説明できないくらい速くなる (2016. 5.13)
 「OpenMPで驚きの結果が!」と言うと、コマーシャル直前のTVのナレーションのようですが、スレッド数4のCPUで、実行時間が16%になったのですから、驚きです。普通には説明がつきません。
 OpenMPで、テンプレートマッチングを試しました。4重のforループを回す重い処理なので、OpenMP向きです。
 OpenMP不使用で100回繰り返すと、一回の平均が約155msecですが、OpenMPを使用すると、一回の平均が約25msecになります。なんと、16%に減っています。しかし、初回は51msecで、33%ですから、これは理解できます。
 つまり、OpenMPを使うと、一回目は33%でリーズナブルであるが、何回も同じ処理を繰り返していると、16%の不可解な値になるということです。CPUの学習により、キャッシュのヒット率が向上していくのかもしれませんが、OpenMP不使用時には現れません。

Facebookより --- 画像のヒストグラムを採るのは、OpenMPは苦手の様です (2016. 4. 2)
 OpenMPを使って、画像のヒストグラムを採ってみました。画像の全ピクセルをスキャンして取り出し、RGBに分解して、それぞれの値に対応したカウンタ配列にカウントアップしていきます。ピクセルスキャンは並列処理できるのですが、カウントアップの所で競合してしまうのか?結果は芳しくありませんでした。OpenMP ver. 3.0でFortranなら配列も並列化できるとの情報がありますが、現在のVisual Studioはver.2.0しか対応しておらず、「reduction句の変数はスカラー(配列はダメ)でなくてはなりません」の警告が出てしまいます。
 sectionsで明示的に並列化を指示してOpenMPを使うと、単にOpenMPを使用するよりは高速ですが、OpenMPを使用しない場合より50%ほど遅くなります。

Facebookより --- OpenMPでの実行時間は、不規則な変動が多い (2016. 2.29)
 OpenMPが分かりません。最初の実行では、40%程度にしか実行時間が短縮されないのに、同じ処理を100回繰り返すと、16%まで下がります。Visual C++のコンパイラのみでも、デフォルトでベクトル化機能が働きますが、こちらは100回でも変わりません。
 CPUの分岐予測(branch prediction)や先読み(prefetch)の学習効果でしょうか?
 二つの三角関数の積を、1000 x 1000の二重ループで、合計1000000回足し込む処理の、一回の実行時間を求めたところ、実行時間にはノイズ(オーバーヘッドやキャッシュミスなどによる不規則な変動)が多く、この程度の処理をさせて、ようやく、有意な結論が出てきます。
 ネット上では、
 Don't embark on threading lightly! You've been warned: Here be dragons!
と言う忠告も見かけました。信頼性のない、再現性のないドラゴンだ、と続いています。

Facebookより --- Batteries Not Includedは、映画の題名だった (2016. 2.12)
 30年前の謎が解けた!?
 Pythonのことを調べていたら、次のようなやり取りがありました。
 What does "batteries included" philosophy (in Python) mean? It means you don't have to reinvent the wheel.
確かに、Pytthonは batteries included (電池同梱)の言語と言われています。これは、豊富なライブラリが付属していることを意味します。しかし、他の言語がライブラリが足りないとも思いません。
 回答で、reinvent the wheel が気に入りました。以前に投稿したように、直訳すれば、「車輪を再発明する」 です。すでにある(知られている)ことを、わざわざやる、すでに知られていることを、あたかも自分が考えたように言う、などのあまり良くない意味です。でも、ここでは、答えになっていません。
 ネットで調べていたら、"Batteries Not Included"の方が多くヒットしました。これは、1987年(約30年前)の映画の題名でした。このころ、私はマレーシアで技術指導をしていました。ところが、現地の技術者が、ときどき"Batteries Not Included"と言っているのです。私は、「うわべだけ技術を教えても、金やものも持ってこないと、意味ないよ。」と言われているような気がしていました。映画の話をしていたのだったら、幸いです。

Facebookより --- Javaの人気が高いようですが、画像処理にはJavaの良い面はあります
(2016. 2. 5)
 またプログラム言語の比較で失礼します。画像処理では、Javeに軍配が上がります。RGB表色系とHSB(HSVと同じ)表色系の相互変換が、Java APIではできます。C++では、.NET Frameworkを使うことになるのですが、RGB系からHSL系への一方通行のみです。関数名はGetBrightnessとあるので、HSB系かと思いきや、Lightnessを使うHSL系です。逆変換は、自作しないといけません。
 平滑化、鮮鋭化、エッジ検出に使うコンボリューションも。Java APIには、ConvolveOpや、マスクを定義するKernelがあります。C++の場合は、これらは手作りになります。
 画像処理なら、OpenCVを使えばよいではないか、との意見もあるでしょうが、そこまで本格的にならないなら、Javaでしょう!

Facebookより --- Visual Studio Community 2015による、Win32のGUIの解説に区切りを付けました (2016. 2. 2)
 最近、プログラミング言語の人気(popularity)が気になって、少し調べてみました。最も権威がありそうなIEEESpectrumの「2015年トップ10プログラミング言語」によれば、上位は、Java、C、C++、Python、C#の順に僅差で並んでいます。これは、いろいろな角度から総合した結果だそうです。
 Googleその他の多数の検索サイトの頻度をまとめたTIOBE社によれば、JavaがトップでCが続き、大きく水をあけられて、C++、C#、Python、PHPが続いています。検索エンジンによる順位に対しては、批判的な意見もあります。
 検索サイトの調査で、特に入門者向けチュートリアルに限ったPYPL(Popularity of Programming Language Index)によれば、Java、Python、PHP、C#、C++、Cと続いています。まだ、あまり使っていないが、勉強を始めたいという人の傾向でしょうか。
 ネット上での質疑応答の場の一つであるGitHubによれば、JavaScript、Java、Ruby、PHP、Pythonと順位が並び、C、C++は下位になっています。2008年以来、JavaScriptは常に2〜1位を占めていますが、Javaは、2008年の7位から、毎年のように順位が上がり、2位になりました。
いずれを見ても、Javaの人気が高いのは間違いありません。我がC++は、成熟しきって、老化現象が出始めているのでしょうか?それとも、難しすぎるのでしょうか?

Facebookより --- Visual Studio Community 2015による、Win32のGUIの解説を終わりました (2016. 1.30)
 「Visual C++の勉強部屋」で、「Visual Studio Community 2015の使い方」に一段落を付けました。ここでは、Win32アプリケーションの、特にボタン類、コントロール類など、GUI(Graphic User Interface)を中心に解説しました。GUIの使い方が分かれば、プログラム本体のアルゴリズムは、Windowsフォームアプリケーションの解説から容易に類推できるとの考え方です。
次は、何をやろうかな、と考えています。お奨めがあれば、教えてください。

Facebookより --- 2015年の「Visual C++の勉強部屋」のページビューをまとめました (2016. 1.19)
 新しい年になり、昨年の、私の「Visual C++の勉強部屋」の月別ページビューを整理してみました。Visual C++離れが進んでか、最盛期の1/4程度になりました。OpenCVをやってみたり、工夫はしているのですが、いまひとつです。
 やはり、学生が中心のようです。新年度の4月が高く、夏休みに下がります。卒論をまとめ始める1月に上がり、3月まで次第に下がっていきます。
 Win32は、初心者にはとっつきにくいのですが、Visual C++ = Win32になってしまった感じがして、頑張っています。

Facebookより --- OpenCVを使いこなすには、高精度のカメラが要ることが分かりました (2015.11.20)
 OpenCVの解説は、一段落させました。OpenCVは、体系的に素晴らしく、学術的にも立派なものであることが分かりました。しかし、それは、理想的な高精度のカメラや設置条件があっての話であることも強く感じました。
 人間の視覚は、眼と脳の共同作業です。眼は単なる入力装置で、処理は脳で行っています。脳は過去の膨大な経験や記憶をもとにして判断しています。OpenCVはコンピュータビジョン(Computer Vision、人工視覚)用のライブラリですが、この脳に相当するところが貧弱(機械学習も含まれていますが)で、まだ、到底、人間にはかないません。それを補うべく、眼(カメラ)が重要になっているのでしょう。
 クルマの自動運転が実用化されつつあります。こちらは、レーダーなどのアクティブな手法も併用しています。

Facebookより --- OpenCVのHOG特徴で、人の検出がうまくいきました(2015.11. 6)
 すでに公開しているOpenCVの資料を見直しています。さきに、「人(歩行者)を検出するのに、HOG特徴はHaar-like特徴に比べて性能が悪い」との結果を得ていました。しかし、疑問を感じ、やり直しました。
 各種条件をデフォルト(標準設定、一般に、特に初心者は、このまま使う)のまま使った場合には、一人も検出できていませんでしたが、公開資料にない条件を「自己責任」で使ったら、HOG特徴は、決して悪くはありませんでした。
詳細は、下記サイトをご覧ください。

Facebookより --- OpenCVのカスケード分類器を見直しました(2015.10.25)
 OpenCVで、三次元再構築には一区切りつけて(精密に設置された高性能のカメラと、テクスチャが理想的な対象物が必要なことが分かったので)、今までの資料の見直しにかかりました。まずは、カスケード分類器による顔と人物の検出を改版しました。

Facebookより --- OpenCVの視差マップから画像を再生しました(2015.10.13)
 OpenCVで、人為的に視差マップを作成し、reprojectImageTo3D関数で三次元座標化し、視点を移動させて、projectPoints関数で二次元画像化しました。すべて、期待通りにうまくいきました。理想的で正確な視差マップがあれば、OpenCVの関数は良く動作してくれます。
しかし、通常の自然画像から、適切な視差マップを得るのは、非常にむつかしいのです(7月26日投稿参照)。

Facebookより --- OpenCVのfindFundamentalMat関数も、仕様通りに動きません(2015. 9. 2)
 OpenCVで、findFundamentalMat関数を調べました。二枚の画像から基礎行列を求める関数ですが、これがおかしかったからです。8POINTアルゴリズムは使えなく、RANSACも、仕様(N>=8)に合致しているはずのN=8で異常現象が生じ、N=20では使えました。
特徴点の座標値に誤差を付加すると、当然のことながら、カメラの角度を大きくずらさないと、正しい基礎行列が得られませんでした。
結局、1)十分多数のマッチング特徴点が得られる対象であること、2)高精度のレンズ、多画素数のカメラを正確に固定的に配置すること、3)カメラの画素数にもよるが、二つのカメラ位置相互間の距離と同程度以下の距離に対象物を置くこと、が必要とわかりました。これでは応用範囲が限られますね。

Facebookより --- OpenCVのtriangulatePoints関数は、仕様通りに動きません(2015. 9.10)
 OpenCVで、triangulatePoints関数がおかしいのではないかと疑問を抱くようになり、詳しく調べてみました。この関数は、複数の特徴点を一括して計算できる筈なのですが、一対の特徴点ずつ計算させないと、期待通りでない異常な結果になりました。
 triangulatePoints関数がおかしいとの資料は特になく、私の勘違いでなければよいが・・・と思いつつ、資料にまとめました。

Facebookより --- OpenCVで、二枚の写真を貼り合わせました(2015. 8.24)
 OpenCVで三次元物体を再構築するのは、かなりむつかしい仕事です。一歩一歩進めている作業の一つに、ホモグラフィー変換の応用があります。ここでは、一番簡単な応用例として、二枚の写真からパノラマを作成することを試みました。基礎行列の場合と異なり、ホモグラフィー行列は、割合簡単に求まりました。パノラマ化のみが目的であれば、OpenCVには、Stitcherクラスという、便利なものがあります。

Facebookより --- OpenCVの特徴抽出がうまくいかない(2015. 8. 13)
 また、OpenCVの話題です。解説の筆が進みません。頭が「お盆休み」モードに入っているわけでも、夏バテでもありません。二つの画像間の変換(射影)マトリックスを求めるfindHomographyが、うまく動いてくれないのです。分かってきたことは、特徴抽出に使っているORBがダメなのではないか?と言うことです。そこで、資料に良く使われているSURFを使ってみました。すると、ORBよりは、ずっとましなことが分かってきました。でも、チューニングにチューニングを重ねても、完全に満足できる結果には至りませんでした。
 ある論文に、Jpeg圧縮によるアーチファクト(偽ノイズ)が原因と示唆するものがありました。OpenCVの資料を作成するために、RAW画像の得られる高価なカメラを購入する気もないので、この話題は、パスかな、と思っています。
 でも、世界中の多くの人が問題にしない中、こんな発言は、度胸が要りますよね。

Facebookより --- Visual Studio Community 2015をダウンロードしました(2015. 8. 2)
 Visual Studio Community 2015をダウンロードし、インストールしました。新しいプロジェクトを作成しようとすると、Visual C++の場合は、さらに、ひと手間かけて、Visual C++ 2015を別途ダウンロードする必要があります。そうして、ようやく、WinコンソールアプリケーションとWin32プロジェクトを作成できるVisual Studio Express 2013並みになりました。
 効能書きには、C++11へほぼ完全に対応したとか、C++14/17へも一部対応したとかありますが、C++が冷遇されている感は否めません。

Facebookより --- OpenCVの3D再現は高級カメラが必要?(2015. 7. 4)
 人間は、片方の目だけでも、ある程度の遠近感を得られます。それは、山は遠方にあるもの、人の身長はこのくらいだから、あの人は10m位先に居るはず、陰になっているから、その右が出張っているに違いない、・・・です。つまり、人は画像の意味を理解し、その属性から距離を推測するのです。
 3Dの映画やテレビが普及しないのは、両眼の視差情報がなくても、脳が立体感を付加してくれるので、不自然に感じないからでしょう。
ところが、OpenCVの関数による立体視は、ただ、画面上の位置情報に頼るばかりです。これでは、画像の僅かな歪が大きく影響するのも当然です。「画像センシング展」で、高価なカメラの展示が多かった理由が分かったような気がします。

Facebookより --- OpenCVの3D再現は不安定で、難しい(2015. 6.22)
 OpenCVの解説の筆が進まないで困っています。二つのカメラ画像から、三次元情報を取得するのに、基礎行列(fundamental matrix)を用います。この行列は、異なる位置から撮影した画像から求めることができ、数学的根拠の高いものです。しかし、これが容易に求まらないのです。
 詳しく調べて行くと、やはりそうらしく、基礎行列導出の不安定さを論じる論文がずらりと並びます。マッチング点の誤差に弱い、ノイズに弱い、同一平面にあったらダメ、解像度が低いとダメ、・・・。 OpenCVの解説本も、その辺を逃げている感じがします。 理論は素晴らしく、整然としているのに、実際にやってみると、問題だらけ。

Facebookより --- OpenCVでカメラキャリブレーションをした(2015. 5.18)
 OpenCVで、三次元再構成の前準備として、カメラキャリブレーションを終わりました。最近のデジカメは、超広角で使用しない限り、結構歪が少ないので、ほとんど、自作したチェスボードの精度を測定しているのと同じと分かり、あわてて、チェスボードを作り直し、ほぼ良好な結果を得ました。
 次は、三次元再構成ですが、これが簡単ではありません。OpenCV以外のライブラリとの併用も視野に、しばらくは裾野を這い回りながら、少しずつ進めて行きたいと思います。

Facebookより --- OpenCVがプログラム通りに動かない(2015. 1. 30)
 また、OpenCVで恐縮です。Aの処理をしてから、その結果をimshowで描き出す。Bの処理をしてからBの結果をimshowで・・・。と順序良くやっているつもりですが、Bの処理がparameter out of rangeなどで引っかかると、Aの結果も表示されません。どうも、処理だけ先にやって、あとでまとめてimshowをやるのではないかと思われます。Aの処理とBの処理をループで回すと、おかしくなることがあります。Bの処理結果は正しく表示されているのに、Aで引っかかったりします。コンピュータが、プログラマの意図通りに動かなくなるとは、困った問題です。

Facebookより --- OpenCVは勝手に並列演算をしている?(2015. 1.29)
 Visual Studioを用いて、C++言語でOpenCVを使っていることは、たびたび話題にしていますが、最近、ビルドは通るのに、実行時エラーになる現象に悩まされています。まだ、完全に原因はつかめていませんが、勝手に並列演算をやるからではないかと思うようになりました。同じ変数名の使いまわしがいけないらしく、別にすれば正常になります。つまり、同じ変数が、直列的に順を追って繰り返し使われるのではなく、同時に並行して使われて混乱するからではないか、と思うようになりました。コードの簡潔さ、分かり易さ、論理性からいうと逆行するのですが・・・。と言うわけで、私の書くコードに冗長性が多いと感じられた場合は、そのような理由かもしれない、と思い出してください。マルチコア、マルチスレッドのCPUの時代ですからね。

Facebookより --- 電子書籍を読み始めました(2015. 1. 26)
 AmazonからKindle for PCリリースの案内があったので、早速ダウンロードしました。そしたら、本を買いたくなったので、OpenCV Essentials(2014/8)とLearning OpenCV:Computer Vision with the OpenCV Library(2008/10)を買いました。どちらも、ボタンをクリックすると10秒位で、ダウンロード済みの「Kindle for PC」に配送されました。後者は古い本ですがバイブル的な本で、和訳もされています。しかし、和訳本は電子書籍化されてなく、Kindleで読めません。他に1冊、無料のComputer Vision Metrics:Survey, Taxonomy and Analysis(2014/5)もダウンロードしました。紙の書籍の3分の1程度の値段と、すぐ読めるところが魅力です。
 電子書籍は、形がなく、飾っておくことができません。それと、読んでいる時、無料の、ネット上のサイトを見ているのと感覚がごっちゃになって、「これ、お金出して見ているんだ」と、ふと思うことがあります。

Facebookより --- OpenCVには面白い発見がある(2015. 1. 7)
 OpenCVを始めて2か月が経ちました。「Visual C++の勉強部屋」に8件の紹介記事をアップしました。まあ、テンポは速い方です。OpenCVのオフィシャルサイトのあるプログラム例で、ある値に1000が使われているのです。理由は書いてありません。内外の資料にも、そのまま真似されています。考えてみると、対応する画像の幅image.colsまたは画像の高さimage.rowsの大きい方を選べばよいことが分かりました。これを超えた値の1000にしておけば十分で、気が付かないのでしょうか。
OpenCVには、面白い発見があります。だから、止められない。気づいたことは早くアップしないと・・・。

Facebookより --- 「国際画像機器展2014」に行ってきました(2014.12. 4)
 12月4日、パシフィコ横浜で開催中の「国際画像機器展2014」に行ってきました。出品は、カタログページ数で見ても、展示スペースで見ても、カメラ(画像処理機能含むものあり)が圧倒的に多く、光源、レンズ、画像入力ボードが続きます。システムとしての画像認識装置の出展は僅かでした。
 実用レベルでの画像認識には、やはり精緻な画像が必要で、そのためには高度な光源、カメラ、レンズが必要であることが分かりました。勉強していたので、展示説明員と少し深い話も楽しめました。
 アマゾンに発注してあった本が来ました。OpenCV Computer Vision Application Programming Cookbook - 2nd Editionは、入門的な画像処理をOpenCVで行うための説明が多くなっています。Hough変換による直線や円の検出や、各種の特徴抽出法も出てきますが、本当の問題はそこからなのです。2014.8刊で、OpenCVのバージョンは新しいです。
A Practical Introduction to Computer Vision with OpenCVは英語(British English)で書かれています。著者は、アイルランドの人です。2014.1刊で、OpenCVのバージョンは新しいです。カラー画像の扱いが多く、画像認識にも踏み込んでいますが、詳細は参考文献を見よ、との姿勢です。

Facebookより --- 「OpenCVとVisual C++による画像処理と認識」を始めました(2014.11.25)
 私の「Visual C++の勉強部屋」で、「OpenCVとVisual C++による画像処理と認識」を始めました。内外に数ある優れた紹介サイトに伍していけるのか心配ですが、最新2.4.10バージョン対応の強みを生かしたいと思っています。既存の参考資料は、もちろん役に立ちますが、関数名や構造体、定数などの頭からcvやCV_が消え、それらは使えても、推奨されなかったり、予想外の結果になったりします。
 画像をマトリックスで表すという概念を頭に叩き込む必要があります。

Facebookより --- OpenCVで簡単な画像処理を試してみました(2014.11.16)
 OpenCVで、一通りの画像処理を試みました。多少手間をかければ、細かい細工もできました。プログラムを組むとやや面倒な、Canny法によるエッジ検出や、大津の方法による二値化などは、既製ライブラリがあって便利ですが、無理に使わなくても困らないものです。異論を覚悟の上で言うと、画像処理にOpenCVは必要ありません。
ところが、市販のOpenCV本を見ると、易しい画像処理に多くのページを費やし、本来のComputer Vision(画像認識)の解説が少ないのは不思議です。この分野の読者が少ないからか、難解だからかは分かりません。と言うわけで、これから画像認識に取りかかります。内外の専門学術誌が頼りです。

Facebookより --- OpenCVが動き始めました(2014.11.13)
 OpenCVが、Visual Studio で動き始めました。IntelliSense(入力候補をガイドしてくれる)が快適に働き、文法の知識があいまいでも、楽に使えます。従来の、.NET Frameworkで画像処理をやっていたのが、アセンブリ言語のように感じられ、OpenCVは高級言語に相当します。しかし、アセンブリ言語と高級言語の違いそのままに、OpenCVでは、小わざが使えません。それと、GUI関係が貧弱で、組込み用の定型的な処理(商業的な実用性では、この分野が大きい?)には向きますが、研究用やホビー用には、どうかなとの面もあります。
いずれにしても、当分の間、退屈しないおもちゃができ、生きがいを保てそうです。

Facebookより --- 画像処理・認識OpenCVライブラリをダウンロードしました(2014.10.10)
 OpenCVを始めました。これは、オープンソースのComputer Vision(画像認識)ライブラリです。画像処理ライブラリも含まれています。永らく、Visual C++で画像処理をやってきましたが、画像認識をやるには、やや能力不足です。そこで、OpenCVの助けを借りるために、最新のopencv-2.4.10.exeをダウンロードしました。build/x86/vc12/bin/のライブラリを使って、Visual Studio Express 2013から呼び出します。これから、少しずつ、結果を紹介していきます。

Facebookより --- (株)マイナビから発売の「Visual C# 2013 画像処理・数値プログラミング」について(2014. 9.21)
 (株)マイナビから、山口さんのご尽力で「Visual C# 2013 画像処理・数値プログラミング」を出すことができました。この宣伝をするわけではないのですが(結果的に宣伝にになる?)、その経緯を説明したいと思います。
 私の「Visual C++の勉強部屋」で紹介しているC++は、現在最も多く使用されている言語の一つで、プログラム開発を職業としている人が多く使っています。その仕様は常に更新され、コードの簡略化(autoキーワードなど)、実行効率の向上(右辺値参照など)など、一層、プロ向きになっています。これら新仕様の紹介を続けていくには、それに適した実用例が必要ですが、理工系への適切な応用を探すのに苦労しています。
 Microsft社のVisual Studioは優れた統合開発環境(IDE)ですが、2012年以降、Webアプリケーションへの比重が高まり、そこでは、Visual BasicとC#のみが推奨されています。Windows Desktopアプリケーションでは、WindowsフォームアプリケーションがVisual C++では使いにくくなってしまいました。
 以上の環境変化から、新天地開拓のつもりで、Visual C#に目を向けたわけです。

Facebookより --- 最近のソフトの話題は日曜プログラマ向きではない?(2014. 4.30)
 相変わらず、「Visual Studio Express 2013の新しい使い方」に苦労しています。家を建てるのにトンカチやのこぎり、ドライバも要るでしょう。これらは日曜大工でも使います。最近のソフトの話題は、効率向上、省労力化で、もっぱらプロが使う電動トンカチ、電動のこぎり、電動ドライバに相当するような話ばかりで、これを日曜大工で使うにはどうするか、何が作れるのかを考えないといけなくなっています。つまり、作りたいものが先に在って適した道具を探すのではなく、新しい道具を前にして、何を作ろうか、と悩んでいます。
 もう一つ。アメリカのソフトに関する討論サイトを見ていると、「Don't reinvent the wheel.」と言うのがありました。これは、知っていました。「お前の勉強不足だぞ。そんな当たり前のことを、自分が考えたように言うな。」とのお叱りです。
 私も言われないようにしないと・・・。

Facebookより --- 「新しい使い方」の作成に苦労しています(2014. 4. 5)
 「Visual Studio Express 2013の新しい使い方」の作成には苦労しています。forループの代わりにfor_eachを使うとどうなのか、range-based forはどうなのか、その長所短所は?などと疑問がわくと、アメリカの多くのサイトが役に立ちます。
 「StackOverflow」(プログラムに関する討論サイト、名前も面白い)で、forとfor_eachを比較して、「Readability/maintainability is in the eye of the beholder.」とありました。「コードの読み易さ、保守のし易さについては、意見の分かれるところ」とでも訳すのでしょうか。討論は、論文的な表現ではなく、会話的な表現が多いので、プログラムの勉強と同時に、英会話の勉強にもなります。

Facebookより --- 「Visual Studio Express 2013の新しい使い方」を始めました(2014. 3.31)
 最近、私の「Visual C++の勉強部屋」のページビューが伸び悩んでいます。大学等が春休みであることもありますが、Visual C++への人気が落ちているようにも感じます。Windows XP機が最新のWindows 8.1機に買い替えられつつありますので、Visual Studio Express 2013のインストールが可能になり、見直されるかな、と期待しています。
 これに合わせて、「Visual C++の勉強部屋」で、「Visual Studio Express 2013の新しい使い方」シリーズを始めました。従来の「易しい」ではなく、「新しい」とし、比較的新しいプログラム技法を紹介して行こうと思っています。ただ、理工系のテーマへの応用として最適であるかどうか、疑問もあります。

Facebookより --- Developpers Summitに行ってきました(2014. 2.14)
 2月13日、翔泳社が主催するDevelopers Summit(目黒雅叙園)へ行ってきました。Microsoft、Oracle、Embarcaderoなどが、独自でカンファレンスを開催するのに比べると、やや地味な感じはしますが、各会場とも、ほぼ満席の盛況でした。
 話題は、クラウド、スマートフォンやWindowsストアのアプリ、HTML5などで、企業の一員として参加しているよりも、ソフト開発者としての横断的な一体感がある集まりの様に感じられました。

Facebookより --- 今年を振り返って(2013.12.29)
 間もなく、2013年も暮れようとしています。振り返ってみますと、5月にWindows8のPCを買いました。そして始めたのが、Visual Studio 2012 Express、しかし、Visual C++は使いにくくて失望。でも、一応、Win32関係のプログラムを、「Visual C++の勉強部屋」で紹介しました。
 10月に、Windows8.1にアップグレード、Visual Studio Express 2013がでたので、これに乗り換えましたが、これも相変わらず。そこで、Microisoftが優遇している Visual C#を始め、現在、資料を蓄積中です。

Facebookより --- Microsoft Conference 2013に行ってきました(2013.11.21)
 今日、The Microsoft Conference 2013 に行ってきました。「It's time.」がいろいろ出てきて、特に「It's time to make hybrid cloud ready.」に力が入っていました。「今でしょ! ハイブリッドクラウドを始めるのは!」とでも訳すのでしょうか。ハイブリッドクラウドとは、Microsoftや、その他のサービス プロバイダー、社内などのクラウドを一元的に管理するもののようです。
 Visual Studio 2013 に関しては、Windowsストアアプリの開発方法を説明していました。Microsoft が審査して、合格したストアアプリは、Microsoftを通じて世界的に販売される仕組みで、Microsoft 社の良い収益源として期待しているのでしょう。

Facebookより --- Visual Studio Express 2013をダウンロードしました(2013.11. 4)
 Visual Studio Express 2013 for Windows Desktop をダウンロードしました。まだ使ってみていないのですが、ちょっと見た目では、2012と変わりはありません。Visual C++が広く使われるようになったのは、Visual C++ 6.0からですが、それまでは、バージョン番号であらわしていました。その後、2005、2008、20010、2012と、年号であらわすようになり、ついに2013が出ました。もう、2014さえ、ささやかれています。
 頻繁なバージョンアップは、タブレット端末やスマホの急速な普及と進歩で、アプリ開発が増え、内容も高度化して、その対応に追われているためと思います。
 Express版のVisual C++は、相変わらず不便ですが、<math.h>にC99機能が追加され、<complex.h>が独立(もちろんC99準拠)したようですから、電気系の計算には便利になったかもしれません。
 11月21〜22日に、Microsoft Conference 2013がありますので、そこで、もっと詳しいことが分かると、期待しています。

Facebookより --- Wi32アプリケーションで画像処理を始めました(2013. 7.25)
 私のサイトの「Visual C++の勉強部屋」のために、Visual Studio Express 2012を使って、Win32アプリケーションで、画像処理を始めました。私にとって、Win32プログラムは経験が浅いので、ネット上の資料を見ます。
 ところが、その中に、自分が独自に作成したプログラムと類似のものを発見した時は、ガッカリです。パクリと思われるからです。「参考にした」と敬意を表するのも嫌ですし・・・。
 そこで、一念発起、より良い方法を考えます。それが、あるのですね。と言うわけで、時が経つのも忘れて、Win32プログラムと格闘しています。
いつも思うのですが、小説作家や作曲作詞者などは、他人の作品をよく見ているのでしょうか?あまり見すぎると、潜在的に影響を受けてしまうのではないか、見ないと、うっかり「パクリ」をやってしまうのではないか、と心配です。

Facebookより --- Visual Studio2012 Expressを始めました(2013. 7.11)
 Visual Studio 2012 Expressを使って、Visual C++ のプログラムを作成しています。Windowsフォームアプリケーションは、2012年版になってから、テンプレートが使えなく(改悪)なりましたが、少しの手間で、従来通り使えることがわかりました。
 次に、win32アプリケーションを始めたのですが、ここでも、あるファイルを編集できない、と言う制約がある(有償版はできる)ことが分かりました。しかし、ネット上の情報を参考にし、簡単に、編集ができました。
 Visual Studio の有償版を購入する客には、「Express無償版は、いろいろと制約がありますよ」と顔を立て、一方で、抜け穴も用意しておくのは、Microsoft の良心でしょうか。

スパイラルアップ?(2010. 2. 2.)
 
前述のように、MFCにどっぷり浸かっていた「Visual C++ 6.0」から、.NET Frameworkの「Visual C++ 2005」に変わったときには、全面的な書き直しを余儀なくされました。しかし、「Visual C++ 2008」では、大差が無く、新しい内容の追加や補充に重点を置いたものの、旧バージョンの各項目を再検討すると、不十分や不適切な部分が多く見つかって、赤面しながら対応しました。
 
今回は「Visual C++ 2010 Express Beta2」ですが、英語版と言うこともあり、また書き直しを始めました。いずれのバージョンの使い方紹介も、同一バージョン内では、易しいものから複雑なものへと進みます。バージョンアップの度に、再度易しい内容に戻るので、スパイラル状態です。しかし、内容的にはアップしている(レベルが高いと言うより、より正確に丁寧になっている)積りですので、スパイラルアップかなと思っています。
 世間では、経済のスパイラルダウンが心配されていますが…。

「未定」はいつまで未定なの?とのご質問に答えて
(2009.11.5)
 「Visual C++の勉強部屋」は、2000年にVersion 6.0ではじめました。当時はMFCが主流でしたが、無料版の2005 Express Editionの頒布とともに、.NET Frameworkが使われるようになり、全面的な書き直しに迫られました。しかし、Version 6.0で作成した時代には興味を持たれたテーマも、その後の情勢で重要度が失われ、改版に戸惑いがあって、一部がそのまま「未定」になっているのです。
 「使い方(17)」は、「ニューロンをシミュレーションして排他的論理和を実現する」でした。一時期は、家電製品にもニューロンが使われているとうたわれたりしましたが、認識効率が悪く、「理屈が無い」ことが嫌気されて?流行らなくなりました。Javaで書かれた「ニューラルネットワークを用いたパターン認識」はCodeZine上にありますので、ご参照下さい。
 「使い方(22)」は、「Hex Viewer(データ解析ソフト)を作成し、DICOMデータを調べる」でした。かなりDICOMデータに特化している内容なので、後述の理由で、そのままになっています。
 「画像処理(9)」は、「Bitmapファイルや医用画像DICOMファイルを画面に表示する」でした。これも、同様の理由からです。
 「画像処理(11)」は、「現画像を離散コサイン変換し、画像復元を試みる」でした。本文にも書いてあったのですが、この方法はなかなか難しく、良い結果が得られなかったので、改版する気になれませんでした。
 「画像処理(16)」は、「医用画像DICOMの表示を、やや本格的に取り上げる」でした。DICOMは、現在もますます普及している医用画像の標準フォーマットですが、圧縮技術が高度になり、多機能のフリーソフトが標準的に出回り、素人が手を出す分野ではなくなっています。

誰が見に来てくれているのかな(続き)(2008.3.7.)
 このつまらない独り言、「RoomMaster's Voice」は、この表題で5年前に始めました。Googleが提供している解析機能を付加して、一ヶ月以上が経ちました。私のサイトへの訪問者の94%は、「Visual C++の勉強部屋」に来ます。この「RoomMaster's Voice」へも約1%の方が来てくれます。「Visual C++の勉強部屋」にあるカウンタの数字はセッション数で、ページビューは、その約2.5倍になっています。
 来訪の原因は、Googleを主とする検索エンジンが68%、「お気に入り」からが23%、他のサイトからのリンクが9%です。初めての来訪者は51%で、リピーターは49%です。
 これらの結果は、私にとって意外でした。私は、今まで、ほとんどがリピーターで「お気に入り」から来てくれるものと思っていました。もっと検索エンジン対策をして、見栄えも良くしないといけないのかなァと思いますが、でも、やっぱり中身で勝負?に落ち着いてしまいます。

NEC最初のコンピュータNEAC1101が稼動開始から半世紀を迎えました(2008.1.7.)
 今年、平成20年(2008年)は、NEC最初のコンピュータNEAC1101が公式稼動した昭和33年(1958年)から数えて、50周年、半世紀です。これを記念して、50年前の写真を紹介します。下の写真で、左から長森享三氏(故人)、秋野守利氏、吉沢聖一氏(故人)、太刀川勝助氏、私(なぜか、メモリーアレイを一枚持っている)です。 なお、このとき、私は入社後3年目の26歳でした。
 公式稼動の意味は、ほぼ安定に動作するようになったこと、パラメトロンと言う日の丸コンピュータ素子の特殊性から、指導を受けた東京大学、日本電信電話公社、国際電信電話株式会社、技術交流を行った国内同業他社などとの兼ね合いで、この時期に各社ほぼ一斉に発表したことによります。
 装置について説明しますと、手前左から、メモリー内容をモニターするためのオッシロスコープ、制御卓、機械式紙テープリーダ、テレタイプ用プリンタ(紙テープ鑽孔機つき)です。後ろは、左からパラメトロン演算制御部筐体(二連)、メモリ筐体、電源です。パラメトロン用高周波電源は、最左端にありますが、写真には入っていません。 空調設備は無く、筐体上部のファンだけが頼りの厳しい環境であったことも苦労の一因でした。



上の写真をクリックすると大きくなります

Java One Tokyo 2005 に行ってきました(2005.11.19.)
 久しぶりに書いています。最近は、(株)翔泳社のCodeZineへの定期的な寄稿で少し忙しく、ご無沙汰していました。11月8日から10日の間に開かれたJava One Tokyo 2005によれば、「The power of Java rotates the planet.」とかで、「それでも地球は回る」と言った人みたいなことを言っています。もう一つは、「Participation and sharing drives markets.」で、「Participation Age」とも言っています。これだけJavaが広がると、大勢の協力が無いとやって行けないし、その方が、共有物との意識が高まり、皆が使ってくれるとの思惑があるのでしょう。
 従来、JavaにはSE(Standard Edition)、EE(Enterprise Edition)、ME(Mobile Edition)があると思っていたのですが、MEは、Micro Edition と呼ばれるようになっていました。多分、当初のモバイル機器(携帯など)への実用化に成功し、これからは据え置き型の機器にも組み込み用として普及させたいのでしょう。現在、J2SE5.0("Tiger")などと呼ばれている名称は、今後Java(TM) SE 6("Mustang")とかJava(TM) SE 7("Dolphin")などになるとの計画も発表されました。
 Javaを始めて、半年が経ちました。大抵のことが、豊富なAPIに支えられて、簡単にできでしまうのに感心しています。そのことは、いずれ別の機会に・・・。

とうとうJavaを始めました(2005.5.29.)
 ソフト関係の出版社の(株)翔泳社からお誘いがあって、同社が始めたウエブマガジンCodeZineに寄稿させて頂くことにしました。CodeZineは、有名なCodeGruやThe Code Projectの日本版という位置付けで、面白くなりそうです。実は、「Visual C++の勉強部屋」はVisual C++ 6.0を基礎にしていて、新しいバージョンに書き換える必要を感じていました。しかし、最近のJavaの進歩に伴い、かなりのことがJavaでもできると分かりましたので、その代わりに「Javaの勉強部屋」でも始めようかと思っていた矢先でした。
 Javaには、すごく便利なクラスやメソッドが沢山あります(早速Java語になって、失礼!)。画像ファイルの読み込みは、JPEGやGIFなら非常に簡単です。これらはインターネット上の画像フォーマットの標準ですから、インターネット上の通信に重きを置いたJavaなら当然ですね。オブジェクト指向言語の常として、ブラックボックス化したものが沢山あって便利なのですが、ホビープログラマとしては物足りないこともあります。実行速度の遅さが思ったよりも気にならないのは、贔屓(ひいき)目からでしょうか。
 実際にはJavaを使っていて、アルゴリズムだけを参考にするために「Visual C++の勉強部屋」を見てくれている方も多いと思います。CodeZineの方も見てください。

Java誕生10周年を祝ってきました(Java Computing 2005 Spring、Java誕生10周年前夜祭)(2005.3.15.)
 サン・マイクロシステムズ(株)主催の標記カンファレンスに行ってきました。Javaテクノロジーの一層の普及に向けたもので、協賛各社のセッションや展示もありました。Javaは、ネットワークに適した言語ですので、Webアプリケーションやケータイへの応用が強調されていました。昔、COBOLは事務計算用と言われ(FORTRANの技術計算用に対して)、プリンタによる帳票出力に優れていました。現在は、プリンタの代わりに双方向性のWebシステムが用いられることが多いので、JavaがCOBOLに代わるテクノロジーであることを認識しました。あまりプログラムに詳しくない人でも簡単にWebアプリケーションを作成できるように、EoD(Ease of Development)をうたった開発ツールが紹介されていました。
 Javaの入門書が多数本屋に並んでいますが、ほとんどはjavacと言うJavaコンパイラとテキストエディタを用いたCUI方式の解説です。入門者やマニアックなプログラマは、ほとんどがこれのはずです。会場での挙手結果に依れば、IBMが当初開発したオープンなIDE(統合開発環境)であるEclipseを使用している開発者も半数近く居ました。さすがJavaで飯を食っている技術者といったところでしょうか。しかし、SunMicrosystemsのオープンIDEであるNetBeansは、まだ馴染みが薄いようで、これの宣伝もしていました。
 デスクトップのWindow環境として、Looking Glass 3Dがデモで紹介されました。Windowが裏返しになったり、立体的に表示されるのは面白いのですが、CPUパワーやメモリー容量、グラフィックシステムを必要とするので、省エネには逆行するような心配もありました。

デブサミ(Developers Summit 2005)に行ってきました(2005.2.9.)
 大変久しぶりに、書いています。「海外旅行に行っていないが、どうかしたのか」とのご心配も頂きました。昨年は、PSAが上昇する病気のため、手術をしました。現在、ようやく回復してきましたので、活動を再開することにしました。2月3日と4日の両日、出版社の(株)翔泳社が主催する標記デブサミを覗いてきました。エヴァンゲリストやアーキテクトなどの肩書きを持った人が登壇し、いつの間にソフトウエアが宗教や建築物に変わったのかと驚きました。J2SE5.0(Java 2 Platform Standard Edition Ver.5.0)その他の登場で、Javaの勢いはますます強くなり、ソフトウエアの共通語がCからJavaになるのでは?と懸念しています。まあ、オブジェクト指向を必修科目にするのなら良いのかも知れません。Microsoftも、負けじと、Visual Studio 2005を発表しました。もう、ドットネットは付かなくなりました。.NET Frameworkが定着したとの考えでしょうか。単体販売では、「ホビイスト、先進ユーザー、学生」用とうたって、Visial C++ Express Editionがあります。多分、この駄文を読んで下さっている方は、ホビイスト(ソフト開発を飯の種にしない人)か学生の方でしょう。先進ユーザーではないと思いますが・・・。
 PDCAとかカイゼンとかの言葉も聞かれました。これらは、20〜30年前に、ハードでは盛んに聞かれた品質管理用語です。ソフトでもようやくその段階になったのかと、ハード出身のソフト愛好家としては、気強く思っています。

カウンタを付けて1年が経ちました(2004.7.28.)
 昨年7月23日に、恐る恐るカウンタを付けてから、1年が経ちました。1年間で、カウンタは、132,000に達しました。月平均すると、11,000アクセスです。夏休みや春休みのシーズンに減少するところから、多くの訪問者は学生ではないかと思っています。平均して、土日が190アクセス、その他が430アクセスですから、大部分は、学校や職場などから見に来てくれているのでしょう。
 アクセス数の維持は、困難な仕事の一つです。新しいコンテンツを絶えず追加して行かなくてはなりません。ところが、代表的な易しい数値計算、画像処理のアルゴリズムは、ほどんど取り上げてしまっています。学生が卒業して行き、また新しい学生が、卒業論文や修士論文作成にとりかかる、と言ったサイクルのお陰で、辛うじてアクセス数が維持できているのかもしれません。ご愛顧、テーマのご提案を宜しくお願いします。

Javaも始めてみようか(2)(2004.2.20.)
 Sun Microsystems主催の「Java Technology Conference 2004」を覗いてきました。けたたましい音楽と共に、「Java Technology is for Everyone」とか、「Java is Everywhere」の文字が躍っていました。NTTドコモや携帯電話機器メーカがJavaを礼賛していました。「J2ME(Trade Mark)」(Java2 Mobile Edition)に力を入れた話で、家電機器のリモコンの実演もありました。これって、まさに「ユビキタス」なんですよね。展示会場では、LindowsのOS環境で動作するJavaによるウインドウが表示されており、Windowsに似た使い勝手でした。Microsoftに一切お世話にならないでパソコンが使えるとも言っていました。
 Javaが使いにくいのは、C/C++言語で便利なprintf系が使えないことですが、今年の秋に公開される「J2SE1.5 "Tiger"」では out.printf( …… ) が使えるようになる、とのことがあらためて紹介されました。 もうすこし待てば、Javaが一層使いやすくなります。「Everyone」や「Everywhere」に弱い一般プログラマにとって、Javaは目が離せなくなってきました。

Javaも始めてみようか(1)(2004.2.8.)
 最近、「Visual C++の勉強部屋」への訪問者が減っています。12月と1月は約12,800PageViews/月でした。年末年始で、休日が多かったこと、卒業論文や修士論文の作成が一段落したことも関係があるのでしょう。本屋でも、昔は「Visual C++コーナー」があった位だったのに、今は、Visual C++の本はほとんど見かけません。電器量販店のソフト売り場でも、昔は「Visual C++ 6.0」が、高く平積みしてあったのに、今は、「Visual C++.NET」が一個でも置いてあれば良い方です。Microsoft社の講演会を聴いたり展示を見たりしても、初心者や一般プログラマは相手にしていない気がします。
 Microsoft社のVisual C++は、Microsoft社のWindowsの環境では抜群の性能を発揮しますが、一般的には大袈裟です。大型高級乗用車の感じで、Windowsと言う専用高速道路上では、快適なドライブを楽しめますが、高度の運転技能が必要で(やっぱりVisual C++は難しい)、燃費は食うし(メモリが大量に要る)、お値段が高いのです。
 一方、Sun Microsystemsは、Java2の普及に積極的で、Java2SDK(Software Development Kits)を無償で頒布しています。Javaの実行はインタープリター形式なので、時間がかかる欠点がありますが、最近の高速CPUの使い道としては、良いのではないでしょうか。TVをDVDに録画したり編集したり、3Dゲームをやったりするために高性能のパソコンを買うのは、パソコンメーカの戦略に乗せられています。

営業まで覚えた、「メモリーの調整中」(2004.1.18.)
 「コンピュータには、メモリーが要るらしい。演算回路の次はメモリーだ。」というわけで、次に入社した私がメモリー担当になりました。ある大学の先生が会社へ来られ、「石立さんは元気ですね。○○の○○さんは、顔色悪かったですよ。」と、その位苦労をしないとメモリーができないのか、と私の方がびっくりしました。「交流二周波法」という、東大後藤氏の発明した、パラメトロン用の大変エレガントな方式を採用していました。新しい独特の特性(2次高調波が出やすい)を持ったフェライトコア(フェライト製のリング)が必要になり、フェライトメーカとの共同開発を行いました。始めは、なかなか良品が得られず、焼き上がるのを待ってテストに掛け、僅かの良品コアを持ち帰ることを繰り返しました。このメモリ方式は位相に大変敏感な欠点があり、位相調節やその経時変化に苦労しました。
 一年後に、太刀川勝助氏が新入社員としてメモリーに配属され、合計2名になりました。この太刀川勝助氏は、私が位相調節などでオタオタしているのを横目で見て、「待っていれば良くなりますよ」と、落ち着いたものでした。装置の温度が安定すれば、当初の設定通りで動作することを知っていたのです。彼は外科手術の達人でもありました。不良コアを発見すると、メモリーアレイの網目状の配線を切断し、不良コアを取り出し、良品と取り替えて、再び配線をつなぎ、ハンダの跡が目立たないように、上から色を塗るのでした。
 営業の人が、良くお客さんを連れてきました。コンピュータが動いていないと、「ただいま、メモリーの調整中で、動いていませんが・・・・。」と、営業の人まで、覚えてしまいました。何回かに一回は、メモリーが原因でない時もあったのですが・・・・。

交流二周波法メモリーの最初の実験装置、上から、
1)操作用のトグルスイッチ
2)制御用のパラメトロン演算回路
3)上記パラメトロン信号を変換して、2MHzの「非定常励振」
  高周波電力を発生する真空管回路、
4)上記電力によって1MHzで発振する「パワーパラメトロン」
5)アドレス線に選択的に500KHzを流す真空管回路
6)結果の表示回路、その他

下部の見えないところに肝心のメモリーアレイがあり、撚り線
により接続されている。
右は、三相に変調された2MHz高周波電源である。
   
NEAC1101のメモリー部分の扉をはずして、内部を示した
ところ。
上は、本体制御部から受け取ったアドレス信号をデコード
し、選択的にメモリーアレイに高周波電力を供給する真空
管回路ユニット。
下は、メモリーアレイを収納する部分で、まだ、最終計画の
1/4しかメモリーアレイが実装されていない当時のもの。
このメモリーアレイの不良になったフェライトコアを交換する
のが大変な仕事だった。

最初のコンピュータ実験装置の性能は1μMIPSだった(2004.1.17.)
 長森享三博士のもと、俊才で職人肌の面も持ち合わせた中堅の吉沢聖一氏と、新入社員の秋野守利氏で、ディジタルコンピュータの開発が始まりました。最初は、演算回路からと言うことで、2進5桁の四則演算ができるパラメトロン実験装置が作られました。5ビットの入力のための5個のトグルスイッチ(下図で左から5個)、加減乗除の命令を指示するための4個のトグルスイッチ、その他にシフトやクリヤなどのスイッチもありました。出力は10ビットで、パラメトロン出力を整流増幅する真空管、表示用のネオン管が、それぞれ11個ついていました。
 この実験装置には、外国人を含めて外部からの見学者が多く訪れました。ある外国人が感心して、これは1サイクルコンピュータ(現在は、サイクルの単位は使わないので、1ヘルツコンピュータか?)だと褒めてくれました。つまり、これを操作実演して見せた秋野守利氏の手が猛烈な速さで動いたのです。5個のスイッチで入力データをセットし、命令スイッチを操作するのに1秒とかからなかったのですから、まさに、1命令/秒のスピードでした。今風に言えば、1μMIPSでしょうか。

パラメトロン計算機の最初の実験装置、上から、
1)操作用のトグルスイッチ
2)パラメトロン演算回路(大部分を占めている)
3)内容を表示するネオンランプ
4)パラメトロン信号を判定してランプ表示する真空管回路
5)三相に変調された2MHz高周波電源の入力部

高周波電源は右にあり見えない。

日の丸コンピュータ素子、パラメトロンの原理はブランコと同じ(2004.1.14.)
 LC共振回路は、受動回路(Passive Circuit)であって、それ自身で自動的に発振を起こすことはありません。しかし、共振周波数の二倍の周波数でLの値(回路のパラメータ、これがパラメトロンの語源)を変化させてやると、LC共振回路が振動を始めるのです。子供が遊ぶブランコを考えてみます。自然な状態でブランコが揺れる周波数は、ブランコの紐の長さと重力によって決まります。ところが紐の長さを周期的に変えてやると、ブランコは大きく振れ出します。子供がブランコの上で立ったり座ったりしてブランコを漕ぐのは、重心を上下して、実質的に紐の長さを変えているのです。 子供が立ち上がって座って、また立ち上がって座って、子供が2サイクルの動作をした時、はじめてブランコは1サイクルの振動をします。
 パラメトロン(Parametron)のLを2MHzで変化(当時は励振と言っていた)させると、パラメトロンは1MHzで発振します。励振周波数に対して位相が正反対の2種類の発振波形が同じ確率で発生しますので、それが論理の1と0に対応させられました。
 パラメトロンに関する特許は、各所で多数出願されました。パラメトロンは一種の商品名でしたので、NECでは、「周波数変換開閉素子」として出願しました。これは、嶋津保次郎博士の命名によるとされています。

日の丸コンピュータ素子は、大学、通信サービス機関、通信機メーカの協力で実用化された(2004.1.13.)
 東京大学と国際電信電話株式会社(現在のKDDI)、日本電信電話公社(現在のNTT)が共同で研究を開始したパラメトロン(Parametron)は、わが国独自のアイデアによる日の丸コンピュータ素子でした。当然、わが国の代表的な通信機メーカもこの研究に参加し、研究会が開かれました。わが国独自の素子によるディジタルコンピュータは、このような環境から生まれました。 NECの最大の顧客であった電電公社、電電公社から分離独立した国際電電、とは緊密な関係があり、技術指導も受けました。長森享三博士は東京大学のご出身ですが、一時期、東北大学に居られたこともあり、東大、東北大に人脈をお持ちでした。NEC最初のコンピュータは、長森享三博士グループによるパラメトロン計算機NEAC-1101でしたが、製品としての第一号は、東北大学とNEC事業部とで共同開発し、東北大学に納入された、パラメトロン計算機NEAC-1102(SENAC、SENdai Automatic Computer)でした。
 パラメトロン(Parametron)は、東京大学理学部の高橋秀俊教授の下で後藤英一氏により発明されたもので、フェライトコア2個を使ったコイル(インダクタ)と共振用コンデンサから成る、構造が非常に簡単で信頼性の高い論理素子でした。東大のTAC、富士写真フィルムのFUJICなど、真空管を用いたコンピュータも開発中でしたが、固体素子を使ったコンピュータへの願望も強く、一方で、トランジスタの信頼性が極めて低く、困っていた矢先の発明だったので、わが国の多くのメーカがパラメトロンに飛びついたのでした。

アナログコンピュータに、ディジタル技術が使われていた(2004.1.12.)
 開発当初のアナコンは、繰り返し型と呼ばれるものでした。積分のためのCR積が十分大きく取れず(コンデンサのリークが無視できない、増幅器の入力インピーダンスが十分大きく取れないなどの理由により)、長期間の積分を行うと精度が落ちるためでした。そのため、計算結果は、比較的周波数の高い繰り返し波形として、ブラウン管上で見ていました。必要に応じて、波形をカメラで撮影して保存しました。
 しかし、ブラウン管の偏向精度は低く、蛍光スポットの太さは大きく、アナコンの出力装置としての精度が不十分でした。そこで、高周波の繰り返し波形を超低周波に変換し、ブラウン管の他に、ペン書きレコーダ(通称ペンレコ)にも記録することにしました。使われたのは、現在の超高速オッシロスコープに使われている原理と同じで、サンプリング法です。サンプリングには、元になる高周波の繰り返し周波数を精度良くカウントダウンする必要があります。このため、デカトロン(Decatron、10進計数放電管)が使われました。これは、まさにディジタル技術です。

50年も前から、ブラウン管は入力装置を兼ねていた(2004.1.10.)
 ブラウン管や液晶パネルが、ライトペンやマウスの助けを借りて、入力装置として使われているのは、現在の常識です。しかし、50年も前に、アナログコンピュータ(以下、アナコンと略す)で、ブラウン管が入力装置として使われていたのは驚きです。
 アナコンは、外部入力に対する反応(レスポンス)を計算するのに良く用いられます。たとえば、車のショックアブソーバーを設計するのに、車輪が受けるショック波形と車体の動きの関係を、微分方程式を解いて求めます。このような場合には、ショック波形などをアナコンに入力する必要があります。ブラウン管を入力装置として使う原理は、次の通りです。ブラウン管の表面に、入力したい波形の通りに縁を切った不透明の紙を貼り付けます。ブラウン管の周囲を遮光し、ブラウン管の蛍光スポットを光電管で取り出します。サーボを働かせる(スポットが見えると、隠れるように、見えないと出てくるように偏向電圧を制御する)と、ブラウン管上のスポットは、不透明の紙の縁に沿って移動します。この時の偏向電圧波形をアナコンへの入力とするのです。
 長森享三博士が率いたアナコン研究グループは、入社後1、2年の数人でしたが、いずれも精鋭揃いで、これらの実用化に成功しました。

NEACは、最初はアナログコンピュータの名前であった(2004.1.9.)
 わが国のコンピュータの草分け的存在である、長森享三博士のご葬儀で、弔辞を奉読する光栄に浴しましたので、長森享三博士を偲んで、数回にわたり、昔話をしたいと思います。私が学生であった頃、「コンピュータにはアナログコンピュータと、ディジタルコンピュータがある。アナログコンピュータは微分解析などの科学技術計算に用い、ディジタルコンピュータは主として事務計算に用いる。」程度でコンピュータの項を終わっていました。
 長森さんも、最初はアナログコンピュータから出発されました。長森さんは、当時の最先端技術であった「帰還増幅理論」を特に勉強された方でしたから、負帰還増幅器の集まりであるアナログコンピュータの研究開発には、最適な方でした。
 当時、米国でREAC(Reeves Electronic Analog Computer)が商品化されていましたので、それに倣ってNEAC(Nippon Electric Analog Computer)と名付けました。のちに、これはNippon Electric Automatic Computerの意味であると解釈され、ディジタルコンピュータの商品名として使われました。

サンデー・プログラマーの勧め(2003.12.27.)
 サンデー・ドライバーまたは土日ドライバーと言うのがあります。ウイークデーの通勤には車を使わず、休日だけ、主として遊びのために車を転がす人のことです。毎日乗っていないので、やや危ない人も居ます。一方、普段は仕事でダンプカーを運転し、休日は軽自動車で遊びに行くベテランの人も居るかも知れません。
 「Visual C++の勉強部屋」は、サンデー・プログラマー向きです。サンデー・プログラマーとは、ウイークデーには会社で全く別の仕事をしていて、土日に個人的な趣味でプログラムを楽しむ人です。会社で大型汎用機のプログラムを書いて、休日にはパソコンを趣味で使う人も居るかもしれません。学生の場合は、毎日がサンデー・プログラマーの様なものです。サンデー・プログラマーにとっては、UML(Unified Modeling Language)やOOP(Object Oriented Programming)は重要でありません。能率向上や共同作業は必要ないのですから。
 ペーパー・ドライバーと言うのもあります。これは、運転免許を持っていても、車を持たず、運転をしない人のことです。「情報処理技術者試験」の合格者で、プログラムをやらない(できない?)人は、ペーパー・プログラマーと言うのでしょうか。この方たちには、特に、サンデー・プログラマーになることを勧めます。

言語を勉強しただけでは仕事ができない(2003.11.24.)
 1995年に中国へ行ったときの話です。一寸時間ができたので、北京郊外へ観光に出かけました。ホテルに頼むと、二人(運転手と観光ガイド)の中国人が来てくれ、ガイドは英語で案内をしてくれました。ガイドは一流大学の英語科を卒業しているそうですが、「英語だけしかできないので定職がなく、このように臨時のアルバイトをしている。」と言っていました。観光案内ができる知識があれば立派なものと思うのですが、彼の理想は、もっと高かったのでしょう。
 私が電気関係の学科に居たためか、求人に来る会社の人は、巧いことを言います。「ソフトだけできてもダメです。やっぱり、電気の知識があって、しかもソフトができる学生が欲しいのです。」と。確かに、電気メーカの場合は、組み込みマイコン(Embedded Microcomputer)のソフト開発も多く、電気の知識が役に立ちます。
 私は、「学部学科不問」と書いてある求人先には、学生を推薦しませんでした。そのような会社では、経済や法律の学生を多数採用し、理系出身者はあまり優遇されないかも知れないと思ったからです。経済ではかなり高度の数学を使用しますし、法律では、「AとBまたはCの条件を満足し、ただしDを除く」などの複雑な論理にも慣れているでしょうから、入社後、社内でプログラムの特訓をやれば、即戦力になるかもしれません。

メモリからの読み取りは、一旦情報を壊す(2003.11.16.)
 1950年代後半から1970年代前半の間、永らくメインメモリの主流であったコアメモリ(Core Memory、外径2mm〜0.5mmのフェライトリングの磁化方向で記憶する磁心記憶装置)は、破壊読み取り(Destructive Read-Out)方式と呼ばれていました。すなわち、情報を読み取るのに磁化状態が反転して出力が出るかどうかを調べるので、一旦記憶が破壊され、直後に再書き込みする必要があったのです。私は、このメモリの開発の担当でした。米国製のコアでは巧く動作しましたが、開発当初の国産フェライトコアでは苦労しました。
 これを、非破壊読取り(Non-Destructive Read-Out)方式に変える研究が各所で行われましたが、商用機への実用には至りませんでした。理由は、磁化を反転させて情報を破壊しないように、小電流でそっと読み取ったために出力信号が小さく、SN比が悪かったこと、書き込みと読み取りで制御を変える複雑さがあったことなどです。
 「情報を一旦壊すことを怖れてはいけない。すぐ元に戻せば良い。」、「SN比が悪いと信頼性が落ちる、大容量化ができない。」が、高速大容量メモリの考え方です。この考え方は、現在のDRAMにも生きています。DRAMも、読み取ることによって、一旦コンデンサが放電しますが、すぐに再書き込みを行っています。 SRAMは破壊読取りメモリではなく非破壊ですが、1ビットを記憶するセルが複雑で、低密度、高価格のため、メインメモリとしては一般的でありません。

「1」と「0」がすり減ったプリンタ(2003.11.8.)
 昔、私が開発に携わっていたコンピュータは、電源投入後、まずメモリーをチェックしていました。メモリーチェックは、メモリーに一定のパターンを書き込んだ後に全内容を出力する、いわゆるメモリーダンプですが、出力先は、現在のようにモニターではなく、プリンタでした。当時は、16進は一般的でなく、「1」「0」のまま出力していました。そのため、メモリーのご機嫌が悪いときは、メモリーを調整しながら、プリンタへの打ち出しを続けました。そのため、プリンタの活字の「1」と「0」が擦り減ってしまったのでした。通常の計算結果をプリントアウトした時、「1」と「0」だけがぼやけて、読みにくかったのを覚えています。
 1957年に出版された、D.D.McCracken著の「Digital Computer Programming」と言う古い本(当時、給料の4分の1をはたいて買ったもの)を、念のために引っ張り出してきました。そこには、「16や32の基数が、少なくとも一箇所のコンピュータで使われている。しかし、表示するのに6個や22個の余分な新しいシンボルが必要なので、利益よりも欠点の方が多い。入出力装置の性能が良くなれば別だが・・・。」 と書かれていました。その同じ本には、10進数、2進数、8進数の計算の仕方は述べられていましたが、16進数は、前記の記載に留まっていました。

ブートの本来の意味は(2003.10.24.訂正2004.2.12.)
 OSを再インストールすることを「リブートする」などと言います。初めてインストールするのは「ブート」です。「マルチ・ブート方式」などと言うのもありますから、「ブート」は「立ち上げる」程度の意味にも使われます。でも、この「ブート」の本来の意味を知らない人が多いのです。ブートは、「ブートストラップ(bootstrap、長靴を持ち上げる、または引き出すための紐)」の略です。文献等によれば、「pull oneself up by one's bootstraps」は、「to help oneself without the aid of the others」、すなわち、「他人の手を借りずに自分でする」と言う意味、とあります。
 昔、ROMが無かった頃、コンピュータには、イニシアル・ローダー(initial loader、初期読み込みプログラム)がハード・ワイヤードで組み込まれていました。ハードですから、プログラムとしては非常に短いものです。これを用いて、1ワード分だけプログラムを紙テープ装置等から読み込んだのです。最初に読み込んだ1ワード分のプログラムは、更に次の読み込みを指示しました。1ワード読み込むと、次の1ワードを取りに行って、更に次の1ワードを読み込む、と言う調子で少しずつプログラムを読み込み、最後には長いプログラムになって、コンピュータが立ち上がったのです。最初の1ワード分のプログラムが、「ブートストラップ」(靴の引き紐)に相当し、それが元になってプログラム全体(「ブート」)が読み込まれたのでした。

(この項は、渡辺勝寿氏のご指摘により訂正をしました。最初、私は「ブートストラップ」を、単に「靴紐」と解釈し、その結果、最初は編み上げ式の靴紐を連想し、プログラムを少しずつ(靴紐を編み上げるようにして)読み込むことを意味すると、説明しました。しかし、「ブートストラップ」は、携帯電話やカメラについている「ストラップ」と同様に、ぶら下げたり、引き出すために靴についているものであるとのご指摘があり、編み上げ靴紐のように「行ったり来たり」の意味がないことが分かりました。関連Webサイトのご紹介もありましたが、詳細は省略します。渡辺氏に感謝します。)

システム・エンジニアとプログラマ(2003.10.22.)
 大学へ求人にくる会社の人は、「システム・エンジニア」の募集と言い、「プログラマ」の募集とは言いません。でも、「最初はプログラマから始めないとダメでしょう」と私が言うと、「その通りです」との答えが返ってきます。さきに述べたハードとの対応に依れば、「プログラマ」は、回路の組み立てや調整を行う現場作業者のような役割です。「プログラマ35歳定年説」があるのも関係しているのでしょう。
 大学は、「プログラマ」(現場作業者?)の養成機関だとは思っていません。それどころか、特定の言語を教えるのは邪道で、アルゴリズムやデータ構造などの学問を教えるのだとの考え方があります。それならば、「システム・エンジニア」(設計技術者?)の教育をやっているかと言うと、これは学問的体系に乗りにくいらしく、積極的ではありません。
  回路の配線が、部品の自動挿入マシンや自動はんだ付け機、さらには大規模集積回路(LSI)に置き換えられたように、ソフトウエアにおいても、開発の自動化、省力化が急速に進むものと思われます。 その時の対策を考えておかないといけないですね。

プログラムの開発をハードウエアの開発に対応させると・・・(2003.10.21.)
 大学の卒業研究程度のハードウエアの研究の場合、1)ブロック図の作成、2)回路図の作成、3)CADによるシミュレーションの実行、4)回路の組み立て、5)回路の調整、6)条件を変えてのデータ採り、の順に行わせます。これらのスケジュールを立てさせ、学生の尻を引っぱたきます。「条件を変えてのデータ採り」を終わって、はじめて、論文が書けると思うのですが、 ときどき、「回路の組み立て」までがやっとの学生も居ます。
 これを、プログラムの開発に当てはめると、1)流れ図(フロー・ダイヤグラム)の作成、2)ユーザ関数や変数(C++ならクラスやオブジェクト)の割り当て、3)がなくて、4)コーディング、5)デバッグ、6)実用テスト、となるのでしょうか。学生のやり方を見ていると、いきなり「コーディング」から始める者が多く、困ります。「デバッグ」も何とかやるのですが(エラーがあるとビルドできない)、文法的なエラーが無いと言うだけで、とんでもないプログラムができたりします。重要なのは、「実用テスト」です。これが巧く行って、ようやくプログラム作りの醍醐味が味わえるのではないでしょうか。

コメントなしでも解るプログラムにコメントを付ける(2003.10.19.)
 プログラムは脚本のようなものです。最初に、登場人物の名前を並べます(変数や関数の宣言)。人物は、AさんやBさんではなく、フルネームで登場させましょう。名は体を表すと言いますが、その性質を表すような名前を付けると、観客に混乱を起こさせません。プログラム本体は、ストーリー性を持っていなければいけません。つまり、コメントなしでも筋書きが解るのが良いプログラムです。
 構造化プログラミングが提唱された時、「gotoを使わないように」と言われました。タクシーのドライバーに目的地を告げないで、「そこを右に曲がって」、「次の信号を左折して」などと突然に指示をすると、ドライバーは困ってしまいます。gotoは、それと同じです。初期のBASICでは、GOTOが安易に使われ、スパゲッティ・プログラムなどと呼ばれるものもありました。あらかじめ繰り返し回数が決まっているループは必ず forを使いましょう。そうでないものに forループを使ってはいけません。無限ループのfor( ; ; )やwhile(1)などを使って、breakで逃げ出す例を示す参考書を見かけますが、論外です。 コメントなしでも解るプログラムを書いてから、それに、多からず少なからずのコメントを付けるのが良いのです。

ROMとバイトマシン(2003.10.6.)
 ROMの機能は、当初は、Permanent Memory(永久記憶)と呼ばれていました。特に、書き換え可能なものは、Card-Changeable Semi-Permanent Memoryで、パンチカードのようなものを差し替えて、内容を変更していました。
 1959年に発売された中型電子計算機IBM1401は一世を風靡し、コンパチ機も他社から出ていました。これは、いわゆるキャラクタ・マシンで、6〜7ビットが単位でした。コンパチ機の出現に業を煮やしていたIBMは、1964年に、極秘の内に開発していたIBM360シリーズに切り替えます。これが、8ビットのバイト・マシンの最初です。 IBMは、従来のIBM1401に使われていたソフトをIBM360シリーズ上で動かすために、エミュレータを用いました。そのエミュレータプログラムを格納するのに、Permanent Memoryを用いたのです。
 1961年に、私はある種のPermanent Memoryを米国の学会で発表しました。その時、会場のワシントンからIBMの研究所まで、私は引っ張って行かれ、そこで講演をさせられたのです。その当時、IBMが、Permanent Memoryの開発に着手していたことは、私には知る由もありませんでした。私のPermanent Memoryは、IBMには採用されませんでしたが、米国のMeta4と言う計算機には採用されました。Meta4は、わが国でもデモが行われましたが、あまり売れなかったようです。

原理に渦電流(Eddy Current)を利用した
カード状のものを利用するので、Eddycard
と名付けた。左手にサンプルを持ち、原理を
説明している筆者。

ROMと銀行強盗(2003.10.3.)
 ROMはRead Only Memoryの略で、読み取り専用メモリと訳されます。しかし、現在、読み取りだけしかできないROMは少数派です。ほとんどは、書き込みもできます。ただし、容易に書き換えができないように、書き込みには特別の操作を必要とするものが多いのです。ROMの長所は、電源を切っても記憶を失わない不揮発性と高信頼です。一般には、書くことよりも読むことの方が多いので、一時期、Read Mostly Memoryと称したこともあります。
 マレーシア政府機関関係者に教育をしていた頃、ROMの講義をしました。そのとき、「ROMはRead Only Memoryであるが、Write Only Memoryと言うものもある。知らないか?」と受講者に聞きました。答えはありません。そこで、航空機のフライトレコーダや銀行などの監視ビデオの話をしました。これらは、書き込みをするが、何か事故や事件のとき以外は読み取られることが無い。幸せな時はWrite Only Memoryであると。 ところが、その翌日、クアラルンプールの中心街の日系T銀行に、ライフルを持った二人組強盗が入ったのです。前日にその話をしたばっかりだったので、受講者もびっくりしていました。

マレーシア政府機関に依頼されて講義をして
いるところ。長いときは5日間ほど続いた。

ROMはRAMです(2003.10.1.)
 私は電気科卒業ですから、会社ではハードウエア系の仕事をしていました。そこで、今後は、ハードウエアに関する話題も交えてゆきます(表題の色を変えます)。
 1956年に、IBMからRAMAC(Random-Access Method of Accounting and Control)と命名したコンピュータが発売されました。これには、外部大容量メモリーとして、容量4.4MBの磁気円盤(現在のハード・ディスクの第一号)が付いていました。磁気テープのシリアル・アクセスに対し、磁気円盤はランダム・アクセス(ランダムにアドレスを与えても、アクセスタイムが変わらない意、実際には、回転待ち時間があるので、全く同じではないが、磁気テープに比べると・・・)と呼びました。これが、ランダム・アクセスと言う言葉の始まりです。
 つまり、RAMとはRandom Access Memoryの意味であり、磁気テープのようなSerial Access Memoryと対照的な言葉です。ですから、現在、普通に使っているROM(Read Only Memory)はRAMです。RAMは、読み書きがランダムにできるメモリと言う意味ではありません。

巧妙なプログラムから判り易いプログラムへ(2003.9.30.)
 昔のパソコン(いや、その当時は、普通のコンピュータでもそうでした)は処理速度が遅く、クイック・ソートやFFT(高速フーリエ変換)など、巧妙な高速化技法にプログラマは熱中しました。そのため、原理の理解が困難で、プログラム作成は秀才がやるもの、凡人は解らなくても良いもの、とされていました。メモリ容量もごく限られていましたので、やはり、凡人には解りにくい曲芸が行われていました。昔は、巧妙なプログラムが良いプログラムだったのです。
 その後、ソフトウエアに対する需要が急増し、単純な予測では一億総プログラマー化が必要となり、ソフトウエア・クライシス(危機)が叫ばれ、「構造化プログラム」が推奨され、情報処理技術者試験も始まりました。一部の秀才によるソフトウエアの手作りから、凡人の人海戦術によるソフトウエアの量産に変わったのです。処理速度やメモリー容量も向上し、巧妙なテクニックは不要になりました。ソフトウエアの量産は、既存ソフトの再利用と分担作業によって行われるので、誰が見ても判り易いプログラムが良いプログラムになりました。

百聞は一見にしかず、百見は一実行にしかず(2003.9.28.)
 これは、私の実話です。Visual C++を勉強したい気になりました。「Visual C++何とか」と書いてある一冊の本を、良さそうだと思って買いました。読んで行くと、始めは易しいのですが、10ページ位ですぐ難しくなって放棄しました。別の本を買いました。今度は、前の本を読んでいたので、20ページ位まで行きました。また、ギブアップです。こうして、参考書ばかり数冊貯まりました(いずれも、最初の20ページ位までしか読んでない)。あるとき、本に書いてある極めて易しいことを、バカバカしいと思いながらも、そのままパソコンに入力してやってみました。そうすると、参考書が急に読み易くなり、今まで挫折していた本も、どんどん読めるようになったのです。
 参考書は、やってみたらすぐ判ることは書いてないことがあります。しかも、それが判らないと先に進めないのです。参考書は、何冊も買う必要はありません。要は、実際にやってみることです。頭で理解して、判ったと思うことでも、念のために実行してみてください。参考書は、途中を飛ばしてはダメです。バカバカしいことをやって下さい。

プログラム言語の勉強は、外国語の学習法を参考に(2003.9.27.)
 どこかの外国語を勉強しようとする時、どうしますか?「辞書」、「文法書」、「易しい読み物」、「会話のテープ(CD)」などから、何を一番に選びますか?「易しい読み物」を手にとり、知らない単語があれば、「辞書」も欲しいと思うでしょう。今すぐ外国に行く人は、「会話のテープ」で丸暗記をするかもしれません。すくなくとも、最初から「文法書」を読む人は居ません。日本人は、英文和訳はできるが、和文英訳は下手だと言われますが、実は、英文和訳も下手なのです。英文をパターンとして覚えてなく、辞書に頼ったり文法に頼っていたりして居るからです。語学の勉強は、理屈(文法)抜きで、使用例(パターン)を沢山覚えることです。
 プログラム言語も言語の一つですから、理屈にこだわらず、他人の書いたプログラムを良く読むことです。文法は、ひとりでにわかってきます。その段階で、頭を整理するために、「文法書」を読むのも良いでしょう。「他人の書いたプログラム」(特に名作)は、意外に手に入りません。ソース・コードに関心を持つ人が少なく、実行ファイルのみをダウンロードして使っているからでしょう。市販のプログラム言語の参考書は、ほとんどが「文法書」です。その方が、良く売れるからでしょうか?それとも「文法学者」が書くからでしょうか?

パソコンを覚えたい、C言語を勉強したいはダメ(2003.9.26.)
 パソコンを覚えたいからパソコンを買った、と言う人は、大抵、モノになりません。「パソコンは大体分かった。つまらないね。」と言ってパソコンに埃を被せてしまいます。「パソコンを覚える」(この曖昧な言葉!!)ことが目標だったので、本人は目的を達成したつもりで居ます。それに比べると、何か趣味を持っていて、そのためにパソコンを使おうとする人は、それが実現できるまで頑張り、パソコンの達人になれます。つまり、目標が具体的であり、それを達成するとパソコンとは別の世界で満足が得られることが必要なのです。
 C言語(C++でもVisual C++でも良い) を勉強したい、それだけが目標の人の結末も大体同じでしょう。「情報処理技術者試験」に受かることだけが目標の人は、パソコンに向かう必要はありません。過去の問題集をやり、受験参考書を読めば良いのです。出題されるパターンは大体決まっています。C言語(その他の言語でも良い)を本当に勉強したければ、C言語を道具にして「何か別のこと」を狙うことが必要です。「Visual C++の勉強部屋」が、その「何か別のこと」のヒントになれば幸いです。

誰が見に来てくれているのかな(2003.9.25.)
 最近、恐る恐るアクセスカウンタを付けました。と言うのも、もしアクセス数が少ないとがっかりすると思ったからです。しかし、この「Visual C++の勉強部屋」へのリンク元も、判明しているだけで30サイトを超えて来ましたので、付けてみました。現在のところ、1万件/月と、思ったより多くの人が訪れてくれています。
 毎日、期待を込めてアクセス数を見ていますが、ウイークデイが400〜500アクセス、土日・祝日が200アクセス前後です。ということは、学校または職場で見ている人が多いのではないかと想像しています。つまり、学校または職場のパソコンに「Visual C++ 6.0」か何かがインストールされていて、それでプログラムを作成中に、時々見てくれるのではないか?と考えています。 さらに想像すると、多くは、卒業研究の学生ではないかと思っています。
 こんなつまらない文章を、今後も書き続けて行きますので、時々見に来てください(アクセス数アップのために)。



「Visual C++の勉強部屋」に戻る
「石立 喬のホームページ」に戻る