折りたたみを展開する

おぼえ書き、まとめ、発表など

C++の教科書について

もう一度紹介

以前のエントリーでも紹介したが、C++についての本を読んでいる。

be-dazzled.hatenablog.com

基礎からしっかり学ぶC++の教科書 C++14対応 (マイクロソフト関連書)

基礎からしっかり学ぶC++の教科書 C++14対応 (マイクロソフト関連書)

すごく良い

内容をレビューできるほどの身分ではないが、とてもいい本だと思う。厚い本から得られるものより、薄い本から得られるものの方が多いということは頻繁におこる。コンパクトに収められている分、通読し易いし、内容も記憶しやすいからだ。この本は、トピック毎につらつらと説明が書かれているのだが、分量が少ない分そういった構成でも飽きることはない。

なによりこの本が良いのはself-containedであることだ。つまり、頭から読んでいけば理解できるように書かれている。前提知識の要求が低いので、どんな人にも勧められる。前回のエントリーでも書いたが、この本でプログラミングを知りたかった。

著者のブログは必読

著者のブログも面白かった、エントリーの数こそ少ないが、内容は濃い。特にこの本の紹介のエントリーは面白かった。

blog.unfindable.net

曰く、

プログラミング言語なんて,Python一択になるんじゃないの?という向きは,TensorFlowのコードや,世界コンピュータ将棋選手権の参加チームの使用言語をご覧になるといいでしょう。「どうしてJavaC++よりも遅いPython機械学習で使われているの?」などという話もあります。

だそうである。確かにそうだと思う。

また、この本は、

『文法からはじめるプログラミング言語 MS Visual C++入門(マイクロソフト公式解説書)』(日経BP, 2009)の改訂版という位置付けですが

とのこと。今回のタイトルの方が断然良いと思った。

Quoraという質問サイト

暑い日

今日は選挙日だ、結果はどうなるのであろうか。よくわからない。ただ、少し祭り的な気分がするので嫌いではない。公民権くらいは行使していては良いのではないだろうか。

質問サイト

ところで、最近おもしろい質問サイトに登録した。Quoraという質問サイトである。stack overflowというよりも、ヤフー知恵袋よりのサイトである。tech関係の質問が多いのだが、生活に関する質問もされている。

f:id:Rlan:20170702154931p:plain

What do you wear as a programmer/developer in your office to be able to work contiguous hours comfortably? - Quora

スウェットを履いて仕事をするのは不味そうな気がするのだが、そういうのを気にするのは日本人だけなのだろうか。すごく具体的なプログラミングの質問はstack overflowで質問されるかもしれない。基本的であったり、抽象的な質問が多い。そして、そういった質問に対してかなり丁寧な回答がされている。

Why is a pairing heap faster than a binary heap? - Quora

質問から何を読み取るか

また、回答者もPhdホルダーやCTOというった人が直接答えたりしている。 C++/Python/Javaだったらどれを勉強したらいいですか? とか、Social Lifeがないのですどうすればいいですか? といったどうしようもない質問に対しても多くの回答が寄せられている。回答自体は質問同様に抽象的だったりit dependsだったりする。しかし、その答え方や考え方に対しては文化的なバックグラウンドが反映されているので異なる社会を知るという観点で興味深く閲覧している。

if and only if から感じる違和感

丸暗記しちゃだめ?

if and only if というセリフがある。日本語でいうところの必要十分条件を意味する。例えば、 f(x) >0 if and only if  x とかそんな感じ。なにも考えずに、使っているがいったいどういう流れでこれが必要十分条件という意味になるのだろうか。

f:id:Rlan:20170604184810p:plain

素直なif、妖艶なonly if

まず、if はわかりやすい。 if X, then Y. なら、もし、XだったらYという意味。 XならばYという意味。つまり、 \Rightarrowを意味している。問題は only if である。only if X, then Y. というのはいったいどういう意味なのだろうか。 Xのときだけ、Y。見かけでは、ifのときと同じ方向論理関係をを意味しているように思える。つまり、X → Yという方向の論理関係である。

例を使って考えてみる

あまりわかっていないのだが、一般の例を使って考えてみた。いま

  • A: 東京にいる

  • B: 日本にいる

とする。AならばBである。東京は日本にあるので、東京にいれば日本にいることになる。 if A, then B. である。だが、Aのときのみ、Bではない。つまり、「B: 本にいる」のは「A:東京にいる」ときのみではない。つまり、if only A, then B. ではない。

すこし、ややこしいが、記号を入れ替えてみよう。

  • A: 日本にいる

  • B: 東京にいる

このとき、if A, then B. は成立しない。しかし、if only A, then B. は成立している。つまり、 日本にいるときのみ、東京にいるという状況は発生している。

さて、

  • A: 日本の首都にいる

  • B: 東京にいる

とする。 この時、if and only if A, then B. が成立している。

このような例で考えてみるとわかりやすいかもしれない。only if A, then B. というのは、「Aのときのみ、Bであるか」を調べることで  B \Rightarrow A をチェックしているのである。

違和感の源泉

こうして調べてみて、if and only if の違和感の理由が分かったきがする。必要十分条件を示すとき、 A \Rightarrow B と  A \Leftarrow B を別々に示す。しかし、 if and only if は Aを起点として必要十分条件を表現しているので違和感を感じたのだ。

ひとつき

一ヶ月が過ぎた

とりあえず、一ヶ月間のブログ更新を果たすことができた。何も書くことがないのだが、良くもまあ、駄文を重ねてきたものだ。書くことがあるからではなく、書くから書く内容が浮かぶのだということがよくわかった。職業小説家には決まった時間に決まった文字数を書くことを決めているというのもうなずける話である。

天才たちの日課  クリエイティブな人々の必ずしもクリエイティブでない日々

天才たちの日課 クリエイティブな人々の必ずしもクリエイティブでない日々

こういう本とか、村上春樹のエッセイにも同種のことが書いていた。

職業としての小説家 (新潮文庫)

職業としての小説家 (新潮文庫)

ブログを書く暇があったらなにか別のことに時間を使ったほうがいいのではないかという気もする。しかし、この一ヶ月でブログを書いているから他のことに時間が割けなかったとか、時間のロスが激しかったとかいう気はしない。むしろ、普段の生活でネタが見つかって安堵することのほうが多かった気がする。

きっかけになった本

ブログを書こうと思ったのはこの本を見たのも一因である。

できる研究者の論文生産術 どうすれば「たくさん」書けるのか (KS科学一般書)

できる研究者の論文生産術 どうすれば「たくさん」書けるのか (KS科学一般書)

この本は研究者が論文をコンスタントに生産するメソッドが書かれている。書いていることは簡単で、決まった量を決まった時間に書こう、ということである。そして、書くことがあるから書くのではなく、書くから書く内容が出るというのは本で読んだ一説である。自分でそれを試した結果としても、これは正しいように思えている。

ポリシーとこれから

本当は、自分の考えや生活、社会世相や好きなアイドルグループについてのあれこれを書くほうがアクセスも増えていいのかもしれない。たくさんの人が自分の文章を楽しんでくれるというのはそれ自体が素敵なことなのだ。ただ、このブログではこういうそういったことはしないことにしている。あくまで分析的な文章を書く、もしくはその種を保存しておくこ場所にする。これが唯一のこのブログのポリシーである。そして、先のようなことを書きたい場合はどこか別の場所別の形態で、ということになる。

Numptyのiscloseのrelative toleranceについて

大体同じだったら一緒ってことで良いよ

f:id:Rlan:20170629200656p:plain

Numptyiscloseを使った時、よくわからない部分が出た。デフォルトだと値が設定されているのだけど、 relative tolerance というパラメターである。

numpy.isclose(a, b, rtol=1e-05, atol=1e-08, equal_nan=False)

この isclose は単純に2点の距離を測って基準であるtoleranceよりも小さかったら True を返すというわけではなさそうである。実際には2つの評価方法を組み合わせているようだ。

Numpyのドキュメント には以下のような説明が書かれている。

For finite values, isclose uses the following equation to test whether two floating point values are equivalent.

absolute(a - b) <= (atol + rtol * absolute(b))

ということだそうだ。

少し分かりづらかったので、自分なりにまとめてみた。以下は2つのスカラーを比べる時に限定して議論する。

2つの誤差基準

誤差の基準には2つの考え方がある、絶対的なものと相対的なものの2つである。単純なのは絶対基準だろう。

絶対基準

絶対なのでどのような値であっても、2つの誤差に対して適応する基準は変わらない。その誤差を \epsilon とすれば、

 \displaystyle
\left\Vert a-b\right\Vert \leq\epsilon

である。しかし、絶対基準で考える場合、aとbの2つの値の大きさは無視していることになる。例えば、 \epsilon = 0.001 のとき10億ケタオーダーの値同士の誤差と100ケタオーダーの値同士の誤差に対して同じ基準で考えることが適切であるかどうか議論が別れるだろう。

相対基準

そこで、比べる値同士の大きさを考慮した基準で誤差を判定することを考える。それが、相対基準である。例えば以下のような基準で考える。相対基準を \delta として、

 \displaystyle
\frac{\left\Vert a-b\right\Vert }{\left\Vert b\right\Vert }\leq\delta

のようにする。 ほかの表し方として、

 \displaystyle
\left\Vert a-b\right\Vert \leq\delta\left\Vert b\right\Vert

という表しかたもできる。

相対基準の方が、絶対基準よりも柔軟に見えるが問題もある。分母が0に近いと左辺が大きな値を取ってしまうという問題だ。

Numpyのiscloseでは

Bumpyのdiscloseでは、相対基準と絶対基準を組合させた評価方法が考えられている。つまり、絶対基準と相対基準 の説明で記載した不等式の両辺を足し合わせて、

 \displaystyle
\left\Vert a-b\right\Vert \leq2\left\Vert a-b\right\Vert \leq\delta\left\Vert b\right\Vert +\epsilon

となっている。ここで注意すべきなのはbに入る値とaに入る値を入れ替えると結果が変わってしまう可能性があるということだ。実際、ドキュメントには注意書きがある。

読んでいる本

最新の読んでいる本

また、新たに本を読み始めた。なんとなく、C++を勉強しないといけないなという電波を受信したので。でも、どんな本を読めばいいかわからなかった。すごく有名な入門・中級とある本があるが丁寧過ぎて全てに目を通すのはめんどくさそうだし。創始者の本は大著過ぎて読み切るまでに寿命がつきそうである。

プログラミング言語C++ 第4版

プログラミング言語C++ 第4版

ストラウストラップはC++を創った人なので、たしかにこれを読んでみたいという欲望にかられた。だけど私には無理だ。

出会い

そんなところ、良さげな本が発売されているのに気が付いた。その名も、『基礎からしっかり学ぶC++の教科書』。基礎、それは身につけたくても身に着けられない青い鳥である。

基礎からしっかり学ぶC++の教科書 C++14対応 (マイクロソフト関連書)

基礎からしっかり学ぶC++の教科書 C++14対応 (マイクロソフト関連書)

今日、購入して読み始めた。5章までしか読んでないがいい本だと思う。まず、すごくコンパクトで読み切れそうだし、最新のC++14にもしっかり対応している。内容としては、本当のはじめから書いている。プログラムってなんでしょうとか、オブジェクト指向ってなんですか、とかそんなのだ。願わくば、この本でプログラミングを入門したかった。

しかも、本の帯に「はじめに」からの抜粋があって、

これからC++のプログラムを読み書きしていくために最低限必要となるであろう話題だけを選択し、本書を書きました。 プログラムを書くだけでよければもう少しコンパクトにできますが、他人が書いたC++のプログラムを読むのに必要な知識を入れるとこのくらいになるでしょう。

この本が発売されたのは今年の2月である。「しめしめ、いい本を見つけたゾ、Amazonレビューに書こう」と思っていたら既に、最高評価でレビューが10件ついていた。いい本はすぐに発見されるのだ。

とにかく、まずは通しでさっと読み切ろう。こういうのはスピードが大事なのだ。

本を読む

本を読む。電子書籍が全盛期とはいえ、物理的な本を読むことが多い。持ち運びに不便というデメリットはあるものの、教科書などは実物の本の方が読んでて楽しい。

持ち運びの不便さ以外にも本の問題はある。弾力で本が閉じてしまう。覗き込む状態で読むので首が曲がり、血の巡りが悪くなることで肩がこる。などだ。

これを一度に解決する方法をとして、本立てを利用している。ブックオープナーではない。

ナカノ ページオープナー PGH-47/BL ブラック

ナカノ ページオープナー PGH-47/BL ブラック

フリップクリップ ブックホルダー グレー 14154

フリップクリップ ブックホルダー グレー 14154

本当の「本立て」である。立てかけて、開いた状態をキープできる。

actto BST-02 ブックスタンド(OEM品番:EDH-004)

actto BST-02 ブックスタンド(OEM品番:EDH-004)

かなり使いやすくて重宝している。800ページ程度の巨大な本でも対応できている。

アルゴリズムデザイン

アルゴリズムデザイン

今回はスマホで書いてみた。とても書きにくい。