読者です 読者をやめる 読者になる 読者になる

$shibayu36->blog;

プログラミングの話や自分の考えを色々と書いています。

田中圭一さんの「うつヌケ」を読んで欲しい

book

田中圭一さんの「うつヌケ」というコミックエッセイを読んだ。とにかくむちゃくちゃ良かった。

いろんな人にインタビューしていて、それぞれごとに「なぜうつ病になったか」「うつ病になってどうなったか」「どうやってうつ病から脱出できたか」が語られる。そのため、うつ病になっている人がどうやって戻ればいいかとか、うつ病になりそうなのをどう止めるかなどを知ることができる。ちなみに自分はうつ病経験者で、2か月ほど休職もしているので、全ての事例であるある集を眺めている感じだった。

今まさにうつ病に苦しんでいる人も参考になると思うけど、個人的には次のようなうつ病になりやすそうな人にこそ読んでして欲しいと思った。

  • 劣等感を感じやすい人
  • 責任感の強い人
  • ちょっとしたことで不安を感じやすい人
  • 不眠や過眠を経験したことがある人
  • 朝起きて今日一日嫌だなーと思ったことのある人
  • etc

以上のような人は、いつでもうつ病になる可能性があると僕は思っている。そういう人に、他人にヘルプを出すハードルや、病院に行くハードルを下げてもらうためにも是非読んで欲しい。ヘルプを出せたり、うまく逃げることさえ出来れば、うつ病で死ぬこともないと思う。

何度も言うけど、最近ちょっとでも精神的に辛いと思っている人はとにかく読んでくれ。

「数学ガール/乱択アルゴリズム」を読んだ

tech book

アルゴリズム読み物を読みたくて、いろんなところでオススメされている数学ガール乱択アルゴリズムを読んだ。なかなか興味深かった。

数学ガール/乱択アルゴリズム (数学ガールシリーズ 4)

数学ガール/乱択アルゴリズム (数学ガールシリーズ 4)

この本で興味深かったことは以下の二点。

  • 具体例 -> 規則性 -> 一般化で考える
  • アルゴリズムの実行ステップ数の数学的な解析

具体例 -> 規則性 -> 一般化で考える

この本で、問題を考えるときは、具体例を考える -> 規則性を見つけ出す -> 一般化する、という3ステップで考える、ということが書かれていた。

例えば「n枚のカードを一列に並べる方法は、全部で何通りあるか」という問題を考えてみる。この時、n枚のカードのまま一般的に考えようとしてよく分からなくなってしまうという失敗をしてしまうことが多い。そうではなくて、

  • まずは1枚ならどうか、2枚ならどうか、3枚ならどうかと具体例を考える
  • 具体例を見つめて、規則性を探し、イメージを付ける
  • 最後にnの場合でどうなるか、一般化して考える

と、3ステップで考えると良い。


このことは非常に当たり前のことなんだけど、なぜかいつも慌てて一般的に考えて理解不能に陥ることが多い。そのようにならないように、具体例 -> 規則性 -> 一般化という言葉を頭に留めておきたい。

アルゴリズムの実行ステップ数の数学的な解析

この本で特に興味深かったのは、アルゴリズムの実行ステップ数を解析する部分。普通のアルゴリズムの書籍だと、ループの回数の解析でリニアサーチはO(n)、バイナリサーチはO(log n)、バブルソートはO(n^2)、クイックソートはO(n log n)のように説明されていることが多い。しかし、この本では擬似コードの1行1行の実行ステップ数を考え、それを数学的に計算することでオーダーを求めるという、別視点での解析をしている。解析方法にもいろいろあることが知れたのが良かった。

以下のアルゴリズムを数学的に解析しているので、興味があれば読んでみると良さそう。

まとめ

アルゴリズム読み物として、数学ガール/乱択アルゴリズムを読んだ。読み物はいくつも読んだし、少し飽きてきた部分もあるので、とりあえずアルゴリズム読み物系は置いておき、本格的にアルゴリズムの勉強をしようかなと思う。

今は文字列関係のアルゴリズムに一番興味があり、また最近Elasticsearchを触ることもあったので、全文検索エンジンを実装することでアルゴリズムの学習を進めていきたい。あとdiffのアルゴリズムも興味があるので、そのあたりも機会があったらやっていきたい。あとはきちんとアルゴリズムクイックリファレンスを読んでおきたい。

検索エンジン自作入門 ~手を動かしながら見渡す検索の舞台裏

検索エンジン自作入門 ~手を動かしながら見渡す検索の舞台裏

diffの動作原理を知る~どのようにして差分を導き出すのか|gihyo.jp … 技術評論社

アルゴリズムクイックリファレンス 第2版

アルゴリズムクイックリファレンス 第2版

読書ノート

  • アルゴリズムの持っている特徴は、入力・出力・明確性・実効性・有限性 41
    • 入力があると、その出力が存在する
    • 手順が明確である
    • 手順を実際に行うことができる
    • 実行時間が有限である
  • 40ページから、リニアサーチのアルゴリズムの解析が始まる。ここでいつもだったら特に検討せずにO(n)とか話すことが多いが、ちゃんと実行ステップを計算していくのが良い。
  • 問題を考えるときは、具体例を考える -> 規則性を見つけ出す -> 一般化する、というフローで考えていく 73
  • オーダーの記法
    • Θ記法: ちょうどf(n)のオーダー
    • Ω記法: 少なくともf(n)のオーダー
    • O記法 : たかだかf(n)のオーダー
  • オーダーを表す時、logに底を書かない理由 203
  • バイナリサーチの実行ステップ数を数学的に解析する方法が210から始まる 210
  • バブルソートの実行ステップ数の解析 225
  • 比較ソートの最大比較回数が少なくともn * lognのオーダーになるかを、比較木を利用して証明する 229
  • クイックソートの実行ステップ数を数学的に解析する 390

パーフェクトJavaを読んだ

tech book

最近アルゴリズムの勉強でJavaを使っていて、いい機会だしどうせならJavaの言語の詳細な機能や考え方などを知りたいと思っていた。Javaをやっている人に聞いてみると「パーフェクトJava」が良いということなので読んでみた。

改訂2版 パーフェクトJava

改訂2版 パーフェクトJava

おすすめされたとおり非常に良かった。Java8に対応していて、Java8ならどう書くかを知ることが出来たし、クラスやインターフェースの構文の細かな詳細、コレクションの使い方や内部実装、ラムダ式の使い方や考え方、さらにはそれぞれの機能の内部まで細かく眺めることが出来た。Javaはこれまでの歴史からインターネット上には古いコードが無限にあるので、こういう本が一冊リファレンスとしてあるのはありがたい。

この本の中で個人的には以下の章が特に面白かった。これまでの経験から基本的な構文はすんなり理解できるので、ちょっと込み入ったものを面白いと感じたようだ。

  • 5章 クラス
    • とにかくクラスの構文がここまで幅広いのかということが分かった。内部クラスがどう扱われるのかなどが面白そう。
  • 8章 ラムダ式とストリーム
    • 単なるラムダ式の使い方だけでなく、関数型インターフェースがJavaでどのように導入されたかなどのことも知ることが出来た。
  • 15章 ジェネリック
    • ジェネリック型はよく使いたくなるので、どう使うのかがパッとわかったのが良かった
  • 18章 リフレクション
    • 型自体の情報を取り扱う方法を知れた。メタプログラミング的なことをしているコードとかを読むことも多いと思うので、参考になった。これでnanobenchのコードを読める。
  • 19章 アノテーション
    • Javaでよく使われているアノテーションの内部について知ることができた。かなり色んな所に適用できると感じた。

これでとりあえずJavaという言語自体をざっくり学ぶことが出来た。あとはJVMの扱いとか、JVMの内部などを知りたいのだけど、この本には載っていなかった。JVMについて知れるおすすめの資料はどれだろうか...