Pythonプログラミング独学実況中継

40歳未経験者がPythonプログラミングの勉強をメインに、読書や京都のことを書いていく。

『詳解Linux第3版』を読んでいる。

こんにちは。

『詳解Linuxカーネル』を読んでいます。
1000ページほどもあってかなり分厚い本です。

購入してから当分、積ん読していましたが、
Linuxのスゴさに気づいて、
興味がわいたので読みはじめました。

概要としては、メモリ管理や時間管理、
ファイルシステムなどのLinuxカーネルの仕組みと
こうした仕組みを実現するためのコードを
勉強できる内容となっています。

普段から何気なく使っているパソコンですが、
どんな仕組みで動いているのか、
説明しようとしたり、コードがどうなっているのか、など分からないことだらけです。

例えば、パソコンを開いていて、コーヒーを入れて帰って来ると、デスクトップにパスワードの入力画面に変わっていることがあります。これも最後にユーザーが入力してからの時間をOSがカウントしていて、一定時間が来ればロックがかかるような仕組みになっています。単純そうですが、これをどうやって実現したらいいのか、自分で考え出すのはかなり難しいです。その辺りの仕組みや実装コードがかかれているので、読んでいると面白いです。

ただ、専門用語がどんどん出てくるので、
読みはじめて3ヶ月位は全く内容が
頭に入らない状態が続きました。

コードがある自分で再現できる位にはなりたいと考えています。

『プログラミングコンテストチャレンジブック(第2版)』の読み方

こんにちは。

Pythonの基本的な文法は一通り学んだので、
最近はアルゴリズムの勉強をしている。

使っている本は
プログラミングコンテストチャレンジブック』

アルゴリズムに関する標準問題や解法とコードが
のっていて、大学受験の数学の問題集みたいな感じ
なので勉強しやすい。

カバーしている範囲は広くて、アルゴリズム
定石をだいたい勉強できるのではないか、と思う。

問題は実際にPOJなどに出題されたものが
使われているけど、難しくて文法を一通り
終えたぐらいでは解けない。

定石のアルゴリズムについては理解していて、
コード化のテクニックも知っておかないと、
解けない。

例えば、フィボナッチ数列の第N項を求める
問題では、行列の積を使っているが、
普通に考えてループを使ってコードを
組むと時間が足りない、となる。

あと、計算幾何の凸包や
ネットワークフローの最大流最小カットなど、
知識量がかなり必要である。

背景となる知識が足りなくて、
この本だけでは理解できないところは、
アルゴリズム・イントロダクション』を
参考するようにしている。

問題を自分で解こうとして考えるのに、
あまり時間を費やさないようにしている。
問題に対して、定石のアルゴリズムをいかに
適用させるのか、なので定石を一から発見
するのは難しいし、時間がいくらあっても
足りない。

理解して、コードの実装をみにつけて、
知識のストックがあれば、あとは問題を
いかに知っているアルゴリズムと結びつけるのか、
について訓練する。

『プログラミングコンテストチャレンジブック(第2版)』

こんばんは。

『入門Python3』などで、基本的な文法は
使えるようになったので、ためしに
paizaやプログラミングコンテストなどの
問題に取り組んでみた。

単純に、リストとか、for文とか、
文法を知っていれば解ける問題であれば
対応できるけど、例えば、フィボナッチ数列
第N項を求める問題だと、数式をそのまま素直に
コードにしても、時間がかかりすぎてアウトに
なったり、もっと違う知識が必要だと感じた。

そこでこの本にとり組んでいる。

読み方については、昔やった受験数学と同じで、
問題を自分で解いてみて、分からなければ
解説と解答コードを理解する、という方式を
とっている。

自分で解くことにこだわらないで、
あまり時間をかけずに、
解法やコードの組み方を理解して
身につけることに重点をおいている。

結局、プログラミング特有の解法を知らないと
解きようがなかったり、自己流のコードを
組んでも良くなかったりするので、
分からないところは、とっとと解法を
覚えるようにしている。

応用問題を解くには、
解法を複数覚えておいて、
そのうちのいくつかを素早く
組合せて解くものなので、
解法を知らない状態だと徒労になって
時間がもったいないと思う。

高校生のときは「数学を暗記科目とするのは悪」
みたいなところの本質を理解していなくて、
ムダに時間を使ってしまったことがある。

分からないところがあれば「巨人の肩にのる」。
そうしないといくら時間があっても足りない。

今のところ、この本にのっている問題の解法と
コードについて、理解して、身についている
(すぐに解答コードを再現できる)状態に
なることを当面の目標にしている。

解答やコードで、理解できないところがあれば、
とりあえず一旦、手書きで紙に写してみて、
次の項目に移る。そして、三日後位に、
もう一度、読み返したり、手書きで写したりする。

「手書きで写す」のは、ムダだと考えていた時期
もあったけど、有効だと感じている。

あとは、アルゴリズムに関する他の本を
読むと、同じ対象について違う角度から
書かれているので、理解が進んだり、
誤解していたのを修正できたりする。

『アルゴリズム実技検定(エントリ―~中級)』に取り組んでみた。

こんばんは。

以前、paizaのスキルチェック問題に取り組んだ
ところ、コードの出だしで必要になるデータ入力
のところで、戸惑うことがあったので、
何かアルゴリズム問題の「解法の定石」みたいな
のが書いてある本を探していました。

いくら考えても知らないと分かりようが
ないところに時間をかけるのはムダなので。

本屋で立ち読みして探していると
アルゴリズム実技検定」問題集を見つけました。

paizaスキルチェック問題と似たような
例題がのっていたし、その問題のPython
解答コードが、書いてある形式だったので、
やってみました。

この本のおかげで、スキルチェック問題に
取り組んでみても、以前のように、
簡単なところで詰まることが、かなり
減りました。

もっと本質的な、どの解法やアルゴリズム
使えばいいのか、を考えることに
時間を使えるようになりました。

難解な本の取り組み方

こんばんは。

これまで難解な本に取り組もうとして、
何度も挫折してきました。

例えば「コンピュータの数学」。
分厚くて重たくて威圧感のある本ですが、
中を見ると「Σ」「lim」「Γ」をはじめとして
数式が多数書いてあります。

「Σ」も高校数学で習うような、
単純なものではなく、格段に複雑なものです。

こういう本を読み通すには、
どうすればいいのか、
いろいろ試行錯誤してきました。

「最初から完璧に理解していけばいい」

と、考えて1頁目から積み上げるように読んで、
分からないところがあれば、もう一度、
最初に戻って読み直す方法をやってみましたが、
すぐに挫折しました。

分からないところがありすぎて、
1ヶ月たってもぜんぜん進まずに
イヤになってやめました。

次は、「知識量が不足しているから読めない」

だろうと、考えて他の参考書にあたってみましたが、「コンピュータの数学」はレベルが違いすぎて、ほとんど参考になるものは見あたりません。

仕方がないので、「同じ本を繰り返し読む」方法で今はあたっています。

今のところ、挫折はせずに継続できています。

一番、読む際に役に立ったのは「一読しただけでは理解できない。ただ、何度も繰り返し読んでいるといつの間にか、理解できている」と考え方を改めたことです。

「理解できた」と感覚的に思えるのは、
何回も読んでいるうちに、何となく
書いてあることを思い浮かべられるよう
になって「あー、あれか」というふうにつながって、腑に落ちた感じになります。

意味はわからないまま、本を読んだり、
内容を書き写したり、とにかく継続して
触れていると、いつの間にか、
身に付いたり、理解できています。

ただし、ここに至るまでにはかなりの時間が
かかりますが、そんなことは考えずに、
とにかく触れている時間を費やします。

「1日勉強したけど何も頭に残ってない」
となるとムダに時間を使ったと、以前なら
ネガティブに陥ってましたが、今では
考え方を改めると焦りがなくなりました。

この考え方でもって、難解な本にも
臆せず取り組めるようになりました。

『OS自作入門』に取り組んで2ヶ月たった。

こんばんは。

『OS自作入門』のコードを写経しながら、解読を続けています。1日の中でも勉強にかけられる時間は、1時間にも満たないですが、2ヶ月ほど、続けています。

C++については、ほとんど知らない状態だったので、ググったり、『ロベールのC++入門講座』で調べながら読んでいます。あとは、メモリ管理でアセンブリ言語を使うところがが出てくるとさらに難易度が上がります。

とにかく、何度も繰り返し読んだり、書いたりして、今では、こういう結果が欲しいときには、こんな感じのコードになるかな、みたいなところまではぼんやり思い浮かべることができるようになりました。

読み始めた頃はサッパリ、コードをみてもぜんぜん意味がわからない状態が続いていましたが、何度も見ているうちに、例えば「ターミナルにカーソルを表示して、文字入力する位置にて点滅させる」の具体的な実装について、少しずつコードの組み方が思い付くようになってきました。

本書にはかなりの数のコードが記載されていますが、一番はじめののコードから一つずつ、完璧に理解して、読み進めようとすると、読むのが苦痛になって挫折していただろうな、と思います。

そういう読み方はしないで、分かっていなくてもざっくり一通り読んで、繰り返し読む方法をとることで、挫折しなくて続けられています。

理解度は、線形で時間にしたがって真っ直ぐ上がって行くというのではなく、指数関数的に時間がたつにつれて、上がるイメージに近いと感じます。

なので、最初の1ヶ月間はぜんぜん分からなくても、ぜんぜん気になりません。

コードについては、「マウスを動かして画面上のポインターを動かす。クリックしてターミナルをアクティブにして、ドラッグする」とか、「ターミナルのカーソルを点滅させる」とか、いろいろなパターンがありますが、複数のコードを並行して眺めていると、「ここで定数を定義するのは、こういう意味があるのか」とか、C++のコードの書き方などが、分かる瞬間があります。

なんとか年内には読みきりたいところです。

速読は読む本によると感じる。

こんにちは。

本屋に週一回は行くのが習慣です。

読書法や勉強法に関する本が増えたな、と感じます。とくにタイトルや帯に『速読術』『一回読んだら忘れない』などと書かれたものが多い。

速読については色々試したことがありますが、どれも自分には合っていなかったのか、うまくいったためしがありません。

1日5冊読めたらすごいな、と期待してハウトゥ本に取り組みますが、結局、速く読めるようにはならないのを実感しました。

速く読もうとしすぎて、文意が分からなくなったり、取り違えてたり、頭に内容が入ってこなかったり、マイナス要素が多かったので、今では速読系のハウトゥ本を読むくらいなら、さっさと読もうとしていた本を読む時間に当てた方がましだ、と思います。

あと、速読といっても結局、読もうとしている本の内容について、一定の知識量が頭に入っていないと、速読で理解できる訳ではない、と確信しました。

例えば、速読では数学書、定義と証明と数式の羅列なので、理解するのは絶対に無理なので。

読書ではスピードを意識しないようにしています。