いものやま。

雑多な知識の寄せ集め

統計検定2級を受けてみた。

f:id:yamaimo0625:20190601142919j:plain

現在、就活中なんだけど、しばらく活動してみて全然ダメだったので、実績に少し箔をつけるために統計検定2級を受けてみた。
無事合格したので、どんな勉強をしたかなどを紹介したい。

統計検定2級とは

統計検定は、統計学に関する知識や活用力を評価する検定試験。
2級だと大学基礎課程(1・2年次学部共通)で習得すべきことが出題される。

・・・とされてるけど、数理科学科出身の自分でもこんな内容はやってない(^^;
正直、統計学は数学の中でも考え方がかなり特殊なので、数学科出身でもそれなりに勉強はしないと受からないと思う。
数学部分は問題なくても、統計的な考え方と知識がないと解けない。

試験方式は、紙の冊子が配られて回答するPBT方式と、パソコンに問題が表示されて回答するCBT方式がある。
PBT方式は基本的には年2回(6月と11月)。
一方、CBT方式はいろんな会場でほぼ毎日開かれてる。
なので、急ぎで試験を受けたかったらCBT方式がいい。
自分もCBT方式でサクッと試験を受けてきた。

試験時間は90分で、四択or五択の問題が約35問出題され、100点満点で60点以上取れれば合格(※CBT方式の場合)。

ノー勉だとさすがに無理だと思うけど、それなりに勉強して過去問を解けば普通に受かるとは思う・・・のだけど、PBT方式の合格率は40%強なので、微妙なところ。
勉強した人がどれだけ合格したかという条件付き確率が欲しい・・・
(基本情報や応用情報も合格率20%強とかみたいだし、その合格率マジで?となる)

勉強スケジュール

自分の場合、大学時代に統計の勉強はまったくやらなかった。
なので、数学はともかく、統計に関しては知識ゼロからのスタート。

思い立って勉強を始めたのが3/9(月)で、1週間ちょっとで本を読んだりWebを見たりで基本的な知識をつけた。
そのあと、3/17(火)から過去問を解き始め、分からなかったところなどを補強。
そして、3/28(土)、つまり今日、CBT方式で受検して、無事合格。

2週間くらいで取れるかなぁと思ったんだけど、試験申し込みを約1週間前にやらないといけなかったらしく、1週間ほど延びてしまった(^^;
まぁ、その分過去問を解く回数も増えたので、万全を期せた感じ。

読んだ本など

いろいろ読んだので、順番に。

『完全独習 統計学入門』

完全独習 統計学入門

完全独習 統計学入門

  • 作者:小島 寛之
  • 発売日: 2006/09/28
  • メディア: 単行本(ソフトカバー)

統計WEBでいろいろな本が紹介されてた中で、小島先生は他の本(『数学的思考の技術』)で知っていたので、この本をまず手にとってみた。

この本のいいところは、統計学の考え方が分かりやすく書かれていたこと。
最初に手にとった一冊としては、大正解だったと思う。
これは、著者の小島先生自身が統計学を「胡散臭い学問」とちゃんと認識してたからで(数学やってる人からすると統計学ってかなり異質に見える)、その上で「あぁ、統計学ではそう考えるのね!」というポイントをしっかりと掴んでるから。

推測統計の方法論は「部分から全体を推論する」という「帰納法」です。 これは数学という完全無欠の「演繹法」になじんだ筆者には、「飛躍だらけの論理体系」に見え、これを受け入れるためには、慣れ親しんだ思考法からいったん頭を切り替えなければならない、と悟ったのです。
(『完全独習 統計学入門』「おわりに」より引用)

逆にいうと、統計学ではこうするんだよーと言われて何の疑問も持たずに受け入れられてしまう幸せな頭の人は、別の本でもいいかも。

なお、統計学の基本的な考え方を伝えることに注力してるので、統計検定2級に必要な知識を得るにはかなり足りない。
なので、他の本やWebでの補足は必須。

『完全独習 ベイズ統計学入門』

完全独習 ベイズ統計学入門

完全独習 ベイズ統計学入門

  • 作者:小島 寛之
  • 発売日: 2015/11/20
  • メディア: 単行本(ソフトカバー)

上記の本のベイズ統計版。

この本も非常によかった。
面積図を使った説明は、ベイズ統計の考え方をすごく分かりやすく伝えてくれる。

統計検定2級でも事後確率を求める問題は頻出だけど、これ一冊読めばかなり理解が深まり、なんかゴチャゴチャした公式を覚えなくてもベイズ統計の問題が解けるようになると思う。

『マンガでわかる統計学入門』

マンガでわかる統計学入門

マンガでわかる統計学入門

マンガなら読みやすいかなぁと手にとった本。
電子版もあったので。

書かれてる内容は小島先生の本とほとんど同じで、もうちょっと統計学の言葉を使ったものになってる。
なので、読む必要はほとんどなかった。

『マンガでわかる統計学

マンガでわかる統計学

マンガでわかる統計学

これも有名な本。
ずっと昔に買って本棚で眠ってた・・・

マンガだけど、内容はなかなか難しい。
そして、推定や仮説検定の説明だと母平均が使われることが多いと思うのだけど、この本では独立性の検定が使われてる。
また、相関係数の他に相関比や連関係数の話が書かれてて、データの関連性に重点が置かれている感じがした。

正直、この本を入門書として読んでもさっぱりだと思う。
やはり入門は小島先生の本がいい。
その上で、データの関連性について知りたいときにはこの本を読むといいと思う。
(独立性の検定も統計検定2級でよく出る)

『マンガでわかる統計学 回帰分析編』

上記の回帰分析版。

単回帰分析、重回帰分析も統計検定2級の試験範囲でよく出るんだけど、結論から言えばこの本は参考にならなかった。
(この本自体が勉強にならないというわけではない)

試験でよく出るのはt分布を使った検定。
一方、この本ではF分布を使った検定・・・

統計学がわかる』

統計学がわかる (ファーストブック)

統計学がわかる (ファーストブック)

ハンバーガーショップでのいろいろな課題をテーマに話が進むので、読みやすかった。
推定や仮説検定の話がたっぷりと書かれてるので、小島先生の本を読んで、足りない部分を足すとよさそう。
母平均、母分散の検定の話に加え、母平均の差に関する検定の話が書かれてる。

統計学がわかる 回帰分析・因子分析編』

統計学がわかる 【回帰分析・因子分析編】 (ファーストブック)

統計学がわかる 【回帰分析・因子分析編】 (ファーストブック)

上記の本の回帰分析(&因子分析)版。

これも回帰分析の参考にはならなかった。。。
分かりやすいとは思うんだけど、知りたかったのは検定に関する話で、それについては言及ゼロだったので。

統計WEB

かなりお世話になった。

本だとどうしてもページ数に限りがあるので、載せられる検定の種類も限られる。
そこで足りなかった知識については、このサイトでほぼ網羅されてるので、調べればだいたい分かった。

とはいえ、いきなりこのサイトを見てもなかなか難しいところはあるかも。
分量もかなり多いし。
なので、本で基本を押さえ、過去問を解いて分からない問題が出たら調べるという感じが効率いいかもしれない。

『統計検定2級 公式問題集』

日本統計学会公式認定 統計検定 2級 公式問題集[2016〜2018年]

日本統計学会公式認定 統計検定 2級 公式問題集[2016〜2018年]

  • 発売日: 2019/03/20
  • メディア: 単行本(ソフトカバー)

過去3年分(合計6回分)の問題と解説が載ってる。
とはいえ、いきなり解説見ても分からないと思うので、やっぱり基本を理解してから。

この問題集をどれだけやり込んだかが合格に大きく繋がると思う。
自分は2016〜2018年の問題集と、2013〜2015年の問題集を全部解いた。

最初は90分をオーバーしてもいいから全部の問題に目を通し、分からないところを潰す。
そして、慣れてきたらちゃんと時間内に収まるように解くといいと思う。

統計検定2級をとってみて

とりあえずとってみたけど、まぁ勉強すれば普通にとれるだろうし、うーん、凄いんだろうか・・・
まぁ、就活にプラスに働くことを祈るのみ。

勉強したことは忘れないためにも近いうちにまとめて公開したいと思う。

今日はここまで!

完全独習 統計学入門

完全独習 統計学入門

  • 作者:小島 寛之
  • 発売日: 2006/09/28
  • メディア: 単行本(ソフトカバー)

完全独習 ベイズ統計学入門

完全独習 ベイズ統計学入門

  • 作者:小島 寛之
  • 発売日: 2015/11/20
  • メディア: 単行本(ソフトカバー)

マンガでわかる統計学入門

マンガでわかる統計学入門

マンガでわかる統計学

マンガでわかる統計学

統計学がわかる (ファーストブック)

統計学がわかる (ファーストブック)

統計学がわかる 【回帰分析・因子分析編】 (ファーストブック)

統計学がわかる 【回帰分析・因子分析編】 (ファーストブック)

日本統計学会公式認定 統計検定 2級 公式問題集[2016〜2018年]

日本統計学会公式認定 統計検定 2級 公式問題集[2016〜2018年]

  • 発売日: 2019/03/20
  • メディア: 単行本(ソフトカバー)

『0から分かる!ソート・選択アルゴリズムと資源配分問題』を読んでみた。

f:id:yamaimo0625:20190621155528j:plain

新型コロナの影響で技術書典8は中止になったけど、技術書典 応援祭が絶賛開催中。

そんな中で買ったねず宮ちんじろうさんの『0から分かる!ソート・選択アルゴリズムと資源配分問題』が面白かったので、紹介したい。

概要

アルゴリズムの基本とも言えるソートアルゴリズムの解説から始めて、最終的には資源配分問題を高速に解くアルゴリズムまで説明されている。
図が多く、具体例を使った議論がされてるので、とても分かりやすい。
また、資源配分問題を高速に解くアルゴリズムは、なるほどねという感じ。

資源配分問題

本書でゴールにしてる資源配分問題というのは、こんな問題:

Aさん、Bさん、Cさん、Dさんは友人から6個のりんごを貰った。
それぞれがりんごをいくつか貰った時の満足度は次の表で表される。
全体での満足度の合計値が最大となるような配分はどうなるだろうか?

人物 0個 1個 2個 3個 4個 5個 6個
A 0 13 24 33 42 48 52
B 0 17 29 37 42 45 46
C 0 16 31 38 41 43 44
D 0 20 38 52 62 67 69

この問題のポイントは、もらったリンゴの個数が増えたときの満足度の上昇が徐々に減っていっていること。
これは経済学で限界効用逓減の法則と呼ばれてる。
そして、それは数学的にみると凹関数といういい性質として捉えることができる。

さっきのツイートの通り、自分だとこの問題は何も考えずにMIP(Mixed Integer Programming, 混合整数計画問題)にして解いちゃいそうだけど、本で紹介されてるアルゴリズムはこの凹性をうまく利用していたので、とても感心した。
アルゴリズムの詳細は本を買ってのお楽しみということでw

MIPでの解法

ここからはオマケで、じゃあMIPだとどう解くのかという説明。

各自のもらうリンゴの数を求めるから、Aさんがもらうリンゴの数を x_A、Bさんのもらうリンゴの数を x_B、・・・( x_A, x_B, \ldotsは0以上の整数)としてしまいそうだけど、それだとうまくいかない。

こういうときの定石は、Aさんがリンゴを0個もらうかどうかを x_{A,0}、Aさんがリンゴを1個もらうかどうかを x_{A,1}、・・・、 Bさんがリンゴを0個もらうかどうかを x_{B,0}、・・・とバイナリ変数で表すようにする。
そうすると、Aさんがもらったリンゴの数は \sum_i i x_{A,i}と表せるし、Aさんの満足度も(Aさんが i個もらえたときの満足度を s_{A,i}で表すとして) \sum_i s_{A,i} x_{A, i}と表すことができる。

あとは、Aさんがもらうリンゴの数は0〜6個のどれか1つということに気をつければ、 x_{A,i}のうち1になるのがちょうど1個という制約が必要と気づくので、次のような最大化問題として書ける:

\displaystyle
\begin{align}
\textrm{max.} &\quad \sum_{m \in \{A, B, C, D\}} \sum_{i=0}^6 s_{m,i} x_{m,i} \\
\textrm{sub. to} &\quad \sum_{i=0}^6 x_{m,i} = 1 \qquad(\forall m \in \{A, B, C, D\}) \\
&\quad \sum_{m \in \{A, B, C, D\}} \sum_{i=0}^6 i x_{m,i} = 6 \\
&\quad x_{m,i} \in \{0, 1\}
\end{align}

あとはこれを解くだけ。

GLPKで解いてみる

小さなMIPならフリーのGLPKでも全然解けるので、GLPKで解いてみた。

まず、上記の数式をモデルにすると以下:

# リンゴの数
param AppleCount;

# メンバーとリンゴの範囲
set Member;
set AppleRange := 0..AppleCount;

# 満足度
param Satisfaction{Member,AppleRange};

# メンバーとリンゴの数に対して、配分されるか
var Distribution{Member,AppleRange} binary;

# 満足度を最大化
maximize TotalSatisfaction:
sum{m in Member, i in AppleRange} Satisfaction[m,i] * Distribution[m,i];

# 各メンバーについて、配分はどれか1つ
subject to Assignment{m in Member}:
sum{i in AppleRange} Distribution[m,i] = 1;

# 配分されるリンゴの合計はリンゴの数に等しい
subject to CountSum:
sum{m in Member, i in AppleRange} i * Distribution[m,i] = AppleCount;

# 解いて解を出力
solve;
display Distribution;

end;

与えるデータは以下:

# 入力データ
data;

param AppleCount := 6;

set Member := A B C D;

param Satisfaction: 0 1 2 3 4 5 6 :=
    A   0   13  24  33  42  48  52
    B   0   17  29  37  42  45  46
    C   0   16  31  38  41  43  44
    D   0   20  38  52  62  67  69
;

end;

これをglpsolで実行すると、こうなる:

$ glpsol -m rscprb.mod -d small.dat
(省略)
INTEGER OPTIMAL SOLUTION FOUND
Time used:   0.0 secs
Memory used: 0.1 Mb (149031 bytes)
Distribution[A,0].val = 1
Distribution[A,1].val = 0
Distribution[A,2].val = 0
Distribution[A,3].val = 0
Distribution[A,4].val = 0
Distribution[A,5].val = 0
Distribution[A,6].val = 0
Distribution[B,0].val = 0
Distribution[B,1].val = 1
Distribution[B,2].val = 0
Distribution[B,3].val = 0
Distribution[B,4].val = 0
Distribution[B,5].val = 0
Distribution[B,6].val = 0
Distribution[C,0].val = 0
Distribution[C,1].val = 0
Distribution[C,2].val = 1
Distribution[C,3].val = 0
Distribution[C,4].val = 0
Distribution[C,5].val = 0
Distribution[C,6].val = 0
Distribution[D,0].val = 0
Distribution[D,1].val = 0
Distribution[D,2].val = 0
Distribution[D,3].val = 1
Distribution[D,4].val = 0
Distribution[D,5].val = 0
Distribution[D,6].val = 0
Model has been successfully processed

見ての通り、一瞬でサクッと解けた。
(Aが0個、Bが1個、Cが2個、Dが3個)

ちなみに、練習問題に載ってた少し大きい問題も以下の通り:

# 入力データ
data;

param AppleCount := 15;

set Member := A B C D E F;

param Satisfaction:
    0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15 :=
A   0   36  67  91  109 122 131 135 135 135 135 135 135 135 135 135
B   0   40  78  113 134 149 160 165 165 165 165 165 165 165 165 165
C   0   39  66  83  95  101 105 108 108 108 108 108 108 108 108 108
D   0   26  51  71  90  104 116 126 126 126 126 126 126 126 126 126
E   0   23  36  47  55  62  64  65  65  65  65  65  65  65  65  65
F   0   37  69  97  102 106 109 109 109 109 109 109 109 109 109 109
;

end;
$ glpsol -m rscprb.mod -d large.dat
(省略)
INTEGER OPTIMAL SOLUTION FOUND
Time used:   0.0 secs
Memory used: 0.2 Mb (237295 bytes)
(省略)
Distribution[A,3].val = 1
(省略)
Distribution[B,4].val = 1
(省略)
Distribution[C,2].val = 1
(省略)
Distribution[D,2].val = 1
(省略)
Distribution[E,1].val = 1
(省略)
Distribution[F,3].val = 1
(省略)
Model has been successfully processed

こんなふうに、大きくない問題ならアルゴリズムをまったく考えないでも解けるのがMIPの嬉しいところ(^q^)

ちなみに、上記のGLPKの解説は新刊に書いているので、よかったら読んでみてほしい。(宣伝)

もちろん、MIPを使って脳死で解けるのは小さい問題に限るので、紹介した本のような内容も必要になってくる。
なので、紹介した本もぜひとも読んでみてほしい。

今日はここまで!

「3人の嘘つきのパラドックス」について考えてみた。

f:id:yamaimo0625:20200311144523p:plain

FGOのイベントで面白い問題が出てたので、それについて考えてみた。

「3人の嘘つきのパラドックス

ここでいう「3人の嘘つきのパラドックス」(※一般にそういう名前があるわけではない)とは、次のようなもの:

A, B, Cという3人がいるとする。
この3人は全員が「正直者は自分だけで、他の2人はどちらも嘘つきだ」と言っている。
正直者は誰だろうか?

FGOのシナリオでは、これは次のようにパラドックスになると書かれていた:

Aが正直者だった場合、BとCは嘘つきになる。
すると、Bの発言は嘘なのでAとCは正直者となり、Cが嘘つきというのに矛盾する。
一方、Aが嘘つきだった場合、BとCは正直者となる。
すると、Bの発言は正しいのでAとCは嘘つきとなり、Cが正直者というのに矛盾する。
Aが正直者と仮定しても嘘つきと仮定しても矛盾するので、これはパラドックス

さて、どうしたものか・・・というところで、これは単なるなぞなぞだと解決の道筋が示される。
それについてはイベントを実際にプレイして欲しい。(FGOはいいぞ)

けど、自分がプレイしてて思ったこと。

これ、そもそもパラドックスになってないじゃん。

そう、論理的に考えれば、これは全然パラドックスになってない。
矛盾なんか起きない。
でも、論理ができないとこんな間違いもしちゃうんだなぁ、と思ったり。

で、ちょっと考えれば分かることなので、さすがに指摘してる人もたくさんいるんだろうなぁとツイッターを検索してみたんだけど、自分の他に指摘してる人がいない・・・?
いや、本筋には関係ないとはいえ、それなりにツッコミが入ってると思ったんだけど・・・

「AかつB」の否定

この問題のポイントは、「AかつB」の否定はなんなのか、ということ。

「AかつB」の否定は、「Aでない、かつ、Bでない」ではなく、「Aでない、または、Bでない」となる。
(ド・モルガンの法則)

たとえば、「Aは嘘つき、かつ、Bも嘘つき」という発言が、どういったときに正しく、どういったときに間違いと見なされるかを考えてみるといい。

A B Aは嘘つき、かつ、Bも嘘つき
嘘つき 嘘つき 正しい
嘘つき 正直者 間違い
正直者 嘘つき 間違い
正直者 正直者 間違い

見ての通り、AかBの少なくとも一方が正直者なら「Aは嘘つき、かつ、Bも嘘つき」という発言は間違い(=嘘)となる。

つまり「AもBも嘘つき」が嘘なら、正しいのは「AもBも正直者」ではなく、「AかBの少なくとも一人は正直者」。

それを踏まえて上記のパラドックスの説明を眺めると、こうなる:

Aが正直者だった場合、BとCは嘘つきになる。
すると、Bの発言は嘘なのでAかCの少なくとも一人は正直者となり、実際Aは正直者。
Cについても同様なので、矛盾はしない。(Aだけが正直者)
一方、Aが嘘つきだった場合、BかCの少なくとも一人は正直者となる。
Bが正直者の場合、AとCは嘘つきとなり、矛盾しない。(Bだけが正直者)
また、Cが正直者の場合も同様に矛盾しない。(Cだけが正直者)
このように、誰が正直者かは定まらないが、矛盾は発生せず、正直者が1人だけいると分かる。

見ての通り、パラドックスになんかならない。

そして面白いのは、誰が正直者なのかは分からないけど、正直者は確実に1人いると定まること。

「n人の嘘つきのパラドックス

となれば、やっぱり一般化して考えたくなるのが数学をやってる人の性。

まず思い浮かぶのは、じゃあ、3人じゃなくてn人だとどうなんだろう?ということ。

 n人いるとする。( n \ge 2
全員が「正直者は自分だけで、他の全員は嘘つきだ」と言っている。
正直者は何人いるだろうか?

これも「全員嘘つき」の否定が「正直者もいる」だということに気をつければ、1人というのが答えだと分かる。
ある人が正直者だとしたら、他の全員は嘘つきとなり、嘘つきは「他の全員は嘘つき」という嘘をついていることになる。
そして、仮に正直者が2人(以上)いると仮定すると矛盾するので、正直者はぴったり1人だと分かる。

さらに一般化すると、これは自分を含めて正直者が何人いるか、という言及にできる。
しかも、「ぴったり」「以上」「以下」の3パターンを考えられそう:

 n人いるとする。( n \ge 2
全員が「正直者は自分を含めて m人だ」と言っている。( 1 \le m \le n
正直者は何人いるだろうか?

 n人いるとする。( n \ge 2
全員が「正直者は自分を含めて m人以上だ」と言っている。( 1 \le m \le n
正直者は何人いるだろうか?

 n人いるとする。( n \ge 2
全員が「正直者は自分を含めて m人以下だ」と言っている。( 1 \le m \le n
正直者は何人いるだろうか?

ちゃんと確かめてないけど、これらのどれもが「その発言通りが正しい」となってそう。

ただ、ここで mの最小値を0にするーーつまり全員が「全員嘘を言っている」と言っているケースを許すと、話が急に変わってくる。
この場合はパラドックスが発生する・・・

他にもいろいろ変形が考えられそうなので、どういう場合にはパラドックスが発生するのか考えてみるのも面白そう。

今日はここまで!

Fate/Grand Order

Fate/Grand Order

  • Aniplex Inc.
  • ゲーム
  • 無料

『世にも美しき数学者たちの日常』を読んでみた。

f:id:yamaimo0625:20190601142919j:plain

『世にも美しき数学者たちの日常』が面白かったので紹介したい。

世にも美しき数学者たちの日常

世にも美しき数学者たちの日常

数学者ってどんな人なんだろう?

数学者といえば数学を研究している人のことだけど、そもそも数学を研究するってどういうことなのかというと、普通の人にはなかなかイメージがしづらい。
そこで、実際に数学者に会いに行ってみて、どんな人なのかや何が見えているのか、数学についてどう思っているかなどをインタビューしてまとめた本。

数学というと、普通の人が思い浮かべるのは受験数学だけど、そうではない世界があるということを分かりやすく伝えているのがよかった。

数学に「触る」

読んでいてとにかく思ったのは、数学に「触る」という感覚、これが他の読者にも伝わってほしいなということ。
数学的対象というのは目には見えないけど、確かにそこにあって、数学者はおもちゃをいじるようにその数学的対象に触っていじってる。
その辺りがこの本を読めば少し感じてもらえるんじゃないかなと思う。

「大人のための数学教室 和(なごみ)」の堀口先生へのインタビューが非常に共感を持てた。

「普通の人は問題の解法を学んで暗記して、その通りに解いていくわけです。 でも得意な人はそういった解き方はしない」
「どうやって解くんですか?」
「えっとね、たとえば適当な数字を放り込んでみたりする。 複雑な数式の問題が出てきたとしましょう。 そんなとき、得意な人は単純な方向に考えていきます。 なんか試していく、試しにやっていくんです。 いじってみて観察するんです。 そうしているうちに、数式がどういう振る舞いをするものなのか、だんだん分かってくる」

すごく分かるw
そう、とにかくいじってみる。
解けたとしても、他にも解き方があるんじゃないかなといろいろ探してみる。

数学の「自由さ」

千葉先生の数学の捉え方も共感が持てた。

「数学嫌いの理由として、答えががっちり決まっているのが嫌という人がいるじゃないですか。 それはね、数学じゃなくて受験数学なんですよ。 本当は数学ってものすごく自由なんです。 もう、何だって数学なんですよ」
「じゃあ数式とか、そういうのを考える以前に数学はあるんですね。 なぜ?と思った瞬間から、もう数学というか」
「そうです。 数式は音楽家が使う音符と同じものであって。 数学イコール数式というのは、全然違うんですよ。 数学を味わうのに、必ずしも数字や数式は必要ではない」

数学をやってる人だと、数学の自由さは知ってると思うんだけど、この辺りの自由さを普通の人は知らないと思う。
数学だと「今はこう考えるよ」とすれば、その前提の元でならどんな議論も許されてる。

これは津田先生のインタビューなんかでもそういう話が出てる:

「ちゃんと『私はこういう定義をします』と言えばいいんです。 その前提のもとで話をすれば、曖昧にはならない。 そういう自由さは数学の良いところだと思います。 はっきりしているけど、自由。 あと、やっぱり受験数学のためかよく誤解されているのは、証明が一つと思っている人がいるんです。 これも、いくらでもある。 人の数だけあっていい」

数学者と「問題」

あと、黒川先生や加藤先生のインタビューで書かれてた、数学者の問題に対する態度も普通の人には面白いと思う。

「問題を作る、というのはいいことだと思いますよ。 受け身で、誰かが作った問題を解かされる、というのはあまり楽しくないですよね。 お題を一つ二つ決めて、それで問題を作るというのをやってみると、だんだん面白くなるんじゃないかと思います。
作家で言うなら、タイトルだけ決めて小説を書くようなものでしょうか。 一般的には、『数学の問題は与えられるもの』という先入観が強いですよね? でも一番面白いのは、問題を作ることなんです」
数学は「これを解け!」の積み重ねではなかった。
「なぜ?」の積み重ねなのだ。

「数学で一番重要なことは、問題と一緒に生活することなんです」

数学って、自分でおもちゃを用意して、いじって遊び倒して、そこからまた新しいおもちゃを思いついて用意して、というのの繰り返しというか。
こう、数学に「触る」というのが根っこにある。
そういうのが少しでも伝わればな、と思う。


他にも面白かった内容として、次のような発言があった:

「しかもどのレベルの人も『難しい』って言ってると思います。 みんなそれぞれのレベルで『難しい』し『数学わからない』と思ってるはずです。 『数学わかる』って人がいたら、その人はたぶんわかってないと思いますね」

めっちゃ分かるw
これは『数学ガール』の結城先生の言う「わからなくなる最前線」で試行錯誤してるからだと思う。
その最前線でやる数学が一番難しく、そして面白いw

ちなみに、『数学ガール』は「例示は理解の試金石」という言葉の通り、実際にいくつかの例を試して理解を深めているので、数学に「触れてる」様子が書かれている。
なので、この本で数学に「触れる」ことに興味を持ったら、『数学ガール』シリーズ(もしくは『数学ガールの秘密ノート』シリーズ)もオススメ。

そのときはパラパラと読み進めるんじゃなくて、実際に鉛筆と紙を使い、手を動かしながら数学に「触って」読むといいと思う。

今日はここまで!

世にも美しき数学者たちの日常

世にも美しき数学者たちの日常

数学ガール (数学ガールシリーズ 1)

数学ガール (数学ガールシリーズ 1)

  • 作者:結城 浩
  • 発売日: 2007/06/27
  • メディア: 単行本

自動生成パスワードで暗号化ZIPを作るツールを作ってみた。

f:id:yamaimo0625:20200122103438j:plain

技術書のPDFを頒布するときによく使われるのが、以下の方法:

  1. PDFを暗号化されたZIPファイルにする
  2. 暗号化されたZIPファイルをBOOTHなどに置く
  3. ダウンロードカードなどでダウンロードURLと解凍するためのパスワードを伝える

このとき便利な、パスワードを自動生成し、そのパスワードを使って暗号化されたZIPファイルを生成するツールを作ってみた。

※動作要件
Rubyが動く
-Pオプションをサポートしたzipコマンドが動く

よくある問題とその対策

「パスワードを用意してZIP圧縮するなんて、手動でちょちょいとやればいいんじゃないの?」という声もありそうだけど、以下のような問題がある:

1. パスワードに判別しづらい文字が使われてしまう

0O1lのように、フォントによっては判別しづらい文字がある。
ランダムな文字を適当に使ってパスワードを作ると、そういった判別しづらい文字が使われてしまう可能性がある。

そこで、以下の文字はパスワードに使われないようにした:

  • 0oO
  • 1lI
  • 2zZ
  • 5sS
  • 6b
  • gq
  • kK

2. 最新でないファイルを暗号化ZIPにしてしまう

手動でファイルを暗号化する場合、元のPDFを更新したのに暗号化ZIPの方は更新し忘れるといった可能性がある。
これを防ぐには暗号化ZIPの作成まで自動ビルドシステムに組み込んでしまった方がいい。

そこで、パスワード文字列をユーザが手入力する必要のないコマンドラインツールを用意した。

想定ユースケース

想定ユースケースは次の2つ:

  1. PDFとは別にダウンロードカードを用意する場合
  2. PDF内に解凍パスワードを用意する場合

1.の場合、パスワードの自動生成と暗号化ZIPファイルの作成は同時にやっていい。
一方2.の場合、まずはパスワードを自動生成し、それをPDF内に入れてから、生成済みのパスワードを使って暗号化ZIPファイルの作成をすることになる。

作ったツールはこのどちらのユースケースにも対応してある。

作ったツールとインストール方法

作ったツールはpasszip。

インストールはgemコマンドで出来る:

$ gem install passzip

(※システムのRubyを使ってる場合、sudoが必要かも)

使用方法

まず、パスワードの自動生成と暗号化ZIPファイルの生成を同時に行う場合、以下のようにする:

$ passzip <暗号化ZIPにしたいファイル>

こうすると、<ファイル名>.zipという暗号化ZIPファイルと、<ファイル名>.passという暗号化に使ったパスワード(=復号&解凍に使うパスワード)が書かれたテキストファイルが作られる。
あとはこのパスワードの書かれたダウンロードカードを用意すればいい。
(※実行するたびにパスワードは新しく生成されるので、生成済みのパスワードを使いたい場合は後述の方法を使う)

次はパスワードの自動生成と暗号化ZIPファイルの生成を別に行う場合。

パスワードの自動生成をするには、以下のようにする:

$ passzip -g <暗号化ZIPにしたいファイル>

これで生成されたパスワードの書かれた<ファイル名>.passだけ用意される。

そして、PDF内にパスワードを書いたら、以下のように暗号化ZIPファイルを作る:

$ passzip -e <暗号化ZIPにしたいファイル>

こうすると既に存在する<ファイル名>.passに書かれたパスワードを使って<ファイル名>.zipという暗号化ZIPファイルが生成される。

補足説明

パスワードの長さはデフォルトで10文字。
もし、もっと短くていい/もっと長くしたい場合は、-lオプションで長さを指定する。

# (例)パスワードの長さを16文字にする
$ passzip -l 16 hoge.pdf

なお、パスワードをファイルとして残すので、セキュリティ的にはけっこうガバガバ。
なので、不特定の複数ユーザが使うようなシステムでは使わない方が安全だと思う。
(当然、publicなリポジトリにコミットしたらパスワード見放題なので、privateなリポジトリにするかコミットしない方が安全)

ダウンロードカードを用意するかどうか

ちなみに、技術書典などのイベントで頒布するなら、ダウンロードカードを用意するかどうかも考えたいところ。

ダウンロードカードを用意した場合、次のようなメリットがある:

  • 即売会でPDFだけ売れる(ダウンロードカードだけを渡す)
  • 紙の本が売り切れてもダウンロードカードだけ販売できる(※ダウンロードカードは比較的安く印刷できるので紙の本より多く用意できる)

一方、デメリットも:

  • ダウンロードカードをデザインして入稿する必要がある
  • PDFだけ欲しがる人が多い場合に、紙の本と同数のダウンロードカードを最低限残しておく必要がある
  • 頒布時にダウンロードカードを渡す手間が発生する(最悪、渡しそびれる可能性あり)
  • とらのあなさんなどに委託する場合、おまけとしてダウンロードカードを渡す必要があるが、その扱いがけっこう面倒

なので、基本的には本の中にパスワードを書いてしまった方がいいと思う。
そのうえで、PDFだけでも頒布したければダウンロードカードを用意するとよさそう。

今日はここまで!

スロー空手ストレッチの紹介。

f:id:yamaimo0625:20200113132949j:plain

2020年にやっていきたいこと。 - いものやま。でちょっと書いたスロー空手ストレッチの紹介。

スロー空手ストレッチとは

スロー空手ストレッチとは、空手家の高橋優子さんが考案した肩こり解消のためのストレッチ方法。

肩こりすっきり スロー空手ストレッチ

肩こりすっきり スロー空手ストレッチ

  • 作者:髙橋 優子
  • 出版社/メーカー: プレジデント社
  • 発売日: 2017/07/28
  • メディア: 単行本(ソフトカバー)

この本でまず書かれているのが、空手家で肩こりに悩んでる人はいないということ。
これはなぜかというと、空手では四方八方の敵に対処するために、腕を自在に使う訓練をするから。
そのため、稽古で自然と肩まわりがほぐれ、可動域が広がって肩こりにならないとのこと。

そこで、空手の型から特に肩こりに効きそうなものを選び抜いて作られたのがスロー空手ストレッチ。
スロー空手なのは、普段使ってない筋肉を意識して動かすのが重要だからとのこと。

雰囲気は以下の動画を参照:

3種類、8つの動き

スロー空手ストレッチでの動きは次の3種類に分けられる:

  1. のばす
  2. ひねる
  3. ほぐす

この3種類を行えるように、それぞれに対応して「突き」「ひじ打ち」「手刀」のストレッチが用意されている。

さらに、それぞれについていくつかの動きが用意されている:

  1. 「突き」ストレッチ
    1. 交互に水平にのばす
    2. 交互に上にのばす
  2. 「ひじ打ち」ストレッチ
    1. ひじを上にあげる
    2. ひじを前にまわす
    3. ひじを後ろにまわす
  3. 「手刀」ストレッチ
    1. 外からまわす
    2. 内からまわす
    3. 下にのばす

繰り返す回数については特に書かれてないけど、各1分くらいずつやる感じなのかな・・・?
あるいは、ストレッチの定番で、ちょっとツラいと感じるくらいまでやるといいのかも。
そうすれば肩まわりの筋肉が少しずつ育ってくはずなので。

ちなみに、基本はこの3種8つの動きだけど、じっくり行うためのストレッチや、普段の生活の中で行えるストレッチも紹介されてる。

やってみた感想

ちょっとやってみた感想としては、これはかなり大変(^^;
まぁ、それだけ肩まわりの筋肉を普段使ってないということだけど。

肩こり(とそれによる頭痛)を解消していくために、今年はこれを少しやっていきたい。

今日はここまで!

肩こりすっきり スロー空手ストレッチ

肩こりすっきり スロー空手ストレッチ

  • 作者:髙橋 優子
  • 出版社/メーカー: プレジデント社
  • 発売日: 2017/07/28
  • メディア: 単行本(ソフトカバー)

2020年にやっていきたいこと。

f:id:yamaimo0625:20200101195517p:plain

あけましておめでとうございます!
今年もよろしくお願いします!

ということで、今年やっていきたいことのリストアップ。

体調管理

去年に引き続き、まずはコレ。
体調を崩すとどうにもならないので。

以下をやっていきたい:

  • SleepTownを使って睡眠リズムをキープする
  • ラジオ体操で体をほぐす
  • 整体に通って体の歪みを矯正する
  • プールに通って体力を向上する
  • スロー空手ストレッチで肩こりを解消する

勉強

自分の軸とするため、数理最適化の勉強をしていきたい。
強化学習のときと同じように、ブログにアウトプットしていくのもありかも。

また、Pythonを使って数理最適化や機械学習フレームワークにも触れていきたい。
実際にフレームワークに触れて実用性を実感できれば、Python嫌いも改善するはず。

あとは \TeXについてもっと詳しくなりたいかな。

同人活動

去年に引き続き、同人活動も続けていく予定。

とりあえず3/1(日)に技術書典8に出店するので、それに向けて新刊を用意している。
数理最適化の入門的な内容を書く予定。

今年は他にも、6月と11月に技書博、7月と11月に技術書典が予定されてるので、それに合わせて合計3冊、技術書を生やしたいところ。

他、勉強会に参加してLTでも発表していきたいな。
去年は2回発表したので、今年は3回発表するのを目指そう。

転職活動

そして、コレ。
経済的に安定させないと。

未経験の分野に飛び込まざるをえないのでかなり不安なんだけど、まぁやるしかない。
まだやってないから不安なだけで、やってみれば具体的な課題もみえてそれに対する改善もできるだろうし。

今日はここまで!