読書メモ:初めての自動テスト(1)

テストのピラミッド

テストの3つの層・アプリケーションアーキテクチャの3つの層

  • UI (→UIテスト)
    • E2Eで動くテスト
    • 遅く、壊れやすい
  • サービス(→総合テスト)
    • UIを通過せず、サービス層をテストする
    • 問題のある箇所を特定するのには向いていない
  • ロジック(→ユニットテスト)
    • 高速で正確
    • 全体が繋がっているかという観点は向いていない

覚えておくこと

  • UIテストよりユニットテストを優先する
  • ユニットテストで埋められない部分を統合テストでカバーする
  • UIテストは限定的に行う
  • すべて自動化しようとしない。過不足なく自動化すること。
  • 新しいテストを追加するときはまずユニットテストで対応できないか考える。
  • 上層のテストは下層のテストを内包しているが、意図とスコープが違う。

初めての自動テスト ―Webシステムのための自動テスト基礎

初めての自動テスト ―Webシステムのための自動テスト基礎

読書メモ:道具と機械の本(1)

新装版 道具と機械の本――てこからコンピューターまで

新装版 道具と機械の本――てこからコンピューターまで

これがめちゃめちゃ楽しい本で、いろんな機械の仕組みがかわいいイラストで解説されている。
本の構成も良く、機械の目的ではなく、仕組みで分類されているので
同じ仕組みが全然別の機械で使用されていたりして思わぬ発見がある。

第1章は力学的な機械についての解説。
自動車の部品の図解が多いのは執筆された年代によるものなのか・・それとも自動車の部品についてはみんな仕組みを知っているものなのかな。
私は全然知らなかったので面白かった。

リビングに開きっぱなしにして置いておいて、寝る前とかに数ページ読んでいる。
美味しいお菓子をちょっとずつ食べるように楽しめる本。
メモ書きにしちゃうと全然面白そうに見えないけれど・・・。

動きのカラクリ

力学的な機械とは

「決まった量の力をかければ、ちょうどぴったりな量の動きが、ぴったりな場所で正確に起こるようにする」 機械。
てこ・歯車・ばね

力学的な機械のしていること

  • あるかたちの動きを別のかたちの動きに変える
  • 力の大きさを変える
  • その力をちょうど良い場所へかける

結びつける力

地球上のすべてのものには物と物を結びつける力が働いている。

1.重力 1.原子と原子の間に働く電気の力 1.原子力原子核の中の粒子と粒子を結びつけている力)

機械に利用されているのは1、2

エネルギー保存の法則

力学的な機械から得られるエネルギーの量は、最初に機械に加えられたものと等しく、多くなることも少なくなることもない

斜面

  • 斜面を利用すると、重いものをある高さに持ち上げるための力を少なくすることができる。(その分距離がふえる)
  • 斜面を利用している機械では・だいたい楔として使っている
  • 切る道具(はさみ・おの・バリカン・缶切り)
  • すき・ファスナー

てこ

第1種のてこ

  • 支点がつねに作動力と荷重の中間にある
  • てこが動かなくなったときに作動力と荷重がつりあっていることになる
  • 釘抜き・天秤・はさみ

第2種のてこ

  • 作動力はつねに荷重よりも支点から遠いところにかかる
  • つねに力を拡大する・動く距離は縮小される
  • 手押し車・せんぬき

第3種のてこ

  • 作動力はつねに荷重より支点に近いことろにある
  • 動く距離が拡大される・力は縮小される
  • ハンマー・釣竿・毛抜き

てこの働きを組み合わせた道具

体重計・自転車のブレーキ・高所作業車・爪切り

車輪・車軸

  • 固定した中心点のまわりを回転する・回転するてこ
  • 力の伝達
  • ネジまわし・スパナー・
  • 水車・風車・歯医者のドリル

歯車・ベルト

歯車は機械の中で噛み合って、動き・力を伝達。

歯車の種類

ラックとピニオン歯車

回転運動を往復運動へ変化させる

平歯車

同一平面でかみあって、速度や力を調節・回転方向を逆にしたりする

かさ歯車

回転の方向をかえ、速度と力を変える。

ウォーム歯車

回転の方向をかえ、速度と力を変える。

歯車とベルト

歯車の回転方向は変わらない

カム・クランク

カム・歯車が回転して突起がロッドのところにくると動く
クランク・車輪が回転するとロッドが前後に動く

ミシン・自動車のエンジン

滑車

ものを動かす方向を変える
作動力は荷物の重さ+摩擦などに打ち勝つ力 がいるので荷重よりもつねに大きくないといけない

連結された滑車は力を大きくする

チェーンホイスト・クレーン・エスカレーター・エレベーター

ねじ

ものとものを大きな力でつなぎ合わせる
斜面が円柱のまわりにまきついたもの。斜面の力と同じで、まわすのにつかった力よりずっと大きな力でねじ込まれていく
摩擦が動いてネジがものから抜けるのを防ぐ

蛇口・ドリル・トンネル掘進機

回転する車輪

  • 首ふり運動
  • 慣性
  • 遠心力

ろくろ・ターンテーブル シートベルト ジャイロスコープ・平行機

ばね

  • もとの形にもどるバネ
  • 力を測定するバネ
  • エネルギーをためるバネ

 弾性力

分子の相互作用によって弾性が働く。

摩擦

物体が擦れ合う時に必ず発生する力。表面の分子同士が引きあうちから。 2つの面が強く押し付けられていればいるほど強く働く。

自動車のタイヤ・パラシュート

摩擦からの解放

機械の性能は摩擦によって制限されるので摩擦を減らして効率を良くする。 ボールベアリング・潤滑システム

宇宙空間では摩擦がない。永久運動をする。

読書メモ:プログラマの数学(5)

順列・組み合わせ

数えることは整数との対応づけ

  • 数えることは 数えたいものを整数に対応づけすること
  • 数えるときはもれ・ダブりに注意する
  • 数えるルールをつくるために、数えたいものがどんな構造をしているか・どんな性質を持っているか理解する。

数え上げの法則

法則自体は丸暗記するひつようはなくて、各法則がどのようにして「もれなく」「だぶりなく」を実現しているかに注目するのが大事。

植木算

植木算

  • 0のことを忘れない。
  • 数が小さいときは数えても確かめられるが、大事なのは一般的なルールとするとどうなるか、を考えること。
  • k個目はk-1

和の法則

  • 2つの集合にわかれているものを数えるときに使える
  • 和の法則が成り立つのは、集合の要素にダブりがない場合のみ
  • 素数と要素数を合わせてから、ダブった要素数を引く
  • 包含と排除の原理

積の法則

  • 「それぞれに対して」というフレーズがあるときは掛け算すると数えたい数が求まることが多い

置換

  • n個のものを順序を考えて並べることを置換という
  • たとえば・・3枚のカードの並べ方は1枚めの選び方は3通り、2枚めの選び方は1枚め以外のカード2枚から選ぶので、1枚めの選び方ぞれぞれに対して2通り、3枚めは残り1枚を1枚めと二枚めの選び方ぞれぞれに対して1通り・・なので321
  • 1こづつ減っていく掛け算を階乗という
  • 表記は n!
  • 0の階乗は1と定義されている(最初?だったけれど、1章ででてきた0の用途がこれ)

順列

  • たとえば・・・5枚のカードから3枚を選んで順番を考えて並べるとき、1枚めの選び方は5通り、そのそれぞれに対して2枚めの選び方は4通り、そのそれぞれに対して3枚めの選び方は3通りある。
  • 一般化するとn枚のカードからk枚を選んで並べるとき、k枚目の選び方はk-1までの選び方ぞれぞれに対してn-k+1通りある。→(n-0),(n-1),(n-2)・・(n-(k-1))までを全て掛け算している
  • 5枚から0枚選ぶ順列の総数(どうやって表記したらいいのかわからない・・5P0というやつ)は1と定義されている

樹形図

「3枚のカードから3枚を並べる順列」と、「3種類のカードから重複を許して3枚を並べる順列」は樹形図を書くと違いが一目瞭然。 樹形図は数えるものの性質を見抜く道具として使える。

組み合わせ

順序を考えずに選び出す

  • 数え方 順列と同様に「順序を考えて」数え、そのあとに重複してしまった分(重複度)を割り算する。
  • 重複度は順序を考えて重複してる分なので、置換の総数のこと

置換と順列と組み合わせの関係の図がめちゃわかりやすい
「3枚の置換」×「5枚から3枚を選ぶ組み合わせ」= 「5枚から3枚を選ぶ順列」

プログラマの数学

プログラマの数学

読書メモ:プログラマの数学(4)

数学的帰納法

ある主張が成り立つことを0以上のすべての整数について証明する方法。
数学的帰納法は2つのステップで行う

  1. P(0)が成り立つ ことを証明する(基底)
  2. 0以上のどんな整数kを選んでも、P(k)が成り立つならばP(k+1)も成り立つことを証明する(帰納

ドミノだおしに例えると

  1. 最初のドミノが倒れることを保証する
  2. k番目のドミノが倒れたならばk+1番目のドミノも倒れることを保証する

プログラムで書くと

prove(3);
function prove(n){
    console.log(`いまからP(${n})が成り立つことを証明します`);
    let k = 0;
    console.log(`ステップ1により、P(${n})が成り立ちます`);
    while(k < n){
        console.log(`ステップ2によりP(${n})が成り立つならP(${n+1})も成り立つと言えます`);
        console.log(`従って、P(${n+1})が成り立つといえます`);
        k++;
    }
    console.log(`証明終わり`);
}

印象的だったのは、著者が昔、数学的帰納法がわからなかったというエピソードのところで
「p(k)はいまから証明しようとしている式なのに、それを仮定してしまったら証明にならないはずだ」←そうだった、わたしもそう思ったことある、わかる!
「いま思えばproveの引数n(目標にしている数)とproveのローカル変数kを混同してしたのですね」←ほんとだ〜〜!
という感じで、10年越しくらいにもやっとしていたことがわかってすっきりした〜 プログラムがちょっとでもかけるようになってよかったなぁ

ループ不変条件

ループを構成するときにはループの各回で成り立っている論理式をみつけることが重要! この論理式のことを「ループ不変条件」という。 ループを作るときにはこのループの不変条件はなにか?を考えて作ると誤りが少なくなる

プログラマの数学

プログラマの数学

読書メモ:プログラマの数学(3)

剰余

剰余は周期性をみつける道具

  • 剰余を使って考えると周期性をみつけることができる。
  • 周期性を見つけると、大きな数の問題を扱いやすくなる。(一億日後は何曜日か?とか)
  • 10の100乗みたいに解く数がとても大きくなっても、同じように位をあげながらあまりを書き出していくと周期性を見つけることができる。
  • 「物事を詳しく調べよう」というときに、「こまかいところまで正確に把握しよう」ではなく、「的確な分類」の方が役に立つときもある。

周期性の見抜き方

  • あんまりにも大きな数を調べたい時・・・今調べる必要があるのはどの位の数なのか?を考える。
  • パリティチェックだとたくさんの並べ方があるけれど、奇数と偶数の2グループに分けて考える。(最後の1ビットがどちらに所属するかを示している。)

プログラマの数学

プログラマの数学

読書メモ:プログラマの数学(2)

理論

なぜ理論が必要なのか

  • 自然言語のあいまいな部分をなくす。理論式で仕様書を表現しようとするとあいまいなところを見つけることができる。
  • シンプルで理解しやすい式に変換することができる

理論の言葉

命題・真偽

  • 命題:正しいか正しくないかを判断できる式
  • 真:命題が正しいとき「真である(true)」という
  • 偽:命題が正しくないとき「偽である(false)」という

もれ・だぶり

  • もれがないこと(網羅的であること)→ そのルールがどんな場合にも適応できる
  • ダブりがないこと(排他的であること) → そのルールに矛盾がない
  • もれ・だぶりがないことは数直線を書くとわかりやすい 

withdom.jukendou.jp

  • 網羅的で排他的な分割をすると大きな問題を解きやすく分解することができるようになる。
  • 問題の分割はプログラムの中でいうとif文の部分。一つ一つは単純でも組み合わせると複雑になりバグが生まれやすい。if文を書くときは「網羅的で排他的である」のを意識する必要が有る。

命題を組み合わせて新しい命題を作る

  • 否定:「〜ではない」という命題を作る演算。
  • 二重否定は元に戻る
  • 論理積:「AかつB」という命題を作る演算
  • 理論和:「AまたはB」
  • 排他的論理和:「AまたはB(でも両方ではない)」
  • 等値:「AとBは等しい」
  • 含意:「AならばB」

論理包含 - Wikipedia

ド・モルガンの法則

ド・モルガンの法則 - Wikipedia

  • 理論式の相対性:理論式の中のtrueとfalse、Aと¬Aと、またはとかつを交換すると論理式全体を否定した式ができる。

カルノー

複雑な理論式を整理するための図

カルノー図 - Wikipedia

  1. 命題の取り得るすべての真偽値の組み合わせに対応した図を書く
  2. チェックをつける
  3. 隣接するチェックマークを囲うグループをつくる(できるだけ大きく・重なっていてもOK
  4. 作ったグループをあわらす式をつくる

未定義

  • true/falseのどちらも得られないとき undefined(未定義)
  • 3値論理での論理積(条件付き論理積)→ &&
  • 3値論理での論理和(条件付き論理和)→ ||
  • 3値論理での否定→ !

読書メモ:プログラマの数学(1)

数え方と0の役割

数が大きくなってくると扱うのがむづかしいのでいろいろ数え方が生まれた

大きくなってきたら 小さな「まとまり」に分けて解く

位取り記数法(くらいどりきすうほう)

位取り記数法 - Wikipedia

2進法・16進法など

  • 普段使っているのは10進法(10で位が上がる)
  • 2進法はコンピュータで使われる(桁数は多くなるが数字の種類は少ない・コンピュータでは10進数より扱いやすい)
  • コンピュータを使って計算するとき10進法を2進法に変換し、2進法を使って計算して10進法にしている
  • 記数法ではない数え方もある(ローマ数字)

指数法則

指数法則

10の0乗は1の考え方

10の0乗→10を0回かけた数と考えずに、10の3乗・10の2乗・10の1乗は・・と考えていくときルールがシンプルになるには10の0条がなんであれば妥当か と考える

0の役割

  • 場所の確保(100 1の位には何もない)
  • パターンを作ってルールをシンプルにする

プログラマの数学

プログラマの数学