<< 前へ | Home

PR: 住宅ローンについて考えている人のための情報サイト    人間ドックで健康生活    ヘアケアで髪も美しく    みんなのリサイクル意識    引越しのタイミング    今だから始める!ECショップ開業    結婚式は神前式で    本気の婚活!!   

横浜の赤レンガ倉庫

横浜の赤レンガ倉庫。

今回は水準器を持っていったので、水平、垂直はそれなりに出ているはずなんだけど、正対しているかどうかは分からないので、真正面だと難易度高い。相変らずTS-E17の夜景描写はゾクゾクする。

C++によるプログラミングの原則と実践

「C++によるプログラミングの原則と実践」をいただきました。

題名からすると、C++を覚えたての初心者プログラマが、どうやってプログラムを構築していけば良いかを学べる本だと思われる。なのだが、自分の出した結論からといえば、この本はそういう本では無いように思う。だいたい初心者向けの入門書が、いきなり1200ページ超えの物量で心を折りに来るとかどうかしている。この本は多分「ストラウストラップ先生のファンのための随筆」なのだと思う。なので想定読者は、昔C++やったことがあり、アルゴリズムやデータ構造については一通り知っていて、それを最新のC++ wayではどう実装するものなのかを、大きな心でストラウストラップ節を楽しみつつ眺めることができる人ということになる。

「ストラウストラップ節」とは何かと言えば、

  • ハイキングに行くというので、先生に着いてきた。先生は「大丈夫、そこ石があるから気をつけて」と細かに気を使ってくれるので、安心していたら、「じゃ、この崖から飛び込んで、向こうの島まで泳いでいくよ」とか言われて涙目になるような感じ。「大丈夫10kmくらいだし。こんなの朝飯前だよ」って朝ごはんはさっき食べたばかりじゃないですか!
  • 。あるいは、こんな感じ。ハイキングに行くというので、先生に着いてきた。先生は「大丈夫、そこ石があるから気をつけて」と細かに気を使ってくれるので、安心していたら、「ちょっとこっちの道へ行ってみようか」とケモノ道へ。いや先生、目的地はこっち。そちらは近道でも何でもないし。みたいな。

さて、2.2ではHello Worldで始まる。

#include "std_lib_facilities.h"  int main() {     cout >> "Hello, World\n";     return 0; } 

Hello Wolrdから面妖なincludeを用意するとか、さすがは先生と思いきや、これは標準のヘッダだそうだ。というか自分の大昔の知識では、標準のincludeは、><で囲むものだと思っていたが最近は違うのだろうか。

2.3では、プログラムというのはちょっとした間違いで動かなくなるものですよと、懇切丁寧に解説されている。

#include "std_facilities.h" 

つづりが違いますね。

cout << "Hello, World!\n"; 

引用符を閉じ忘れていますね。

integer main() 

integerじゃなくてintですよ。

cout < "Hello, World\n"; 

<が1つ足りませんね。

cout << 'Hello, World!\n'; 

二重引用符でないとダメですよ。

cout << "Hello, World!\n" 

セミコロンが抜けてますよ。という具合で2ページに渡って解説されている。まぁ後半2つはスクリプト言語系をやっていると犯しがちな間違いっぽい。いずれにせよ、なんというか、このあたりは至れり尽くせりな感じがあるが安心してはいけない。次の2.4に入ると、コンパイルの話ではなく、いきなりリンカの話になる。初心者が読んでいたら涙目になることうけあいだが、これを「しょうがないなぁ先生は」と楽しめなければこの本は読み進められないだろう。

keep_window_open()という関数が出てくる。Windowsの場合、スクリプトが終わった時にウィンドウが閉じてしまって見えなくなるので、それを防ぐためのものだそうだ。何と標準関数である。そんな関数が標準で用意されているのはC++くらいのものだろう。

6章は簡単な電卓を作ることにより、2 + 3といった式を構文解析する方法を学ぶ。例によって初心者になったつもりで安直に実装し、それがどうしてうまく動作しないのか丁寧に解説してくれる。もちろんここからが先生の本領発揮である。6.4.1は、「ちょっと回り道しようか」と始まり、なぜか英語の文法の解説が始まる。気が付くと先生の背中は見えない。

おそらくヘッダと実装とを別のソースコードに書くという言語はC/C++以外ではまれだと思うが、6.8.1の最後で言語作者自身は、これが「良いことだ」と考えていることとその理由が書かれている。正直、内容には全く同意はできなかったのだが、こういう考えなのだなと分かった点は収穫だった。

13章は、GUIの話。確かにオブジェクト指向とは相性が良いのでうってつけだろう。プラットフォームに依存しないようにということで、FLTKというツールキットが用いられている。Rectangleクラス。

Rectangle::Rectanlge(Point xy, int ww, int hh)   : w{ww}, h{hh} { .. } 

あれ? w{ww}なんて書き方だっけ? 自分の記憶では、w(ww)だったように思うんだけど、今の仕様ではこう書いても良いのかな。

Shapeという基底クラスを作り、そこから具象クラスを作っていく。Lineを作り、Linesを作り、Open_polylineを作り、Closed_polylineを作り、Polygonを作り、Textを作り、ってちょっとちょっと先生、GUIアプリのアーキテクチャを解説するのが目的なんだから、もう具象クラスはそのくらいでいいのでは... 結局その後も、Circle、Ellipse、Marked_polyline、Marks、Mark、Imageと続く。

図形の描画。Shapeにはdraw()メソッドがあり、そこがGUIのツールキットから呼び出されて描画を行う。というお決まりパターンである。draw()メソッドでは、現在の色とかスタイルの保存と復元を行い、実際の描画処理はdraw_lines()で行う。つまり具象クラスでは、このdraw_lines()をオーバーライドする。でもlineだけじゃないよね。TextもImageもdraw_lineで描画する。なんかしっくりこないなぁ。

それで、GUIの話ではモデルが変更された際に、どうやってそれをGUIライブラリに伝えるのか。先生の手法を見てみたかったのだが、そこには触れず終いで消化不良だった。残念。

14.2.4コピーと可変性。vectorに、Circleをつっこむとスライスされてクラッシュしちゃうから、コピーコンストラクタとコピー代入演算子をdeleteしなきゃだめだよと。そういえばそういうものだっけ。このあたりもC++の辛いところかも。

18.3.4ムーブ演算。mutableなオブジェクトのaliasingの問題に対する解決。rustにも所有権の移転とかborrowとかあるけど、immutableに逃げるだけではなく、こういう方向性もありなのかもしれない。まだ、この手法の限界が見えていないので、判断は保留。rustである程度の規模のアプリケーションを書いてみたい。

19.5.4 unique_ptr。スマートポインタって、こんな名前だっけ? 違う名前だったような気がするんだけど思い出せない。smart_ptrとかじゃなかったっけ。

22章で、言語の理想と歴史となり、いよいよエピローグかと思いきや、次の章はテキストの操作である。編集者の人、突っ込んであげてよ。お願いだから。

23章はテキスト操作なのだけど、C++でも正規表現ライブライは標準になったのだなと感慨にふける。

25章は組み込みシステムプログラミング。ヒープとか使うと領域が無駄になるよねとか、そういう話。でもなぜか途中からコーディング規約の話になる。この謎さ加減が真骨頂。

28章は日本語対応の話。標準ライブラリの多くは、まだUnicode対応できていないらしい。この章の内容は色々と参考になった。多分訳者の人が追加してくれたのかな。

というわけで、プログラミング言語C++第3版の分量を見て涙目になりながらも、頑張って読んだらハイになって気持ち良くなってしまった人、C++で書いたらメモリーリークのバグで苦しめられ、お客さんから「1週間以内に同じようなメモリーリークのバグを全て洗い出してくだいさい」と言われて、GCの無い言語がトラウマになった人に、強力にお勧めいたしますです。

続きを読む...

CDのプレスに挑戦してみた。

ものは試しに、CDのプレスに挑戦してみた。昔聞いた話の感覚では、1000枚で20万とかそんな感じで、今は半額くらいにはなっているのかなと調べたら、安いところだと2-3万くらいで出来るようだ。今回は、Press Stationというところに頼んでみた。

費用は盤面の印刷も入れて2万強。データはCD-Rにそのまま焼いたものをそのまま(Disk at onceで焼く)。演奏時間もサイトに厳密な時間が書かれているので、それを超えないように注意して作る(曲間のギャップも勘定に入れないといけない)。盤面はAdobeのIllustratorなので、仕方なくCloud版を1か月だけ契約して作成した。印刷の色空間はCMYKというもので、最後のKが黒成分なの普通に考えると、Kだけ100%で、あとは0になりそうなものだが、リッチブラックといって、ある程度CMYを混ぜるとより「濃く」なるのだそうだ。ただ間違えるとにじんだりするようで、難易度高そうなので今回は、Kだけで黒にした。

納期はサイトには最短6日とあって、最長が書いてない。まぁ別に急ぐわけでもないからと気にしなかったが、今回は3週間くらいかかった感じ。二次元バーコードも入れてみたのだが、手元のスマホでは認識できず。なぜだろう。印刷盤面を画面で確認した時はスキャンできたのだが。

というわけで1000枚もあるので、欲しい方はもらってください。

ショパン「猫のワルツ」

日本だと、たまに「猫のワルツ」という通称で呼ばれる曲。確かに中間部は、猫が鍵盤の上を歩いているかのようで、命名した人は天才だと思う。

ショパンワルツ Op. 18, Vivo in E​-​Flat Major

なんかSoundCloudが、何でもかんでも他の人の演奏と間違えて著作権違反と出るので(どうも機械判定の著作権判定システム入れたっぽいけど誤検出だらけっぽい)、BandCampに乗り替え。

ショパン練習曲作品25第5曲

英語だと'Wrong note'という副題が付いている。微妙な不協和音をどう調理するか。中間部の右手がすごく難しい...

ショパン練習曲作品10第4曲

ショパン練習曲作品10第4曲

このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8