CS50 2021 学習メモ
Lecture0
重要キーワード
-
バイナリ(binary)
2進法(基数を2とした0または1)で記載された数のことである
バイナリとは、2進数のという意味の英語である
私たちが普段使っている、10進数の2は2進数で10となる -
二進法
2進法とは、数を書き表す方法の一つで、基数を2(0または1)とした表現方法のことを指す
コンピュータ上ではテキストや画像も、0と1で表現できる形式に変換されて保存されている -
ビット
コンピューターで扱う最小のデータ単位のこと
0または1を入れる箱(1桁分)のことをビット(bit)と呼ぶ
n進数 = 箱の大きさがn-1 = 使う数字がn個
1ビットは2の1乗、2ビットは2の2乗、3ビットは2の3乗通り表現する事ができ、
2進数の3ビット(0~7)で表現できるのは、222=8 8通りとなる -
バイト
ビットが8個集まったものがバイトと呼ばれる 8bit = 1byte -
ASCII
米国規格協会(ANSI)によって定められた、コンピューターの情報交換用の標準コード
ASCIIはテキストをバイナリで表現する一つの決まりごととなる
世の中の言語を表現できるように拡張されたのがユニコード(Unicode)
RGB の比率を調整して、1byteで256通りの値が取れるので、大体の色のバリエーションを表現する事が可能
パーツ1つをピクセルと言い、それを集合させることで画像を表現する事ができる -
アルゴリズム
ある結果を出力するためのやり方、計算方法のことである
プログラムを書くときは、基本的には正確性を優先し、その上で効率を考慮する事が大事である -
関数
関数とは、コンピュータに何かをさせるための命令の集合である -
変数
変数とは、一時的にデータ(値)を格納しておくための仕組みである
Lecture1
重要キーワード
-
CUI
キャラクターユーザインターフェース(Character-based User Interface)の略
キャラクターとは、文字という意味であり、名前通り、文字で操作するインターフェースのことである
インターフェースとは、画面のことであり、ユーザーが操作する部分を表している
例として、cmd(コマンドプロンプト)が挙げられる -
GUI
グラフィカルユーザーインターフェース(Graphical User Interface)の略
グラフィカルとは、絵画的という意味であり、
ボタンであったり、マウス操作などを用いて感覚的に操作することを可能としている
スマートフォンや、pcの画面、ほとんどのものがGUIとなる -
コンパイラ、コンパイル
コンパイラとは、人間が書いたソースコードをコンピュータがわかるように機械語に変化するプログラムのこと
また、Cなどのプログラミング言語を機械語(バイナリー)に事前に一括して翻訳することをコンパイルと呼ぶ
コンパイラによって変換されるプログラミング言語のことをコンパイラ言語とも呼ぶ
例として、C言語、C++、Javaなどが挙げられる
それに対して、Python、JavaScriptなど一行ずつ翻訳を行うことをインタープリタと呼ぶ -
関数・引数・戻り値
関数(Function)とは、ある値を与えてある値を返すといった処理を部品化して再利用できるようにしたもの
関数の構造は、 型名 関数名(引数) {処理} である
型名: 計算結果を返すときに使う数値の種類のことである
関数名: 関数の名前のこと
引数: 関数に渡す数値の種類のことで、渡された数値をもとに計算を行なって結果を返す
処理: 関数を終了させる際にはreturn文を使用する、なにも返さない場合は0を返す
数学で言うと、y=2xの場合、xに2を入れたら4を返すような関数と言える
このとき、関数に与えるもの(x)を引数、関数から返される値(y)を戻り値と言う
また、最近では引数や戻り値のない処理のまとまりのことも関数と呼ぶ
引数や戻り値がないことをC言語ではvoidで表現し、voidを返すという
また、voidや0は省略することが可能である -
ライブラリ
英語でlibraryと書くように、プログラムの書庫を思い浮かべるのが適切である
誰かが書いたプログラミングコードを誰でも使えるようにしたものをライブラリと呼び、
それらを活用することで他の人が書いたコードを安易に実装することを可能としている
C言語において、最初に書かれる #include <stdio.h> もライブラリの一つである
この一文を入れることで、printfやscanfなどといった機能を使うことが可能となる
他にも、数学関数を簡単に用いることのできるmath.hであったり、時刻を呼び出すことのできるmath.hはC言語においてよく使われる
外部ライブラリを使う際は、これらのライブラリを使用する際にCUIでコマンドラインツール(Homebrew, npm, Composerなど)と呼ばれるものを用いて、ライブラリをインストールする
また、PythonやJavaScriptが人気とされる理由に多くのライブラリが存在することが挙げられる -
代入
変数に値(数値や、文字、数式など)を入れることである
代入をする際に、値の型を指定することが必要である -
\n(バックスラッシュn)
改行を表す -
ヘッダファイル
ヘッダファイルとは、.hという拡張子で作られたファイルのことである
プログラムが大きくなってくると、機能ごとに複数のファイルに分割を行う
ヘッダファイルには、関数宣言を記述する
ヘッダファイルをincludeする際は<>ではなく、ダブルクォーテーション""で囲んで呼び出す -
コマンド(ls, rm, mkdir, cd, rmdir)
- ls
list segmentsの略で、作業ディレクトリのファイルやフォルダを一覧表示する - rm
removeの略で、指定したファイルを削除する - mkdir
make directoryの略で、ディレクトリを新規作成する - cd
change directoryの略で、指定したPATHのディレクトリに移動する - rmdir
remove directoryの略で、指定したディレクトリを削除する
- ls
-
コマンドによるファイル指定( [~/], [..], [.])
~(チルダ)はユーザーのホームディレクトリ(ログインした際にいるディレクトリ)を示す
/(スラッシュ)で階層を表す
現在のディレクトリは ./で表し、一つ前(上)の階層は、../で表す
cd .. で一つ上の階層へ移動、 cd ../.. で二つ上の階層へ移動 -
C言語の型(string, int, long, float, char)
変数とは、データを格納しておく箱のことであり、それらの種類を示したものをデータ型と呼ぶ- string
文字列(単語や文章など文字の集まり)型 - int
32ビットで表すことのできる整数(-2147483648 ~ 2147483647)型、範囲は約±21億 - long
64ビットで表すことのできる整数(-9223372036854775808 〜 9223372036854775807)型 - float
小数型(浮動小数点数型) - char
文字型
- string
-
型のキャスト
型を宣言した際に用いたものとは異なる型に変換することである
(型)式で変換を行うことができる
float a = 1;
int b = (int) a; -
条件、ループ
- 条件
条件分岐には、if文またはswitch文を用いる
条件式に当てはまる場合、中括弧内の処理を実行してif文を抜ける
if(条件式) {
} else if(条件式) {
} else {
}
また、この際に用いる演算子として、 +(足し算)、-(引き算)、*(掛け算)、/(割り算)、%(余り)がある
条件式では、=を二つ繋げて==として比較を表す
switch分では、switch(式)で式を指定し、それに当てはまる値が1の時、case1:といったように条件分岐を行う
処理を抜ける際はbreak,また、どの条件にも当てはまらない時はdefault:で処理を指定する
switch(式){
case 定数:
処理;
breack;
default:
処理;
}
- ループ
ループには、while文またはfor文を用いる
while文の場合、条件式に当てはまる場合、中括弧内の処理を永遠にループする
while(条件式) {
}
- ブール式
boolとは、ブーリアン型(Boolean datatype)であり、真理値(true: 真、false: 偽)の2つの値を取る
Lecture2
重要キーワード
- make
makeは、C言語などコンパイル型のプログラミング言語で記述されたプログラムを容易にビルドするためのツールである。CS50においては、clangと呼ばれるコマンドの実行の自動化を行なっている。
clangを用いることでソースコードを実行可能な機械語に翻訳している(コンパイル)
アセンブリ出力(assembly output)を表す、a.outファイルが生成される
$ clang -o test test.c
与えられたtestにtest.cを翻訳したもの(実行可能なファイル)を出力結果に返すという意味
何も指定しなければ、a.outファイルが作成される
-
コンパイル(Week1より詳しい手順)
ソースコード → アセンブリ言語 → 機械語
過程で、#から始まるヘッダファイルを検索し、読み込んだプログラムをソースコードに落とし込む
つまり、#で横見込まれた複数のファイルを全て組み合わせて出力を行なっている
ただし、ヘッダーファイルは事前にコンパイラされたものがコンピュータの内部に保存されている(?) -
デバッグ、ブレークポイント、コールスタック
デバッグ: バグ(プログラムの誤り)の原因を探して修正を行うこと
昔、コンピュータの内部に虫が混入してしまったことでシステムに不具合が生じたことがバグの語源である
ブレークポイント: プログラムを実行する際に、強制的に実行を一旦停止する箇所のことを示す
コールスタック: どの関数が現在実行されているのか、その関数の中でどの関数が呼び出されたかを示す
一度コードをコンパイルし、ブレークポイント(コードの実行を一時停止する場所を設定した後、コード上でデバッグを実行する)で -
配列
値を入れることができる連続したメモリの塊のこと
配列のインデックスは0から始まり、3つの数値を格納したい場合、 int scores[要素数] = {1, 2, 3};といった形で記述する。 -
文字
アルファベットなどの半角文字のことである
文字型charは1バイトの情報量であるため、ASCII文字以外のひらがなや漢字などの代入はできない
シングルクォーテーションで括るのが一般的
char moji = 'A'; -
文字列
単語や文章など文字の集まりのことである
C言語においては、stringというデータ型は存在しないので、CS50のライブラリを用いている
ダブルクォーテーションで括るのが一般的
char mojiretsu[5]= "abcd";
文字列の場合、最後に文字列の終わりを表す \n(NULL)が格納されるため、要素数を+1で表示する必要がある -
コマンドライン引数
プログラムを実行する際にプログラムに渡す値のことである
コマンドライン(ターミナルなど)を用いて入力を行うため、コマンドライン引数と呼ばれる -
終了コード
終了コードとは、プログラムや関数が戻す処理結果の値のことである
Lecture3
重要キーワード
-
データ構造
-
線形探索
線形探索とは、左から右、あるいは同等に右から左に検索する一番シンプルな探索である
一般的には左から右へ探索することが多い
とりあえず何か要素を見つけたいときに使われる
上限: O(n)
下限: Ω(1) -
バイナリ検索(二分探索)
要素が順番通りに既にソートされている場合に使える探索
真ん中と比較して、それよりも大きいか、小さい要素であるかを確認を繰り返す探索である
上限: O(log n)
下限: Ω(1) -
構造体
何らかの構造を持つデータ型のこと
typedef と struct を用いることで、他の複数のデータ型を組み合わせた構造を持つ独自のデータ型を作ることができる。下記コードだと、personというカスタムデータ型を生成している
構造体を使うことで、データのつながりがわかりやすくなり、エラーを減らすことができる
typedef struct
{
string name;
string number;
}
person;
-
ソート
-
選択ソート
最小の要素を何度も選択することでソートする
最小の要素を見つけるために、配列の左から右に向かって与えられたデータ全ての要素と比較を行わないといけないのが欠点
上限: O(n^2)
下限: Ω(n^2) -
バブルソート
最大の数字がリストの一番上(最後)に向かって泡のように押し寄せていくことからバブルソートと呼ばれる
隣同士の要素を比較して、大きさが降順になっていた場合にそれぞれを入れ替えていく
与えられた要素によって、計算量が左右されやすいのが問題
上限: (n-1)(n-1) = n^2 - 2n + 1 = O(n^2)
下限: Ω(n) -
再帰
sum(n): 0からnまでの数の合計を返す関数 を考える
再帰的というのは、プログラムの中で同じ処理を繰り返しているときに、到達した点から逆向きに値を渡していくことで、最終的に求めたい値を求めることができる( 数学で言うと、漸化式のようなもの)
同じような処理を階層の中で繰り返して行なっていく
関数の中で同じ関数を呼び出すことができるようなプログラム
>>> sum(3)
sum(3) = 3 + sum(2)
sum(2) = 2 + sum(1)
sum(1) = 1 + sum(0)
sum(0) = 0
- マージソート
2つの数列を併合していくソート
細かいグループにどんどん分けていき、その中でソートを行なって、小さな枠組みマージをしていく
また、それぞれの要素を比較してより大きな枠組みでマージを行なっていく
runoff
決選投票問題
- 有権者は自分の好みの候補者をランク付けする
- 候補者が過半数の票を獲得した場合、その候補者が勝者となる
- そうでなければ、得票数の少ない候補者を排除し、その候補者なしで選挙をやり直す
./runoff Alice Bob Charlie
Number of voters: 5
Rank 1: Alice
Rank 2: Bob
Rank 3: Charlie
Rank 1: Alice
Rank 2: Charlie
Rank 3: Bob
Rank 1: Bob
Rank 2: Charlie
Rank 3: Alice
Rank 1: Bob
Rank 2: Alice
Rank 3: Charlie
Rank 1: Charlie
Rank 2: Alice
Rank 3: Bob
Alice
準備
$wget https://cdn.cs50.net/2020/fall/psets/3/runoff/runoff.c
コーディング
-
vote関数の実装
name(投票された名前)が候補者の名前と一致する時、preferencesを更新する
投票者iのj番目の投票に立候補者のインデックス(candidate_count)を入れる -
tabulate関数の実装
脱落者でないかどうかを判断し、脱落者でない時、投票数をプラスする -
print_winner関数の実装
候補者が過半数の表を持っている場合、その名前をstdoutに出力し、関数はtrueを返す
誰も選挙に勝っていない場合は、関数はfalseを返す -
find_min関数の実装
選挙に残っている候補者の最小投票総数を返す
候補者をループして、選挙に残っているかつ投票数が最も少ない候補者を探す -
is_tie関数の実装
選挙に残っている全ての候補者の投票数が同じ場合はtrueを返し、そうでない場合はfalseを返す
また、この関数は引数min(候補者の最小投票数)を受け取っている -
eliminate関数の実装
投票数がminとなる候補者を除外する
tideman
順位選択制選挙
- Tally : 有権者が候補者のランク付けを行ったら、候補者のペアごとに勝者を決定する
- Sort: 候補者のペアを勝率の高い順に並べ替える(降順でソート)
- Lock:最も強いペアから順に候補のペアを調べ、そのペアを固定してもグラフにサイクルが生じない場合、各ペアを候補者グラフに固定していく
- グラフの開始点となる人が選挙の勝者である
./tideman Alice Bob Charlie
Number of voters: 5
Rank 1: Alice
Rank 2: Charlie
Rank 3: Bob
Rank 1: Alice
Rank 2: Charlie
Rank 3: Bob
Rank 1: Bob
Rank 2: Charlie
Rank 3: Alice
Rank 1: Bob
Rank 2: Charlie
Rank 3: Alice
Rank 1: Charlie
Rank 2: Alice
Rank 3: Bob
Charlie
事前準備
$ wget https://cdn.cs50.net/2020/fall/psets/3/tideman/tideman.c
コーディング
-
candidates
- 候補者名の配列
-
preferences
- 二次元配列
- preferences[i][j]は、候補者jよりも候補者iを好む有権者の数
-
pairs
- ある候補者が他の候補者よりも優先されるすべてのペアの配列
-
locked
- 候補者のグラフを表す2次元ブーリアン配列
- locked[i][j]は、候補者iから候補者jへのadgeポイントを固定したことを意味する
-
vote関数の実装
name(投票された名前)が候補者の名前と一致する時、配列ranksを更新する
ranks[i]は投票者のi番目の選好を表す
ranksを正常に更新できた場合、この関数はtrueを返し、そうでない場合(nameが候補者ではなかった場合)はfalseを返す -
record_preferences関数を実装
グローバル関数preferencesを更新して現在の投票者の選考を追加する
preferences[i][j]は、候補者jよりも候補者iを好む投票者の数を表す必要がある -
add_pairs関数を実装
グローバル変数pair_countを更新して、候補者のペアの数にする必要がある
(ペアは全てpairs[0]~pairs[pairs_count - 1]に格納する)
どの候補者が優先されているかについて、配列pairsに全ての候補者のペアを追加する
引き分けの候補者ペアは配列に追加しない -
sort_pairs関数を実装
選択された候補者を好む投票者の数を勝利の要因と定義し、勝利の高い順(降順)で配列pairsをソートする。複数のペアが同じ強さである場合、順序はどちらでも良いと考える -
lock_pairs関数を実装
ロックされたグラフlockedを作成し、矢印がサイクルを作成していない場合に限り、全ての矢印を勝利順(降順)で追加する -
print_winner関数を実装
グラフの開始点である候補者の名前を出力する
複数の開始点が存在しないと想定する
Lecture4
重要キーワード
-
16進数
16進数は10進数で表す0-9までを0-9で表し、10-16までの値をA-Fを用いて16を表現する。 -
アドレス、ポインタ
-
C言語における文字列(string)の扱い
-
文字列(string)の比較とコピー
-
メモリリーク
-
malloc, free
mallocは、メモリを確保し、使用可能なメモリの最初のバイトのアドレスを与える。
freeは、メモリをオペレーティングシステムに私、使い終わったことを知らせるためのもの。
一度使用したメモリを解放することができるため、他の変数に再利用が可能。
mallocを使用した際は最後にfreeを用いてメモリ不足を解消する必要がある。
$ vali
-
ゴミのような値
自分自身がメモリのどこかに値を入れていない場合、安全のために、それは引用符で囲まれたゴミのような値と考えるべきである。 -
グローバル変数
-
malloc
-
ヒップ、ヒップオーバーフロー
-
スタック、スタックオーバーフロー
-
C言語におけるファイルの扱い
-
16進数とはどのようなものか、どのように使われているのか
16進数とは、16を基数(ベース)として表した数値のことを指す。
16個(プログラムなので、0から考えて0から15まで)の数字を1桁で表すことが出来るのが16進数であり、15を超えた時に桁が繰り上げとなる。
10進数で表す0-9までを0-9で表し、10-16までの値をA-Fを用いて16を表現する。 -
ポインタとアドレスとは何か
ポインタとは、変数のアドレスを格納することができる変数のことである。
*(アスタリスク)を使うことで、ポインタ型の変数であることを示すことができる。
アドレスとは、メモリ状に与えられた番号、住所のようなものである。
&(アンパサンド)を使うことで、メモリのどこに位置しているか(アドレス)を確かめることができる。 -
C言語において文字列(string)は、変数には実際には何が保存されているか
文字列(string)は実際には文字列の、最初の文字のアドレスを持つ単なるポインタのことである。
実際には、char *で表すことができる。 -
文字列(string)同士を比較またはコピーするにはどうすればよいか
strcpyを用いてstring型で宣言した変数の値を比較、コピーを行うことができる。
または、for文などのループ、mallocを用いてアドレスをコピーする二種類の方法がある。
C言語にはさまざまなライブラリが既に実装されていて、文字列(string, char *)はstrcpyという関数で簡単にコピーが行える -
(難) メモリリークとは何か
メモリを確保した後に解放し忘れること -
(難) ヒープ、ヒープオーバーフローとは何か
-
(難) スタック、スタックオーバーフローとは何か
Lecture5
重要キーワード
それぞれのメリットデメリットを抑えておく
10:20
-
配列のサイズ変更
1つの解決策として、新たに大きな配列を用意して配列をそこにコピーをするというものである。
この際に元の配列に格納されているn個の要素をそれぞれコピーする必要があるため、
実行時間の上限はO(n)、下限はO(1)となる。 -
連結リスト
メリット: 処理時間が抑えられる
値をメモリ内の空いている任意の場所を使用して格納する方法である。
デメリット: 値同士がメモリ内で隣り合っていないため、探すのが複雑である
-> コンピュータから余分にメモリを使用して、次の要素へのポインタを格納しておく
最後にはNULLを格納することで、それ以上要素がないことを示す
デメリット: 2倍のメモリが必要となる -
木構造
連結リストでは、直線的にノードが繋がっているデータ構造であったのに対して、木構造では二分探索を用いた木のような形でノードがつながっている
親となる要素の左側には小さい要素、右側には大きい要素を格納していくことでツリーのような構造となっている- ノード node ツリー構造の各データ
- ブランチ brunch ノードとノードとのつながり、枝部分
- ルート root ツリー構造のノードのうち、最上位のもの
- 親ノード parent node ブランチで結ばれたノード同士のうち、上位のもの
- 子ノード child node ブランチで結ばれたノード同士のうち、下位のもの
各ノードには最大で二つの子ノードがある
メリット: 実行時間が短い: O(log n)、簡単に検索を行える、ハッシュテーブルに対しては、余分なメモリを用意しなくて良い -
ハッシュテーブル
配列に連結リストを繋げて一つのデータ構造にしたもの
ハッシュテーブルとは、
配列に連結りすとを繋げて1つのデータ構造としたもので、
具体的には、配列は普通インデックス0,1,2,3,4といった番号で管理していくところを、
キーと呼ばれる目印を入れていきます。今回の動画ではA,B,C,Dといったアルファベットを目印としています。
で、それに対応するペアとなる要素を格納していったもの(例えば、AにはAから始まる名前を入れる)がハッシュテーブルです。 -
ハッシュ関数
ハッシュ関数は入力を受け取り、入力されるべき場所に確定的にマップするもの
ペアとして対応するデータを格納する -
キュー
-
その他のデータ構造
Lecture6
重要キーワード
-
緩く片付けされている(動的型付け)
動的型付けとは、あらかじめ変数などのデータ型の宣言をする必要がなく、プログラムを書くときに変数や引数にどういったデータが入るのかが特に決まっていない形のことを指す
メリット: 型宣言のいる静的型付け言語に比べ記述量が減る, 直感的にコードを書くことができる
デメリット: 実行するまでエラーがわからない余分に多く, メモリ領域を確保しておく必要がある -
Pythonにおけるインデントの意味
Pythonでは各行のインデントによってコードブロックが決まる
インデントが処理の効果範囲を示す(ネストを示す)ため、インデントが位置がズレると想定外の処理を行う事があり注意が必要である -
C言語との処理の実行違い
C言語に比べて、Pythonの方が実行時間が遅くなる
原因として、インタプリタ言語である、動的型付け言語であることなどが挙げられる -
インタプリタ
コンパイラ: 実行前に翻訳
インタプリタ: プログラムの実行時に翻訳される
C言語ではあらかじめ機械語に翻訳を行なったファイルをコンピュータが読み込んでいるが、
pythonでは実行時に同時に翻訳を行うため、コンピュータが理解をするのに時間がかかる -
from
-
+演算子
-
range
-
list
-
dict(dictionary)
Lecture7
重要キーワード
-
CSV
Comma Separated Valueの略でカンマで区切られたシンプルなデータのことを指す
スプレッドシートから、ASCIIやUnicodeで保存されたシンプルなテキストファイルに変換することが可能
フラットファイルデータベースとも呼ばれる
数式を扱うことはできない、基本的に保存できるのは不変の値のみである
(フラットファイル・データベースであり、各列のデータがカンマで区切られたデータベースをCSVと呼ぶ)
何かを素早く行いたいとき、Googleのような第三者から標準的でポータブル(さまざまな人、さまざまなシステムで使用できる)な方法でデータをダウンロードしたいときにとても便利である -
データベース
データを保存するファイル、またはデータを保存してくれるプログラムを指す -
リレーショナル・データベース
全てのデータを行と列に分けて保存するデータベースのことである
データを保存するファイルではなく、データを保存するプログラムである
例: Oracle, MySQL, PostgreSQL ...
フラットファイルデータベースに比べて、データを実際に保存するために多くのRAM、メモリを使用する
また、効率的にデータの検索、挿入、削除、更新を行うことが可能である -
SQL
Structured Query Languageの略である
他のプログラミング言語と組み合わせて使用されることが多い新しいプログラミング言語となる
データベースを操作するための標準的な言語である
データベースに情報を照会し、それを用いて何か操作をするために使用する言語である -
SQL Lite
SQLをよりユーザフレンドリーにしたもの
クロスプラットフォームで使用することができる
1つのファイル(バイナリファイル)を用いて、全てのデータを保存し、そのファイルの中で0と1、あるいは前に言及したテーブルを使用してデータを表現する
.mode csv
: タブ区切りのTSVなどの他のフラットファイルフォーマットと区別するために、csvファイルを用いる時は、csvモードに切り替える
.import 'FILE NAME' TABLENAME
: ファイルをインポートする
.schema
: テーブルの構造を取得- CRUD
- Create(作成): 新しいデータの作成、または追加テーブルの名前を小文字で入力、()のなかに作成したい列の名前、タイプを入力していく
CREATE TABLE table (column type, ...);
- Read(読み取り): 新しいデータにアクセスしてメモリに読み込む、ファイルを開く際にも使われるテーブルから1つまたは、複数の列を指定された名前で選択する
SELECT columns FROM table;
SELECT 1つまたは複数の列の名前 FROM データを選択したいテーブル名
全てを選択する場合は、*を用いる - Update(更新): データセット内のデータを更新
- Delete(削除): データセット内のデータを削除
- Create(作成): 新しいデータの作成、または追加
- その他の関数
- AVG
- COUNT
出現回数をカウントするSELECT column, COUNT(column) FROM tablename;
- DISTINCT
重複行をまとめるSELECT DISTINCT(column) FROM tablename;
- LOWER
- MAX
- MIN
- UPPER
SELECT DISTINCT(UPPER(column)) FROM tablename;
- WHERE
条件分岐: このデータの中で何かが真または偽であるものを全て選択することができるSELECT column FROM tablename WHERE column = "keyword";
- LIKE
正確にはこれではないが、これに似ているデータを要求することが可能%記号は、左右に0文字以上の文字があることを示すSELECT column FROM tablename WHERE column LIKE "%keyword%";
keywordを含む全てのcolumnを検索してくれる、包括的な関数である - ORDER BY
ソートを行う - LIMIT
- GROUP BY
重複したデータをグループ化するSELECT column FROM tablename GROUP BY column;
- CRUD
-
正規化
全てのデータを何らかの標準的な方法でフォーマットすることである
同じ言葉が何度も出てこないようにする、データの情報源を1つにする
id: ユニークなデータ、一意なデータを設定する -
データ型
* BLOB
Binary Large Objectの略。0または1のデータ
* INTEGER 整数
* NUMBERIC
年や時間のように、数字を含んでいるが単なる整数でないもの
* REAL float
* TEXT 文字列
* NOT NULL
列をNULLにできないようにする
* UNIQUE
この列に入る値は全て一意な値でなければならない -
主キーと外部キー
キーとは、レコード(1つ、1人分のデータ)を任意に特定できるもののこと
主キーとは、各行を一意に識別することができる属性のことを指す
例: マイナンバー、学籍番号など
外部キーとは、2つの表を繋げるためのキーのこと -
プレースホルダ
プレースホルダを使って指定しておけば、その部分はあくまで「値」として処理され、万が一不正な値が入力されても、SQL命令に関わるような「特殊文字」は無効化(エスケープ処理と言います)される
Week8
CS50 Week8 HTML, CSS, JavaScript
重要キーワード
-
プロトコル
-
ルーター
-
IPアドレス
IP(インターネットプロトコル)は、コンピュータがお互いを認識する方法を標準化したもの
IPアドレスとは、コンピュータが持つ固有のアドレスのことである -
DNS
Domain Name Systemの略である
一般的にドメイン名や完全修飾ドメイン名と呼んでいるものを英語のような人間が読める文字から、対応するIPアドレスに変換を行う(〇〇.comといったドメイン名からIPアドレスに変換) -
TCP
Transmission Control Protocolの略である
A地点からB地点にデータを送信する際に、必要に応じてデータを再送信することでデータが失われないようにするためのプロトコルの一部である
いくつかの異なる事柄を管理する中で、安全でないWebトラフィックには80,安全なWebトラフィックには443といったサービスの番号付を行い、データがある地点から別の地点に到達し、特定のサーバ上で実行されている適切なアプリケーションによって処理されることを保証している
TCP/IPは封筒の外側を管理する -
HTTP, HTTPS
HTTPとは、HyperText Transfer Protocolの略である
URL(Uniform Resource Locators)の頭に表示されるもので、インターネット上でどのウェブサイトや画像を要求するかを決めるために使用するツールのことである
封筒の内側に入るものを管理するもの -
URL
-
ドメイン
-
HTTPステータスコード
-
HTML(解説されている内容)
HyperText Markup Languageの略
ただのテキスト、何をどのように表示するかを上から下へ、左から右へとブラウザに伝える
タグや要素と呼ばれるものと、属性という2つの異なる概念が含まれている
タグ: 山括弧で囲まれたもので、HTMLのような単語や簡潔なフレーズで始まる
<!DOCTYPE html>
<html lang="en">
<head>
<title>
hello, title
</title>
</head>
<body>
hello, body
</body>
</html>
- CSS(解説されている内容)
- JavaScript(解説されている内容)
- 無名関数
- API
Week9
重要キーワード
-
フレームワーク
アプリケーション開発におけるルール、基盤、枠組みのようなもの
それに沿って開発を行うことで開発効率を向上させることができる
他の具体例として、React, Flutter, などが挙げられる -
Flask
PythonのWebアプリケーションフレームワークのことである
独自のwebサーバを作成し、追加機能を実装することが可能
ファイルの構造としては、├── application.py (Webサーバ用のPythonコード) ├── requirements.txt (アプリケーションに必要なライブラリのリスト) ├── static (CSSやJavaScriptなどの静的ファイルのディレクトリ) └── templates (最終的なHTMLの作成に使用されるファイルのディレクトリ)
-
MVC
Model-View-Controllerの略
プログラムやコードの実装におけるデザインパターン
・MODEL : SQLデータベースやCSVファイルなどのデータ
・VIEW : HTMLやCSSなどのユーザインターフェース
・CONTROLLER : ユーザ入力を受けてアプリケーション全体を管理するロジックとコード
-
HTTPメソッド(GET, POST)
サーバにHTMLを要求するHTTPリクエストを送る方法のことである
GET, POSTはHTML5でサポートされているメソッドであり、
GET : HTMLテキストの表示
POST : サーバにデータを送る
他にも、PUT, DELETE, PATCH, HEAD, CONNECT, OPTION などがある -
テンプレートエンジン(jinja)
Jinja: 二重中括弧の構文と中括弧のパーセント記号の構文のこと -
セッション
-
Cookie
コンピュータに貼られた仮想のハンコのようなもの
コンピュータはそれを何度も提示するように設計されている -
Ajax
11週目 オリジナル講義(?) データベース設計基礎
RDB(リレーショナルデータベース)について学ぶ
- データベースを学ぶ理由
アプリケーションの複雑性や保守性に大きく影響を与える部分であるため
また、パフォーマンスに大きく影響を与える - データベースの良くない例
・凡庸的に扱えない
データ型が揃っていない、定義できないものなど
・実装を考えていない
一つのカラムで色々な意味を持つ(コメントを入れないとどんな処理かわからない)
新しいデータが増えた際に全ての処理を見直す必要がある
-> より良いデータベース設計が行われれば、コードをシンプルに保つことが出来る
設計工程
-
概念設計
どんな情報の塊が必要かを考える
(例) 生徒の成績を管理するシステム
→ 生徒、成績、教科の3つのデータ管理が必要そう
→ それぞれのデータがどのように関連付けしているかも考える(ER図)
-
論理設計
概念設計のエンティティ構造をデータベースが扱いやすい構造に変形させる
→ どんなテーブルにどんな属性(カラム)を持つかを考える-
正規化
矛盾したデータが発生しないようにテーブルを分割していく作業 -
間数従属性
「ある列Xの値が決まれば自ずと列Yの値も定まる」関係のことを、「列Yは列Xに関数従属している」という -
非正規形 ~ 第三正規形
第一正規形: 全ての属性は単一値である
第二正規形: 第一正規形であり、全ての非キー属性は、いかなる候補キーにも部分関数従属していない部分関数従属:主キーの一部に関数従属している
第三正規形: 第二正規形であり、全ての非キー属性は、いかなる候補キーにも推移的関数従属していない推移的関数従属: 関数従属が推移的に行われている
→ 第三正規形したつもりで分割したことによる発生する問題点として、あるデータを変更すると過去に登録したデータも変化してしまう(変化する可能性のある数値データなどはその時のデータとして保持するか、新しいIDを発番するなどして対策を講じる)- 連関エンティティ(中間テーブル、結合テーブル)
新しいテーブルを追加して、複数のデータを紐づけること
-
-
物理設計
データベースに保存するためにはどうすればよいか
DBMSを利用するために必要な詳細な設計を決定していく
→ 物理名、型、制約、インデックスの決定など
物理設計は各DBMSの特性を理解している必要がある(Oracle, MySQL, PostgreSQLなど)
-
物理名の命名規則
テーブル名は複数形(例: users)
日時は xxxx_at, 日付は xxxx_on
true(1)が何か予測しやすい is_xxxx
プログラムの中で使えることを意識して命名する -
NULLの罠
計算や文字列結合時にNULLを使用すると、結果がNULLとなる
COALESCE(X, 0)とすることで、XがNULLならば0を返すと指定できる
計算、条件、グルーピング、並び替えなどに使用する列はできる限りNULLを許容するべきでない
→ NOT NULL制約を使う
重要キーワード
-
なぜデータベース設計が重要で慎重に行うべきか
-
論理設計、物理設計とはそれぞれ何を行うか
-
主キーとは何か、どんな性質を備えているか
レコードを一位に特定できるものとして用いる列、またはその集合のことである
主キーが持つべき特性
→ 必ずデータが格納されている(NULLでない)
→ 他の行と値が重複しない(ユニークである)
複合主キー: 複数の列で構成される主キーのこと
(候補キー: 行を一意に識別することのできる最小限の組み合わせ → 主キーの候補
)
自然キー: データベースに投入する前に既に実在(自然に存在)していて、値で主キーの役割を果たせるもの
人口キー: 管理目的のために人為的に追加された列のこと
-
一事実一箇所の原則とはどのようなものか
データの生合成を保つためには、一つの事実は一箇所に保存するべきといった原則
→ 一つのデータを更新した際に、矛盾が生じないようにするため -
正規化とは何か
矛盾したデータが発生しないようにテーブルを分割していく作業のこと
第一正規化: 繰り返しの排除
第二正規化: 部分関数従属の排除
第三正規化: 推移的関数従属の排除
正規化を行うデメリット
→ テーブルの結合処理に時間(コスト)がかかる
→ アプリケーションが(一部)複雑になる
トランザクションを行うことが大事 -
物理名と論理名の違いは何か
論理名とは、人間にとってわかりやすいように表記したものである
物理名とは、システムに設定するために表記したものである
グループワーク
テーブル設計(論理設計)してみよう
テーブル設計は次のように示す
テーブル名(主キー*、カラム1、カラム2、カラム3)
テーブル名(複合主キー1*、複合主キー2*、カラム1、カラム2、カラム3)
現在の仕様
現在、ユーザ登録を行い、短文の文章を投稿できる掲示板アプリがある
テーブル設計は次の通りである
ユーザ(ユーザID*、メールアドレス、パスワード、ユーザ名、登録日時、退会フラグ)
投稿(投稿ID*、ユーザID、投稿文、投稿日時)改修要件
・ユーザがお互いをフォローできる(フォローを行うとそのユーザの登録を簡単に閲覧可能である)
フォロー数やフォロワー(フォローされている)数に制限はない
過去にフォローしていたかどうかは履歴として保持する必要はない改修要件を実現するためにどのようなテーブルやカラムが必要になるか論理設計を行う。
Week14
重要キーワード
-
パスワード認証の堅牢さ
4桁の数字の場合、パスワード認証は脆弱であると言える
4桁のパスワードの場合プログラミングを使用すれば、1秒もかからず全通り確かめることができる
-> 文字や特殊文字を含めることによって、パスワードの堅牢さを高める
数字と文字と特殊文字を組み合わせていくと、 6000兆通り以上のパスワードを生み出す -
2要素認証
-
エンドツーエンド暗号
一見ランダムとなる0と1をエンドユーザに送信すると、エンドユーザはそれを解読することができる
実際に中身にアクセスできるのはエンドユーザのみ
パスワードの保存
-> データベースへの悪意のあるリクエストを対策するために、SQL文となる文字列は保存できないようにする
AAA -> (暗号化) -> BBB -> (復号化) -> AAA
-> ハッシュ化
登録: AAA -> (ハッシュ化) -> e1faffb3...
認証: AAA -> (ハッシュ化して一致を確認) -> e1faffb3...
-
安全(セキュア)とはどういった状態か?
データやシステムがしっかりと暗号化されていたり、ウィルス対策ソフトなどにより保護されており、 攻撃、侵入など不正アクセスの危険性がない状態のことを指します。 -
安全ではないパスワードとはどういったものか?
0123やpasswordなどの規則性、予測のされやすい文字列のこと
また、4桁の数字などは最大1万通りしかないため、プログラミングを用いれば1秒もかからずに前通り確かめることができる。このことから、数字だけではなく文字列や特殊文字なども用いて、ある程度大きい桁数でパスワードを管理する必要性がある -
セキュリティとユーザビリティがトレードオフとはどういう意味か?
セキュリティを高める為には、パスワードを複雑にする必要性があるが、そうするとユーザ側としてはパスワードを暗記できない、一回でログインできないなど使いにくい仕様となる -
2要素認証とは何か?
通常のパスワード認証に加えて、一時的なパスワード(ワンタイムパスワード)を使用することで、セキュリティを強化する認証機能のことである -
エンドツーエンド暗号化とは何か?
エンドユーザ(利用者)の間の通信を暗号化することである。たとえサービス提供者であってもその通信を復号することはできない -
可逆暗号と不可逆暗号とはどのようなものか?
暗号化は元に戻すことを前提としている
ハッシュ化 元に戻すことが困難な一方向性関数である
可逆暗号は元に戻せる暗号のことで、不可逆暗号とは元に戻せない暗号のことである
シーザー暗号のように、右にシフトして~といった感じの暗号方法が例として挙げられていた
例)
AAA -> (暗号化) -> BBB -> (復号化) -> AAA
逆に、不可逆暗号の例としては、ハッシュ化が挙げられる
例)
登録: AAA -> (ハッシュ化) -> e1faffb3...
認証: AAA -> (ハッシュ化して一致を確認) -> e1faffb3...
不可逆暗号化した値をDBに格納しておくことで、データが流出しても元のデータはわからない
ただし、どのようにハッシュ化したかを特定できてしまった場合、結果的に元のデータも流出したこととなる -
ハッシュ値をより堅牢にするためにどのようなことができるか?
同じハッシュ関数でハッシュ値を総当たりで作成し、照合することで元の値を推測されるなどの危険性があるため、より堅牢にする為にはソルトやストレッチングを行う
ソルトとは、パスワードに対して、ソルトという文字列を付与し、それをハッシュ化することでソルト付のハッシュ値が生成され、より複雑性が増した強いパスワードとすることができる
例) password + y KQdadd -> 684FQIE...
ストレッチングとは、ハッシュ化を何回も繰り返すことで、解読困難とする方法である
例) password -> F1351E48 -> AQ39A48 -> ... -
セッションIDとは何か?
セッション情報は、サーバ側に保存されており、ブラウザにはその識別子であるセッションIDが保存されている。 -
セッションを使う上で注意すべきことにどんなことがあるか?
セッションIDを攻撃者がターゲットに同じセッションIDを使わせることで
- XSSとはどのような脆弱性か?
XSSとはクロスサイトスクリプティングの略で、Webサイトの脆弱性を狙ったサイバー攻撃のことである
XSSの脆弱性が存在すると、外部からの入力で不正なJavaScriptコードが実行されてしまうなどが起こる