コンテンツにスキップ

中高数学+物理+プログラミングのオンライン勉強会

概要

勉強会用に準備した資料をせっかくなので公開. Zoom でやっていて動画も撮っているが, それは私以外の参加者の声も入っているので非公開.

もともとは次のコンテンツのブラッシュアップのためなどいくつかの目的で, 必要なことを教えるので協力してくれないか, という感じではじめた勉強会.

周辺知識を揃えないとつらくなってきたので, IT 関係の基礎知識も紹介するようになった. あと課題もあると嬉しいという話があり, 実際に中高生に勉強してもらうときも参考になるだろうと思い, 課題も毎回作って適当に解説もしている.

ipynb to md

必要なら nbconver で markdown 化. ブログにあげるときは面倒なので画像はアップしていない.

1
2
$ jupyter nbconvert --to <output format> <input notebook>
$ jupyter nbconvert --to markdown 2020-.*.ipynb

企画趣旨

はじめに

いま, 1 年くらいの長期にわたって知人と少人数でゆるく統計学・機械学習系の勉強会をしている. そこからのスピンオフで Python と基本的な数学に関する勉強会をやろうと思っていて, その内容に関する事前説明資料として記事にする. 説明資料が長文になるのでその共有のためもあり, 他の人もそれぞれで同じようなことをやってほしいのもあり, この計画が参考になるだろうと思ったのもある. 私が持っているコンテンツを提供できるので, 必要なら連絡してほしい.

バリバリと進んだことがやりたい中高生向けの数学・物理・プログラミング教育を進めようと思っていて, いまちょうど新型コロナで話が潰れているが, 実際に地元の知り合いの政治家・自治体にも提案はしている. Jupyter notebook でコンテンツを作っていて, まだ完全にチェックできていないオンラインのプログラミング環境の検証も兼ねている. 経験上も慣れていない人がプログラミング環境をローカルに作るのは本当に大変なので, Google Colabolatory などプログラミング環境をオンラインで完結させたい. よくも悪くも時代がそうなっていくだろうというのもある.

言語として Python は好きではないが, 事実上の入門デファクトという感もあるので, とりあえずそこにした. 数学・物理系で入門レベルの情報がとても多く, それなりに質もあり, バリエーション豊かなところは最THE高とは思う

ちなみにさらなるコンテンツ作成のために次の GitHub リポジトリにコードをためていて, それで生成した動画は YouTube に上げている. 興味があればぜひ眺めてほしい.

さらに次のページに数学系の無料の通信講座をいくつか置いてある. 登録用のページだけでも数学・物理の勉強をする参考になると思うので, これも興味があれば眺めてほしい.

大方針

私の趣味・守備範囲もあるので, 数学・物理方面からプログラミングに入る. 基本的な方向性としては次の無料通信講座と, その続編として作ったコンテンツを基礎にして展開する.

次の大方針で進める.

  • まずは細かいことはさておき, プログラミングでできることをゴリゴリ紹介する
  • まずはお絵描き中心
  • 離散化すれば四則演算でしかないので微分・積分をダイレクトに数値計算する形で進める
    • まずは波動方程式・拡散方程式を見せる
    • 波と拡散というイメージと視覚がマッチした対象だから
    • まずは概要を掴むのが目的なので本質的な数学部分が難しくなるのは気にしない
    • 何をするにも慣れが必要なので, とにかく浴びて慣れてもらうのが目的
  • お絵描き+数値計算で Python プログラミングの気分を掴む
  • 少しずつプログラムの詳細を見ていく
    • 暴力的な量の四則演算を進めるだけなので「数学」の話は最低限に留めながら進める
  • ある程度慣れてきた段階でプログラムと並行して数学の話をする

概要・議論の順番

いま考えているのは次のような感じ.

  • ある意味での終着点, 波動方程式・拡散方程式の数値計算結果の動画を見る・作ってみる
  • 偏微分方程式はわけわからなくても最終的に計算させる離散化の式はそれはそう, という感じのはずなのでそれを紹介する
  • 他にも微分方程式でどんな現象が表せてどんなことができるか紹介する
    • 常微分方程式の紹介
      • ホジキン-ハクスレー方程式 (大雑把に言ってノーベル医学・生理学賞の対象 (らしい)
      • フィッツヒュー・南雲方程式
      • 放射性物質の崩壊の方程式
      • ロジスティック方程式
      • 単振動の方程式
    • 微分方程式の数値計算の観点から見た中高数学の復習とプログラムへの落とし込み
  • 中高数学の復習をしつつ Python プログラムへの落とし込み

いったん別のところで組み上げたコンテンツがあるので, それをブラッシュアップしつつ進める予定. その意味では目次もある: 中高数学の復習の部分が詳しいだけではある. 質疑応答しつつ, 適当にプログラミングについても補足説明を入れていく.

ちなみに波動方程式や拡散方程式の数値計算結果は次のような感じ.

とりあえずはこんなところか. 録画しておいて, YouTube にも公開する予定. 他の人が勉強会をする参考になるはずだから, 質問・コメントが来たらこちらにも回答を追加していこう.

2020-04-19課題

はじめに

  • コンテンツの案内ページ
  • GitHub へのリンク
  • 00-introduction_02_jupyter.ipynb を一通り読んで Jupyter notebook(大雑把には Google Colab も同じ)の概要を把握してください。特に次の点に注意して読んでください。
  • テキストセルを作ってください。
    • テキストセルに何か文章を書いてみてください。文章は「あ」だけでも構いません。
    • TeX 形式で次のような式を打ってみてください。「このセル」をダブルクリックで開くとどうすれば式が打てるかわかるので、そのコピペで構いません。他にも資料を漁ってどんな風に書くとどう表示されるか眺めてみるといいでしょう。

$$\int_0^1 f(x) \, dx$$

  • コードセルを作ってください。
    • 01-basic_01_fundamental.ipynb を参考に print("Hello, World!") を実行してみてください。「実行結果出力欄」に「Hello, World!」と出れば成功です。
  • もう 1 つコードセルを作ってください。
    • 01-basic_03_matplotlib.ipynb を参考に、グラフを 1 つ書いてみてください。コピペでグラフが出てくることを確認するだけで十分です。
    • お好みでの追加タスク:いろいろ推測しながらプログラムを少しいじってみて、直線以外のグラフを描いたり、グラフを描く範囲を変えてみてください。

プログラムを勉強するときの注意

  • プログラミング「言語」と言われるように、いわゆる語学を勉強するときのコツがある程度流用できます。
  • 「英作文は英借文」というように、既に動いている(通じる)「例文」をコピペしてみましょう。そこからパーツを少し変えてみてどうなるか試します。
  • プログラミング言語は機械が意味を判定するので、文法に厳格に沿っていないと「きちんと文法通りに話せ」と怒られます。
    • ある程度まで来たらこの文法もきちんと勉強する必要があります。
    • よほどの趣味を持っていない限り、文法の勉強は初学の段階であまり面白いものでもないので、まずは 01-basic_01_fundamental.ipynb に書いてあることを雑に眺めて気分を掴んでください。
    • 公式のチュートリアルも参考になります。
      • Web 上の資源の問題として、リンクがたくさん張られている関係でいろいろな所に飛ばされる(飛びたくなる)ことがあります。本だと自分でページを飛ばさない限り一直線の道を歩むしかないので、Web 上の資源で勉強すると気が散るなら本を買ってざっと眺めるのも一手です。
  • 一般の語学でも実際に読み書きしないと身につかないように、プログラムも実際に読み書きしないと身につきません。Jupyter notebook 配布のいいところはすぐにコード実行できるところにあります。パチパチ実行してみてください。

解答例

参考:TeX

  • $f(x)$ のように 1 つのドルマークで囲むと地の文に普通に埋め込まれる式として $\int f(x) dx$ が書けます。
  • $$\int f(x) dx, \left{a\in A \mid a>0, b>0 \text{かつ} c>0\right}$$ と 2 つのドルマークで囲むと別行立ての式 $$\int f(x) dx$$ が書けます。
  • \begin{align} \int f(x) dx \end{align} などと書くと、数式環境下での式が書けます。 \begin{align} \int f(x) dx \end{align}
  • 複数行ある複雑な式を書くときは数式環境下で式を書きます:参考リンク
  • 数式環境と $$\int f(x)dx$$ 型との違い・使い分けについては次のように考えましょう.
  • $$\int f(x) dx$$ はあくまで地の文に埋め込みたいが縦・横に長い式なので別行立ての方が見やすい場合に使う
  • \begin{align} \int f(x) dx \end{align} は複数行にわたるハードな式展開・計算を書くときに使う.

$\epsilon$ $\varepsilon$

$$A = (a_{ij}) = \begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n} \ a_{21} & a_{22} & \cdots & a_{2n} \ \vdots & \vdots & \ddots & \vdots \ a_{m1} & a_{m2} & \cdots & a_{mn} \end{pmatrix}.$$

参考:Markdown

  • テキストセルは TeX の他, markdown という形式で書けます.
  • 参考リンク
  • 参考リンク
  • 参考リンク
  • 段落分けや文字の強調などはこの形式に沿っています.
  • 主に技術系の文書を書くために使われる書式なので, 過度な装飾はできません (そもそもそういう機能がない).

コード例

  • sympy のサンプルを紹介します。
  • Google Colab 上ではオリジナルの Jupyter より面倒で、追加処理が必要です。
    • オリジナルの Jupyter では動くのに Google Colab 上では動かない (らしい) プログラムもあります
    • 例:4 次方程式の解の公式の表示.
  • 実際に一通り眺めて sympy をできる限り Google Colab 上でも動くようにするのはこの勉強会の目的の 1 つです.

```python !pip install --upgrade sympy

import sympy as sp from sympy.plotting import plot from IPython.display import display

def custom_latex_printer(expr, options): from IPython.display import Math, HTML from google.colab.output._publish import javascript url = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-AMS_CHTML" javascript(content="""window.MathJax = { tex2jax: { inlineMath: [ ['$','$'] ], processEscapes: true } };""") javascript(url=url) return sp.latex(expr, options)

sp.init_printing(use_latex="mathjax", latex_printer=custom_latex_printer)

x = sp.Symbol('x') expr = x*2-12x+8 display(expr) ```

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
 Collecting sympy
 [?25l  Downloading https://files.pythonhosted.org/packages/ce/5b/acc12e3c0d0be685601fc2b2d20ed18dc0bf461380e763afc9d0a548deb0/sympy-1.5.1-py2.py3-none-any.whl (5.6MB)
      |████████████████████████████████| 5.6MB 8.4MB/s
 [?25hRequirement already satisfied, skipping upgrade: mpmath>=0.19 in /usr/local/lib/python3.6/dist-packages (from sympy) (1.1.0)
 Installing collected packages: sympy
   Found existing installation: sympy 1.1.1
     Uninstalling sympy-1.1.1:
       Successfully uninstalled sympy-1.1.1
 Successfully installed sympy-1.5.1



 <IPython.core.display.Javascript object>

$\displaystyle x^{2} - 12 x + 8$

python x = sp.Symbol('x') y = sp.Symbol('y') expr1 = 2*x + 3*y - 6 expr2 = 3*x + 2*y - 12 display(expr1) display(expr2) #display(sp.solve((expr1, expr2))) # Math Processing error になる

1
 <IPython.core.display.Javascript object>

$\displaystyle 2 x + 3 y - 6$

1
 <IPython.core.display.Javascript object>

$\displaystyle 3 x + 2 y - 12$

python display(sp.solve((expr1, expr2)))

1
 <IPython.core.display.Javascript object>

$\displaystyle \left{ x : \frac{24}{5}, \ y : - \frac{6}{5}\right}$

  • 上の方程式は厳密解として $x=4.8,y=-1.2$ を持つ。
  • これの近似解として例えば $x=4.78888888,y=-1.1999999$

python p = plot(-(2/3)*x - 2, - (3/2)*x - 6, legend=True, show=False) p[0].line_color = 'b' p[1].line_color = 'r' p.show()

1
2
3
4
5
6
 /usr/local/lib/python3.6/dist-packages/sympy/plotting/plot.py:1065: MatplotlibDeprecationWarning:
 The set_smart_bounds function was deprecated in Matplotlib 3.2 and will be removed two minor releases later.
   self.ax[i].spines['left'].set_smart_bounds(True)
 /usr/local/lib/python3.6/dist-packages/sympy/plotting/plot.py:1066: MatplotlibDeprecationWarning:
 The set_smart_bounds function was deprecated in Matplotlib 3.2 and will be removed two minor releases later.
   self.ax[i].spines['bottom'].set_smart_bounds(False)

```python eq1 = x2 + y2 - 1 eq2 = x - y

plot1 = sp.plot_implicit(eq1, line_color="blue", show=False) plot2 = sp.plot_implicit(eq2, line_color="green", show=False) plot1.extend(plot2) plot1.show() ```

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
 /usr/local/lib/python3.6/dist-packages/sympy/plotting/plot.py:1065: MatplotlibDeprecationWarning:
 The set_smart_bounds function was deprecated in Matplotlib 3.2 and will be removed two minor releases later.
   self.ax[i].spines['left'].set_smart_bounds(True)
 /usr/local/lib/python3.6/dist-packages/sympy/plotting/plot.py:1066: MatplotlibDeprecationWarning:
 The set_smart_bounds function was deprecated in Matplotlib 3.2 and will be removed two minor releases later.
   self.ax[i].spines['bottom'].set_smart_bounds(False)
 /usr/local/lib/python3.6/dist-packages/sympy/plotting/plot.py:1096: MatplotlibDeprecationWarning:
 The set_smart_bounds function was deprecated in Matplotlib 3.2 and will be removed two minor releases later.
   ax.spines['left'].set_smart_bounds(False)
 /usr/local/lib/python3.6/dist-packages/sympy/plotting/plot.py:1097: MatplotlibDeprecationWarning:
 The set_smart_bounds function was deprecated in Matplotlib 3.2 and will be removed two minor releases later.
   ax.spines['bottom'].set_smart_bounds(False)

```python import sympy as sp from sympy.plotting import plot from IPython.display import display

def custom_latex_printer(expr, options): from IPython.display import Math, HTML from google.colab.output._publish import javascript url = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-AMS_CHTML" javascript(content="""window.MathJax = { tex2jax: { inlineMath: [ ['$','$'] ], processEscapes: true } };""") javascript(url=url) return sp.latex(expr, options)

a,b,c,d,x = sp.symbols('a,b,c,d,x') expr = ax3 + bx*2 + cx + d

display(sp.solve(expr, x, dict=True)) ```

$\displaystyle \left[ \left{ x : - \frac{- \frac{3 c}{a} + \frac{b^{2}}{a^{2}}}{3 \sqrt[3]{\frac{\sqrt{- 4 \left(- \frac{3 c}{a} + \frac{b^{2}}{a^{2}}\right)^{3} + \left(\frac{27 d}{a} - \frac{9 b c}{a^{2}} + \frac{2 b^{3}}{a^{3}}\right)^{2}}}{2} + \frac{27 d}{2 a} - \frac{9 b c}{2 a^{2}} + \frac{b^{3}}{a^{3}}}} - \frac{\sqrt[3]{\frac{\sqrt{- 4 \left(- \frac{3 c}{a} + \frac{b^{2}}{a^{2}}\right)^{3} + \left(\frac{27 d}{a} - \frac{9 b c}{a^{2}} + \frac{2 b^{3}}{a^{3}}\right)^{2}}}{2} + \frac{27 d}{2 a} - \frac{9 b c}{2 a^{2}} + \frac{b^{3}}{a^{3}}}}{3} - \frac{b}{3 a}\right}, \ \left{ x : - \frac{- \frac{3 c}{a} + \frac{b^{2}}{a^{2}}}{3 \left(- \frac{1}{2} - \frac{\sqrt{3} i}{2}\right) \sqrt[3]{\frac{\sqrt{- 4 \left(- \frac{3 c}{a} + \frac{b^{2}}{a^{2}}\right)^{3} + \left(\frac{27 d}{a} - \frac{9 b c}{a^{2}} + \frac{2 b^{3}}{a^{3}}\right)^{2}}}{2} + \frac{27 d}{2 a} - \frac{9 b c}{2 a^{2}} + \frac{b^{3}}{a^{3}}}} - \frac{\left(- \frac{1}{2} - \frac{\sqrt{3} i}{2}\right) \sqrt[3]{\frac{\sqrt{- 4 \left(- \frac{3 c}{a} + \frac{b^{2}}{a^{2}}\right)^{3} + \left(\frac{27 d}{a} - \frac{9 b c}{a^{2}} + \frac{2 b^{3}}{a^{3}}\right)^{2}}}{2} + \frac{27 d}{2 a} - \frac{9 b c}{2 a^{2}} + \frac{b^{3}}{a^{3}}}}{3} - \frac{b}{3 a}\right}, \ \left{ x : - \frac{- \frac{3 c}{a} + \frac{b^{2}}{a^{2}}}{3 \left(- \frac{1}{2} + \frac{\sqrt{3} i}{2}\right) \sqrt[3]{\frac{\sqrt{- 4 \left(- \frac{3 c}{a} + \frac{b^{2}}{a^{2}}\right)^{3} + \left(\frac{27 d}{a} - \frac{9 b c}{a^{2}} + \frac{2 b^{3}}{a^{3}}\right)^{2}}}{2} + \frac{27 d}{2 a} - \frac{9 b c}{2 a^{2}} + \frac{b^{3}}{a^{3}}}} - \frac{\left(- \frac{1}{2} + \frac{\sqrt{3} i}{2}\right) \sqrt[3]{\frac{\sqrt{- 4 \left(- \frac{3 c}{a} + \frac{b^{2}}{a^{2}}\right)^{3} + \left(\frac{27 d}{a} - \frac{9 b c}{a^{2}} + \frac{2 b^{3}}{a^{3}}\right)^{2}}}{2} + \frac{27 d}{2 a} - \frac{9 b c}{2 a^{2}} + \frac{b^{3}}{a^{3}}}}{3} - \frac{b}{3 a}\right}\right]$

2020-04-19オンライン数学勉強会用イントロ

はじめに

まとめ

事前準備:sympy インストールとチェック

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
from sympy import *
from IPython.display import display

def custom_latex_printer(expr, **options):
    from IPython.display import Math, HTML
    from google.colab.output._publish import javascript
    url = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-AMS_CHTML"
    javascript(content="""window.MathJax = {
        tex2jax: {
            inlineMath: [ ['$','$'] ],
            processEscapes: true
        }
        };""")
    javascript(url=url)
    return latex(expr, **options)

init_printing(use_latex="mathjax", latex_printer=custom_latex_printer)

x = Symbol('x')
expr = x**2-12*x+8
display(expr)
1
<IPython.core.display.Javascript object>

$$x^{2} - 12 x + 8$$

はじめの注意

  • 吃音があるので聞きにくいと思います。
  • 言いにくい場合は文字で書きます。
  • いろいろ試験的な取り組みです。
  • この資料はあとで配ります。

大方針

  • Python でプログラミング
  • 将来に向けたいろいろなテストを兼ねる
  • 中高生または中高数学復習用に作ったコンテンツのテスト・流用
  • 試験的に Google Colabolratory を利用
  • いま使っている「これ」
  • ローカルの環境構築がいらない
  • TeX の形式を使うと式もきれいに書ける:$$\int_\Omega f(x) \, dx$$
  • 何回くらい・どのくらいの期間になるかは不明
  • なるべくゆっくり・ゆるく進める
  • 日々いろいろなタスクがある大人向けの勉強会なのでゴリゴリにやると疲れ果てて続かない
  • その代わり長期戦でのんびりやる
  • 予習はやりたければやる
  • 無理がない範囲で、長続きさせることを第一に
  • 復習は勉強会の中でやる
    • その分ペースも遅くなる
    • その遅さが気になるなら予習をしよう
  • 復習を自力でやれるくらいならはじめから独学できていると思う

勉強のコツ

  • 「すぐに理解する・できる」という幻想を捨てる
  • 同じことを何度も繰り返して、少しずつ慣れる
  • 究極的には「独学」が必要
  • そのサポートをするのがこの勉強会の目的
  • 細部が詳しい本はたくさんあり、いろいろなレベルの本がたくさんある
  • この勉強会の当面の主目的は概要を掴むこと
  • 細かいことが気になったら都度調べるなり質問するなりしてもらう
  • そしてすぐにわからなくても気にしない

進め方の方針

  • 細かいことはさておき, プログラミングでできることをゴリゴリ紹介する
  • まずはお絵描き中心:微分方程式を解く
  • 後の内容も「中高数学のネタを視覚化する」方向で進める。
  • 微分方程式に関して
    • 高校数学の最終目的地の微分・積分に直結する
    • 微分・積分は統計学をはじめとしたその他いろいろな応用でも主力
    • 離散化すれば四則演算でしかないので微分・積分をダイレクトに数値計算する形で進める
    • 今回、イメージづくりで波動方程式・拡散方程式を見せる
    • 波と拡散というイメージと視覚がマッチした対象だから
    • まずは概要を掴むのが目的なので本質的な数学部分が難しくなるのは気にしない
    • 何をするにも慣れが必要なので, とにかく浴びて慣れてもらうのが目的
  • お絵描き+数値計算で Python プログラミングの気分を掴む
  • 少しずつプログラムの詳細を見ていく
    • 暴力的な量の四則演算を進めるだけなので「数学」の話は最低限に留めながら進める
  • ある程度慣れてきた段階でプログラムと並行して数学の話をする

基礎コンテンツの紹介

  • 中高数学をプログラミングを軸にまとめた。
  • この講座ではプログラミング、特に Python については深くは解説しない
  • 必要ならその時々の新しい本で勉強すること。
  • 古い本を選んでしまうと、最新の環境でその本に書かれたプログラムが動かない可能性がある。

講座の構成

  1. 数学に関わる Python の基礎
    • 重要なライブラリ numpy のまとめ
    • 重要なライブラリ matplotlib のまとめ
    • 重要なライブラリ sympy のまとめ
    • 上記ライブラリを使った数学プログラミングのまとめ
  2. 線型代数:ベクトルと行列
  3. 微分積分
  4. 確率
  5. 統計
  6. 常微分方程式
  7. 偏微分方程式

大まかな説明

  • 最初の第 1 章:Python を使ってどんなことができるかを説明
    • 特に Python 自体の基本的な機能とライブラリの使い方を説明
    • 必要なコードは各箇所に書かれているので、ここは飛ばしてすぐに本編に進んでも問題ない
  • 線型代数以降の各章から、数学・プログラミングが混然一体になった本編がはじまる。
  • 常微分方程式の章を先に読んでみるのもおすすめします。
  • 「大事なことは何度でも」の精神

注意・当面の進めるイメージ

  • 下の 2 つを先にざっと眺める
  • 既に無料講座として公開している常微分方程式の章を少しずつ詳しく進める
  • 微分積分をやる

環境構築

Google Colab

  • いわゆる gmail のアカウントがあれば使える。
  • 「google colaboratory」でググってトップに出てくるページを開けば開くはず
  • 公式のチュートリアルもあるので、それを見よう

Python のインストール

  • インストールのことを「環境構築」とも呼ぶことにする
  • 将来の対応を考えて、勉強会では Google Colaboratory で進めてみる
  • ローカル(自分の PC)にインストールしたいなら、適当にやる
  • 経験上、「素人」の状態で環境構築は本当に大変
  • プログラミング・環境構築に慣れていない状態で数学と絡めた環境構築がしたいなら、Anaconda でインストールするのが楽
  • Google Colab 前提なのでこれ以上詳しくは触れない
  • 本格的にプログラミングするならローカルに環境を作るのは必須

本題:数学とアニメーション

定積分のアニメーション

  • 定積分はグラフが囲む領域の面積
  • いわゆる区分求積法:次のように定義する

\begin{align} \int_0^1 f(x) dx &= \lim_{n \to \infty} \frac{1}{n} \sum_{k=0}^{n-1} f \left( \frac{k}{n} \right), \ n = 2 &\Rightarrow \frac{1}{2} \left(f\left(\frac02\right) + f\left(\frac12\right)\right) \ n = 3 &\Rightarrow \frac{1}{3} \left(f\left(\frac03\right) + f\left(\frac13\right) + f\left(\frac23\right)\right) \end{align}

  • 右辺に注目する
    • $\frac{1}{n}$ は単なる割り算
    • $\sum_{k=0}^{n-1}$ は $n$ 項足しているだけ
    • $\lim$ は $n$ をどんどん大きくしている
  • 数値計算でやること
    • 十分大きな $n$ で右辺を計算する
    • だいたい面積が近似できることを確認する
アニメーション用の基本関数
  • 次の関数でいろいろやっている:今回詳しくは触れない
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import numpy as np
import matplotlib.pyplot as plt

def scatter_integral_body(num_data, is_left, f, param):
    # 描画領域の指定
    fig = plt.figure(figsize=(param["figsize_x"], param["figsize_y"]))
    subplot = fig.add_subplot(1, 1, 1)
    subplot.set_xlim(param["x_min"], param["x_max"])
    subplot.set_ylim(param["y_min"], param["y_max"])

    # 参考: グラフを折れ線で描く. 折れ線近似の様子を見たい場合に使う.
    #linex = np.linspace(param["x_min"], param["x_max"], num_data)
    #subplot.plot(linex, f(linex), color='blue')

    # 長方形の描画と面積の近似値計算
    area = 0
    step = (param["x_max"] - param["x_min"]) / num_data
    for x0 in np.arange(param["x_min"], param["x_max"], step):
        x = x0 if is_left else x0 + step
        rect = plt.Rectangle((x0, 0), step, f(x), alpha=param["alpha"])
        subplot.add_patch(rect)
        area += step * f(x)

    subplot.text(param["text_x"], param["text_y"], ('area = %f' % area))

    # 関数と三角関数の描画:上の supplot の処理の後に置かないと上の長方形が描かれない
    vf = np.vectorize(f)

    x_for_square = np.linspace(param["x_min"], param["x_max"], param["num_max"])
    y0 = vf(x_for_square)
    plt.plot(x_for_square, y0, color="red")
底辺と高さ 1 の直角三角形の面積
  • 底辺×高さ / 2 = 1/2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from ipywidgets import interact

def scatter(num_data, is_left):
    def f(x):
        return x

    param = {
        "x_min": 0.0,
        "x_max": 1.0,
        "y_min": 0.0,
        "y_max": 1.0,
        "figsize_x": 4,
        "figsize_y": 4,
        "alpha": 0.5,
        "text_x": 0.2,
        "text_y": 0.7,
        "num_max": 50
    }
    scatter_integral_body(num_data, is_left, f, param)

num_max = 50
interact(scatter, num_data=(2, num_max, 1), is_left=True)
1
2
3
4
5
6
7
interactive(children=(IntSlider(value=26, description='num_data', max=50, min=2), Checkbox(value=True, descrip…





<function __main__.scatter>
参照用

\begin{align} \int_0^1 f(x) dx &= \lim_{n \to \infty} \frac{1}{n} \sum_{k=0}^{n-1} f \left( \frac{k}{n} \right), \ n = 2 &\Rightarrow \frac{1}{2} \left(f\left(\frac02\right) + f\left(\frac12\right)\right) \ n = 3 &\Rightarrow \frac{1}{3} \left(f\left(\frac03\right) + f\left(\frac13\right) + f\left(\frac23\right)\right) \end{align}

二次関数
  • $x^2$ を $[0,2]$ で積分
  • 面積は $\int_0^2 x^2 dx = 8/3 = 2.6666...$
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from ipywidgets import interact

def scatter(num_data, is_left):
    def f(x):
        return x**2

    param = {
        "x_min": 0.0,
        "x_max": 2.0,
        "y_min": 0.0,
        "y_max": 4.0,
        "figsize_x": 4,
        "figsize_y": 4,
        "alpha": 0.5,
        "text_x": 0.2,
        "text_y": 3.0,
        "num_max": 50
    }
    scatter_integral_body(num_data, is_left, f, param)

num_max = 50
interact(scatter, num_data=(2, num_max, 1), is_left=True)
1
2
3
4
5
6
7
interactive(children=(IntSlider(value=26, description='num_data', max=50, min=2), Checkbox(value=True, descrip…





<function __main__.scatter>
定積分の大雑把なまとめ
  • どんどん細かくしていくと、細かさに応じて近似がよくなる。
  • 近似を上げていった最果てで厳密な値が得られるとみなす。
  • 視覚的に確認すると定義の意図が見えやすくなる
  • 定義の意図がわかっていないとプログラムを書くのも難しい

1 次元の波動方程式

  • ひもの左端を揺らしたときのひもの振動(波)の様子を見る
  • 波が右端まで行くと反射するところも見られる
偏微分方程式としての波動方程式

\begin{align} u_{tt} = c^2 u_{xx}, \quad \frac{\partial^2 u}{\partial t^2} = c^2 \frac{\partial^2 u}{\partial x^2}. \end{align}

  • ここで $c$ は定数で物理的には波の速度。
  • 物理だとこれをどうやって導出するかも問われる。
  • ここではそうした議論はせず、とにかく数値的に解いてみて波を表している様子を眺める

\begin{align} \frac{\partial u}{\partial t} &= \lim_{\Delta t \to 0}\frac{u(t + \Delta t, x) - u(t,x)}{\Delta t} \ &\simeq \frac{u(t + \Delta t, x) - u(t,x)}{\Delta t} \end{align}

\begin{align} \frac{\partial^2 u}{\partial t^2} = \frac{\partial}{\partial t} \frac{\partial u}{\partial t}= \frac{u_t(t+\Delta t,x) - u_t(t,x)}{\Delta t} &\simeq \frac{\frac{u(t + \Delta t, x) - u(t,x)}{\Delta t} - \frac{u(t , x) - u(t- \Delta t,x)}{\Delta t}}{\Delta t} \end{align}

最終的に計算する式

\begin{align} u(t + \Delta t, x ) = 2 u(t,x) - u(t - \Delta t, x) + \left(\frac{c \Delta t}{\Delta x}\right)^2 \left(u(t, x + \Delta x) - 2 u(t,x) + u(t, x - \Delta x) \right). \end{align}

  • 次の時刻 $t + \Delta t$ の値を計算するのに現在時刻 $t$ とひとつ前の時刻 $t - \Delta t$ の値を使っている。
  • 最終的には四則演算だけ
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from IPython.display import HTML
from matplotlib import animation
from tqdm import tqdm
import numpy as np
import matplotlib.pyplot as plt

lx = 1  # 計算領域の長さ
nx = 41 # 領域の分割数
xs = np.linspace(0, lx, nx)

def wave(nx):
    dx = lx / (nx - 1) # 空間方向の刻み
    nt = 500           # 計算回数
    dt = 0.01          # 時間刻み
    c = 1              # 波の速度
    f = 2.0            # 強制振動の周波数

    # 初期条件
    u0 = np.zeros(nx)

    # 結果の配列と nt, nx の次元を持つ配列で初期化
    us = np.zeros((nt, len(u0)))

    # 初期条件を結果の配列の各行にコピー
    us[:,:] = u0.copy()

    alpha = (c * dt / dx)**2

    for i in tqdm(range(1, nt-2)):
        t = i * dt
        # 左端を強制振動
        us[i, 0] = np.sin(2 * np.pi * f * t)
        us[i+1, 0] = np.sin(2 * np.pi * f * t)

        # 時間発展
        us[i+1, 1:-1] = 2 * us[i, 1:-1] - us[i-1, 1:-1] \
                        + alpha * (us[i, 2:] - 2 * us[i, 1:-1] + us[i, :-2])
        # 右端の境界値指定
        us[i+1, nx-1] = 0

    return us


### 解
us = wave(nx)

fig = plt.figure();

### グラフの軸の設定
ax = plt.axes(xlim=(0, lx), ylim=(-5, 5));
line, = ax.plot([], [], lw=2);

def animate(u):
    line.set_data(xs, u)
    return line

anim = animation.FuncAnimation(fig, animate, frames=us, interval=50)
#anim.save('07-pde_03_wave_ex01.tmp.mp4', writer="ffmpeg")
plt.close(anim._fig)
HTML(anim.to_jshtml(default_mode='reflect'))
1
100%|██████████| 497/497 [00:00<00:00, 34649.84it/s]

1 次元の拡散方程式

  • 真ん中に置いておいた物質が周囲に拡散していく様子を見る
偏微分方程式としての拡散方程式

\begin{align} \frac{\partial u}{\partial t}= \nu \frac{\partial^2 u}{\partial x^2}. \end{align}

最終的に計算する式

\begin{align} u(t+ \Delta t, x) = u(t, x) + \nu \frac{\Delta t}{(\Delta x)^2} (u(t, x + \Delta x) - 2u(t,x) + u(t, x - \Delta x)). \end{align}

  • これも四則演算だけ。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import HTML
from matplotlib import animation

lx = 2  # 計算領域の長さ
nx = 41 # 領域の分割数
xs = np.linspace(0, lx, nx)

def diffusion(nx):
    dx = lx / (nx - 1) # 空間方向の刻み
    dt = 0.001         # 時間刻み
    nt = 200           # 計算回数
    nu = 1.0           # 拡散係数

    # 初期条件:中央以外すべて 0
    u0 = np.zeros(nx)
    # 真ん中に物質を置く
    x_center = int((nx - 1) / 2)
    u0[x_center-2: x_center+2] = 1

    # 結果の配列と nt, nx の次元を持つ配列で初期化
    us = np.zeros((nt, len(u0)))

    # 初期条件を結果の配列の各行にコピー
    us[:,:] = u0.copy()

    for i in range(0, nt-1):
        us[i+1, 1:-1] = us[i, 1:-1] + nu * dt / dx**2 *  (us[i, 2:] - 2 * us[i, 1:-1] + us[i, :-2])

    return us

us = diffusion(nx)

fig = plt.figure();
#グラフの軸の設定
ax = plt.axes(xlim=(0, lx), ylim=(0, 1.2));
line, = ax.plot([], [], lw=2);

def animate(u):
    line.set_data(xs, u)
    return line

anim = animation.FuncAnimation(fig, animate, frames=us, interval=50)
#anim.save('07-pde_04_diffusion_ex01.tmp.mp4', writer="ffmpeg")
plt.close(anim._fig)
HTML(anim.to_jshtml(default_mode='reflect'))

2 次元の波動方程式

  • イメージとしては膜の振動
  • 真ん中を振動させてその波の伝播を見る
偏微分方程式としての波動方程式

\begin{align} u_{tt} = c^2 (u_{xx} + u_{yy}). \end{align}

  • ここで $c$ は定数で物理的には波の速度
  • 1 次元のときとの違いは $u_{yy}$ の追加
  • 物理的には次元に依存する議論もあってそれほど簡単ではない
最終的に計算する式

\begin{align} &u(t + \Delta t, x, y) \ &= 2 u(t,x,y) - u(t - \Delta t, x, y) \ \quad &+ \left(\frac{c \Delta t}{\Delta x}\right)^2 \left(u(t, x + \Delta x,y) - 2 u(t,x,y) + u(t, x - \Delta x,y) \right) \ \quad &+ \left(\frac{c \Delta t}{\Delta y}\right)^2 \left(u(t, x,y + \Delta y) - 2 u(t,x,y) + u(t, x,y - \Delta y) \right) \ \end{align}

  • 右辺の時刻は $t$ と $t - \Delta t$、つまり過去の時刻しか出てこない
  • 過去の時間での情報さえわかれば未来の挙動がわかる
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
from IPython.display import HTML
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D
from tqdm import tqdm
import numpy as np
import matplotlib.pyplot as plt

lx = 1  # 計算領域の長さ
ly = 1  # 計算領域の長さ
nx = 11 # 領域の分割数
ny = 11 # 領域の分割数
nx_center = int((nx - 1) / 2)
ny_center = int((ny - 1) / 2)
xs = np.linspace(0, lx, nx)
ys = np.linspace(0, ly, ny)

x1d = np.linspace(0, lx, nx)
y1d = np.linspace(0, ly, ny)
xs, ys = np.meshgrid(x1d, y1d)

def wave(nx, ny):
    dx = lx / (nx - 1)
    dy = ly / (ny - 1)
    nt = 300           # 計算回数
    dt = 0.5 * dx * dy # 時間刻み
    c = 1              # 波の速度
    f = 2.0            # 強制振動の周波数

    # 初期条件
    u0 = np.zeros((nx, ny))

    # 結果の配列と nt, nx, ny の次元を持つ配列で初期化
    us = np.zeros((nt, nx, ny))

    # 初期条件を結果の配列の各行にコピー
    us[:,:,:] = u0.copy()

    alpha_x = (c * dt / dx)**2
    alpha_y = (c * dt / dy)**2

    for i in tqdm(range(1, nt-2)):
        t = i * dt
        # 中心を強制振動
        us[i, nx_center, ny_center] = np.sin(2 * np.pi * f * t)
        us[i+1, nx_center, ny_center] = np.sin(2 * np.pi * f * t)

        # 時間発展
        us[i+1, 1:-1, 1:-1] = 2 * us[i, 1:-1, 1:-1] - us[i-1, 1:-1, 1:-1] \
                            + alpha_x * (us[i, 2:, 1:-1] - 2 * us[i, 1:-1, 1:-1] + us[i, :-2, 1:-1]) \
                            + alpha_y * (us[i, 1:-1, 2:] - 2 * us[i, 1:-1, 1:-1] + us[i, 1:-1, :-2])
        # 境界値指定
        us[i+1, 0, :] = 0
        us[i+1, nx-1, :] = 0
        us[i+1, :, 0] = 0
        us[i+1, :, ny-1] = 0

    return us


### 解
us = wave(nx, ny)

fig = plt.figure();
ax = fig.add_subplot(111, projection='3d')
ax.set_xlim(0, lx)
ax.set_ylim(0, ly)
ax.set_zlim(-2, 2)
ax.set_xlabel('$x$')
ax.set_ylabel('$y$')
ax.set_zlabel('$u$')
surf = ax.plot_surface(xs, ys, us[0], rstride=1, cstride=1, linewidth=0, cmap='jet')

def animate(u):
    return ax.plot_surface(xs, ys, u, rstride=1, cstride=1, linewidth=0, cmap='jet')
    #surf.set_data(u)
    #return surf

anim = animation.FuncAnimation(fig, animate, frames=us, interval=50)
#anim.save('07-pde_06_wave_2dim_ex01.tmp.mp4', writer="ffmpeg")
plt.close(anim._fig)
HTML(anim.to_jshtml(default_mode='loop'))

微分方程式の大雑把なまとめ

  • (いろいろな都合によって)物理では無限に細かいところで方程式を立てている
  • そのままでは計算機に計算させられない
  • 微分係数・導関数を定義によって有限化:差と商にわける。
  • 有限に落とした部分は無限に細かくしていけば元の微分係数・導関数を近似できていると期待する

次回以降

  • 常微分方程式のところをのんびり進める
  • まずは微分方程式で何ができるのかをのんびり
  • 微分方程式で記述できる現象を説明したあと、近似計算の数理を追う
  • プログラムに落とし込む工夫を見る
  • 数値計算プログラムを大雑把に眺める
  • 講座・コンテンツ本体を眺める

質疑応答

  • 今の時点での目標が何かとか
  • こんな感じで進めてほしいとか
  • こんなネタを扱ってほしいとか

要望メモ

  • 小さな課題が欲しい。
  • 成功体験を積もう。
  • 予習の範囲を出す。
  • 式とグラフの対応。いろいろお絵描きしてみる。どうやってプログラムに落とすか確認する。

アンケート

毎回アンケートを取っています. 質問や要望がある場合もこちらにどうぞ.

アンケートは匿名なので気楽にコメントしてください. 直接返事してほしいことがあれば, メールなど適当な手段で連絡してください.

2020-04-26 課題

はじめに

  • コンテンツの案内ページ
  • GitHub へのリンク
  • 少なくとも英語・フランス語・ドイツ語・ウクライナ語・スペイン語では別行立ての式に句読点がついていました. 式に句読点がついている外国語, 特に英語の文献を探してみてください. 英語については arxiv が探しやすいでしょう. ドイツ語についてはアインシュタインの論文, フランス語では Serre の論文あたりが探しやすいだろうと思います.
  • 引き続き TeX でいろいろな式を書いてみましょう. arxiv を彷徨って格好よさそうな式を https://mathpix.com/ で TeX 化してみると楽しいかもしれません.
  • 引き続きプログラムをいろいろいじってみましょう. 例えば次のような方針があります. コンテンツからのコピペで構いません. 適切にコピペして動かすだけでも割と大変なので.
    • (numpy を使って) いろいろな関数のグラフを描いてみましょう.
    • (sympy を使って) いろいろな連立方程式を解いてみましょう.
    • いろいろな微分方程式を解いてみましょう. 実際にコンテンツでも紹介しているように, 分点を自分でも変えていじってみるとのが第一歩です.
  • (難しいのでやらなくても構いません) 近似について考えてみましょう. もとの関数 $f$ がほとんど 0 であるにも関わらず, 導関数が 0 とはかけ離れた関数を考えてみてください.
  • 近似の基準として差の絶対値の最大値, つまり $\max_x |f(x) - g(x)|$ を取ることにします. この量が小さくても, 導関数に対する $\max_x |f'(x) - g'(x)|$ が小さいとは限らない関数を具体例を作ることで示したことにあたります. エネルギーは適当な導関数によって定義されるので, 近似に関する微妙なさじ加減が少し体験できます. (エネルギーは積分が絡むので実はもう少し面倒です.)
  • 数値計算と微分方程式の近似解法についてはシンプレクティック積分法などの話題もあります.

$F(x)=0$ という関数があったとする。 これは導関数の $F'(x)$ も $F'(x)=0$ である。

自分用メモ

  • 遅延型方程式に対するコメント追加
  • 06 の introduction と overview の統合
  • 人口論の説明のブラッシュアップ
  • import に関する実演:めんどいのでローカルの Jupyter で。

解答例:忘れる前にメモしておく

句読点問題

TeX でいろいろな式を書こう

\begin{align} \int_0^\infty x^{2n} e^{-ax^2} \, dx &= \frac{(2n+1)!!}{2^{n+1}} \sqrt{\pi} a^{- n - 1/2}. \end{align}

\begin{align} \langle f, e^{-tH} g \rangle = \int_{\mathbb{R}^d} \mathbb{E}_W^x \left[ \overline{f(B_0)} g(B_t) e^{- \int_0^t V(B_s) ds} \right] dx. \end{align}

$\mathrm{R}$

いろいろなプログラムを書こう

numpy でのグラフ
1
2
3
4
5
6
7
import numpy as np
import math
x = np.linspace(0.01, 2)
print(np.linspace(0.01, 2))
print(np.log(x))

print(np.log(1))
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[0.01       0.05061224 0.09122449 0.13183673 0.17244898 0.21306122
 0.25367347 0.29428571 0.33489796 0.3755102  0.41612245 0.45673469
 0.49734694 0.53795918 0.57857143 0.61918367 0.65979592 0.70040816
 0.74102041 0.78163265 0.8222449  0.86285714 0.90346939 0.94408163
 0.98469388 1.02530612 1.06591837 1.10653061 1.14714286 1.1877551
 1.22836735 1.26897959 1.30959184 1.35020408 1.39081633 1.43142857
 1.47204082 1.51265306 1.55326531 1.59387755 1.6344898  1.67510204
 1.71571429 1.75632653 1.79693878 1.83755102 1.87816327 1.91877551
 1.95938776 2.        ]
[-4.60517019 -2.98356174 -2.39443189 -2.02619098 -1.75765386 -1.54617572
 -1.37170739 -1.22320417 -1.09392939 -0.97946963 -0.87677571 -0.7836526
 -0.69846743 -0.61997259 -0.54719327 -0.47935332 -0.41582471 -0.35609202
 -0.29972711 -0.2463704  -0.195717   -0.14750614 -0.10151305 -0.05754264
 -0.01542447  0.02499122  0.06383674  0.10122955  0.13727438  0.17206506
  0.20568593  0.23821311  0.26971551  0.30025575  0.32989086  0.35867295
  0.38664975  0.4138651   0.44035936  0.46616976  0.4913307   0.51587408
  0.53982949  0.56322443  0.58608454  0.60843372  0.63029431  0.65168723
  0.67263205  0.69314718]
0.0
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0.01, 2)  # x を 0 にできない
y = np.log(x)  # 自然対数

plt.plot(x, y)

plt.xlabel("x", size=20)
plt.ylabel("y", size=14)
plt.grid()

plt.show()
1
2
3
4
5
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2)  # 0 を含めるとエラー
y = np.log(x)  # 自然対数
1
2
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:5: RuntimeWarning: divide by zero encountered in log
  """
sympy での連立方程式

実際に解があるか目で見て確かめる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-2, 2, 100)  # x を 0 にできない
y1 = x**2 - 1
y2 = x
plt.plot(x, y1, label="x^2 - 1")
plt.plot(x, y2, label="x")
plt.legend()
plt.show()
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from sympy import *
#from sympy.plotting import plot
from IPython.display import display

def custom_latex_printer(expr, **options):
    from IPython.display import Math, HTML
    from google.colab.output._publish import javascript
    url = "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/MathJax.js?config=TeX-AMS_CHTML"
    javascript(content="""window.MathJax = {
        tex2jax: {
            inlineMath: [ ['$','$'] ],
            processEscapes: true
        }
        };""")
    javascript(url=url)
    return latex(expr, **options)

init_printing(use_latex="mathjax", latex_printer=custom_latex_printer)

x = Symbol('x')
expr1 = x**2 - 1
expr2 = x
sol = solve(expr1 - expr2, x) # 「引き算 = 0」にすれば連立方程式を解いたことになる
display(sol)
1
<IPython.core.display.Javascript object>

$$\left [ \frac{1}{2} + \frac{\sqrt{5}}{2}, \quad - \frac{\sqrt{5}}{2} + \frac{1}{2}\right ]$$

微分方程式
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import HTML
from matplotlib import animation

lx = 2  # 計算領域の長さ
nx = 41 # 領域の分割数
xs = np.linspace(0, lx, nx)

def diffusion(nx):
    dx = lx / (nx - 1) # 空間方向の刻み
    dt = 0.001         # 時間刻み
    nt = 200           # 計算回数
    nu = 1.0           # 拡散係数

    # 初期条件:中央以外すべて 0
    u0 = np.zeros(nx)
    # 真ん中に物質を置く
    x_center = int((nx - 1) / 2)
    u0[x_center-2: x_center+2] = 1

    # 結果の配列と nt, nx の次元を持つ配列で初期化
    us = np.zeros((nt, len(u0)))

    # 初期条件を結果の配列の各行にコピー
    us[:,:] = u0.copy()

    for i in range(0, nt-1):
        us[i+1, 1:-1] = us[i, 1:-1] + nu * dt / dx**2 *  (us[i, 2:] - 2 * us[i, 1:-1] + us[i, :-2])

    return us

us = diffusion(nx)

fig = plt.figure()

ax = plt.axes(xlim=(0, lx), ylim=(0, 1.2));
line, = ax.plot([], [], lw=2)

def animate(u):
    line.set_data(xs, u)
    return line

anim = animation.FuncAnimation(fig, animate, frames=us, interval=50)
plt.close(anim._fig)
HTML(anim.to_jshtml(default_mode='reflect'))

関数の近似

十分大きな $n$ に対する次の関数があります。 \begin{align} f(x) &= \frac{1}{n} \sin (e^n x), \ f'(x) &= \frac{e^n}{n} \cos (e^n x). \end{align} グラフを描いてみましょう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import numpy as np
import matplotlib.pyplot as plt

n = 10
x = np.linspace(0, 2 * np.pi, 100)
y1 = np.sin(np.exp(n) * x) / n
y2 = np.exp(n) * np.cos(np.exp(n) * x) / n
plt.plot(x, y1, label="$f$")
plt.plot(x, y2, label="$df/dx$")
plt.legend()
plt.show()
コメント

これは次のように思ってください。

  • 関数 $f_n$ は元の関数 $f_0 = 0$ を(最大値ノルムで)よく近似できている。
  • 関数 $f'_n$ は元の関数の導関数 $f'_0 = 0$ をよく近似できていない.

関数の近似はいろいろ難しいところがあって, それだけで論文になるレベルです. 同じ事情はベクトルの近似にもあります. いま流行りの統計学の応用としての自然言語処理でも, 言語の近さを量的にどう判定するかという問題があり, これはまさに言葉をどうベクトルで表現するか, 表したベクトルの近さを何でどう判定するかが問われています. 例えば, よくある「変換候補」遊びは, ある単語を打ち込んだとき, その人の入力の癖という観点から次にどのような語が来るか (どのような語が近いか) を統計的に判定する自然言語処理の事情が絡んでいます. このあたり, 既に「身近」なテーマで, そして身近なことは本当に難しいのでちょっと考えた程度でわかるような話ではありません. 何せ十分な精度で使いやすくかつ役に立ってもらわないといけないので.

2020-05-03 課題

  • コンテンツの案内ページ
  • GitHub へのリンク
  • matplotlib の公式ドキュメントを見ていろいろ遊んでみてください。例えば次のようなことを試してみてください。
    • 線の色を変えてみる。
    • 点にマーカーをつける。
    • 公式のサンプルやチュートリアルを試してみる。
  • 引き続き TeX でいろいろな式を書いてみましょう。式が書けると数学系のコミュニケーションがだいぶ楽になります。
  • 引き続きプログラムをいろいろいじってみましょう. 例えば次のような方針があります. コンテンツからのコピペで構いません. 適切にコピペして動かすだけでも割と大変なので.
    • (numpy を使って) いろいろな関数のグラフを描いてみましょう.
    • (sympy を使って) いろいろな連立方程式を解いてみましょう. グラフを描くのもおすすめです.
    • いろいろな微分方程式を解いてみましょう. 実際にコンテンツでも紹介しているように, 分点を自分でも変えていじってみるとのが第一歩です.

自分用メモ

  • 遅延型方程式に対するコメント追加
  • import に関する実演
  • Jupyter (IPython)でのはまりどころ解説を作ろう
    • いったん変数を作ると他のセルでも読み込める(読み込めてしまう)
    • 「セルを上から順に読み込まないと動かない」問題の原因
    • カーネル再起動まで変数は残り続ける

解答例

プログラムのコピペの功罪

  • プログラムをコピペしているだけだと自力で組み上げる力がつかない
  • 私の作るコンテンツは基本的に「世のいろいろなコンテンツのギャップを埋める」ことを目的にする
    • 大きな展望を見えるようにする
    • 中規模の目標を作る
  • 初学の段階で小さいプログラムしか書けないのもつまらない
  • 世にある「まとも」なプログラム(numpy などのライブラリ)は規模が大きいので読む・勉強するのが大変
  • どのくらいの規模のプログラムでどのくらいのモノが作れるのかを見たい
  • コピペであってもプログラムが動けばそれだけで面白い(こともある)
  • ある程度先まで見通せないと面白さも見えず、やる気が続かない
  • 程々の規模のプログラムをコピペして動かしてみて様子を掴もう

matplotlib

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import numpy as np
import matplotlib.pyplot as plt

def koch_snowflake(order, scale=10):
    """
    Return two lists x, y of point coordinates of the Koch snowflake.

    Arguments
    ---------
    order : int
        The recursion depth.
    scale : float
        The extent of the snowflake (edge length of the base triangle).
    """
    def _koch_snowflake_complex(order):
        if order == 0:
            # initial triangle
            angles = np.array([0, 120, 240]) + 90
            return scale / np.sqrt(3) * np.exp(np.deg2rad(angles) * 1j)
        else:
            ZR = 0.5 - 0.5j * np.sqrt(3) / 3

            p1 = _koch_snowflake_complex(order - 1)  # start points
            p2 = np.roll(p1, shift=-1)  # end points
            dp = p2 - p1  # connection vectors

            new_points = np.empty(len(p1) * 4, dtype=np.complex128)
            new_points[::4] = p1
            new_points[1::4] = p1 + dp / 3
            new_points[2::4] = p1 + dp * ZR
            new_points[3::4] = p1 + dp / 3 * 2
            return new_points

    points = _koch_snowflake_complex(order)
    x, y = points.real, points.imag
    return x, y

x, y = koch_snowflake(order=5)

plt.figure(figsize=(8, 8))
plt.axis('equal')
plt.fill(x, y)
plt.show()
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['legend.fontsize'] = 10

fig = plt.figure()
ax = fig.gca(projection='3d')


theta = np.linspace(-4 * np.pi, 4 * np.pi, 100)
z = np.linspace(-2, 2, 100)
r = z**2 + 1
x = r * np.sin(theta)
y = r * np.cos(theta)

ax.plot(x, y, z, label='parametric curve')
ax.legend()

plt.show()

TeX でいろいろな式を書こう

Poisson 積分

\begin{align} u\left(z_{0}\right) &= \frac{1}{2 \pi} \int_{0}^{2 \pi} u\left(e^{i \psi}\right) \frac{1-\left|z_{0}\right|^{2}}{| z_{0}-e^{\left.j \phi\right|^{2}}} d \psi, \ u(x, y) &= \frac{1}{2 \pi} \int_{0}^{2 \pi} u(a \cos \phi, a \sin \phi) \frac{a^{2}-R^{2}}{a^{2}+R^{2}-2 a R \cos (\theta-\phi)} d \phi, \ u(x, y, z)&=\frac{1}{4 \pi a} \int_{S} u \frac{a^{2}-R^{2}}{\left(a^{2}+R^{2}-2 a R \cos \theta\right)^{3 / 2}} d S. \end{align}

いろいろなプログラムを書こう

numpy でのグラフ
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-np.pi / 4, np.pi / 4)
plt.plot(x, np.sin(4 * x), label="sin 4x")
plt.plot(x, np.cos(4 * x), label="cos 4x")
plt.plot(x, np.tan(x), label="tan x")

plt.xlabel("x", size=20)
plt.ylabel("y", size=14)
plt.grid()
plt.legend()

plt.show()
sympy
  • Colab 上でもローカルの Jupyter でも動くようにしたい。
  • $n=-1$ の場合分けも勝手にやってくれてすごい。
1
2
3
4
from IPython.display import Math, HTML
def load_mathjax_in_cell_output():
    display(HTML("<script src='https://www.gstatic.com/external_hosted/mathjax/latest/MathJax.js?config=default'></script>"))
get_ipython().events.register('pre_run_cell', load_mathjax_in_cell_output)
1
2
3
4
5
x,n = symbols('x,n')

int = Integral(x**n, (x, 0, x))
print("積分それ自体を表示できる")
display(int)
1
2
3
4
5
積分それ自体を表示できる



<IPython.core.display.Javascript object>

$$\int_{0}^{x} x^{n}\, dx$$

1
2
print("単純な計算結果:場合分けまでしてくれるし、0 での無限大もそう書いてくれる")
display(int.doit())
1
2
3
4
5
単純な計算結果:場合分けまでしてくれるし、0 での無限大もそう書いてくれる



<IPython.core.display.Javascript object>

$$\begin{cases} \log{\left (x \right )} + \infty & \text{for}\: n = -1 \- \frac{0^{n + 1}}{n + 1} + \frac{x^{n + 1}}{n + 1} & \text{otherwise} \end{cases}$$

1
2
print("simplify() で 0 を消せる")
display(simplify(int.doit()))
1
2
3
4
5
simplify()  0 を消せる



<IPython.core.display.Javascript object>

$$\begin{cases} \log{\left (x \right )} + \infty & \text{for}\: n = -1 \\frac{x^{n + 1}}{n + 1} & \text{otherwise} \end{cases}$$

1
2
3
4
from IPython.display import Math, HTML
def load_mathjax_in_cell_output():
    display(HTML("<script src='https://www.gstatic.com/external_hosted/mathjax/latest/MathJax.js?config=default'></script>"))
get_ipython().events.register('pre_run_cell', load_mathjax_in_cell_output)
微分方程式
  • フィッツヒュー・南雲方程式
    • ホジキン-ハクスレー理論で出てきたモデルの簡略化
    • ヤリイカの巨大神経細胞軸索を用いた研究をもとに定式化した神経興奮に関する基礎理論 (Journal of Physiology 117(1952)500-ほか)
    • この業績で 1963 年にノーベル賞(生理学医学賞)を受賞

\begin{align} y_{t}&=c\left(y-\frac{y^{3}}{3}-x+I(t)\right),\x_{t}&=y-bx+a. \end{align}

  • $I$ は時間の関数で構わないが、以下のシミュレーションでは定数にしている。
    • $I$ が 0.34 以上かどうかで解のふるまいが定性的に変わる。
    • 力学系の話。
  • Colab 上で動画を表示させるところまでできなかったので作った動画は YouTube で:Rust 版動画
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
from IPython.display import HTML
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import scipy.integrate as integrate

I = 0.34 #external stimulus
a = 0.7
b = 0.8
c = 10

def FHN(state, t):
    """
    FitzHugh-Nagumo Equations
    u : the membrane potential
    v : a recovery variable
    """
    u, v = state
    dot_u = c * (-v + u - pow(u,3)/3 + I)
    dot_v = u - b * v + a
    return dot_u, dot_v

#initial state
u0 = 2.0
v0 = 1.0

fig = plt.figure()
t = np.arange(0.0, 10, 0.01)
len_t = len(t)
dt = 5 #time steps

#animationの1step
def update(i):
    global y, y0

    #y0の初期値の設定
    if i ==0:
        y0 = [u0, v0]

    plt.cla() #現在描写されているグラフを消去

    #微分方程式を解く
    y = integrate.odeint(FHN, y0, t)

    #1Step(=dt)後のyの値を次のステップでのy0の値に更新する
    y0 = (y[dt,0], y[dt,1])

    #配列としてu,vを取得
    u = y[:,0]
    v = y[:,1]

    #描画
    plt.plot(t, u, label="u : membrane potential", color="#ff7f0e")
    plt.plot(t, v, label="v : recovery variable", color="#1f77b4")
    plt.plot(t[len_t-1], u[len_t-1],'o--', color="#ff7f0e") #uのmarker
    plt.plot(t[len_t-1], v[len_t-1],'o--', color="#1f77b4") #vのmarker
    plt.title("Membrane Potential / Volt")
    plt.grid()
    plt.legend(bbox_to_anchor=(0, 1),
               loc='upper left',
               borderaxespad=0)

    return (u, v)

anim = animation.FuncAnimation(fig, update, interval=100,
                              frames=300)
plt.close(anim._fig)
HTML(anim.to_jshtml(default_mode='reflect'))

質問メモ

  • numpy:モジュール名と関数名を「.」でつなぐ np.array() 関数
  • クラスとオブジェクトの話。

シューティングゲーム - 敵の弾(概念):クラス:弾がどこにあるか x,y - 具体的に画面に現れる弾: x=1, y=1

1
2
3
import numpy as np
print(type(np.array))
#print(type(np.array()))
1
<class 'builtin_function_or_method'>
1
2
from numpy import *
print(type(array))
1
<class 'builtin_function_or_method'>
1
2
a = [1,2]
print(len(a))

2020-05-10 課題

  • コンテンツの案内ページ
  • GitHub へのリンク
  • 曲線を線分で近似できる気分を自分なりに説明してみてください。
    • 手書きで絵を描くだけでも構いません。
    • 一定のルールにしたがって描かれた曲線を適当な近似的ルールで描くのがプログラミングで描く曲線です。
  • 「自分でお絵かきできるようになろう」講座なので、お絵描き用ライブラリに慣れ親しむのが大事です。そこで matplotlib の公式ドキュメントを見ていろいろ遊んでみてください。例えば次のようなことを試してみてください。
    • 線の色を変えてみる。
    • 点にマーカーをつける。
    • 公式のサンプルやチュートリアルを試してみる。
    • 公式サンプル
    • これも公式:サンプルコードもある。
  • 引き続き TeX でいろいろな式を書いてみましょう。式が書けると数学系のコミュニケーションがだいぶ楽になります。
  • 引き続きプログラムをいろいろいじってみましょう. 例えば次のような方針があります. コンテンツからのコピペで構いません. 適切にコピペして動かすだけでも割と大変なので.
    • (numpy を使って) いろいろな関数のグラフを描いてみましょう.
    • (sympy を使って) いろいろな連立方程式を解いてみましょう. グラフを描くのもおすすめです.
    • いろいろな微分方程式を解いてみましょう. 実際にコンテンツでも紹介しているように, 分点を自分でも変えていじってみるとのが第一歩です.

自分用メモ

  • 常微分方程式で漸化式から微分方程式に流れる部分の書き直し
  • 数値計算に関わるクラス・オブジェクトの説明
    • まずは辞書・構造体の拡大版として導入するか?
    • 変な誤解を生まないような書き方を考える
  • 遅延型方程式に対するコメント追加
  • import に関する実演
  • matplotlib 回では実際に matplotlib のチュートリアルを読もう
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる
  • Jupyter (IPython)でのはまりどころ解説を作ろう
    • いったん変数を作ると他のセルでも読み込める(読み込めてしまう)
    • 「セルを上から順に読み込まないと動かない」問題の原因
    • カーネル再起動まで変数は残り続ける

オブジェクトについて

今日は具体的なプログラムというより、今日のメインの話とも少し関係する形でオブジェクトについて少し眺める機会にする。

  • オブジェクト指向のオブジェクトの話ではない。
  • 必ずしもいつもかっちりした定義のもとに議論されているわけでもない。
  • 各プログラミング言語ごとの用語の事情もある。
第一級のオブジェクト

第一級オブジェクト(ファーストクラスオブジェクト、first-class object)は、あるプログラミング言語において、たとえば生成、代入、演算、(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のことである。

問題になる例:言語によっては関数が第一級のオブジェクトになる。(最近の言語は割とこの傾向があるように思う。) 関数が第一級のオブジェクトの言語では「関数の関数」みたいな概念が考えられる。 高階関数と呼ばれる。

「関数の関数」として python の map を紹介しておく。

python #リスト `lst1` の要素を二倍する lst1 = [1, 2, 3, 4] lst2 = [] for a in lst1: lst2.append(a*2) print(lst2)

1
  [2, 4, 6, 8]

```python #次のように map で書ける def prod2(a): return a*2

lst1 = [1, 2, 3, 4] lst2 = list(map(prod2, lst1)) #map はイテレーターを返すので list() でリスト化する print(lst2) ```

1
  [2, 4, 6, 8]

python #参考:ラムダ式 lst1 = [1,2,3,4] lst2 = list(map(lambda x: x*2, lst1)) print(lst2)

1
  [2, 4, 6, 8]

python #参考:リスト内法表記 lst1 = [1,2,3,4] lst2 = [a*2 for a in lst1] print(lst2)

1
  [2, 4, 6, 8]

```python lst1 = [1,2,3,4] lst2 = []

lst3 = [1,2,3,4] for a in lst3: lst2.append(a*2) print(lst2) ```

1
  [2, 4, 6, 8]

```python lst1 = [1,2,3,4] lst2 = []

lst3 = [1,2,3,4]

for a in lst3: lst2.append(a*2) print("") print("")

print(lst2) ```

1
2
3
4
    File "<ipython-input-9-2e52d339fe66>", line 6
      lst2.append(a*2)
         ^
  IndentationError: expected an indented block
なぜ(Python で)map の返り値がイテレーターか
  • 巨大なリストを処理する場合、リストが返るとメモリを大量に消費するから。
  • この手の話をきちんと考えるにはコンピューターアーキテクチャなり、データ構造なり、プログラミング言語に関する諸々の知識がいる(のでその辺のプログラミング言語入門みたいな本ではふつう出てこない)。
  • この手の「入門」は大学の情報科学系の入門書にはきちんと書いてある。
オブジェクトとインスタンス
オブジェクト

だいたい次のような性質を持っています。 - 何らかの型がある。 - 変数に代入できる。 - 関数(メソッド)の引数にできる。 - 関数(メソッド)の戻り値にできる。 - それ自体が式であり、任意の式の一部になる。

インスタンス

これはオブジェクト指向だけの概念です。クラス(プロトタイプベースの場合はプロトタイプとなるオブジェクトになりますが、以下クラスとまとめて考えます)はオブジェクトの雛形です。その雛形から実際のデータをもつオブジェクトにすることを実体化(インスタンス化)と言い、そのオブジェクトはそのクラスのインスタンスと言われます。

python import matplotlib.pyplot as plt fig = plt.figure() #a = A.new()

関数とメソッド

言語によっていろいろありはする。

  • サブルーチン
    • 関数、手続き
    • 何らかの処理をまとめたモノ
    • 数学の関数とは必ずしも関係ない
  • メソッド:メソッド (method) あるいは メンバー関数 (-かんすう, member function) とはオブジェクト指向プログラミング言語において、あるクラスないしインスタンスに所属するサブルーチンを指す。

第一級関数(だいいっきゅうかんすう、英: first-class function、ファーストクラスファンクション)とは、関数を第一級オブジェクトとして扱うことのできるプログラミング言語の性質、またはそのような関数のことである。

```python #値を返す「関数」 def f(): return 1

#値を返さない「関数」 def g(): print(1) g() ```

1
  1

```python class TestClass: x = "変数1"

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
  def __init__(self, y):
      self.y = y

  def test_method1(self):
      print(self.x)

  def test_method2(self, arg1):
      print("引数1:" + arg1)

  def gety(self):
      return self.y

a = TestClass("y") print(a.gety())

b = TestClass("b") print(b.gety())

a.test_method1() b.test_method1() ```

1
2
3
4
  y
  b
  変数1
  変数1

解答例

matplotlib

TeX でいろいろな式を書こう

python def f(): return {"a": "a"} print(f().keys())

1
  dict_keys(['a'])

いろいろなプログラムを書こう

numpy でのグラフ
sympy

python #colab の場合 from IPython.display import Math, HTML def load_mathjax_in_cell_output(): display(HTML("<script src='https://www.gstatic.com/external_hosted/mathjax/latest/MathJax.js?config=default'></script>")) get_ipython().events.register('pre_run_cell', load_mathjax_in_cell_output)

微分方程式

2020-05-17 課題

はじめに

  • コンテンツの案内ページ
  • GitHub へのリンク
  • 前回使った ipynb のプログラムを実際に実行してみて、実数の数値計算上で起こる問題を実感してみてください。
  • 「自分でお絵かきできるようになろう」講座なので、お絵描き用ライブラリに慣れ親しむのが大事です。そこで matplotlib の公式ドキュメントを見ていろいろ遊んでみてください。例えば次のようなことを試してみてください。
    • 線の色を変えてみる。
    • 点にマーカーをつける。
    • 公式のサンプルやチュートリアルを試してみる。
    • 公式サンプル
    • これも公式:サンプルコードもある。
  • 引き続き TeX でいろいろな式を書いてみましょう。式が書けると数学系のコミュニケーションがだいぶ楽になります。

自分用メモ

  • 常微分方程式で漸化式から微分方程式に流れる部分の書き直し
  • 勉強のおすすめ:AtCoder はどうか?C++の解説もあるし、仕事・評価にも割と直結するし、具体的な問題つきで勉強できる。
    • https://atcoder.jp/contests/apg4b
      • C++のコードをPythonで書き直してみるだけでもかなりの勉強になるはず
    • Python によるアルゴリズム https://qiita.com/cabernet_rock/items/cdd12b07d213b67d0530
  • 数値計算に関わるクラス・オブジェクトの説明
    • まずは辞書・構造体の拡大版として導入するか?
    • 変な誤解を生まないような書き方を考える
  • 遅延型方程式に対するコメント追加
  • import に関する実演
  • matplotlib のチュートリアルを読もうの会
  • matplotlib 回では実際に matplotlib のチュートリアルを読もう
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる
  • Jupyter (IPython)でのはまりどころ解説を作ろう
    • いったん変数を作ると他のセルでも読み込める(読み込めてしまう)
    • 「セルを上から順に読み込まないと動かない」問題の原因
    • カーネル再起動まで変数は残り続ける

プログラミングの一般論

イテレーターとジェネレーター

  • 参考
  • この間イテレーターとジェネレーターを勘違いして話してしまったのでやり直し
基本
  • イテレータ: 要素を反復して取り出すことのできるインタフェース
    • 例:リスト、配列、タプル、辞書など
    • 「要素をたくさん持っているデータ構造」
  • ジェネレータ: イテレータの一種であり、1要素を取り出そうとする度に処理を行い、要素を生成する。Pythonではyield文を使った実装を指すことが多い
  • ジェネレーターが必要になる理由
    • とりあえずリストを想定する
    • 要素すべてをあらかじめ計算しておく/取得してくるのが大変
      • 例:何十GBもある巨大なイテレータはメモリにのせられない
    • HDD・SSD に載せるのも大変(速度なり何なりいろいろ)
    • ふつう 1 つ 1 つの要素自体は小さい
    • 要素を 1 つ 1 つ生成すればメモリをそんなに食わない
    • 1 つ 1 つ作ろう
1 つ 1 つ作る?
  • range がイメージしやすそうな気がする
  • 一度にドカッとリストを作る必要はなく、1 つ 1 つの整数を都度作ってくればいい
1
2
3
4
xs = range(0, 10)
print(type(xs))
for x in xs:
    print(x)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<class 'range'>
0
1
2
3
4
5
6
7
8
9
  • イテレータ(リスト)の要素数が $10^{1000000}$ くらいになるとそもそもリストが作れない
  • 一気に作らずに 1 つずつ要素を生成すれば問題なく処理は回る
    • $10^{1000000}$ 個の要素を処理しないといけない点で時間自体はどうしてもかかる
    • これは本質的な問題で、ジェネレーターを使う・使わないに関係ない
    • メモリに載るか載らないかではなく処理の所要時間の問題
Python のジェネレーターの簡単な例
  • yield を使ってみる
1
2
3
4
5
6
7
def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
print(type(gen))
1
<class 'generator'>
1
2
3
4
5
6
7
8
9
def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
print(gen.__next__())  # 1
print(gen.__next__())  # 2
print(gen.__next__())  # 3
1
2
3
1
2
3
  • 4 回呼ぶと怒られる
  • for で呼び出すと怒られるところでループを止めてくれる
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
"""4 回呼ぶと怒られる"""
def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
gen.__next__()  # 1
gen.__next__()  # 2
gen.__next__()  # 3
gen.__next__()  # StopIteration
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
---------------------------------------------------------------------------

StopIteration                             Traceback (most recent call last)

<ipython-input-1-f379ec6e011a> in <module>()
      8 gen.__next__()  # 2
      9 gen.__next__()  # 3
---> 10 gen.__next__()  # StopIteration


StopIteration:
1
2
3
4
5
6
7
8
def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
for a in gen:
    print(a)
1
2
3
1
2
3

クラス

  • 念頭に置くのは Python のクラス・オブジェクト(オブジェクト指向の意味のオブジェクト)
  • データとそれを処理する「関数」のペア
  • まずは「辞書」または「リスト」の拡張だと思おう
  • ある学生 s のテストの点に関していろいろ統計的な処理をしたい
  • 学生 s のテストの点を次のようにリストで持つ
    • 国語・数学・英・理科・社会の順に点数を並べるとする
    • 平均点を計算したい
1
2
3
4
5
s_scores = [10, 20, 30, 40, 50] # 国語・数学・英・理科・社会の順
def calc_mean(s_scores):
    return sum(s_scores) / len(s_scores)
s_mean = calc_mean(s_scores)
print(s_mean)
1
30.0
  • リストだと何も情報がなくて、何番目が何の科目だったか覚えていられない
  • コメントもあるが、何かの都合で仕様が変わったりしたらどうする?
  • 具体的に名前で持たせればいい:辞書を使おう
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
s_scores = {
    "ja": 10,
    "math": 20,
    "eng": 30,
    "science": 40,
    "society": 50
}

def calc_mean(s_scores):
    s_sum = sum([v for v in s_scores.values()])
    return s_sum / len(s_scores)

s_mean = calc_mean(s_scores)
print(s_mean)
1
30.0
  • 関数 calc_mean は(本質的には)成績の持たせ方と連動した関数である
  • 値と処理をバラバラにしないでワンセットにしたい:クラス化
    • いまは単なる平均だからご利益が何も感じられない
    • もっと複雑なことを考えると「ワンセット」にご利益が出てくる
    • それこそ「辞書のクラス・メソッド」などを考えてみよう
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class Score():
    def __init__(self, ja, math, eng, sci, soc):
        self.ja = ja
        self.math = math
        self.eng = eng
        self.sci = sci
        self.soc = soc

    def calc_mean(self):
        return (self.ja + self.math + self.eng + self.sci + self.soc) / 5

s = Score(10, 20, 30, 40, 50)
print(s.calc_mean())
1
30.0
  • ほかの生徒の成績も考えたいとき、簡単に各生徒用のオブジェクトが作れる
    • オブジェクトは s1s2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
class Score():
    def __init__(self, ja, math, eng, sci, soc):
        self.ja = ja
        self.math = math
        self.eng = eng
        self.sci = sci
        self.soc = soc

    def calc_mean(self):
        return (self.ja + self.math + self.eng + self.sci + self.soc) / 5

s1 = Score(10, 20, 30, 40, 50)
print(s1.calc_mean())

s2 = Score(1, 2, 3, 4, 5)
print(s2.calc_mean())
1
2
30.0
3.0

アルゴリズムとデータ構造

アルゴリズムとデータ構造でプログラミングを勉強する

  • https://atcoder.jp/?lang=ja
    • プログラミングのコンテストサイト
    • 競技プログラミング
  • C++ の勉強も兼ねた勉強用ページ https://atcoder.jp/contests/APG4b
  • 初心者向け練習問題 https://atcoder.jp/contests/abs
    • 探せば他にも練習問題特集はある

いいところ

  • 簡単な問題なら 10 行もあれば書ききれる
  • 自分で何か作ったりしなくても問題演習という形でプログラミングに触れられる
  • 基本的には実際のプログラミングに即役立つタイプの問題
  • ランキング上位者は本当にプログラミングで食っていけるレベルの腕でもある
  • 良くも悪くも、コンピューターの基礎みたいな部分に触れざるを得ない面がある
    • リストと配列は何が違うのか?
    • どういうときにどちらを使えばいいのか?
    • メモリ上のデータの配置が違う
    • 「低レイヤー」の話とも向き合う必要が出る可能性

自分に合った勉強法・勉強内容を探そう

  • 最終的な目的・目標と勉強に対する最善のアプローチが一致するとは限らない
  • 私の場合は物理・数学系だと勉強しやすかったが、皆が皆そうというわけでもない
  • 課題を競プロから出してみて様子を見るか?

2020-05-31 課題

はじめに

  • コンテンツの案内ページ
  • GitHub へのリンク
  • 01-01 ipynb のプログラムを実際に実行してみて、実数の数値計算上で起こる問題を実感してみてください。
  • 「自分でお絵かきできるようになろう」講座なので、お絵描き用ライブラリに慣れ親しむのが大事です。そこで matplotlib の公式ドキュメントを見ていろいろ遊んでみてください。例えば次のようなことを試してみてください。
    • 線の色を変えてみる。
    • 点にマーカーをつける。
    • 公式のサンプルやチュートリアルを試してみる。
    • 公式サンプル
    • これも公式:サンプルコードもある。
  • 引き続き TeX でいろいろな式を書いてみましょう。式が書けると数学系のコミュニケーションがだいぶ楽になります。
  • 実際に競プロの問題をいくつか解いてみましょう。例えばここのページを一通り眺めてみてください。Pythonで10問解いてみた記事もあるので参考にしてください。

自分用メモ

  • 常微分方程式で漸化式から微分方程式に流れる部分の書き直し
  • 勉強のおすすめ:AtCoder はどうか?C++の解説もあるし、仕事・評価にも割と直結するし、具体的な問題つきで勉強できる。
    • https://atcoder.jp/contests/apg4b
      • C++のコードをPythonで書き直してみるだけでもかなりの勉強になるはず
    • Python によるアルゴリズム https://qiita.com/cabernet_rock/items/cdd12b07d213b67d0530
  • 文と式の説明
  • IT 基礎知識みたいなやつ
  • 数値計算に関わるクラス・オブジェクトの説明
    • まずは辞書・構造体の拡大版として導入するか?
    • 変な誤解を生まないような書き方を考える
  • 遅延型方程式に対するコメント追加
  • import に関する実演
  • matplotlib のチュートリアルを読もうの会
  • matplotlib 回では実際に matplotlib のチュートリアルを読もう
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる
  • Jupyter (IPython)でのはまりどころ解説を作ろう
    • いったん変数を作ると他のセルでも読み込める(読み込めてしまう)
    • 「セルを上から順に読み込まないと動かない」問題の原因
    • カーネル再起動まで変数は残り続ける

競プロを 2 題解いてみる

  • https://qiita.com/KoyanagiHitoshi/items/c5e82841b8d0f750851d の最初の2題

ABC 086 A - Product

  • 標準入力から取るのが本筋(input
  • 面倒なのでここでは入力部分をハードコードする

```python input_str = "1 3"

print("input_str") print(input_str)

print("======") print(input_str.split())

print("======") print(map(int, input_str.split()))

print("======") print(list(map(int, input_str.split())))

a, b = map(int, input_str.split()) print(a) print(b)

######################## a, b = map(int, input_str.split()) if a*b % 2 == 0: print("Even") else: print("Odd") ```

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
  input_str
  1 3
  ======
  ['1', '3']
  ======
  <map object at 0x7f537ad30c88>
  ======
  [1, 3]
  1
  3
  Odd

python s = "1" print(s) print(type(s)) print(int(s)) print(type(int(s)))

1
2
3
4
  1
  <class 'str'>
  1
  <class 'int'>
map オブジェクトはイテレーター

python input_str = "1 3" a = map(int, input_str.split()) print(a.__next__()) print(a.__next__()) print(a.__next__())

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
  1
  3



  ---------------------------------------------------------------------------

  StopIteration                             Traceback (most recent call last)

  <ipython-input-3-c797e216c7f4> in <module>()
        3 print(a.__next__())
        4 print(a.__next__())
  ----> 5 print(a.__next__())


  StopIteration:
参考:標準入力
  • 果てしなくめんどい
    • 低レイヤーの話に突撃する:コンソール・ターミナル、リダイレクトなどなど
    • 「特殊 ( スペシャル ) ファイル」
    • 「ソケット」
      • http://e-words.jp/w/%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88.html
      • 特定の通信相手(IPネットワーク上の場合はIPアドレスとポートの組み合わせ)と紐付いた通信端点をプログラム上に生成し、これを通じてコネクションの確立やデータの送受信、切断などの処理を行う。具体的な通信方式や通信相手の指定方式が複数用意されており、同じコンピュータ上の他のプロセスとも、TCP/IPなどを利用して他のコンピュータ上のプログラムとも通信できる。
  • 標準入力について参考ページ
  • 低レイヤーとは何か
    • 参考
    • 「低レイヤーとは 「生の」コンピュータに近いことを意味します。」
    • OS やら CPU やらメモリやら何やら
    • 「ハードウェアに近い話」みたいにも言えるかもしれない
    • 簡単とか世間的な意味での「低レベル」とは関係ない
    • 参考:「高レイヤー」は Web アプリなど
  • この辺は基本情報技術者試験などで「基礎知識」として問われたりする

第二問 ABC 081 A - Placing Marbles

  • 文字列は文字からなるリスト(配列)とみなす
  • count() の説明は例えばここ
    • 解説が何を言っているかよくわからないこともよくある
    • サンプルをいくつか動かす方が早いこともよくある
    • 数学でもよくある:一般論・抽象論ばかりではなく例をいじろう

python input_str = "101" print(input_str.count("1"))

1
  2

python input_str = "abcabcab" print(input_str.count("a"))

1
  3

python input_str = "abcabcab" print(input_str.count("abc"))

1
  2

プログラミングの一般論

インポートまわりの話

  • 「お行儀」の問題もいろいろある。
    • コーディングルールとして言及されることはよくある。
  • たくさん読み書きしてはじめてわかることもある。
    • ある程度の量はこなさないと見えない世界がある

初心者にありがちな話:モジュールの内容を全部インポートする

  • 「いちいち必要なのだけ選ぶのはめんどい」
  • 「楽でいいじゃない」

python from sympy import * from numpy import * x,y,z = symbols("x,y,z")

問題点
  • 知らないモジュールのインポートがたくさんあると、どのクラス・関数がどのモジュールから来ているのかわからない
  • 似た名前の関数やクラスなどもたくさんある
  • 他人も読むコードではやめてほしい
  • 将来、詳細を忘れた自分が読むのも厳しい
  • 「わけがわからないので、使うクラスや関数だけインポートしてほしい」
    • 例:使うものだけインポート
      • https://github.com/django/django/blob/master/django/middleware/cache.py#L48-L50
  • 「使うクラス・メソッドだけインポートするか、as で呼ぶかする」といった規約をつけていることもよくある
    • sympy, numpy あたりはお行儀がよくて、必要なモノだけインポートするよう徹底されている模様

python import numpy as np import matplotlib.pyplot as plt

いろいろなインポートの指定

  • 状況に合わせて都合がいいからそうする
  • 状況に合わせた方法もいろいろ準備されている
    • 必要だったから体系化されて盛り込まれている

python from fractions import Fraction q = Fraction(3,4) print(q)

1
  3/4

python import fractions r = fractions.Fraction(3,4) print(r)

1
  3/4
  • 内容は同じだが後者は長い
    • 書くのが面倒
    • 読むときも余計なものまで読まされる
    • シンプルにしたい
  • ケースバイケースでいろいろやる
    • クラスだけ直接インポート:from fractions import Fraction
    • as で短くする:import fractions as f

python import fractions as f a = f.Fraction(3,4) print(a)

1
  3/4

python from numpy import * linspace(0, 10, 11)

1
  array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])

python import numpy numpy.linspace(0, 10, 11)

1
  array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])

全体像をつかもう

  • ある程度大きな姿を捕まえないと局所的に何をやっているかもわからないことはよくある
    • 料理でも下ごしらえとか
      • 「やらなくてもいいが、やらないと美味しくない」
    • フグの調理で毒を避けて処理する
      • 「死にたいならやればいい」
  • 知識や見えている範囲が狭い中で考えて判断しようとしても無駄なことはよくある
  • 意味がわかるかはさておき、ある程度たくさん知っておかないといけないことはよくある
    • 単純な知識問題もよくある
      • はまることや立ち止まることに意味がない
    • 何かを調べたいとき、対応する言葉を知らないと調べようがなければ聞きようもない
  • 本を読んでいるなら、とにかく四の五の言わずに 2-3 週読んでみるとかした方がいいこともよくある
  • プログラミングはちょっと突っ込むだけでいきなりコンピューター関係の基礎知識を大量に要求されるので、さっさと諦めてそれらを勉強する
    • 基礎からやったところですぐにわかるようになるわけもないが、それらを諦めるところまで込めて諦める

膨大な量の経験が大事

  • 経験を積むと「こうした方がいい」「これはやめてほしい」というのがいろいろたまってくる
  • コーディングルールとしてノウハウがまとまっていたりする
  • 数学でもε-δで「なぜこんなεを取るのか」みたいな話はよくあるし、「何でこんな概念を導入するのか」みたいな話はよくある。
    • 「便利だから」とか言われてもその便利なところを実感できるのはだいぶ慣れ親しんでから。
    • この苦労を経ないとその辺の意味やご利益もわからないことはよくある
    • プログラミングでも同じ
    • ある程度は量をこなそう

楽しく量をこなすには?

  • 楽しいと思えることを探すしかない
  • 何が楽しいかは自分しかわからない
  • はじめつまらなくてもやっているうちに楽しくなることもあれば、何かのきっかけで目覚めることもある
  • いい方向が見つかるまでは試行錯誤するしかない
  • この中で自然と頭を使いつつ(質を高めつつ)量もこなす必要が出てくる

2020-06-14 課題

自分用メモ

  • 常微分方程式で漸化式から微分方程式に流れる部分の書き直し
  • 勉強のおすすめ:AtCoder はどうか?C++の解説もあるし、仕事・評価にも割と直結するし、具体的な問題つきで勉強できる。
    • https://atcoder.jp/contests/apg4b
      • C++のコードをPythonで書き直してみるだけでもかなりの勉強になるはず
    • Python によるアルゴリズム https://qiita.com/cabernet_rock/items/cdd12b07d213b67d0530
  • 文と式の説明
  • IT 基礎知識みたいなやつ
  • 数値計算に関わるクラス・オブジェクトの説明
    • まずは辞書・構造体の拡大版として導入するか?
    • 変な誤解を生まないような書き方を考える
  • 遅延型方程式に対するコメント追加
  • import に関する実演
  • matplotlib のチュートリアルを読もうの会
  • matplotlib 回では実際に matplotlib のチュートリアルを読もう
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる
  • Jupyter (IPython)でのはまりどころ解説を作ろう
    • いったん変数を作ると他のセルでも読み込める(読み込めてしまう)
    • 「セルを上から順に読み込まないと動かない」問題の原因
    • カーネル再起動まで変数は残り続ける

Matplotlib

  • とりあえず本当に簡単な図を描く
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-4, 4, 201)
y1 = - 0.5 * x + 1
y2 = np.sin(x)
y3 = np.cos(x)

plt.plot(x, y1)
plt.plot(x, y2)
plt.plot(x, y3)

plt.grid()
plt.axes().set_aspect('equal', 'datalim') # アスペクト比を合わせる
plt.show()
1
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:14: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance.  In a future version, a new instance will always be created and returned.  Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.

勉強ネタ紹介

  • 前回も言ったように、自分に合った、楽しめるネタを探す必要がある
    • 勉強しなければいけないことと、やっていて楽しめること・長続きすることが一致しないこともよくある
  • 教材がある事案
  • 最近の私の趣味と実益を兼ねた対象がデータ構造とアルゴリズムなので、ここでもその辺を試してみている
  • 例えば上の中でも興味のあるネタがあればそれは取り上げるので、要望があれば挙げてほしい。
    • 自然言語処理の UNIX コマンドとか

競プロを 2 題解いてみる

  • https://qiita.com/KoyanagiHitoshi/items/c5e82841b8d0f750851d の 3 題目と最後の問題
  • AOJ も勉強用にお勧め
    • 素因数分解など数学ネタもある
    • これをもとにしたもある
    • 言語が C/C++ なのが難点といえば難点
    • C/C++ の方が低レイヤーを意識しやすくなる利点はある
  • 最近は Python によるデータ構造とアルゴリズムの本も出ているし、ネット上に資料もある

ABC081B、Shift only

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#https://atcoder.jp/contests/abs/submissions/14323299
#input()
#A = list(map(int, input().split()))

def f(A):
    count = 0
    while all(a % 2 == 0 for a in A):
        A = [a/2 for a in A]
        count += 1
    print(count)

A = [8, 12, 40]
f(A)

A = [5, 6, 8, 10]
f(A)

A = [382253568, 723152896, 37802240, 379425024, 404894720, 471526144]
f(A)
1
2
3
2
0
8
Python の all

Pythonでリストやタプルなどのイテラブルオブジェクトの要素がすべてTrue(真)か、いずれか一つでもTrueか、あるいは、すべてFalse(偽)かを判定するには組み込み関数all(), any()を使う。

1
2
print(all([True, True, True]))
print(all([True, False]))
1
2
True
False

ABC086C、Traveling

  • 止まれない条件
    • 止まってよければ問題は簡単:時間に関する制約だけでいい
    • 非現実的な問題設定にしたおかげで難しくなっている
    • cf. たいていの場合は現実が難しすぎるから簡単にした問題を解く
  • 「距離」
    • 京都・札幌・マンハッタンのような碁盤目状に道が整備された街での 2 点間の距離をどう測るといいか?
      • 普通の2点間の距離(ユークリッド距離)$\sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}$ では不適切。
      • $|x_1 - x_2| + |x_1 - x_2|$ で測る方が適切。
      • 機械学習でも $L^1$ 正則化などで出てくる。
      • 情報系(?)だとマンハッタン距離と呼ぶ。
      • 数学では $L^1$ ノルムと呼ぶ。
        • 一般には $L^p$ ノルムという概念がある
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#N = int(input())
def f(N, course):
    count = 0
    T, X, Y = 0, 0, 0
    for i in range(N):
        #t, x, y = map(int, input().split()) # 都度読み込み:駄目な経路があれば即終了
        t, x, y = course[i]
        if abs(x-X)+abs(y-Y) <= t-T and t % 2 == (x+y) % 2:
            count += 1
        T, X, Y = t, x, y
    print("Yes" if count == N else "No")

N = 2
course = [(3, 1, 2,), (6, 1, 1)]
f(N, courses)

N = 1
course = [(2, 100, 100)]
f(N, course)

N = 2
course = [(5, 1, 1), (100, 1, 1)]
f(N, course)
1
2
3
Yes
No
No
1
2
3
4
5
6
7
8
if count == N:
    s = "Yes"
    if a == B:
        s = "a"
    elif a == C:
        s = "b"
else:
    s = "No"
現実的なスケジューリングの問題
  • Google Map の経路探索
  • Yahoo 路線情報などの経路探索
  • 野球・サッカーなどの年間試合日程
  • PASMO などでの運賃清算
PASMO などの運賃計算
  • 論文が出るほどの問題
    • 解説記事
    • https://www.orsj.or.jp/~archive/pdf/j_mag/Vol.54_J_001.pdf
    • https://www.seikei.ac.jp/university/rikou/pdf/JFST440213.pdf
    • https://ci.nii.ac.jp/naid/110008913789
  • 何が難しいか:乗車情報を使って東京の複雑な路線図から「最安運賃」を即座に計算させる
    • 使える時間は 0.2 秒
    • 運賃が高く計算されたら怒られる
    • 安ければ文句がでない
    • いくらでも変な経路がありうる
    • 余計な枝をはじいて重要な部分だけ計算する
  • どうやって:これがアルゴリズム研究
    • ほぼ純粋なプログラムだけの問題
  • テストの視点
    • どんな始点・終点であっても問題なく動くか、プログラムを検証する問題もある
    • 検証すべきパターンは $10^{40}$ 程度あるとか:解説記事
プロスポーツのスケジュール決定
  • OR の研究課題
  • 多数のステークホルダーの利害調整問題
    • ドームなどはコンサートもある
      • 著名アイドル・歌手の結成何周年イベントなどは「この時期、できれば第何週」というレベルで細かい指定が入る
      • ドル箱はもちろん優先
    • 春夏の甲子園の時期は高校野球に占拠される
    • 各チームが過酷な移動スケジュールにならないような配慮
      • 「九州から北海道に順に移動していき、逆順に移動していく」みたいな形だと移動の負担は少ない
      • 必ずしもそううまくは組めない
      • 長時間移動だけでも体力消費があり選手パフォーマンスに影響する
      • 旅費もかさむ
  • どうするか?
    • これも組み合わせは膨大で、電車ほど激しくはないが短時間で計算させたい
    • 最終的には人間の目も入れる必要があるだろう
    • コンピューターにいくつか候補を計算させたい
    • 適当にイベントと時期に重みづけ(ペナルティ)をつけて「一定程度以上ペナルティが積まれたスケジュールはもう考えない」といった工夫がいる
    • いい感じのスケジュールにならなければパラメータ調整して再計算させたい
      • このサイクルはなるべく早く回したい
      • 高速計算の需要
      • この辺は最近はやりの機械学習でもまさに同じような事情がある

プログラミングの一般論

  • Web システムを例にした速度問題
  • データ構造とアルゴリズム
    • 連結リストと配列:どんな特性があるか?
    • スタックとキュー:いつどこで使うか?どう実装するか?

web システムの事例

  • 参考
  • システムが重いというときどこにどんな原因があるか?
    • ソシャゲでもよくある「障害発生」はどこでどう起こるか?
    • どこかのサーバーが物理的に壊れることもある
  • データ構造とアルゴリズム(いわゆる「プログラミング」)がかかわるのはどこか?
    • web サーバーでの処理(プログラム)
    • データベースの(インデックス)設計
    • ソフトによる問題なら基本的にはどこにでもありうる

データ構造とアルゴリズム

  • 鶏と卵で、同時に考えるべきテーマ:何かをするためにはどうデータを持ってどんな処理をすれば効率がいいか?
    • 効率にもいろいろある
    • 単純な処理速度・メモリ消費量・計算量
(連結)リストと配列
  • 何が違うのか?
  • メモリ上の配置やデータの「つなぎ方」
  • 状況によって使い分ける
リストの特徴
  • 要素数は変わることが前提
  • データを(先頭に)追加するのは簡単
  • データの削除も比較的簡単
  • 先頭から 1 つずつ順に処理するならそれなり
  • 検索やデータの書き換えが遅い:連結構造をたどる必要がある
配列の特徴
  • 要素数は固定
  • データの追加・削除が重め
  • データの参照・書き換えが速い:アドレスが連続なので先頭さえわかれば「そこから何番先」と直指定できる
  • 「リストで遅ければ配列で書き直す」みたいなことはよくある
ベクター(参考
  • 「要素数可変の配列」
  • リストのように要素追加・削除が比較的低コストで、要素の参照・書き換えも配列のように速い
  • 何が問題か:要素の追加が楽なように余計なメモリ領域を確保する
  • ハードウェア組み込みプログラムのように、メモリがカツカツの状況では使えない
    • 「メモリがカツカツ」という意味が理解できるか?

2020-06-20 課題

メモ:先に進む前に録画してあるか確認しよう

自分用メモ

  • 常微分方程式で漸化式から微分方程式に流れる部分の書き直し
  • 勉強のおすすめ:AtCoder はどうか?C++の解説もあるし、仕事・評価にも割と直結するし、具体的な問題つきで勉強できる。
    • https://atcoder.jp/contests/apg4b
      • C++のコードをPythonで書き直してみるだけでもかなりの勉強になるはず
    • Python によるアルゴリズム https://qiita.com/cabernet_rock/items/cdd12b07d213b67d0530
  • 文と式の説明
  • IT 基礎知識みたいなやつ
  • 数値計算に関わるクラス・オブジェクトの説明
    • まずは辞書・構造体の拡大版として導入するか?
    • 変な誤解を生まないような書き方を考える
  • 遅延型方程式に対するコメント追加
  • import に関する実演
  • matplotlib のチュートリアルを読もうの会
  • matplotlib 回では実際に matplotlib のチュートリアルを読もう
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる
  • Jupyter (IPython)でのはまりどころ解説を作ろう
    • いったん変数を作ると他のセルでも読み込める(読み込めてしまう)
    • 「セルを上から順に読み込まないと動かない」問題の原因
    • カーネル再起動まで変数は残り続ける

Matplotlib

  • とりあえず本当に簡単な図を描く
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-4, 4, 201)
y1 = x**2 - 2 * x + 1
y2 = x**3 + 2 * x + 3
y3 = x**4 - x**2 - 2 * x + 3

plt.plot(x, y1, label="y1")
plt.plot(x, y2, label="y2")
plt.plot(x, y3, label="y3")

plt.grid()
plt.legend()
#plt.axes().set_aspect('equal', 'datalim') # アスペクト比を合わせる
plt.show()

自然言語処理100本ノック

第1章: 準備運動 00. 文字列の逆順

文字列"stressed"の文字を逆に(末尾から先頭に向かって)並べた文字列を得よ.

1
2
print("".join(list(reversed("stressed"))))
print("stressed"[::-1])
1
2
desserts
desserts
1
reversed("stressed")
1
<reversed at 0x7fddcfffd5f8>
1
"".join(reversed("stressed"))
1
'desserts'
1
list(reversed("stressed"))
1
['d', 'e', 's', 's', 'e', 'r', 't', 's']
1
"|".join(list(reversed("stressed")))
1
'd|e|s|s|e|r|t|s'
1
"stressed"[::2]
1
'srse'

第1章: 準備運動 01. 「パタトクカシーー」

  • 「パタトクカシーー」という文字列の1,3,5,7文字目を取り出して連結した文字列を得よ.
1
print("パタトクカシーー"[1::2])
1
タクシー
1
print("パタトクカシーー"[0::2])
1
パトカー

02. 「パトカー」+「タクシー」=「パタトクカシーー」

「パトカー」+「タクシー」の文字を先頭から交互に連結して文字列「パタトクカシーー」を得よ.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
s1 = "パトカー"
s2 = "タクシー"


print("".join([s1[i] + s2[i] for i in range(4)]))


s = ""
for i in range(4):
    print(s)
    s = s + s1[i]+ s2[i]
print(s)
1
2
3
4
5
6
パタトクカシーー

パタ
パタトク
パタトクカシ
パタトクカシーー

03 円周率

"Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."という文を単語に分解し,各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成せよ.

1
2
s = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
print(list(map(lambda x: len(x), s.split())))
1
[3, 1, 4, 1, 6, 9, 2, 7, 5, 3, 5, 8, 9, 7, 9]
1
2
s = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
s.split()
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
['Now',
 'I',
 'need',
 'a',
 'drink,',
 'alcoholic',
 'of',
 'course,',
 'after',
 'the',
 'heavy',
 'lectures',
 'involving',
 'quantum',
 'mechanics.']
1
2
s = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
print(list(map(lambda x: len(x), s.replace(",", "").replace(".", "").split())))
1
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
s = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
print(s.replace(",", ""))
print(s.replace(",", "").replace(".", ""))
print(s.replace(",", "").replace(".", "").split())

xs = []
for x in s.replace(",", "").replace(".", "").split():
    print(len(x))
    xs.append(len(x))
print(xs)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
Now I need a drink alcoholic of course after the heavy lectures involving quantum mechanics.
Now I need a drink alcoholic of course after the heavy lectures involving quantum mechanics
['Now', 'I', 'need', 'a', 'drink', 'alcoholic', 'of', 'course', 'after', 'the', 'heavy', 'lectures', 'involving', 'quantum', 'mechanics']
3
1
4
1
5
9
2
6
5
3
5
8
9
7
9
[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]

04. 元素記号

"Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."という文を単語に分解し,1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭の2文字を取り出し,取り出した文字列から単語の位置(先頭から何番目の単語か)への連想配列(辞書型もしくはマップ型)を作成せよ.

(言っていることがよくわからなくて何度も読み返した。)

1
2
3
4
5
6
7
8
9
numbers = [1,5,6,7,8,9,15,16,19]
numbers = list(map(lambda x: x - 1, numbers))

def f(i,v):
    return v[0] if i in numbers else v[0:2]

s = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
s = s.replace(",", "").replace(".", "").split()
print({f(i,v): i for i, v in enumerate(s)})
1
{'H': 0, 'He': 1, 'Li': 2, 'Be': 3, 'B': 4, 'C': 5, 'N': 6, 'O': 7, 'F': 8, 'Ne': 9, 'Na': 10, 'Mi': 11, 'Al': 12, 'Si': 13, 'P': 14, 'S': 15, 'Cl': 16, 'Ar': 17, 'K': 18, 'Ca': 19}
1
2
3
4
5
s = ""
if i in numbers:
    s = v[0]
else:
    s = v[0:2]
内包表記をループで書き直した
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
numbers = [1,5,6,7,8,9,15,16,19]
numbers = list(map(lambda x: x - 1, numbers))

def f(i,v):
    return v[0] if i in numbers else v[0:2]

s = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
s = s.replace(",", "").replace(".", "").split()

dic = {}
for i,v in enumerate(s):
    dic[f(i,v)] = i

print(dic)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
0
Hi

1
He

2
Lied

3
Because

4
Boron

5
Could

6
Not

7
Oxidize

8
Fluorine

9
New

10
Nations

11
Might

12
Also

13
Sign

14
Peace

15
Security

16
Clause

17
Arthur

18
King

19
Can

{'H': 0, 'He': 1, 'Li': 2, 'Be': 3, 'B': 4, 'C': 5, 'N': 6, 'O': 7, 'F': 8, 'Ne': 9, 'Na': 10, 'Mi': 11, 'Al': 12, 'Si': 13, 'P': 14, 'S': 15, 'Cl': 16, 'Ar': 17, 'K': 18, 'Ca': 19}

プログラミングの一般論

  • Web システムを例にした速度問題
  • データ構造とアルゴリズム
    • 連結リストと配列:どんな特性があるか?
    • スタックとキュー:いつどこで使うか?どう実装するか?

web システムの事例

  • 参考
  • システムが重いというときどこにどんな原因があるか?
    • ソシャゲでもよくある「障害発生」はどこでどう起こるか?
    • どこかのサーバーが物理的に壊れることもある
  • データ構造とアルゴリズム(いわゆる「プログラミング」)がかかわるのはどこか?
    • web サーバーでの処理(プログラム)
    • データベースの(インデックス)設計
    • ソフトによる問題なら基本的にはどこにでもありうる

データ構造とアルゴリズム

  • 鶏と卵で、同時に考えるべきテーマ:何かをするためにはどうデータを持ってどんな処理をすれば効率がいいか?
    • 効率にもいろいろある
    • 単純な処理速度・メモリ消費量・計算量
(連結)リストと配列
  • 何が違うのか?
  • メモリ上の配置やデータの「つなぎ方」
  • 状況によって使い分ける
リストの特徴
  • 要素数は変わることが前提
  • データを(先頭に)追加するのは簡単
  • データの削除も比較的簡単
  • 先頭から 1 つずつ順に処理するならそれなり
  • 検索やデータの書き換えが遅い:連結構造をたどる必要がある
配列の特徴
  • 要素数は固定
  • データの追加・削除が重め
  • データの参照・書き換えが速い:アドレスが連続なので先頭さえわかれば「そこから何番先」と直指定できる
  • 「リストで遅ければ配列で書き直す」みたいなことはよくある
ベクター(参考
  • 「要素数可変の配列」
  • リストのように要素追加・削除が比較的低コストで、要素の参照・書き換えも配列のように速い
  • 何が問題か:要素の追加が楽なように余計なメモリ領域を確保する
  • ハードウェア組み込みプログラムのように、メモリがカツカツの状況では使えない
    • 「メモリがカツカツ」という意味が理解できるか?

2020-06-28 課題

メモ:先に進む前に録画してあるか確認しよう

  • メモ:東大の AWS クラウド講義資料
  • https://tomomano.gitlab.io/intro-aws/#_hands_on_5_bashoutter
  • これを眺めてみるのもいいかもしれない

自分用メモ

  • 常微分方程式で漸化式から微分方程式に流れる部分の書き直し
  • 勉強のおすすめ:AtCoder はどうか?C++の解説もあるし、仕事・評価にも割と直結するし、具体的な問題つきで勉強できる。
    • https://atcoder.jp/contests/apg4b
      • C++のコードをPythonで書き直してみるだけでもかなりの勉強になるはず
    • Python によるアルゴリズム https://qiita.com/cabernet_rock/items/cdd12b07d213b67d0530
  • 文と式の説明
  • IT 基礎知識みたいなやつ
  • 数値計算に関わるクラス・オブジェクトの説明
    • まずは辞書・構造体の拡大版として導入するか?
    • 変な誤解を生まないような書き方を考える
  • 遅延型方程式に対するコメント追加
  • import に関する実演
  • matplotlib のチュートリアルを読もうの会
  • matplotlib 回では実際に matplotlib のチュートリアルを読もう
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる
  • Jupyter (IPython)でのはまりどころ解説を作ろう
    • いったん変数を作ると他のセルでも読み込める(読み込めてしまう)
    • 「セルを上から順に読み込まないと動かない」問題の原因
    • カーネル再起動まで変数は残り続ける

Matplotlib

  • とりあえず本当に簡単な図を描く
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0.01, 4, 201)
y1 = np.exp(x)
y2 = np.log(x)

plt.plot(x, y1, label="e^x")
plt.plot(x, y2, label="\log x")

plt.grid()
plt.legend()
#plt.axes().set_aspect('equal', 'datalim') # アスペクト比を合わせる
plt.show()

TeX の記録

量子力学の1粒子ハミルトニアン。 \begin{align} \hat{H} = \frac{1}{2m} \hat{p}^2 + V(x). \end{align}

自然言語処理100本ノック

第2章 Unix コマンド

  • 要検討:ローカルでやった方がデモンストレーションとしてはいいかもしれない
  • 参考ページ
    • ここでは pandas を使っている
    • これはこれで覚えると便利
    • Excel が処理できる
  • Google Colab 上では !ls のように ! をつけると Unix (Linux) コマンドが実行できる。
  • Mac ならターミナルから直接実行できる
  • Windows でも適当な手段でインストールできる
    • ただし OS の違いから純粋な Windows では意味を持たないコマンドもある
    • chown や chmod などの権限管理とか
  • すさまじく大量にあり、各コマンドはオプションも死ぬほどたくさんある。
    • 毎日ゴリゴリに使い込まければ覚えられるものではない。
    • 大事なコマンドをいくつか見て慣れ親しむことだけが目的。
補足
  • cd, ls などの(もっと)基本的なコマンドはカバーされていない。
  • 参考リスト:とりあえずこのくらい知っておくといい(名前だけ何となく覚えていればいい)
  • Python にも対応する関数がある
    • mv は shutil.move: https://note.nkmk.me/python-shutil-move/
    • shutil はたぶん shell utilities の略
  • Ruby だと「わかりやすさ」を考えて Linux コマンドと同じ名前の関数・メソッドで定義されている
準備
1
!wget https://nlp100.github.io/data/popular-names.txt
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
--2020-07-12 03:48:25--  https://nlp100.github.io/data/popular-names.txt
Resolving nlp100.github.io (nlp100.github.io)... 185.199.111.153, 185.199.109.153, 185.199.110.153, ...
Connecting to nlp100.github.io (nlp100.github.io)|185.199.111.153|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 55026 (54K) [text/plain]
Saving to: ‘popular-names.txt.1'

popular-names.txt.1 100%[===================>]  53.74K  --.-KB/s    in 0.03s

2020-07-12 03:48:25 (2.03 MB/s) - ‘popular-names.txt.1' saved [55026/55026]
1
!wc --help
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Usage: wc [OPTION]... [FILE]...
  or:  wc [OPTION]... --files0-from=F
Print newline, word, and byte counts for each FILE, and a total line if
more than one FILE is specified.  A word is a non-zero-length sequence of
characters delimited by white space.

With no FILE, or when FILE is -, read standard input.

The options below may be used to select which counts are printed, always in
the following order: newline, word, character, byte, maximum line length.
  -c, --bytes            print the byte counts
  -m, --chars            print the character counts
  -l, --lines            print the newline counts
      --files0-from=F    read input from the files specified by
                           NUL-terminated names in file F;
                           If F is - then read names from standard input
  -L, --max-line-length  print the maximum display width
  -w, --words            print the word counts
      --help     display this help and exit
      --version  output version information and exit

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
Full documentation at: <http://www.gnu.org/software/coreutils/wc>
or available locally via: info '(coreutils) wc invocation'
10. 行数のカウント

行数をカウントせよ.確認にはwcコマンドを用いよ.

1
!wc -l ./popular-names.txt
1
2780 ./popular-names.txt
1
2
3
4
import pandas as pd

df = pd.read_table('./popular-names.txt', header=None, sep='\t', names=['name', 'sex', 'number', 'year'])
print(len(df))
1
2780
補足:wc コマンドの調査
  • 参考
  • 実際にターミナルで実演してみよう
11. タブをスペースに置換

タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.

1
!sed -e 's/\t/ /g' ./popular-names.txt | head -n 5
1
2
3
4
5
Mary F 7065 1880
Anna F 2604 1880
Emma F 2003 1880
Elizabeth F 1939 1880
Minnie F 1746 1880

s/何とか/実はこう書きたかった/

1
!head -n 5 popular-names.txt
1
2
3
4
5
Mary    F   7065    1880
Anna    F   2604    1880
Emma    F   2003    1880
Elizabeth   F   1939    1880
Minnie  F   1746    1880
12. 1列目をcol1.txtに,2列目をcol2.txtに保存

各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ.

Linux コマンド
1
2
3
4
5
!cut -f 1 ./popular-names.txt > ./col1_chk.txt
!cat ./col1_chk.txt | head -n 5

!cut -f 2 ./popular-names.txt > ./col2_chk.txt
!cat ./col2_chk.txt | head -n 5
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Mary
Anna
Emma
Elizabeth
Minnie
F
F
F
F
F
Python
1
2
3
4
5
6
7
col1 = df['name']
col1.to_csv('./col1.txt', =False)
print(col1.head())

col2 = df['sex']
col2.to_csv('./col2.txt', =False)
print(col2.head())
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
0         Mary
1         Anna
2         Emma
3    Elizabeth
4       Minnie
Name: name, dtype: object
0    F
1    F
2    F
3    F
4    F
Name: sex, dtype: object

第 3 章 正規表現

正規表現の簡単な話
  • 分厚い本が何冊も出るくらいのごつい話
  • 例:「イギリス」という言葉が出てくる文章を調べたい
    • 単なる検索でいい
  • 例:「イギリス+単語」という言葉が出てくる文章を、その単語セットとともに調べたい。
    • 例えばイギリスではなく「イギリス連邦」「イギリスの勝利」のような形で調べたい
    • ここで正規表現が出てくる
  • もう少し web でよくある例
    • メールアドレスのバリデーション
    • 「メインの文字列@gmail.com」みたいなのをチェックする
  • メンテナンスが魔界
    • 正規表現は死ぬほど複雑で簡単な部類でさえすでに読みにくい
    • 複雑なものは本当に何もわからない
    • 時間が経つと書いた当人でさえ判別できないことはよくある
ファイル取得
1
!wget https://nlp100.github.io/data/jawiki-country.json.gz
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
--2020-07-12 03:48:38--  https://nlp100.github.io/data/jawiki-country.json.gz
Resolving nlp100.github.io (nlp100.github.io)... 185.199.108.153, 185.199.109.153, 185.199.110.153, ...
Connecting to nlp100.github.io (nlp100.github.io)|185.199.108.153|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5068362 (4.8M) [application/gzip]
Saving to: ‘jawiki-country.json.gz.1'

jawiki-country.json 100%[===================>]   4.83M  13.3MB/s    in 0.4s

2020-07-12 03:48:38 (13.3 MB/s) - ‘jawiki-country.json.gz.1' saved [5068362/5068362]
展開(解凍)
1
!gunzip ./jawiki-country.json.gz
行数確認
1
!wc -l ./jawiki-country.json
1
248 ./jawiki-country.json
先頭行の確認
1
!head -1 ./jawiki-country.json
1
{"title": "エジプト", "text": "{{otheruses|主に現代のエジプト・アラブ共和国|古代|古代エジプト}}\n{{基礎情報 国\n|略名 =エジプト\n|漢字書き=埃及\n|日本語国名 =エジプト・アラブ共和国\n|公式国名 ={{lang|ar|'''جمهورية مصر العربية'''}}\n|国旗画像 =Flag of Egypt.svg\n|国章画像 =[[ファイル:Coat_of_arms_of_Egypt.svg|100px|エジプトの国章]]\n|国章リンク =([[エジプトの国章|国章]])\n|標語 =なし\n|位置画像 =Egypt (orthographic projection).svg\n|公用語 =[[アラビア語]]\n|首都 =[[File:Flag of Cairo.svg|24px]] [[カイロ]]\n|最大都市 =カイロ\n|元首等肩書 =[[近代エジプトの国家元首の一覧|大統領]]\n|元首等氏名 =[[アブドルファッターフ・アッ=シーシー]]\n|首相等肩書 ={{ill2|エジプトの首相|en|Prime Minister of Egypt|label=首相}}\n|首相等氏名 ={{仮リンク|ムスタファ・マドブーリー|ar|مصطفى مدبولي|en|Moustafa Madbouly}}\n|面積順位 =29\n|面積大きさ =1 E12\n|面積値 =1,010,408\n|水面積率 =0.6%\n|人口統計年 =2012\n|人口順位 =\n|人口大きさ =1 E7\n|人口値 =1億人\n|人口密度値 =76\n|GDP統計年元 =2018\n|GDP値元 =4兆4,374億<ref name=\"economy\">IMF Data and Statistics 2020年2月3日閲覧([https://www.imf.org/external/pubs/ft/weo/2019/02/weodata/weorept.aspx?sy=2017&ey=2024&scsm=1&ssd=1&sort=country&ds=.&br=1&c=469&s=NGDP%2CNGDPD%2CPPPGDP%2CNGDPDPC%2CPPPPC&grp=0&a=&pr.x=57&pr.y=4])</ref>\n|GDP統計年MER =2018\n|GDP順位MER =45\n|GDP値MER =2,496億<ref name=\"economy\" />\n|GDP統計年 =2018\n|GDP順位 =21\n|GDP値 =1兆2,954億<ref name=\"economy\" />\n|GDP/人 =13,358<ref name=\"economy\" />\n|建国形態 =[[独立]]<br />&nbsp;-&nbsp;日付\n|建国年月日 =[[イギリス]]より<br />[[1922年]][[2月28日]]\n|通貨 =[[エジプト・ポンド]] (£)\n|通貨コード =EGP\n|時間帯 = +2\n|夏時間 =なし\n|国歌 =[[エジプトの国歌|{{lang|ar|بلادي، بلادي، بلادي}}]]{{ar icon}}<br>''我が祖国''<br>{{center|[[file:Bilady, Bilady, Bilady.ogg]]}}\n|ISO 3166-1 = EG / EGY\n|ccTLD =[[.eg]]\n|国際電話番号 =20\n|注記 =\n}}\n'''エジプト・アラブ共和国'''(エジプト・アラブきょうわこく、{{lang-ar|جمهورية مصر العربية}})、通称'''エジプト'''は、[[中東]]([[アラブ世界]])および[[北アフリカ]]にある[[共和国]]。[[首都]]は[[カイロ]]。\n\n[[アフリカ大陸]]では北東端に位置し、西に[[リビア]]、南に[[スーダン]]、北東の[[シナイ半島]]では[[イスラエル]]、[[ガザ地区]]と[[国境]]を接する。北は[[地中海]]、東は[[紅海]]に面している。南北に流れる[[ナイル川]]の[[河谷]]と[[三角州|デルタ]]地帯([[ナイル・デルタ]])のほかは、国土の大部分の95%以上が[[砂漠]]である<ref>[https://kotobank.jp/word/エジプト-36404 エジプト]藤井宏志『日本大百科全書』小学館 2020年2月1日閲覧</ref>。ナイル河口の東に地中海と紅海を結ぶ[[スエズ運河]]がある。\n\n== 国号 ==\n正式名称は[[アラビア語]]で {{lang|ar|'''جمهورية مصر العربية'''}}(ラテン[[翻字]]: {{transl|ar|DIN|Ǧumhūrīyah Miṣr al-ʿarabīyah}})。通称は {{lang|ar|'''مصر'''}}([[フスハー|標準語]]: {{transl|ar|DIN|Miṣr}} ミスル、[[アラビア語エジプト方言|エジプト方言]]ほか、口語アラビア語: {{IPA|mɑsˤɾ}} マスル)。[[コプト語]]: {{Lang|cop|Ⲭⲏⲙⲓ}}(Khemi ケーミ)。\n\nアラビア語の名称'''ミスル'''は、古代から[[セム語派|セム語]]でこの地を指した名称である。なお、セム語の一派である[[ヘブライ語]]では、[[双数形]]の'''ミスライム'''({{lang|he|מצרים}}, ミツライム)となる。\n\n公式の英語表記は '''Arab Republic of Egypt'''。通称 '''Egypt''' {{IPA-en|ˈiːdʒɨpt|}}。形容詞はEgyptian {{IPA-en|ɨˈdʒɪpʃ''ə''n|}}。エジプトの呼称は、古代[[エジプト語]]のフート・カア・プタハ([[プタハ]]神の魂の神殿)から転じてこの地を指すようになったギリシャ語の単語である、[[ギリシャ神話]]の[[アイギュプトス (ギリシア神話)|アイギュプトス]]にちなむ。\n\n[[日本語]]の表記はエジプト・アラブ共和国。通称[[wikt:エジプト|エジプト]]。[[漢字]]では'''埃及'''と表記し、'''埃'''と略す。この[[国名の漢字表記一覧|漢字表記]]は、[[漢文]]がそのまま日本語や[[中国語]]などに輸入されたものである。英語では「イージプト」と呼ばれる。\n\n* [[1882年]] - 1922年 ({{仮リンク|イギリス領エジプト|en|History of Egypt under the British}})\n* 1922年 - 1953年 [[エジプト王国]]\n* 1953年 - 1958年 [[エジプト共和国]]\n* 1958年 - 1971年 [[アラブ連合共和国]]\n* 1971年 - 現在 エジプト・アラブ共和国\n\n== 歴史 ==\n{{Main|エジプトの歴史}}\n\n=== 古代エジプト ===\n[[ファイル:All Gizah Pyramids.jpg|thumb|300px|right|[[ギーザ|ギザ]]の[[三大ピラミッド]]]]\n[[ファイル:Egyptiska hieroglyfer, Nordisk familjebok.png|thumb|260px|right|[[ヒエログリフ]]]]\n{{Main|古代エジプト}}\n\n「エジプトはナイルの賜物」という[[古代ギリシア]]の[[歴史家]][[ヘロドトス]]の言葉で有名なように、エジプトは豊かな[[ナイル川]]の[[三角州|デルタ]]に支えられ[[古代エジプト|古代エジプト文明]]を発展させてきた。エジプト人は[[紀元前3000年]]ごろには早くも中央集権国家を形成し、[[ピラミッド]]や[[王家の谷]]、[[ヒエログリフ]]などを通じて世界的によく知られている高度な[[文明]]を発達させた。\n\n=== アケメネス朝ペルシア ===\n3000年にわたる諸王朝の盛衰の末、[[紀元前525年]]に[[アケメネス朝]]ペルシアに支配された。\n\n=== ヘレニズム文化 ===\n[[紀元前332年]]には[[アレクサンドロス3世|アレクサンドロス大王]]に征服された。その後、[[ギリシャ人|ギリシア系]]の[[プトレマイオス朝]]が成立し、[[ヘレニズム]]文化の中心のひとつとして栄えた。\n\n=== ローマ帝国 ===\nプトレマイオス朝は[[紀元前30年]]に滅ぼされ、エジプトは[[ローマ帝国]]の[[属州]]となり[[アエギュプトゥス]]と呼ばれた。ローマ帝国の統治下では[[キリスト教]]が広まり、[[コプト教会]]が生まれた。ローマ帝国の分割後は[[東ローマ帝国]]に属し、豊かな[[穀物]]生産でその繁栄を支えた。\n\n=== イスラム王朝 ===\n7世紀に[[イスラム教|イスラム化]]。[[639年]]に[[イスラム帝国]]の[[将軍]][[アムル・イブン・アル=アース]]によって征服され、[[ウマイヤ朝]]および[[アッバース朝]]の一部となった。アッバース朝の支配が衰えると、そのエジプト[[総督]]から自立した[[トゥールーン朝]]、[[イフシード朝]]の短い支配を経て、[[969年]]に現在の[[チュニジア]]で興った[[ファーティマ朝]]によって征服された。これ以来、[[アイユーブ朝]]、[[マムルーク朝]]とエジプトを本拠地として[[歴史的シリア|シリア地方]]まで版図に組み入れた[[イスラム王朝]]が500年以上にわたって続く。特に250年間続いたマムルーク朝の下で[[中央アジア]]や[[カフカス]]などアラブ世界の外からやってきた[[マムルーク]](奴隷軍人)による支配体制が確立した。\n\n=== オスマン帝国 ===\n[[1517年]]に、マムルーク朝を滅ぼしてエジプトを属州とした[[オスマン帝国]]のもとでもマムルーク支配は温存された({{仮リンク|エジプト・エヤレト|en|Egypt Eyalet}})。\n\n=== ムハンマド・アリー朝 ===\n[[ファイル:ModernEgypt, Muhammad Ali by Auguste Couder, BAP 17996.jpg|thumb|180px|[[ムハンマド・アリー]]]]\n[[1798年]]、[[フランス]]の[[ナポレオン・ボナパルト]]による[[エジプト・シリア戦役|エジプト遠征]]をきっかけに、エジプトは[[近代国家]]形成の時代を迎える。フランス軍撤退後、混乱を収拾して権力を掌握したのはオスマン帝国が派遣した[[アルバニア人]]部隊の隊長としてエジプトにやってきた軍人、[[ムハンマド・アリー]]であった。彼は実力によってエジプト総督に就任すると、マムルークを打倒して総督による中央集権化を打ち立て、[[経済]]・[[軍事]]の近代化を進め、エジプトをオスマン帝国から半ば独立させることに成功した。アルバニア系ムハンマド・アリー家による[[世襲]]政権を打ち立てた([[ムハンマド・アリー朝]])。しかし、当時の世界に勢力を広げた[[ヨーロッパ]][[列強]]はエジプトの独立を認めず、また、ムハンマド・アリー朝の急速な近代化政策による社会矛盾は結局、エジプトを列強に経済的に従属させることになった。\n\n=== イギリスの進出 ===\nムハンマド・アリーは[[綿花]]を主体とする農産物[[専売制]]をとっていたが、1838年に宗主オスマン帝国が[[イギリス]]と自由貿易協定を結んだ。ムハンマド・アリーが1845年に三角州の堰堤を着工。死後に専売制が崩壊し、また堰堤の工期も延びて3回も支配者の交代を経た1861年、ようやく一応の完工をみた。1858年末には国庫債券を発行しなければならないほどエジプト財政は窮迫していた。[[スエズ運河会社]]に払い込む出資金の不足分は、シャルル・ラフィット([[:fr:Charles Laffitte|Charles Laffitte]])と割引銀行(現・[[BNPパリバ]])から借り、国庫債券で返済することにした。[[イスマーイール・パシャ]]が出資の継続を認めたとき、フランスの[[ナポレオン3世]]の裁定により契約責任を問われ、違約金が[[自転車操業]]に拍車をかけた。[[1869年]]、エジプトはフランスとともに[[スエズ運河]]を開通させた。この前後(1862 - 1873年)に8回も[[外債]]が起債され、額面も次第に巨額となっていた。エジプトはやむなくスエズ運河会社持分を398万[[スターリング・ポンド|ポンド]]でイギリスに売却したが、1876年4月に[[デフォルト]]した<ref>西谷進、「[https://doi.org/10.20624/sehs.37.2_113 一九世紀後半エジプト国家財政の行詰まりと外債 (一)]」 『社会経済史学』 1971年 37巻 2号 p.113-134,216\n, {{doi|10.20624/sehs.37.2_113}}</ref>。\n\n英仏が負債の償還をめぐって争い、エジプトの蔵相は追放された。[[イタリア]]や[[オーストリア]]も交えた負債委員会が組織された。2回目のリスケジュールでイスマーイール一族の直轄地がすべて移管されたが、土地税収が滞った<ref>西谷進、「[https://doi.org/10.20624/sehs.37.3_283 一九世紀後半エジプト国家財政の行詰まりと外債 (二)]」 社会経済史学 1971年 37巻 3号 p.283-311,330-33, {{doi|10.20624/sehs.37.3_283}}</ref>。\n\n[[1882年]]、[[アフマド・オラービー]]が中心となって起きた反英運動([[ウラービー革命]])がイギリスによって武力鎮圧された。エジプトはイギリスの[[保護国]]となる。結果として、政府の教育支出が大幅カットされるなどした。[[1914年]]には、[[第一次世界大戦]]によってイギリスがエジプトの名目上の[[宗主国]]であるオスマン帝国と開戦したため、エジプトはオスマン帝国の宗主権から切り離された。さらに[[サアド・ザグルール]]の逮捕・国外追放によって反英独立運動たる[[エジプト革命 (1919年)|1919年エジプト革命]]が勃発し、英国より主政の国として独立した。\n\n=== 独立・エジプト王国 ===\n第一次大戦後の[[1922年]][[2月28日]]に'''[[エジプト王国]]'''が成立し、翌年イギリスはその[[独立]]を認めたが、その後もイギリスの間接的な支配体制は続いた。\n\nエジプト王国は[[立憲君主制]]を布いて議会を設置し、緩やかな近代化を目指した。[[第二次世界大戦]]では、[[枢軸国軍]]がイタリア領リビアから侵攻したが、英軍が撃退した([[北アフリカ戦線]])。第二次世界大戦前後から[[パレスチナ問題]]の深刻化や、1948年から1949年の[[パレスチナ戦争]]([[第一次中東戦争]])での[[イスラエル]]への敗北、経済状況の悪化、[[ムスリム同胞団]]など政治のイスラム化([[イスラム主義]])を唱える社会勢力の台頭によって次第に動揺していった。\n\n=== エジプト共和国 ===\nこの状況を受けて[[1952年]]、軍内部の秘密組織[[自由将校団]]が[[クーデター]]を起こし、国王[[ファールーク1世 (エジプト王)|ファールーク1世]]を亡命に追い込み、ムハンマド・アリー朝を打倒した([[エジプト革命 (1952年)|エジプト革命]]<ref>片山正人『現代アフリカ・クーデター全史』叢文社 2005年 ISBN 4-7947-0523-9 p49</ref>)。生後わずか半年の[[フアード2世 (エジプト王)|フアード2世]]を即位させ、[[自由将校団]]団長の[[ムハンマド・ナギーブ]]が首相に就任して権力を掌握した。さらに翌年の1953年、国王を廃位して共和政へと移行、[[ムハンマド・ナギーブ|ナギーブ]]が首相を兼務したまま初代大統領となり、'''エジプト共和国'''が成立した。\n\n=== ナーセル政権 ===\n[[ファイル:Gamal Nasser.jpg|thumb|180px|right|[[ガマール・アブドゥル=ナーセル]]。[[第二次中東戦争]]に勝利し、スエズ運河を国有化した。ナーセルの下でエジプトは[[汎アラブ主義]]の中心となった]]\n[[1956年]]、第2代大統領に就任した[[ガマール・アブドゥル=ナーセル]]のもとでエジプトは[[冷戦]]下での中立外交と[[汎アラブ主義|汎アラブ主義(アラブ民族主義)]]を柱とする独自の政策を進め、[[第三世界]]・[[アラブ諸国]]の雄として台頭する。同年にエジプトは[[スエズ運河国有化宣言|スエズ運河国有化]]を断行し、これによって勃発した[[第二次中東戦争]](スエズ戦争)で政治的に勝利を収めた。[[1958年]]には[[シリア]]と連合して'''[[アラブ連合共和国]]'''を成立させた。しかし[[1961年]]にはシリアが連合から脱退し、[[国家連合]]としてのアラブ連合共和国はわずか3年で事実上崩壊した。さらに[[1967年]]の[[第三次中東戦争]]は惨敗に終わり、これによってナーセルの権威は求心力を失った。\n\n=== サーダート政権 ===\n[[1970年]]に急死したナーセルの後任となった[[アンワル・アッ=サーダート]]は、自ら主導した[[第四次中東戦争]]後に[[ソビエト連邦]]と対立して[[アメリカ合衆国]]など[[西側諸国]]に接近。[[社会主義]]的経済政策の転換、[[イスラエル]]との融和など、ナーセル体制の切り替えを進めた。[[1971年]]には、国家連合崩壊後もエジプトの国号として使用されてきた「アラブ連合共和国」の国号を捨てて'''エジプト・アラブ共和国'''に改称した。また、サーダートは、経済の開放などに舵を切るうえで、左派に対抗させるべくイスラーム主義勢力を一部容認した。しかしサーダートは、イスラエルとの和平を実現させたことの反発を買い、[[1981年]]に[[イスラム過激派]]の[[ジハード団]]によって[[暗殺]]された。\n\n=== ムバーラク政権 ===\n[[ファイル:Hosni Mubarak ritratto.jpg|thumb|180px|[[アラブの春]]で失脚するまで30年以上にわたり長期政権を維持した[[ホスニー・ムバーラク]]]]\n[[イラク]]の[[クウェート侵攻]]はエジプトの国際収支を悪化させた。サーダートに代わって副大統領から大統領に昇格した[[ホスニー・ムバーラク]]は、対米協調外交を進める一方、[[開発独裁]]的な[[政権]]を20年以上にわたって維持した。\n\nムバラク政権は1990年12月に「1000日計画」と称する経済改革案を発表した。クウェート解放を目指す[[湾岸戦争]]では[[多国籍軍]]へ2万人を派兵し、これにより約130億ドルも[[対外債務]]を減らすという外交成果を得た。累積債務は500億ドル規模であった。軍事貢献により帳消しとなった債務は、クウェート、[[サウジアラビア]]に対するものと、さらに対米軍事債務67億ドルであった。1991年5月には[[国際通貨基金]]のスタンドバイクレジットおよび[[世界銀行]]の構造調整借款(SAL)が供与され、[[パリクラブ]]において200億ドルの債務削減が合意された。エジプト経済の構造調整で画期的だったのは、ドル・ペッグによる為替レート一本化であった<ref>『エジプトの経済発展の現状と課題』 [[海外経済協力基金]]開発援助研究所 1998年 23頁</ref>。\n\n海外の[[機関投資家]]に有利な条件が整えられていった。イスラム主義運動は厳しく[[弾圧]]され、[[ザカート|喜捨]]の精神は失われていった。[[1997年]]には[[イスラム集団]]による[[ルクソール事件]]が発生している。1999年にイスラム集団は武装闘争放棄を宣言し、近年、観光客を狙った事件は起こっていない。しかし、ムバーラクが大統領就任と同時に発令した[[非常事態法]]は、彼が追放されるまで30年以上にわたって継続された<ref>[http://www.cnn.co.jp/world/30001719.html エジプト副大統領が野党代表者らと会談、譲歩示す]</ref>。\n\n2002年6月、エジプト政府は15億ドルの[[ユーロ債]]を起債したが、2002年から2003年に為替差損を被り、対外債務を増加させた<ref>IMF, ''Arab Republic of Egypt: Selected Issues'', 2005, [https://books.google.co.jp/books?id=aZDSd_fjJzkC&pg=PT49&dq=reschedule+egypt+eurobond&hl=ja&sa=X&ved=0ahUKEwiD0qHpn8DbAhWLWbwKHXRrDGQQ6AEIJzAA#v=onepage&q=reschedule%20egypt%20eurobond&f=false]</ref>。\n\n=== ムルシー政権 ===\n[[ファイル:Mohamed Morsi-05-2013.jpg|thumb|180px|民主化後初の大統領だった[[ムハンマド・ムルシー]]]]\n{{Main|エジプト革命 (2011年)|2012年エジプト大統領選挙}}\n[[チュニジア]]の[[ジャスミン革命]]に端を発した近隣諸国の民主化運動がエジプトにおいても波及し、[[2011年]]1月、30年以上にわたって独裁体制を敷いてきたムバーラク大統領の辞任を求める大規模なデモが発生した。同2月には大統領支持派によるデモも発生して騒乱となり、国内主要都市において大混乱を招いた。大統領辞任を求める声は日に日に高まり、2月11日、ムバーラクは大統領を辞任し、全権が[[エジプト軍最高評議会]]に委譲された。同年12月7日には{{仮リンク|カマール・ガンズーリ|en|Kamal Ganzouri}}を暫定首相とする政権が発足した。その後、2011年12月から翌年1月にかけて人民議会選挙が、また2012年5月から6月にかけて大統領選挙が実施され[[ムハンマド・ムルシー]]が当選し、同年6月30日の大統領に就任したが、人民議会は大統領選挙決選投票直前に、選挙法が違憲との理由で裁判所から解散命令を出されており、立法権は軍最高評議会が有することとなった。\n\n2012年11月以降、新憲法の制定などをめぐって反政府デモや暴動が頻発した({{仮リンク|2012年-13年エジプト抗議運動|en|2012–13 Egyptian protests}})。ムルシー政権は、政権への不満が大規模な暴動に発展するにつれて、当初の警察改革を進める代わりに既存の組織を温存する方向に転換した。{{仮リンク|ムハンマド・イブラヒーム・ムスタファ|ar|محمد إبراهيم مصطفى|label=ムハンマド・イブラヒーム}}が内相に就任した[[2013年]]1月以降、治安部隊による政治家やデモ隊への攻撃が激化。1月末には当局との衝突でデモ参加者など40人以上が死亡したが、治安部隊への調査や処罰は行われていない<ref>「『アラブの春』の国で繰り返される悪夢」 エリン・カニンガム 『Newsweek[[ニューズウィーク]]日本版』 2013年3月5日号</ref>。イブラヒーム内相は、「国民が望むならば辞任する用意がある」と2月に述べている<ref>{{Cite news\n|url=http://english.ahram.org.eg/News/63894.aspx\n|title=I will leave my position if people want: Egypt's interior minister\n|newspaper=アハラムオンライン\n|date=2013-02-02\n|accessdate=2013-05-08\n}}</ref>。下落する[[エジプト・ポンド]]がとめどなく[[アメリカ合衆国ドル|USドル]]に交換され、[[外貨準備]]を減らすような混乱が同月10日の[[ロイター通信]]で報じられている。下落は1月から起きており、同月には[[ドバイ]]のエミレーツNBD([[:en:Emirates NBD|Emirates NBD]])が[[BNPパリバ]]のエジプト支店を完全買収した。[[オイルマネー]]がエジプト経済を我が物にする社会現象が起こっていた。さらに『[[フィナンシャル・タイムズ]]』が1月19日に報じたのは、[[エチオピア]]がナイルの川上に48億ドルの予算をかけて[[ダム]]を造るという計画であった。混乱中のエジプトが水紛争で負ければ大きな水ストレスが生じるだろうと予測された。\n\n2013年4月、[[エジプト中央銀行]]は[[リビア]]から20億ドルの預金を得た。リビア側が利害を説明したところによると、リビアはエジプト株を100億ドル近く保有しているという。リビアは[[世界金融危機]]の時から欧米の[[メガバンク]]と癒着を疑われている。\n\nムルシー政権は発足後約1年後の[[2013年エジプトクーデター|2013年7月3日、軍部によるクーデター]]によって終焉を迎えた<ref>{{Cite news\n|url=http://middleeast.asahi.com/watch/2013070800008.html\n|title=エジプトのクーデターに至る過程:朝日新聞記事再録\n|work=asahi.com\n|newspaper=[[朝日新聞]]\n|date=2013-07-09\n|accessdate=2013-07-13\n}}</ref>。8月下旬にムバラクが釈放され、国内銀行が平常運転に復帰した。8月30日の[[CNN]]では、[[中国石油化工]]が米国[[ヒューストン]]のアパッチ([[:en:Apache Corporation|Apache Corporation]])とエジプト内[[油田]]事業を提携したことが報じられた。10月下旬、[[アラブ首長国連邦]]がエジプトに50億ドルの支援を申し出た。エジプトエリートの売国とソブリン危機は翌年4月まで深化していった。\n\nなお、イブラヒームは、クーデター後に成立した[[ハーゼム・エル=ベブラーウィー|ベブラーウィー]]暫定内閣でも続投している。\n\n=== アッ=シーシー政権 ===\n[[ファイル:Abdel_Fattah_el-Sisi_September_2017.jpg|thumb|180px|[[アブドルファッターフ・アッ=シーシー]]。2013年のクーデターを主導し、大統領に就任した]]\n2014年5月26日 - 28日に行われた大統領選挙では2013年のクーデターの主導者[[アブドルファッターフ・アッ=シーシー]]が当選して6月8日、大統領に就任し<ref>http://www.afpbb.com/articles/-/3017089 エジプトのシシ新大統領が就任、前大統領の追放からほぼ1年</ref>、8月5日からは[[新スエズ運河]]の建設など大規模なプロジェクトを推し進めた。[[2015年]][[3月13日]]には、[[カイロ]]の東側に向こう5 - 7年で、450億ドルを投じて新しい行政首都の建設も計画していることを明らかにした<ref>http://jp.reuters.com/article/topNews/idJPKBN0MC0B720150316 エジプト、カイロの東に新行政首都建設へ=住宅相(ロイター通信)</ref>。行政と経済の中心となる新首都はカイロと紅海の間に建設され、広さは約700平方キロメートルで、米[[ニューヨーク]]の[[マンハッタン]]のおよそ12倍の面積の予定であり<ref>http://jp.wsj.com/articles/SB10030317691824024149004580519060782977390 エジプト、新首都建設を計画―カイロと紅海の間に</ref>、大統領府などエジプトの行政を担う地区は当初覚書を交わした[[アラブ首長国連邦]](UAE)の[[エマール・プロパティーズ]]や[[中華人民共和国|中国]]の[[中国建築|中国建築股份有限公司]]との破談はあったものの[[2016年]]4月に地元企業によって工事を開始し<ref>{{Cite news|url=http://www.xinhuanet.com/english/2016-04/02/c_135246252.htm|tile=Egypt kicks off 1st phase of building new capital|work= [[新華社]]|date=2016-04-02|accessdate=2018-06-25}}</ref>、代わりにエジプト政府がピラミッド<ref>{{Cite news|url= https://zhuanlan.zhihu.com/p/41444500|title=埃及总理表示,将新首都CBD项目建成"金字塔"一样的地标|work= 知乎专栏|date=2018-08-06|accessdate=2018-08-18}}</ref>に匹敵する一大事業の[[ランドマーク]]と位置づけている、アフリカでもっとも高いビルも建設予定である経済を担う[[中央業務地区]]を中国企業が請け負って[[2018年]]3月に着工した<ref>{{Cite news|url=http://www.xinhuanet.com/english/2017-10/12/c_136672905.htm|tile=Chinese firm finalizes deal for building huge business district in Egypt's new capital|work= amwalalghad|date=2017-10-12|accessdate=2018-07-28}}</ref><ref>{{Cite news|url=http://en.amwalalghad.com/china-to-build-egypt-africa-tallest-tower-in-new-capital-spokesperson/|tile=China to build Egypt-Africa tallest tower in new capital: spokesperson|work= amwalalghad|date=2018-06-28|accessdate=2018-06-29}}</ref><ref>{{Cite news|url=https://www.bloomberg.com/news/articles/2018-03-18/china-to-finance-majority-of-new-egypt-capital-s-tower-district|tile=China to Finance Majority of New Egypt Capital's Tower District|work= [[ブルームバーグ (企業)|ブルームバーグ]]|date=2018-03-18|accessdate=2018-07-28}}</ref><ref>{{Cite news|url= http://eg.mofcom.gov.cn/article/todayheader/201803/20180302720170.shtml|title=中建埃及新行政首都CBD项目开工仪式在开罗举行|work= 中華人民共和国駐エジプト大使館|date=2018-03-21|accessdate=2018-06-25}}</ref>。\n\nUAEや中国と破談した背景には通貨不安が存在する。2016年11月3日、エジプト中央銀行が[[変動相場制]]を採用すると発表した。エジプト・ポンドが売られるのを革命の影響だけで片付けるには、この不安は長引きすぎている。同行は6日後、国際金融機関から20億ドルの[[シャドー・バンキング・システム#レポ市場|レポ借入]]を始めた。4月に[[国際通貨基金]]からも120億ドルを借りている。エジプトは経済主権を失っている。[[ガーディアン]]が10月4日に報じたところでは、国際金融機関の[[バークレイズ]]がエジプト事業を[[ダノン#ワファバンク|ワファバンク]]に売却した。\n\n2017年末、政府が[[世界銀行]]に対し、エチオピアのダム事業を差し止めるように要請した。世銀は5月にエジプトへ10億ドルを追加融資しており、エジプトは厳しい立場にある。翌2018年1月中旬にエチオピアとの水紛争が妥協に至った。5月末にエジプトの対外債務累積額は829億ドルであった。9月、ムバラクの息子ら2人([[:en:Gamal Mubarak|Gamal]] and [[:en:Alaa Mubarak|Alaa]])がエジプトの株価を操作した疑いで逮捕された。\n\n== 政治 ==\n{{エジプトの政治}}\n{{Main2|詳細は{{仮リンク|エジプトの政治|en|Politics of Egypt|ar|السياسة في مصر}}および[[近代エジプトの国家元首の一覧]]}}\n\n=== 政体 ===\n[[共和制]]\n=== 大統領 ===\n[[国家元首]]の大統領は、立法・行政・司法の三権において大きな権限を有する。また国軍([[エジプト軍]])の[[総司令官|最高司令官]]でもある。大統領の選出は、[[直接選挙]]による。任期は4年で、三選禁止となった<ref>{{Cite journal|和書|author = 鈴木恵美|coauthors = |title = エジプト革命以後の新体制形成過程における軍の役割|journal = 地域研究|volume = 12|issue = 1|pages = 135-147|publisher = 京都大学地域研究統合情報センター|location = |date = 2012-03-28|language = |url = http://www.cias.kyoto-u.ac.jp/publish/?cat=4|jstor = |issn = 1349-5038 |isbn =978-4-8122-1178-6|doi = |id = |naid = |accessdate = 2012-06-17}}</ref>。最高大統領選挙委員会(The Supreme Presidential Election Commission, SPEC)委員長は、最高憲法裁判所長官が兼任していたが、現在は副長官がその任を負う。\n\n第2代大統領[[ガマール・アブドゥル=ナーセル]]以来、事実上の終身制が慣例で、第4代大統領[[ホスニー・ムバーラク]]は[[1981年]]の就任以来、約30年にわたって[[独裁]]体制を築いた。ムバーラクの[[親米]]・親[[イスラエル]]路線が欧米諸国によって評価されたために、独裁が見逃されてきた面がある。当時は任期6年、多選可。議会が候補者を指名し、国民は[[信任投票]]を行っていた。ただし、2005年は複数候補者による大統領選挙が実施された。\n\n[[2011年]]9月に大統領選が予定されていたが、2011年1月に騒乱状態となり、[[2月11日]]、ムバーラクは国民の突き上げを受ける形で辞任した。翌日より[[国防大臣]]で[[エジプト軍最高評議会|軍最高評議会]]議長の[[ムハンマド・フセイン・タンターウィー]]が元首代行を務め、それは[[2012年エジプト大統領選挙]]の当選者[[ムハンマド・ムルシー]]が[[6月30日]]に大統領に就任するまで続いた。2011年[[3月19日]]、[[憲法改正]]に関する[[国民投票]]が行われ、承認された<ref name=jpnmofa>{{Cite web|title = エジプト・アラブ共和国 基礎データ|work = 各国:地域情勢|publisher = 外務省(日本)|url = http://www.mofa.go.jp/mofaj/area/egypt/data.html|accessdate =2016-10-01}}</ref><ref>{{Cite web|title = エジプト基礎情報~政治・外交|work = エジプト情報|publisher = 在エジプト日本国大使館|date = 2011-07-30|url = http://www.eg.emb-japan.go.jp/j/egypt_info/basic/seiji.htm|accessdate =2016-10-01}}</ref>。\n\nしかしムルシー政権発足からわずか1年後の2013年、[[2013年エジプトクーデター|軍事クーデター]]が勃発。ムルシーは解任され、エジプトは再び軍による統治へと逆戻りした。2014年1月に再び憲法が修正され<ref name=jpnmofa />、同年5月の大統領選挙を経て再び民政へと復帰した。\n\n=== 議会 ===\n議会は、[[一院制]]の'''人民議会'''(マジュリス・アッ=シャアブ)。全508議席で、498議席は公選、10議席は大統領指名枠<ref>2011年12月現在では、定数498議席のうち、3分の2(332議席)が政党(連合)リストによる[[比例代表制]]で、3分の1(166議席)が[[小選挙区制]]で選出される</ref>。任期5年。これとは別に、'''諮問評議会'''(シューラ)が1980年設置されたが、立法権は有さない大統領の諮問機関である<ref>{{Cite web| author = 鈴木恵美\n | coauthors =\n | title = エジプト\n | work = 中東・イスラーム諸国の民主化\n | publisher = NIHU プログラム・イスラーム地域研究、東京大学拠点\n | date =\n | url = http://www.l.u-tokyo.ac.jp/~dbmedm06/me_d13n/database/egypt/egypt_all.html\n | format =\n | doi =\n | accessdate = 2012-06-15}}</ref>。全270議席で、180議席が公選、90議席が大統領指名枠。\n\n=== 選挙 ===\n2011年[[11月21日]]、[[イサーム・シャラフ]]暫定内閣は、デモと中央[[治安部隊]]の衝突で多数の死者が出たことの責任を取り軍最高評議会へ辞表を提出した。軍最高評議会議長タンターウィーは[[11月22日]]テレビで演説し、「28日からの人民議会選挙を予定通り実施し、次期大統領選挙を2012年6月末までに実施する」と表明した<ref>[http://www.asahi.com/special/meastdemo/TKY201111220122.html エジプト・シャラフ内閣が総辞職表明 デモの混乱で引責] 『朝日新聞』 2011年11月22日</ref><ref>[http://www.asahi.com/special/meastdemo/TKY201111230004.html エジプト軍議長「近く挙国一致内閣」とテレビ演説] 『朝日新聞』 2011年11月23日</ref><ref>[http://www.asahi.com/special/meastdemo/TKY201111250136.html エジプト軍議長、元首相に組閣要請 選挙管理内閣を想定] 『朝日新聞』 2011年11月25日</ref>。人民議会選挙は2011年[[11月28日]]から[[2012年]][[1月]]までに、行政区ごとに3回に分けて、また、投票日を1日で終わりにせず2日間をとり、大勢の投票での混乱を緩和し実施、諮問評議会選挙も[[3月11日]]までに実施された。また[[5月23日]]と[[5月24日|24日]]に[[2012年エジプト大統領選挙|大統領選挙]]の投票が実施された。\n\nしかし、[[6月14日]]に最高[[憲法裁判所]]が出した「現行の議会選挙法は違憲で無効(3分の1の議員について当選を無効と認定)」との判決を受け<ref>[http://www.asahi.com/international/reuters/RTR201206150031.html「エジプト議会選は無効」、憲法裁が大統領選直前に違法判断] 『朝日新聞』 2012年6月15日</ref><ref>[http://www.news24.jp/articles/2012/06/15/10207632.html エジプト議会、解散へ 大統領選にも影響か] [[日テレNEWS24]] 2012年6月15日</ref>、[[6月16日|16日]]までにタンターウィー議長は人民議会解散を命じた<ref>{{Cite news\n  | author = カイロ共同\n | title = エジプト、軍が議会に解散命令 憲法裁判所の判断で\n | newspaper = 47NEWS\n | location =\n | pages = 6\n | language =\n | publisher = 共同通信\n | date = 2012-06-18\n | url = http://www.47news.jp/CN/201206/CN2012061701001315.html\n | accessdate = 2012-06-18}}</ref>。大統領選挙の決選投票は6月16日と[[6月17日|17日]]に実施され、イスラム主義系の[[ムハンマド・ムルシー]]が当選した。\n\n=== 政党 ===\n{{main|エジプトの政党}}\n\n2011年3月28日に改正政党法が公表され、エジプトでは[[宗教]]を基盤とした[[政党]]が禁止された。そのため、[[ムスリム同胞団]](事実上の最大[[野党]]であった)などは非合法化され、初めての選挙(人民議会選挙)では、ムスリム同胞団を母体とする[[自由公正党]]({{lang-ar|حزب الحرية والعدالة}} - {{lang|en|Ḥizb Al-Ḥurriya Wal-'Adala}}, {{lang-en-short|Freedom and Justice Party}})が結成された。また、[[ヌール党]]([[サラフィー主義]]、イスラーム保守派)、[[新ワフド党]](エジプト最古の政党)、[[政党連合]]{{仮リンク|エジプト・ブロック|en|Egyptian Bloc}}(含む[[自由エジプト人党]](世俗派)、[[エジプト社会民主党]](中道左派)、[[国民進歩統一党]](左派))、[[ワサト党]]、{{仮リンク|政党連合革命継続|en|The Revolution Continues Alliance}}、{{仮リンク|アダラ党|en|Justice Party (Egypt)|label=公正党}}({{lang-ar|حزب العدل}} - {{lang|en|Hizb ElAdl}}, {{lang-en-short|Justice Party}}、今回の革命の中心を担った青年活動家による政党)など、全部で50以上の政党が参加していた<ref>{{Cite web\n | last =\n | first =\n | authorlink =\n | coauthors =\n | title = エジプト・アラブ共和国 基礎データ\n | work = 各国:地域情勢\n | publisher = 外務省(日本)\n | date =\n | url = http://www.mofa.go.jp/mofaj/area/egypt/data.html\n | format =\n | doi =\n | accessdate =2012-06-17 }}</ref><ref>{{Cite web\n | last =\n | first =\n | authorlink =\n | coauthors =\n | title = エジプト基礎情報~政治・外交\n | work = エジプト情報\n | publisher = 在エジプト日本国大使館\n | date = 2011-07-30\n | url = http://www.eg.emb-japan.go.jp/j/egypt_info/basic/seiji.htm\n | format =\n | doi =\n | accessdate =2012-06-17 }}</ref>。\n\n=== 政府 ===\n* {{仮リンク|エジプトの首相|en|Prime Minister of Egypt|label=首相}}・{{仮リンク|ムスタファ・マドブーリー|en|Moustafa Madbouly}} 2018年6月就任。\n* {{仮リンク|エジプトの国防大臣の一覧|en|List of Ministers of Defence of Egypt|label=国防大臣}}・{{仮リンク|セドキ・ソブヒィ|en|Sedki Sobhi}} 2014年3月就任、エジプト軍総司令官。\n\n== 司法 ==\n{{Main2|詳細は[[エジプトの法]]}}\n[[ナポレオン法典]]と[[イスラム法]]に基づく、混合した法システム<ref>{{Cite web|title = Egypt| publisher = CIA-The World Factbook| url = https://www.cia.gov/library/publications/the-world-factbook/geos/eg.html| accessdate = 2012-06-15}}</ref>。フランスと同じく、司法訴訟と行政訴訟は別の系統の裁判所が担当する。{{仮リンク|フランスにおける裁判所の二元性|fr|Dualité des ordres de juridiction en France}}参照。\n* {{仮リンク|最高憲法裁判所|en|Supreme Constitutional Court of Egypt}} - 法律が違憲か否かを判断する。1979年設立。長官はアドリー・マンスール(2013年7月1日 - )<ref>{{Cite web| title = Aperçu Historique | publisher = 最高憲法裁判所\n  | url =http://www.hccourt.gov.eg/About/history.asp\n | accessdate = 2013-08-27}}</ref>。ほか、10人の判事は1998年から2013年7月までに着任している<ref>{{Cite web| title = Current Members of the Court | publisher = 最高憲法裁判所\n | date =\n | url =http://www.hccourt.gov.eg/CourtMembers/CurrentCourt.asp\n | accessdate = 2013-08-27}}</ref>。長官は[[最高大統領選挙委員会]](The Supreme Presidential Election Commission, SPEC)の委員長を兼任していた<ref>{{Cite news\n | author = 貫洞欣寛\n| title = エジプト司法が逆襲 ムバラク裁判「判決批判許さん」\n | newspaper = 朝日新聞 | date = 2012-06-09\n | url = http://digital.asahi.com/articles/TKY201206080567.html?ref=comkiji_txt_end\n | accessdate = 2012-06-15}}</ref>が、2012年9月には副長官ハーティム・バガートゥーが務めていた<ref>{{Cite web\n | title = 中東要人講演会\n | newspaper = 中東調査会 | date =\n | url = http://www.meij.or.jp/members/20120903124551000000.pdf\n | accessdate = 2012-09-09}}</ref>。\n* [[司法省]]管轄の一般の[[裁判所]] - [[最高裁判所]]([[破毀院]]、1931年設立)と以下の[[下級裁判所]]([[控訴院]]、[[第一審]]裁判所、[[地区裁判所]]および[[家庭裁判所]] - 2004年設立)からなる。\n* [[国務院]]管轄の[[行政裁判所]] - [[コンセイユ・デタ]] - 1946年設立<ref>{{Cite web| title = Judiciary Authority| publisher = Egypt State Information Service\n| url =http://www.sis.gov.eg/En/Templates/Categories/tmpListArticles.aspx?CatID=248\n | accessdate = 2013-08-29}}</ref>。2011年[[2月19日]]、従来の[[政党委員会]](政府運営)の申請却下に対する不服申し立てを認めた形の判決で、[[政党]]の許認可<ref>{{Cite web| title = エジプトでイスラーム政党が認可 | work =[中東研ニュースリポート]| publisher = [[日本エネルギー経済研究所]] 中東研究センター| date = 2月21日\n | url =http://jime.ieej.or.jp/htm/extra/ronbun/003pol.htm\n | format =\n | doi =\n | accessdate = 2012-05-19}}</ref>を、[[4月16日]]、[[与党]]・[[国民民主党 (エジプト)|国民民主党]](NDP)の解散を裁定した。\n\n== 国際関係 ==\n{{main|{{仮リンク|エジプトの国際関係|en|Foreign relations of Egypt}}}}\n国力、文化的影響力などの面からアラブ世界のリーダーとなっている。ガマール・アブドゥル=ナーセル時代には[[非同盟諸国]]の雄としてアラブに限らない影響力を持ったが、ナーセル死後はその影響力は衰えた。ナーセル時代は親ソ連だった外交はサーダート時代に入って親米路線となり、さらにそれに伴いイスラエルとの外交関係が進展。1978年の[[キャンプ・デービッド合意]]とその翌年のイスラエル国交回復によって親米路線は確立したが、これはイスラエルを仇敵とするアラブ諸国の憤激を買い、ほとんどのアラブ諸国から断交されることとなった。その後、[[1981年]]にサーダートが暗殺されたあとに政権を握ったムバーラクは親米路線を堅持する一方、アラブ諸国との関係回復を進め、1988年には[[シリア]]、[[レバノン]]、[[リビア]]を除くすべてのアラブ諸国との関係が回復した<ref>『アフリカを知る事典』、平凡社、ISBN 4-582-12623-5 1989年2月6日 初版第1刷 p.58</ref>。以降はアラブの大国として域内諸国と協調する一方、アフリカの一国として2004年9月には[[国際連合安全保障理事会]]の[[常任理事国]]入りを目指すことを表明した。[[2011年]]、[[パレスチナ]]の[[ガザ]]の[[国境検問所|検問所]]を開放した。また、[[イラン]]との関係を修復しようとしている<ref>[http://www.asyura2.com/11/lunchbreak47/msg/284.html エジプト:ガザ、出入り自由に 検問所開放、外交転換鮮明に]</ref>。\n\nシーシー政権はムスリム同胞団政権時代のこうした外交政策とは一線を画している。欧米や日本、親米アラブ諸国、イスラエルのほか、中国や[[ロシア]]<ref>[https://www.nikkei.com/article/DGXMZO24487270R11C17A2FF2000/ 「ロシアが中東に接近 プーチン大統領、エジプトに軍事協力 米の中東政策の揺らぎつく」][[日本経済新聞]]ニュースサイト(2017年12月11日)2019年1月9日閲覧。</ref>などと広範な協力関係を築いている。\n\n[[2017年カタール外交危機]]では、サウジアラビアとともに、ムスリム同胞団を支援してきたカタールと[[国交]]を断絶した国のひとつとなった。またサウジアラビアとは、[[アカバ湾]]口に架橋して陸上往来を可能とするプロジェクトが話し合われた([[チラン島]]を参照)。\n\n=== 日本国との関係 ===\n{{Main|日本とエジプトの関係}}\n\n== 軍事 ==\n[[ファイル:Abrams in Tahrir.jpg|thumb|陸軍の主力戦車[[M1エイブラムス]]]]\n{{Main|エジプト軍}}\n中東有数の軍事大国であり、イスラエルと軍事的に対抗できる数少ないアラブ国家であると目されている。2010年11月見積もりの総兵力は46万8,500人。[[予備役]]47万9,000人。兵員数は[[陸軍]]34万人([[軍警察]]を含む)、[[海軍]]1万8,500人([[沿岸警備隊]]を含む)、[[空軍]]3万人、[[防空軍]]8万人<ref>{{Cite book\n | title = The Middle East and North Africa 2012\n | publisher = Routledge\n | edition = 58th\n | date = 2011\n | page = 380\n | isbn = 978-1-85743-626-6}}</ref>。内務省管轄の中央[[治安部隊]]、[[国境警備隊]]と国防省管轄の革命[[国家警備隊]](大統領[[親衛隊]])の[[準軍事組織]]が存在する。\n\nイスラエルとは4度にわたる[[中東戦争]]で毎回干戈を交えたが、[[第二次中東戦争]]で政治的な勝利を得、[[第四次中東戦争]]の緒戦で勝利を収めたほかは劣勢のまま終わっている。その後はイスラエルと接近し、シーシー政権下ではシナイ半島で活動する[[イスラム過激派]]([[ISIS]])に対する掃討作戦で、[[イスラエル空軍]]による[[爆撃]]を容認していることを公式に認めた<ref>[http://www.tokyo-np.co.jp/article/world/list/201901/CK2019010602000123.html 「対IS イスラエルと協力」エジプト大統領 治安重視]『[[東京新聞]]』朝刊2019年1月6日(国際面)2019年1月9日閲覧。</ref>。\n\n軍事的にはアメリカと協力関係にあるため、[[北大西洋条約機構]](NATO)のメンバーではないものの同機構とは親密な関係を保っている。また、ロシアや中国からも武器の供給を受けており、中露の主導する[[上海協力機構]]への参加も申請している<ref>{{Cite web|date=2015-07-11|url=http://jp.sputniknews.com/politics/20150710/556387.html|title=上海協力機構事務総長:機構はカラー革命など恐れていない|publisher=Sputnik 日本|accessdate=2019-08-18}}</ref><ref>{{Cite web|date=2015-07-27|url=http://arab.rbth.com/news/2015/07/27/30859.html|title=وزير الخارجية المصري: مصر لا تستبعد عضويتها في منظمة \"شنغهاي\" للتعاون في المستقبل | روسيا ما وراء العناوين|publisher=ロシアNOWアラビア語版|accessdate=2019-08-18}}</ref><ref>{{Cite web|date=2016-06-23|url=http://www.interfax.com/newsinf.asp?id=683491|title=Syria, Israel, Egypt willing to join SCO's activity - president's special envoy|publisher=[[インテルファクス通信]]|accessdate=2019-08-18}}</ref>。\n\n== 地方行政区画 ==\n[[ファイル:Governorates of Egypt.svg|thumb|right|280px|エジプトの行政区画]]\n{{Main|エジプトの県}}\nエジプトの最上級の地方行政単位は、29あるムハーファザ({{lang|ar|محافظة}}, '''県'''、'''州''' と訳されることもある)である。[[知事]]は中央政府から派遣される官選知事で、内務省の管轄下において中央集権体制をとる。極端な行政区分でナイル川流域やナイル下流は非常に細分化されているにもかかわらず、南部は非常に大まかに分けられている。これは、ナイル流域以外が全域砂漠であり、居住者がほとんどいないことによるものである。\n\n=== 主要都市 ===\n{{Main|エジプトの都市の一覧}}\n{{Main|エジプトの県}}\n{{Col-begin}}\n{{Col-break}}\n* [[アシュート]]\n* [[アスワン]]\n* [[マラウィー]]\n* [[アブ・シンベル]]\n* [[アレクサンドリア]]\n* [[イスマイリア]]\n* [[インバーバ]]\n* [[エスナ]]\n* [[エドフ]]\n* [[エル・アラメイン]]\n* [[カイロ]]\n{{Col-break}}\n* [[ケナ]]\n* [[ギーザ]]\n* [[コム・オンボ]]\n* [[ザガジグ]]\n* [[サッカラ]]\n* [[シャルム・エル・シェイク]]\n* [[スエズ]]\n* [[スブラエルケーマ]]\n* [[ソハーグ県|ソハーグ]]\n* [[ダマンフール]]\n* [[タンター]]\n{{Col-break}}\n* [[ディムヤート]]\n* [[ハルガダ]]\n* [[ファイユーム]]\n* [[ベニスエフ]]\n* [[ポートサイド]]\n* [[エル=マハッラ・エル=コブラ|マハッラ・クブラー]]\n* [[マンスーラ]]\n* [[ミニヤー県|ミニヤ]]\n* [[メンフィス (エジプト)]]\n* [[ルクソール]]\n* [[ロゼッタ (エジプト)|ロゼッタ]]\n{{Col-end}}\n<!-- 五十音順 -->\n\n== 地理 ==\n{{Main2|詳細は{{仮リンク|エジプトの地理|en|Geography of Egypt}}}}\n[[ファイル:Egypt Topography.png|thumb|200px|エジプトの地形図]]\n[[ファイル:Egypt 2010 population density1.png|thumb|200px|エジプトの人口分布図]]\n[[アフリカ大陸]]北東隅に位置し、国土面積は100万2,450㎢で、世界で30番目の大きさである。国土の95%は砂漠で、ナイル川の西側には[[サハラ砂漠]]の一部である西部砂漠([[リビア砂漠]])、東側には[[紅海]]と[[スエズ湾]]に接する[[東部砂漠]]({{lang|ar|الصحراء الشرقية}} - シャルキーヤ砂漠)がある。西部砂漠には海抜0m以下という地域が多く、面積1万8,000km<sup>2</sup>の広さをもつ[[カッターラ低地]]は海面より133mも低く、[[ジブチ]]の[[アッサル湖]]に次いでアフリカ大陸で2番目に低い地点である。[[シナイ半島]]の北部は砂漠、南部は山地になっており、エジプト最高峰の[[カテリーナ山]](2,637m)や、[[旧約聖書]]で[[モーセ]]が[[モーセの十戒|十戒]]を授かったといわれる[[シナイ山]](2,285m)がある。シナイ半島とナイル河谷との間は[[スエズ湾]]が大きく湾入して細くくびれており、ここが[[アフリカ大陸]]と[[ユーラシア大陸]]の境目とされている。この細い部分は低地であるため、[[スエズ運河]]が建設され、紅海と地中海、ひいてはヨーロッパとアジアを結ぶ大動脈となっている。\n[[ファイル:S F-E-CAMERON 2006-10-EGYPT-LUXOR-0439.JPG|thumb|left|200px|[[ナイル川]]]]\n[[ナイル川]]は南隣の[[スーダン]]で[[白ナイル川]]と[[青ナイル川]]が合流し、エジプト国内を南北1,545Kmにもわたって北上し、河口で広大な[[三角州|デルタ]]を形成して[[地中海]]にそそぐ。[[アスワン]]以北は人口稠密な河谷が続くが、幅は5Kmほどとさほど広くない。上エジプト中部のキーナでの湾曲以降はやや幅が広がり<ref>『朝倉世界地理講座 アフリカI』初版所収「ナイル川の自然形態」春山成子、2007年4月10日(朝倉書店)p198</ref>、[[アシュート]]近辺で分岐の支流が[[ファイユーム]]近郊の[[モエリス湖|カールーン湖]]({{lang|ar|Birket Qarun}}、かつての[[モエリス湖]])へと流れ込む。この支流によって、カールーン湖近辺は肥沃な{{仮リンク|ファイユーム・オアシス|en|Faiyum Oasis}}を形成している。一方、本流は、[[カイロ]]近辺で典型的な扇状三角州となる'''[[ナイル・デルタ]]'''は、地中海に向かって約250Kmも広がっている。かつてはナイル川によって運ばれる土で、デルタ地域は国内でもっとも肥沃な土地だったが、[[アスワン・ハイ・ダム]]によってナイル川の水量が減少したため、地中海から逆に塩水が入りこむようになった。ナイル河谷は、古くから[[下エジプト]]と[[上エジプト]]という、カイロを境にした2つの地域に分けられている。前者はデルタ地域を指し、後者はカイロから上流の谷を指している。ナイル河谷は、世界でももっとも[[人口密度]]の高い地域のひとつである。\n\nナイル河谷以外にはほとんど人は住まず、わずかな人が[[オアシス]]に集住しているのみである。乾燥が激しく地形がなだらかなため、特にリビア砂漠側には[[ワジ]](涸れ川)が全くない。[[シワ・オアシス|シーワ]]、[[ファラフラ (エジプト)|ファラーフラ]]、[[ハルガ]]、バハレイヤ、ダフラといった[[オアシス]]が点在している<ref>『ミリオーネ全世界事典』第10巻 アフリカI([[学習研究社]]、1980年11月)p206</ref>。ナイル以東のシャルキーヤ砂漠は地形がやや急峻であり、ワジがいくつか存在する。紅海沿岸も降雨はほとんどないが、ナイルと[[アラビア半島]]を結ぶ重要な交通路に位置しているため、いくつかの小さな港が存在する。\n\n=== 国境 ===\n1885年に列強が[[ドイツ]]の[[ベルリン]]で開いた会議で、それまでに植民地化していたアフリカの分割を確定した。リビア国境の大部分で[[東経25度線|東経25度]]に、スーダンでは[[北緯22度線|北緯22度]]に定めたため、国境が直線的である。\n\nスーダンとの間では、エジプトが[[実効支配]]する[[ハラーイブ・トライアングル]]に対してスーダンも領有権を主張している。一方、その西にある[[ビル・タウィール]]は両国とも領有権を主張していない[[無主地]]である。\n\n=== 気候 ===\n{{Main2|詳細は{{仮リンク|エジプトの気候|en|Climate of Egypt}}}}\n国土の全域が[[砂漠気候]]で人口はナイル河谷および[[デルタ地帯]]、[[スエズ運河]]付近に集中し、国土の大半は[[サハラ砂漠]]に属する。夏には日中の気温は40℃を超え、50℃になることもある。降雨はわずかに[[地中海|地中海岸]]にあるにすぎない。冬の平均気温は下エジプトで13 - 14℃、上エジプトで16℃程度である。2013年12月にはカイロ市内でも降雪・積雪があったが、観測史上初ということで注目された。\n\n== 経済 ==\n{{Main2|詳細は{{仮リンク|エジプトの経済|en|Economy of Egypt}}}}\n[[ファイル:View from Cairo Tower 31march2007.jpg|thumb|left|220px|カイロはビジネス、文化、政治などを総合評価した[[世界都市#世界と指数|世界都市格付け]]でアフリカ第1位の都市と評価された<ref>[http://www.atkearney.com/documents/10192/4461492/Global+Cities+Present+and+Future-GCI+2014.pdf/3628fd7d-70be-41bf-99d6-4c8eaf984cd5 2014 Global Cities Index and Emerging Cities Outlook] (2014年4月公表)</ref>]]\n\n2018年のエジプトの[[GDP]]は約2,496億ドル(約27兆円)、一人当たりでは2,573ドルである<ref name=\"economy\" />。アフリカでは屈指の経済規模であり、[[BRICs]]の次に経済発展が期待できるとされている[[NEXT11]]の一国にも数えられている。しかし、一人当たりのGDPでみると、中東や北アフリカ諸国の中では、最低水準であり、[[トルコ]]の約4分の1、[[イラン]]の半分に過ぎず、更に同じ北アフリカ諸国である[[チュニジア]]や[[モロッコ]]に比べても、水準は低い<ref name=\"エジプト経済の現状と今後の展望\" >{{Cite report|author=堀江 正人|date=2019-01-08|title=エジプト経済の現状と今後の展望 ~経済の復調が注目される中東北アフリカの大国エジプト~|url=https://www.murc.jp/report/economy/analysis/research/report_190108/|publisher=[[三菱UFJリサーチ&コンサルティング|三菱UFJリサーチ&コンサルティング株式会社]]|accessdate=2020-02-03}}</ref>。\n\n[[スエズ運河]]収入と[[観光産業]]収入、更には在外労働者からの送金の3大外貨収入の依存が大きく、エジプト政府は、それらの手段に安易に頼っている<ref name=\"エジプト経済の現状と今後の展望\" />。更に政情に左右されやすい。\n\nかつては[[綿花]]の世界的生産地であり、ナイル川のもたらす肥沃な土壌とあいまって農業が重要な役割を果たしていた。しかし、通年灌漑の導入によってナイルの洪水に頼ることが減り、アスワン・ハイ・ダムの建設によって、上流からの土壌がせき止められるようになった。そのため、ダムによる水位コントロールによって農地が大幅に拡大した。農業生産高が格段に上がったにもかかわらず、[[肥料]]の集中投入などが必要になったため、コストが増大し、近年代表的な農業製品である綿製品は価格競争において後塵を拝している。\n\n[[1970年代]]に農業の機械化および各種生産業における機械への転換により、地方での労働力の過剰供給が見受けられ、労働力は都市部に流出し、治安・衛生の悪化及び社会政策費の増大を招いた。80年代には、[[石油]]産業従事者の増大に伴い、農業において労働力不足が顕著となる。このため綿花および綿製品の価格上昇を招き、国際競争力を失った。1990年代から、[[国際通貨基金|IMF]]の支援を受け経済成長率5%を達成するが、社会福祉政策の低所得者向け補助の増大および失業率10%前後と支出の増大に加え、資源に乏しく食料も輸入に頼るため、2004年には物価上昇率10%に達するなどの構造的問題を抱えている。現状、中小企業育成による国際競争力の強化、雇用創生に取り組んでいるが、結果が出ていない。[[2004年]]のナズィーフ内閣が成立後は、国営企業の民営化および税制改革に取り組んでいる。[[2008年]]、世界的な食料高騰によるデモが発生した。\n\nまた、「[[アラブの春]]」により、2012年~2014年の間は2~3%台と一時低迷していたが、その後政情の安定化により、2015年には、4%台に回復している。また[[IMF]]の勧告を受け、2016年に[[為替相場]]の大幅切り下げや[[補助金]]削減などの改革をしたことで、経済健全化への期待感より、外国からの資本流入が拡大していき、経済の復調を遂げている<ref name=\"エジプト経済の現状と今後の展望\" />。\n\n農業は農薬などを大量に使っているため世界一コストの高い農業となっているがそれなりの自給率を保っているし果物は日本にもジャムなどに加工され輸出されている。工業は石油などの資源はないが様々な工業が発展しており今後も成長が見込まれる。近年IT IC産業が急速に成長している。\nしかしながらGDPの約半分が軍関連企業が占めていて主に農業 建築業などの工業を担っている。\n金融はイスラーム銀行も近代式銀行の両方とも発達しており投資家層も厚くトランプ政権にはエジプトの敏腕女性投資家が起用されている。\n\n== 交通 ==\n{{Main|エジプトの交通}}\nエジプトの交通の柱は歴史上常に[[ナイル川]]であった。[[アスワン・ハイ・ダム]]の建設後、ナイル川の流れは穏やかになり、交通路として安定性が増した。しかし貨物輸送はトラック輸送が主となり、内陸水運の貨物国内シェアは2%にすぎない。[[ファルーカ]]という伝統的な[[帆船]]や、観光客用のリバークルーズなどの運航もある。\n\n[[鉄道]]は、国有の[[エジプト鉄道]]が運営している。営業キロは5,063キロにのぼり、カイロを起点として[[ナイル川デルタ]]や[[ナイル河谷]]の主要都市を結んでいる。\n\n航空は、[[フラッグ・キャリア]]である[[エジプト航空]]を筆頭にいくつもの航空会社が運行している。[[カイロ国際空港]]はこの地域の[[ハブ空港]]の一つである。\n\n== 国民 ==\n{{Main2|詳細は{{仮リンク|エジプトの人口統計|en|Demographics of Egypt}}}}\n[[ファイル:Cairo mosques.jpg|thumb|left|220px|[[カイロ]]の[[モスク]]]]\n=== 人口構成 ===\n[[ファイル:Egypt population pyramid 2005.svg|thumb|[[2005年]]の人口ピラミッド。30歳以下の若年層が非常に多く、若者の失業が深刻な問題となっている]]\n[[ファイル:Egypt demography.png|thumb|400px|[[国際連合食糧農業機関]]の2005年データによるエジプト人口の推移。1960年の3,000万人弱から人口が急増しているのが読み取れる]]\nエジプトの人口は8,254万人(2013年1月現在)で、近年急速に増大し続けている。年齢構成は0から14歳が33%、15から64歳が62.7%、65歳以上が4.3%(2010年)で、若年層が非常に多く、ピラミッド型の人口構成をしている。しかし、若年層はさらに増加傾向にあるにもかかわらず、経済はそれほど拡大していないため、若者の[[失業]]が深刻な問題となっており、[[2011年エジプト騒乱]]の原因のひとつともなった。年齢の中央値は24歳である。人口増加率は2.033%。\n\n=== 民族 ===\n{{See also|エジプト民族}}\n住民は[[ムスリム|イスラム教徒]]と[[キリスト教徒]]([[コプト教会]]、[[東方正教会]]など)からなる[[アラブ人]]がほとんどを占め、そのほかに[[ベドウィン]](遊牧民)や[[ベルベル人]]、{{仮リンク|ヌビア人|en|Nubian people}}、[[アルメニア人]]、[[トルコ人]]、[[ギリシア人]]などがいる。遺伝的に見れば、エジプト住民のほとんどが古代エジプト人の直系であり、[[エジプト民族]]との呼称でも呼ばれる所以である。また、エジプト人の大半は、イスラム勢力のエジプト征服とそれに続くイスラム系国家の統治の間に言語学的にアラブ化し、本来のエジプト語を捨てた人々であるとする見解がある。それだけではなく、長いイスラーム統治時代の人的交流と都市としての重要性から、多くのアラブ人が流入・定住していったのも事実である。1258年にアッバース朝が崩壊した際、[[カリフ]]周辺を含む多くの人々がエジプト(おもにカイロ近郊)へ移住したという史実は、中東地域一帯における交流が盛んであったことを示す一例である。現代においてカイロは[[世界都市]]となっており、また歴史的にも[[アル=アズハル大学]]は、イスラム教[[スンナ派]]で最高権威を有する教育機関として、中東・イスラム圏各地から人々が参集する。\n\nなお[[古代エジプト]]文明の印象があまりに大きいためか、特に現代エジプトに対する知識を多く持たない人は、現代のエジプト人を古代エジプト人そのままにイメージしていることが多い。すなわち、[[ギザの大スフィンクス]]や[[ギザの大ピラミッド]]を建て、太陽神やさまざまな神を信仰([[エジプト神話]])していた古代エジプト人を、現代のエジプト人にもそのまま当てはめていることが多い。しかし、上述のとおり現代エジプト人の9割はイスラム教徒であり、アラビア語を母語とするアラブ人である。それもアラブ世界の中で比較的主導的な立場に立つ、代表的なアラブ人のひとつである。\n\n=== 言語 ===\n{{Main2|詳細は{{仮リンク|エジプトの言語|en|Languages of Egypt}}}}\n現在のエジプトでは[[アラビア語]]が[[公用語]]である。これは、イスラムの征服当時にもたらされたもので、エジプトのイスラム化と同時に普及していった。ただし、公用語となっているのは[[正則アラビア語]](フスハー)だが、実際に用いられているのは[[アラビア語エジプト方言]]である{{要出典|date=2012年8月}}<!-- 実際に「通用」の意味か? 行政等の用語は? -->。\n\n古代エジプトの公用語であった[[エジプト語]](4世紀以降の近代エジプト語は[[コプト語]]の名で知られる)は、現在では少数のキリスト教徒が典礼言語として使用するほかはエジプトの歴史に興味を持つ知識層が学んでいるだけであり、これを話せる国民はきわめて少ない。日常言語としてコプト語を使用する母語話者は数十名程度である<ref>[http://www.dailystaregypt.com/article.aspx?ArticleID=106 The Dairy Star of Egypt 2007年1月23日]</ref>。他には地域的に[[ヌビア諸語]]、[[教育]]・[[ビジネス]]に[[英語]]、[[文化_(代表的なトピック)|文化]]においては[[フランス語]]なども使われている。\n\n=== 宗教 ===\n{{Main2|詳細は{{仮リンク|エジプトの宗教|en|Religion in Egypt}}}}\n{{bar box\n|title=宗教構成(エジプト)\n|titlebar=#ddd\n|width= 300px\n|float=right\n|bars=\n{{bar percent|イスラム教(スンナ派)|green|90}}\n{{bar percent|キリスト教その他|blue|10}}\n}}\n宗教は[[イスラム教]]が90%(ほとんどが[[スンナ派]])であり、[[憲法]]では[[国教]]に指定されている(既述の通り、現在では宗教政党の活動ならびにイスラム主義活動は禁止されている)<ref name=2010cia/>。その他の宗派では、エジプト土着の[[キリスト教会]]である[[コプト教会]]の信徒が9%、その他のキリスト教徒が1%となる<ref name=2010cia/>。\n\n=== 婚姻 ===\n多くの場合、婚姻時に女性は改姓しない([[夫婦別姓]])が、改姓する女性もいる<ref>[https://culturalatlas.sbs.com.au/egyptian-culture/naming-9bdb9e00-ffa6-4f6f-9b29-1616ec7bb952#naming-9bdb9e00-ffa6-4f6f-9b29-1616ec7bb952 Egyptian Culture], Cultural Atlas.</ref>。\n\n=== 教育 ===\n{{Main2|詳細は{{仮リンク|エジプトの教育|en|Education in Egypt}}}}\n[[ファイル:Bibalex-egypt.JPG|thumb|180px|[[新アレクサンドリア図書館]]]]\nエジプトの教育制度は、1999年から[[小学校]]の課程が1年延び、日本と同じく小学校6年・[[中学校]]3年・[[高等学校|高校]]3年・[[大学]]4年の6・3・3・4制となっている<ref>[http://www.mofa.go.jp/mofaj/toko/world_school/07africa/infoC70400.html 諸外国の学校情報(国の詳細情報) 日本国外務省]</ref>。[[義務教育]]は小学校と中学校の9年である。[[1923年]]のエジプト独立時に初等教育はすでに無料とされ、以後段階的に無料教育化が進み、[[1950年]]には著名な作家でもあった文部大臣[[ターハー・フセイン]]によって中等教育が無料化され、1952年のエジプト革命によって高等教育も含めたすべての公的機関による教育が無料化された。しかし、公立学校の[[教員]]が給料の少なさなどから個人の[[家庭教師]]を兼任することが広く行われており、社会問題化している<ref>[http://www.fukuoka-pu.ac.jp/kiyou/kiyo15_1/1501_tanaka.pdf 『福岡県立大学人間社会学部紀要』 田中哲也]</ref>。高額な授業料を取る代わりに教育カリキュラムの充実した私立学校も多数存在する。エジプト国内には、20万以上の小中学校、1,000万人以上の学生、13の主要大学、67の[[師範学校]]がある。\n\n[[2018年]]より「エジプト日本学校(EJS=Egypt-Japan School)」が35校、開校した<ref>[https://www.jica.go.jp/publication/mundi/1904/201904_03_01.html 「日本式教育」で、子どもたちが変わる! エジプト]</ref>\n<ref>[https://www.jica.go.jp/press/2018/20181004_01.html 「エジプト・日本学校」35校が開校:日本式教育をエジプトへ本格導入]</ref>。これは2017年に[[JICA]]が技術協力「学びの質向上のための環境整備プロジェクト」を開始ししたことに始まるもので、[[日本の学校教育]]で行われている[[学級会]]や生徒による清掃などをエジプトの教育に取り入れようとする教育方針である<ref>[https://www.nippon.com/ja/japan-topics/g00727/ エジプトの小学校に「日本式教育」、協調性など成果も]</ref>。試験的に導入した際には文化的な違いから反発も見受けられたが、校内での暴力が減った、子供が家でも掃除をするようになったなど、徐々に成果が見えるようになり本格的に導入されることになった<ref>[https://www.huffingtonpost.jp/entry/egypt-japan-school_jp_5cdba4c0e4b0c39d2a13534f 「日本式教育」はエジプトの教育現場をどう変えたか。「掃除は社会階層が低い人が行うもの」という反発を乗り越えて]</ref><ref>[https://egyptcesbtokyo.wordpress.com/2018/10/10/「エジプト・日本学校」について/ 「エジプト・日本学校」(EJS)について]</ref>。\n\n2005年の推計によれば、15歳以上の国民の[[識字率]]は71.4%(男性:83%、女性:59.4%)である<ref name=2010cia>[https://www.cia.gov/library/publications/the-world-factbook/geos/za.html CIA World Factbook \"Egypt\"]2010年1月31日閲覧。</ref>。2006年にはGDPの4.2%が教育に支出された<ref name=2010cia/>。\n\nおもな高等教育機関としては、[[アル=アズハル大学]](988年 p? )、[[吉村作治]]、[[小池百合子]]らが出身の[[カイロ大学]](1908年~)などが存在する。\n\n国立図書館として[[新アレクサンドリア図書館]]が存在する。\n\n== 文化 ==\n[[ファイル:Necip Mahfuz.jpg|thumb|[[ナギーブ・マフフーズ]]は[[1988年]]に[[ノーベル文学賞]]を受賞した]]\n{{Main2|詳細は{{仮リンク|エジプトの文化|en|Culture of Egypt}}}}\n\n* [[古代エジプト]]の建造物で有名。\n* [[ボードゲーム]]や[[カードゲーム]]の発祥の地としても知られている。\n* 座った時に足を組むと、相手に敵意があると受けとられる。\n\n=== 食文化 ===\n{{Main|エジプト料理}}\n\n=== 文学 ===\n{{Main|古代エジプト文学|アラビア語文学|エジプト文学}}\n古代エジプトにおいては[[パピルス]]に[[ヒエログリフ]]で創作がなされ、[[古代エジプト文学]]には『[[死者の書 (古代エジプト)|死者の書]]』や『[[シヌヘの物語]]』などの作品が現代にも残っている。7世紀にアラブ化したあともエジプトは[[アラビア語文学]]のひとつの中心地となった。近代の文学者として[[ターハー・フセイン]]の名が挙げられ、現代の作家である[[ナギーブ・マフフーズ]]は1988年に[[ノーベル文学賞]]を受賞している。\n{{clear}}\n\n=== スポーツ ===\n* [[サッカーエジプト代表]]の[[モハメド・サラー]]は[[プレミアリーグ]]で得点王、[[PFA年間最優秀選手賞]]を獲得、[[UEFAチャンピオンズリーグ 2018-19|2018-19シーズン]]に[[UEFAチャンピオンズリーグ]]優勝を果たした。\n* [[スカッシュ (スポーツ)|スカッシュ]]では[[21世紀]]に入ってからワールドオープン([[:en:World Squash Championships]])で男女ともに多くの優勝者を輩出している。\n\n=== 世界遺産 ===\n{{Main|エジプトの世界遺産}}\nエジプト国内には、[[国際連合教育科学文化機関|ユネスコ]]の[[世界遺産]]リストに登録された文化遺産が6件、自然遺産が1件登録されている。\n\n<gallery widths=\"180\" heights=\"120\">\nファイル:Egypt.Giza.Sphinx.01.jpg|[[メンフィスとその墓地遺跡|メンフィスとその墓地遺跡-ギーザからダハシュールまでのピラミッド地帯]](1979年、文化遺産)\nファイル:S F-E-CAMERON 2006-10-EGYPT-KARNAK-0002.JPG|古代都市[[テーベ]]とその墓地遺跡(1979年、文化遺産)\nファイル:Abou simbel face.jpg|[[アブ・シンベル]]から[[フィラエ]]までの[[ヌビア遺跡]]群(1979年、文化遺産)\nファイル:Al Azhar, Egypt.jpg|[[カイロ|カイロ歴史地区]](1979年、文化遺産)\nファイル:Katharinenkloster Sinai BW 2.jpg|* [[聖カタリナ修道院|聖カトリーナ修道院地域]](2002年、文化遺産)\nファイル:Whale skeleton 2.jpg|[[ワディ・アル・ヒタン]](2005年、自然遺産)\n</gallery>\n\n== 参考文献 ==\n*鈴木恵美編著『現代エジプトを知るための60章』、[[明石書店]]、2012年 ISBN 4750336483\n{{節スタブ}}\n\n== 脚注 ==\n{{脚注ヘルプ}}\n{{Reflist|2}}\n\n== 関連項目 ==\n* [[エジプト民族]]\n* [[エジプト美術]]\n* [[エジプト神話]]\n* [[エジプト軍]]\n* [[エジプト海軍艦艇一覧]]\n* [[エジプト革命 (2011年)]]\n* [[エジプトの法]]\n* [[エジプト関係記事の一覧]]\n\n== 外部リンク ==\n{{Wiktionary}}\n{{Commons&cat|Egypt|Egypt}}\n{{Wikivoyage|Egypt|エジプト{{en icon}}}}\n{{osm box|r|1473947}}\n{{ウィキポータルリンク|アフリカ|[[画像:Africa_satellite_orthographic.jpg|36px|ウィキポータルリンク アフリカ]]}}\n; 政府\n:* [http://www.egypt.gov.eg/arabic/home.aspx エジプト政府サービス・ポータル] {{ar icon}}\n:* [http://www.egypt.gov.eg/english/home.aspx エジプト政府サービス・ポータル] {{en icon}}\n:* [http://www.egypt.or.jp/.html 在日エジプト大使館 エジプト学・観光局] - 「観光情報」と「基本情報」{{ja icon}}\n:\n; 日本政府\n:* [https://www.mofa.go.jp/mofaj/area/egypt/ 日本外務省 HP>各国・地域情勢>アフリカ>エジプト・アラブ共和国] {{ja icon}}\n:* [https://www.eg.emb-japan.go.jp/itprtop_ja/.html 在エジプト日本国大使館] {{ja icon}}\n:** [https://www.eg.emb-japan.go.jp/itpr_ja/00_000035.html 在エジプト日本国大使館>エジプト情報]\n:\n; その他\n:* [https://www.jica.go.jp/.html 独立行政法人 JICA 国際協力機構]\n:** [https://www.jica.go.jp/egypt/ HP>各国における取り組み>中東>エジプト生活情報]\n:** [https://libportal.jica.go.jp/fmi/xsl/library/public/ShortTermStayInformation/MiddleEast/Egypt-Short.pdf HP>世界の現状を知る>世界の様子(国別生活情報)>中東>エジプト短期滞在者用国別情報(2011)]\n:* [https://www.jetro.go.jp/world/africa/eg/ 独立行政法人 JETRO 日本貿易振興機構 HP>海外ビジネス情報>国・地域別情報>アフリカ>エジプト]\n:* [https://www.jccme.or.jp/08/08-07-08.html 財団法人 JCCME 中東協力センター HP>中東各国情報>エジプト]\n:* [https://wikitravel.org/ja/%E3%82%A8%E3%82%B8%E3%83%97%E3%83%88 ウィキトラベル旅行ガイド - エジプト] {{ja icon}}\n:* {{Wikiatlas|Egypt}} {{en icon}}\n:* {{CIA World Factbook link|eg|Egypt}} {{en icon}}\n:* {{dmoz|Regional/Africa/Egypt}} {{en icon}}\n\n{{アフリカ}}\n{{アジア}}\n{{OIC}}\n{{OIF}}\n{{NATOに加盟していない米国の同盟国}}\n{{Authority control}}\n{{Coord|30|2|N|31|13|E|type:city|display=title}}\n\n{{デフォルトソート:えしふと}}\n[[Category:エジプト|*]]\n[[Category:共和国]]\n[[Category:軍事政権]]\n[[Category:フランコフォニー加盟国]]"}
20. JSON データの読み込み

Wikipedia記事のJSONファイルを読み込み,「イギリス」に関する記事本文を表示せよ.問題21-29では,ここで抽出した記事本文に対して実行せよ.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import json

filename = 'jawiki-country.json'
with open(filename, mode='r') as f:
    for line in f:
        line = json.loads(line)
        if line['title'] == 'イギリス':
            text_uk = line['text']
            break


### 確認
print(text_uk)
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
{{redirect|UK}}
{{redirect|英国|春秋時代の諸侯国| (春秋)}}
{{Otheruses|ヨーロッパの国|長崎県熊本県の郷土料理|いぎりす}}
{{基礎情報 |略名  =イギリス
|日本語国名 = グレートブリテン及び北アイルランド連合王国
|公式国名 = {{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br />
*{{lang|gd|An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath}}[[スコットランドゲール語]]
*{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon}}[[ウェールズ語]]
*{{lang|ga|Ríocht Aontaithe na Breataine Móire agus Tuaisceart na hÉireann}}[[アイルランド語]]
*{{lang|kw|An Rywvaneth Unys a Vreten Veur hag Iwerdhon Glédh}}[[コーンウォール語]]
*{{lang|sco|Unitit Kinrick o Great Breetain an Northren Ireland}}[[スコットランド語]]
**{{lang|sco|Claught Kängrick o Docht Brätain an Norlin Airlann}}{{lang|sco|Unitet Kängdom o Great Brittain an Norlin Airlann}}アルスタースコットランド語</ref>
|国旗画像 = Flag of the United Kingdom.svg
|国章画像 = [[ファイル:Royal Coat of Arms of the United Kingdom.svg|85px|イギリスの国章]]
|国章リンク =[[イギリスの国章|国章]]
|標語 = {{lang|fr|[[Dieu et mon droit]]}}<br />[[フランス語]]:[[Dieu et mon droit|神と我が権利]]
|国歌 = [[女王陛下万歳|{{lang|en|God Save the Queen}}]]{{en icon}}<br />''神よ女王を護り賜え''<br />{{center|[[ファイル:United States Navy Band - God Save the Queen.ogg]]}}
|地図画像 = Europe-UK.svg
|位置画像 = United Kingdom (+overseas territories) in the World (+Antarctica claims).svg
|公用語 = [[英語]]
|首都 = [[ロンドン]]事実上
|最大都市 = ロンドン
|元首等肩書 = [[イギリスの君主|女王]]
|元首等氏名 = [[エリザベス2世]]
|首相等肩書 = [[イギリスの首相|首相]]
|首相等氏名 = [[ボリスジョンソン]]
|他元首等肩書1 = [[貴族院 (イギリス)|貴族院議長]]
|他元首等氏名1 = [[:en:Norman Fowler, Baron Fowler|ノーマンファウラー]]
|他元首等肩書2 = [[庶民院 (イギリス)|庶民院議長]]
|他元首等氏名2 = {{仮リンク|リンゼイホイル|en|Lindsay Hoyle}}
|他元首等肩書3 = [[連合王国最高裁判所|最高裁判所長官]]
|他元首等氏名3 = [[:en:Brenda Hale, Baroness Hale of Richmond|ブレンダヘイル]]
|面積順位 = 76
|面積大きさ = 1 E11
|面積値 = 244,820
|水面積率 = 1.3%
|人口統計年 = 2018
|人口順位 = 22
|人口大きさ = 1 E7
|人口値 = 6643万5600<ref>{{Cite web|url=https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates|title=Population estimates - Office for National Statistics|accessdate=2019-06-26|date=2019-06-26}}</ref>
|人口密度値 = 271
|GDP統計年元 = 2012
|GDP値元 = 1兆5478億<ref name="imf-statistics-gdp">[http://www.imf.org/external/pubs/ft/weo/2012/02/weodata/weorept.aspx?pr.x=70&pr.y=13&sy=2010&ey=2012&scsm=1&ssd=1&sort=country&ds=.&br=1&c=112&s=NGDP%2CNGDPD%2CPPPGDP%2CPPPPC&grp=0&a=IMF>Data and Statistics>World Economic Outlook Databases>By Countrise>United Kingdom]</ref>
|GDP統計年MER = 2012
|GDP順位MER = 6
|GDP値MER = 2兆4337億<ref name="imf-statistics-gdp" />
|GDP統計年 = 2012
|GDP順位 = 6
|GDP値 = 2兆3162億<ref name="imf-statistics-gdp" />
|GDP/ = 36,727<ref name="imf-statistics-gdp" />
|建国形態 = 建国
|確立形態1 = [[イングランド王国]][[スコットランド王国]]<br />両国とも[[合同法 (1707年)|1707年合同法]]まで
|確立年月日1 = 927843|確立形態2 = [[グレートブリテン王国]]成立<br />1707年合同法
|確立年月日2 = 1707年{{0}}5月{{0}}1|確立形態3 = [[グレートブリテン及びアイルランド連合王国]]成立<br />[[合同法 (1800年)|1800年合同法]]
|確立年月日3 = 1801年{{0}}1月{{0}}1|確立形態4 = 現在の国号「'''グレートブリテン及び北アイルランド連合王国'''」に変更
|確立年月日4 = 1927年{{0}}4月12日
|通貨 = [[スターリングポンド|UKポンド]] (£)
|通貨コード = GBP
|時間帯 = ±0
|夏時間 = +1
|ISO 3166-1 = GB / GBR
|ccTLD = [[.uk]] / [[.gb]]<ref>使用は.ukに比べ圧倒的少数</ref>
|国際電話番号 = 44
|注記 = <references/>
}}

'''グレートブリテン及び北アイルランド連合王国'''(グレートブリテンおよびきたアイルランドれんごうおうこく{{lang-en-short|United Kingdom of Great Britain and Northern Ireland}}: '''UK''')[[ヨーロッパ大陸]]の北西岸に位置し[[グレートブリテン島]][[アイルランド島]]北東部その他多くの島々から成る[[立憲君主制]][[国家]]首都は[[ロンドン]][[日本語]]における[[通称]]の一例として'''イギリス'''、'''英国'''(えいこくがある(→[[#国名]])。

'''[[イングランド]]'''、'''[[ウェールズ]]'''、'''[[スコットランド]]'''、'''[[北アイルランド]]'''という歴史的経緯に基づく4つの[[イギリスのカントリー|カントリーと呼ばれる]]が[[同君連合]]型の単一の[[主権国家体制|主権国家]]を形成する<ref name="page823">{{cite web |url=http://webarchive.nationalarchives.gov.uk/+/http://www.number10.gov.uk/Page823 |title=Countries within a country |publisher=Prime Minister's Office |accessdate=10 January 2003}}</ref>独特の統治体制を採るが、一般的に[[連邦]]国家とは区別される。

[[国際連合安全保障理事会常任理事国]]の一国五大国であり[[G7]][[G20]]に参加するGDPは世界10位以内に位置する巨大な市場を持ちヨーロッパにおける四つの大国[[ビッグ4 (ヨーロッパ)|ビッグ4]]の一国である[[ウィーン体制]]が成立した[[1815年]]以来世界で最も影響力のある国家[[列強]]の一つに数えられるまた[[民主主義]][[立憲君主制]]など近代国家の基本的な諸制度が発祥した国でもある

イギリスの[[擬人化]]としては[[ジョンブル]][[ブリタニア (女神)|ブリタニア]]が知られる

==国名==
正式名称は英語で{{Lang|en|'''United Kingdom of Great Britain and Northern Ireland'''}}ユナイテッドキングダムオヴグレイトブリテンアンドノーザンアイルランド)」であり日本語では、「'''グレートブリテン及び北部アイルランド連合王国'''」とする場合法文など「'''グレートブリテン及び北アイルランド連合王国'''」とする場合条約文などがある

英語での略称は{{Lang|en|'''United Kingdom'''}}」、「{{Lang|en|'''UK'''}}」。[[日本語]]における一般的な通称は「'''イギリス'''」もしくは「'''英国'''」であるが稀に{{Lang|en|United Kingdom}}の[[直訳と意訳|直訳]]である「'''[[連合王国]]'''(れんごうおうこく)」が用いられることもある現在の公用文では英国が使用されており、「イギリスは口語で用いられることが多い<ref>[[日本放送協会|NHK]]で採用している他原則として英国を用いるメディアでも[[イギリス英語]]のような形では使用する</ref>。「連合王国は2003年まで法文において用いられていた<ref>[http://warp.da.ndl.go.jp/info:ndljp/pid/1368617/www.meti.go.jp/policy/anpo/moto/topics/country/country.pdf 輸出貿易管理令等における国名表記の変更について]([[経済産業省]]) 国立国会図書館のアーカイブより''2019-2-5閲覧''</ref>。

イギリス[[ポルトガル語]]で[[イングランド]]を指す{{Lang|pt|Inglez}}イングレス)」が語源で戦国時代にポルトガル人が来航した事に起源を持つ原義にかかわらず連合王国全体を指して使われており連合王国の構成体たるイングランドとは区別される[[江戸時代]]には[[オランダ語]]の{{Lang|nl|Engelsch}}エングルシュ)」を語源とする「'''エゲレス'''」という呼称も広く使用された<ref>[https://kotobank.jp/word/%E3%82%A8%E3%82%B2%E3%83%AC%E3%82%B9-444373 コトバンク「エゲレス」]</ref>。[[幕末]]から[[明治]]・[[大正]]期には「'''英吉利'''(えいぎりす)」や「大不列顛(だいふれつてん、大ブリテン)」と[[国名の漢字表記一覧|漢字で表記]]されることもあったが、前者が「英国」という略称の語源である。ただし「英国」は、狭義に連合王国全体でなくイングランド('''英格蘭''')のみを指す場合もある<ref>また、[[アメリカ合衆国]]に渡ることを「渡米」と言うように、イギリス、特にイングランドへ渡ることを「渡英」と言う([[二字熟語による往来表現の一覧]]を参照)。</ref>。

[[合同法 (1707年)|1707年合同法]]においては[[イングランド王国]]および[[スコットランド王国]]を一王国に統合すると宣言する同法において新国家名称は[[グレートブリテン王国]]またはグレートブリテン連合王国および連合王国とすると述べている<ref>{{cite web |url=http://www.scotshistoryonline.co.uk/union.html |title=Treaty of Union, 1706 |publisher=Scots History Online |accessdate=23 August 2011}}</ref><ref>{{cite book |url=http://books.google.com/?id=LYc1tSYonrQC&pg=PA165 |title=Constitutional & Administrative Law |page=165 |author=Barnett, Hilaire |author2=Jago, Robert |edition=8th |year=2011 |isbn=978-0-415-56301-7 |publisher=Routledge |location=Abingdon }}</ref>。しかしながら、「連合王国」という用語は18世紀における非公式の使用にのみ見られ、「長文式」でない単なる「グレート・ブリテン」であった1707年から1800年まで、同国はごくまれに正式名称である「グレート・ブリテン連合王国」と言及された<ref>See [[s:Act of Union 1707#Article 1 (name of the new kingdom)|Article One]] of the Act of Union 1707.</ref><ref name=name>"After the political union of England and Scotland in 1707, the nation's official name became 'Great Britain'", ''The American Pageant, Volume 1'', Cengage Learning (2012)</ref><ref name=name2>"From 1707 until 1801 ''Great Britain'' was the official designation of the kingdoms of England and Scotland". ''The Standard Reference Work:For the Home, School and Library, Volume 3'', Harold Melvin Stanford (1921)</ref><ref name=name3>"In 1707, on the union with Scotland, 'Great Britain' became the official name of the British Kingdom, and so continued until the union with Ireland in 1801". ''United States Congressional serial set, Issue 10;Issue 3265'' (1895)</ref><ref>{{cite web |url=http://www.historyworld.net/wrldhis/PlainTextHistories.asp?historyid=ab07 |title=History of Great Britain (from 1707) |authorlink=w:Bamber Gascoigne |author=Gascoigne, Bamber |publisher=History World |accessdate=18 July 2011}}</ref>。[[合同法 (1800年)|1800年合同法]]では、1801年にグレート・ブリテン王国と[[アイルランド王国]]が統合し、[[グレート・ブリテン及びアイルランド連合王国]]が成立した。現在の正式国名である「グレート・ブリテン及び北(部)アイルランド連合王国」は、[[北アイルランド]]のみが連合王国の一部としてとどまった1922年の[[アイルランド自由国]]独立および{{仮リンク|アイルランド分裂|en|Partition of Ireland}}後に採用された<ref>{{cite book |title=The Irish Civil War 1922–23 |author=Cottrell, P. |year=2008 |page=85 |isbn=1-84603-270-9}}</ref>。

イギリスは主権国家として国であるがイングランド[[スコットランド]][[ウェールズ]]それほどの段階ではないが北アイルランドも主権国家ではないが[[イギリスのカントリー|」(country]]と呼ばれる<ref name="alphabeticalNI">{{citation |author1=S. Dunn |author2=H. Dawson|year=2000 |title=An Alphabetical Listing of Word, Name and Place in Northern Ireland and the Living Language of Conflict |publisher=Edwin Mellen Press |location=Lampeter |quote=One specific problem&nbsp; in both general and particular senses&nbsp; is to know what to call Northern Ireland itself:in the general sense, it is not a country, or a province, or a state&nbsp; although some refer to it contemptuously as a statelet:the least controversial word appears to be jurisdiction, but this might change.}}</ref><ref>{{cite web |url=http://www.iso.org/iso/iso_3166-2_newsletter_ii-3_2011-12-13.pdf |title=Changes in the list of subdivision names and code elements |work=ISO 3166-2 |publisher=International Organization for Standardization |date=15 December 2011 |accessdate=28 May 2012}}</ref>。スコットランド、ウェールズ、北アイルランドは、権限の委譲による自治権を有する<ref>[http://books.google.com/?id=gPkDAQAAIAAJ Population Trends, Issues 75–82, p.38], 1994, UK Office of Population Censuses and Surveys</ref><ref name="citizenship">[http://books.google.com/?id=2u8rD6F-yg0C&pg=PA7 Life in the United Kingdom:a journey to citizenship, p. 7], United Kingdom Home Office, 2007, ISBN 978-0-11-341313-3.</ref>。イギリス首相のウェブサイトでは、連合王国の説明として「1国内の国々」という言葉が用いられていた<ref name="page823"/>。{{仮リンク|イギリスの12のNUTS1地域|en|NUTS of the United Kingdom}}統計のような複数の統計的概要において、スコットランド、ウェールズ、北アイルランドを「region」と言及している<ref>{{cite web |url=http://www.ons.gov.uk/ons/dcp171778_346117.xml |title=Statistical bulletin:Regional Labour Market Statistics |accessdate=5 March 2014 |archiveurl=https://web.archive.org/web/20141224045523/http://www.ons.gov.uk/ons/dcp171778_346117.xml |archivedate=2014年12月24日 |deadlinkdate=2018年3月 }}</ref><ref>{{cite web |url=http://www.gmb.org.uk/newsroom/fall-in-earnings-value-during-recession |title=13.4% Fall In Earnings Value During Recession |accessdate=5 March 2014}}</ref>。北アイルランドは「province」とも言及される<ref name="alphabeticalNI"/><ref name="placeApart">{{cite book |author=Murphy, Dervla |title=A Place Apart |year=1979 |publisher=Penguin |place=London |isbn=978-0-14-005030-1}}</ref>。北アイルランドに関しては、記述名の使用が「多くの場合、個人の政治的選好を明らかにする選択で議論の的になり得る」<ref>{{Cite book |last1=Whyte |first1=John |authorlink1=w:John Henry Whyte |last2=FitzGerald |first2=Garret|authorlink2=w:Garret FitzGerald|year=1991 |title=Interpreting Northern Ireland |location=Oxford |publisher=Clarendon Press |isbn=978-0-19-827380-6}}</ref>。

英語ではBritainという言葉は連合王国の同義語として頻繁に用いられる一方、「Great Britainという言葉は連合王国全体の緩い同義語として用いられる場合もあるが<ref>{{cite web |url=http://www.merriam-webster.com/dictionary/great%20britain |title=Merriam-Webster Dictionary Online Definition of '&#39;Great Britain'&#39;|publisher=[[:en:Merriam Webster|Merriam Webster]] |date=31 August 2012 |accessdate=9 April 2013}}</ref><ref>[[:en:New Oxford American Dictionary|New Oxford American Dictionary]]:"Great Britain:England, Wales, and Scotland considered as a unit. The name is also often used loosely to refer to the United Kingdom."</ref>、本来はイングランド、スコットランドおよびウェールズを指すものであり、北アイルランドを含む(すなわち、イギリス全体を指す)場合には用いるべきでないとされる<ref>{{cite news |url=http://www.guardian.co.uk/styleguide/page/0,,184840,00.html |title=Guardian Unlimited Style Guide |publisher=Guardian News and Media Limited |accessdate=23 August 2011 |location=London |date=19 December 2008}}</ref><ref>{{cite news |url=http://news.bbc.co.uk/1/hi/programmes/radio_newsroom/1099593.stm#g|title=BBC style guide (Great Britain)|accessdate=23 August 2011 |work=BBC News|date=19 August 2002}}</ref><ref>{{cite web |url=http://www.direct.gov.uk/en/Governmentcitizensandrights/LivingintheUK/DG_10012517 |title=Key facts about the United Kingdom|archiveurl=http://webarchive.nationalarchives.gov.uk/20121015000000/http://www.direct.gov.uk/en/Governmentcitizensandrights/LivingintheUK/DG_10012517|archivedate=3 November 2012 |accessdate=8 March 2015 |work=Government, citizens and rights |publisher=HM Government}}</ref>。

"GB"及び"GBR"イギリスの[[国際標準化機構|標準]]国名コード ([[ISO 3166-2:GB|ISO 3166-2]]及び[[:en:ISO 3166-1 alpha-3|ISO 3166-1 alpha-3]]を参照) でありその結果として国際機関がイギリスに言及する際に用いられることがあるさらにイギリスのオリンピックチームはGreat Britainもしくは[[Team GB]]の名称を用いる<ref>{{cite web |title=Great Britain |url=http://www.olympic.org/great-britain |publisher=International Olympic Committee |accessdate=10 May 2011}}</ref><ref>{{cite news|last1=Mulgrew|first1=John|title=Team GB Olympic name row still simmering in Northern Ireland|url=http://www.belfasttelegraph.co.uk/news/northern-ireland/team-gb-olympic-name-row-still-simmering-in-northern-ireland-28776939.html|accessdate=9 March 2015|work=Belfast Telegraph|date=2 August 2012}}</ref>。

形容詞のBritishイギリスに関する事項への言及によく用いられる。「Britishに明白な法的含意はないがイギリスの市民権及び[[:en:British nationality law|国籍に関する事項]]への言及に法律上用いられる<ref name="Bradley">{{cite book |url=http://books.google.com/?id=HT_GS2zgN5QC&pg=PA36 |title=Constitutional and administrative law |volume=1 |page=36 |author=Bradley, Anthony Wilfred |author2=Ewing, Keith D. |edition=14th |publisher=Pearson Longman |location=Harlow |year=2007 |isbn=978-1-4058-1207-8}}</ref>。イギリスの国民は、自らの国民性を表現するのに多数の異なる用語を用い、自らを[[イギリス人]]であるか、[[イングランド人]]、[[スコットランド人]]、[[ウェールズ人]]、[[:en:People of Northern Ireland|北アイルランド人]]、[[アイルランド人]]<ref>{{cite web |url=http://www.ark.ac.uk/nilt/2010/Community_Relations/NINATID.html |title=Which of these best describes the way you think of yourself? |year=2010 |work=Northern Ireland Life and Times Survey 2010 |publisher=ARK&nbsp;– Access Research Knowledge |accessdate=1 July 2010}}</ref>であるか、またはその両方であると見なし得る<ref>{{cite book |url=http://books.google.com/?id=u8gZklxHTMUC&pg=PA275 |title=Regionalism after regionalisation:Spain, France and the United Kingdom |pages=275–277 |author=Schrijver, Frans |publisher=Amsterdam University Press |year=2006 |isbn=978-90-5629-428-1}}</ref>。

2006{{仮リンク|イギリスのパスポート|en|British passport}}に新デザインが導入された新パスポートの1ページ目には[[英語]][[ウェールズ語]][[スコットランドゲール語]]で正式国名が記載されている<ref>{{cite news|url=http://www.guardian.co.uk/commentisfree/2010/dec/11/ian-jack-saddened-by-scotland-going-gaelic |location=London |work=The Guardian |first=Ian |last=Jack |title=Why I'm saddened by Scotland going Gaelic |date=11 December 2010}}</ref>。ウェールズ語での正式国名は"Teyrnas Unedig Prydain Fawr a Gogledd Iwerddon"であり、政府のウェブサイト上での略名は"Teyrnas Unedig"であるが<ref>{{cite web|url=http://www.direct.gov.uk/cy/Governmentcitizensandrights/LivingintheUK/DG_10012517CY|title=Ffeithiau allweddol am y Deyrnas Unedig|publisher=Directgov&nbsp;– Llywodraeth, dinasyddion a hawliau]|archiveurl=https://web.archive.org/web/20120924102112/http://www.direct.gov.uk/cy/Governmentcitizensandrights/LivingintheUK/DG_10012517CY|archivedate=2012年9月24日|accessdate=8 March 2015}}</ref>、通常は語形変化した形"Y Deyrnas Unedig"から"DU"と略される。スコットランド・ゲール語での正式国名は"Rìoghachd Aonaichte Bhreatainn is Èireann a Tuath"であり、略名は"Rìoghachd Aonaichte"である。

==歴史==
{{ブリテンの歴史}}
{{main|イギリスの歴史}}
[[ファイル:Descriptio Prime Tabulae Europae.jpg|thumb|left|[[クラウディオスプトレマイオス|プトレマイオス]]の[[地理学 (プトレマイオス)|地理学]]に基づく地図アルビオンと[[:en:Hibernia|ヒベルニア]]現在のアイルランドの文字が見える]]
[[ファイル:Lenepveu, Jeanne d'Arc au siège d'Orléans.jpg|thumb|left|[[ジャンヌダルク]]]]
{{Clear}}

古代のグレートブリテン島は[[アルビオン]]と呼ばれたラテン語起源でドーバーの白い崖に由来するとされる

1066年に[[ノルマンディー公]]であった[[ウィリアム1世 (イングランド王)|ウィリアム征服王]] (William the Conqueror) が[[ノルマンコンクエスト|イングランドを征服]]し大陸の進んだ[[封建制]]を導入して[[王国]]の体制を整えていった人口と[[経済力]]に勝るイングランドがウェールズとスコットランドを圧倒していった

13世紀[[第一次バロン戦争]][[第二次バロン戦争]]で[[フランス]]に政治を左右された1282年にウェールズ地方にもイングランドの州制度がしかれた14-15世紀にわたりフランスと[[百年戦争]]を展開したが1373年に[[英葡永久同盟]]を結んだ

[[ばら戦争]]を勝ち抜いた[[ランカスター朝]]は[[閨閥]]にバイエルン公でホラント伯の[[ヴィルヘルム1世 (バイエルン公)|ヴィルヘルム1世]]を迎えた1497[[ジョンカボット]]が北米海岸を発見した1514[[検閲]]できない外国商人飛脚が設立された1534[[国王至上法]]が出た1536年及び1543年の[[:en:Laws in Wales Acts 1535 and 1542|統一法]]の下スコットランドを正式に併合した{{仮リンク|ウェールズ法諸法|en|Laws in Wales Acts 15351542}})。1559キリスト教が[[イングランド国教会]]統一された1562年フランスで[[ユグノー戦争]]が起こってユグノーが移ってきた亡命者トレンチ家はイギリスで[[:en:Earl of Clancarty|クランカートリー伯]]となった<ref>Samuel Smiles, ''The Huguenots:Their Settlements, Churches, and Industries in England and Ireland'', Genealogical Publishing Com, 1868, pp.313-314.</ref>1588[[アルマダの海戦]]でカトリック勢力を破った1598[[ハンザ同盟]]の在ロンドン基地を閉鎖した

[[ファイル:London.bankofengland.arp.jpg|thumb|[[イングランド銀行]]]]
1600年[[イギリス東インド会社]]ができた1603年にイングランドとスコットランドが[[同君連合]]を形成したそして[[ヘンリーハドソン]]や[[ウィリアムバフィン]]が北米探検に活躍した1620[[ピルグリムファーザーズ]]が北米に上陸しまたフランスでユグノーが反乱しだした1628年に[[権利の請願]]がなされ翌年に[[リシュリュー]]がユグノーと和解した1639-1640スコットランド王国に国教会を強制しようとイングランドは二度の司教戦争を挑むが共に敗れてしまったそして矛先をアイルランド王国へ変えて[[チャールズ1世 (イングランド王)|チャールズ1世]][[オリバークロムウェル]][[ウィリアム3世 (イングランド王)|ウィリアム3世]]の3人が17世紀末まで苛め抜いたウィレム3世は[[ルイ14世]]に迫害されたユグノーに支えられ1694年[[イングランド銀行]]を設立した1702ユグノーだった[[:en:Matthew Decker|マシューデッカー]]がロンドンへ来た1704年にジブラルタルを占領し[[カトリック]]勢力を地中海に封じた1707年の合同法でイングランドとスコットランドは合邦しグレートブリテン王国となった[[ピューリタン]]とユグノーが商売敵のカトリックに対し統一戦線を組み上げたのである[[イギリス帝国]]の手が届く世界各地で宗教と経済が不可分にからみあった紛争が続いた植民地の争奪戦だけでなく[[ロシア帝国]]とアメリカ合衆国で利権を工作するときも彼らは常に優位であった繊維業における[[産業革命]]は綿花を輸出する[[アメリカ合衆国]]へ通貨を独占的に供給した

[[ファイル:Battle of Waterloo 1815.PNG|thumb|ユグノーから[[:en:Baron Northwick|ノースウィック男爵]]が出た頃イギリスは[[対仏大同盟]]の主役であった連合国が[[ワーテルローの戦い]]で勝利し[[ナポレオン戦争]]が終息したこうして[[パクスブリタニカ]]の時代が到来した]]
1801年の合同法でアイルランド王国と合邦しグレートブリテン及びアイルランド連合王国となった<ref>アイルランドにもユグノーが地位を占めていた[[:en:Baron Rendlesham|レンドルシャム男爵]]など</ref>しかし[[アイルランド共和軍]]は健在である統一戦線としては[[ジョージ4世 (イギリス王)|ジョージ4世]]の家柄勲章[[フリーメーソン]]加入すべてが戦利品であったフランス王が再びカトリックを強制することはないだろうしもはや[[神聖ローマ帝国]]もなくなっていた[[ベルギー]]を独立させ[[阿片戦争]]に勝利し統一戦線は鉄道通信の独占に注力したしかし統一戦線は事をやりすぎる癖があった[[ルイ16世]]には忌まわしき[[フォンテーヌブローの勅令]]を破棄させれば十分であったが[[フランス革命]]が[[ナポレオン]]を台頭させて神聖ローマだけでなく統一戦線まで脅かした支援した[[プロイセン王国]]がロシアと組んで[[オスマン帝国]]を攻撃するのも都合がよかったしかし[[普墺戦争]]で[[キール運河]]の利権をとられそうになったり[[普仏戦争]]で南ドイツ連邦が水の泡となったり[[オスマン債務管理局]]の利権を[[ドイツ帝国]]に奪われたりしてベルギーの統一戦線は飼い犬に手を噛まれた気持ちになった

[[栄光ある孤立]]と謳われた外交方針は[[エドワード7世 (イギリス王)|エドワード7世]]のときに放棄された[[1902年]]には[[日本]]とも[[日英同盟]]を締結した彼らはドイツを[[第一次世界大戦]]で敵対国として敗戦後の[[ヴァイマル共和政]]に対して多額の賠償金による債務奴隷にしたしかしアメリカ合衆国に対する影響力でイギリスはドイツにひけをとった1926年には[[バルフォア報告書]]が提出されたイギリスは[[ラザード]]を支配したが[[太平洋]]は支配できなかった[[ウィンザー朝]]の[[ジョージ5世 (イギリス王)|ジョージ5世]]による治世[[デビッドロイドジョージ]]政権下の[[1922年]]に[[英愛条約]]が発効され北部6州北アイルランド;アルスター9州の中の6州を除く26州がアイルランド自由国現[[アイルランド|アイルランド共和国]]として独立し[[1927年]]に現在の名称「'''グレートブリテン及び北アイルランド連合王国'''」へと改名したなおカントリーの一つであるスコットランドが独立すべきかどうかを問う住民投票が2014年9月に実施されたが独立は否決された<ref>{{cite web|url=http://www.cnn.co.jp/world/35023094.html|title=スコットランド独立の是非を問う住民投票実施へ 英国|author=<code>CNN.co.jp</code>|accessdate=2012-10-16}}</ref>。1925年受託者法([[:en:Trustee Act 1925|Trustee Act 1925]])の第61条は、裁判所に、公生かつ合理的に行動し、免責されるのが当然である受託者を、信託違反の責任から免除する権限を与えた<ref>Trustee Act, 1925. Article 61. "If it appears to the court that a trustee, whether appointed by the court or otherwise, is or may be personally liable for any breach of trust, whether the transaction alleged to be a breach of trust occurred before or after the commencement of this Act, but has acted honestly and reasonably, and ought fairly to be excused for the breach of trust and for ommitting to obtain the directions of the court in the matter in which he committed such breach, then the court may reliave him either wholly or partly from personal liability for the same."</ref><ref>1958年信託変更法([[:en:Variation of Trusts Act 1958|Variation of Trusts Act 1958]])は、信託を変更し、かつ受益者の利益のために信託財産を処理することを認可する広い権限を、裁判所に与えている。</ref>。この立法をなした[[イギリス議会]]は、[[世界恐慌]]が[[投資信託]]を通し大衆化した歴史にある程度の責任がある。イギリス投資信託全体の資産構成に占める下位証券の割合は、1933年で36.2%、1935年で42.0%、1938年で53.5%に上昇していった<ref>[[証券取引委員会]] ''Investment Trusts and Investment Companes'', Part 2, 連邦政府出版局 1939年 52頁;H.Burton and D.C.Corner, ''Investment and Unit Trusts in britain and America'', Elek Book, London, 1968, p.68.</ref>。

[[1939年]]の[[アドルフヒトラー]]総統の[[国家社会主義ドイツ労働者党|ナチ党]]率いる[[ナチスドイツ]]が[[ポーランド]]に侵攻し[[フランス]]とともに宣戦布告を行い[[バトルオブブリテン]]をはじめ[[西部戦線 (第二次世界大戦)|ヨーロッパ戦線]]では対独伊戦争[[太平洋戦争|太平洋戦線]]では対日戦争を経験しアメリカ合衆国の[[民主党 (アメリカ)|民主党]][[フランクリンルーズベルト]]大統領と[[大西洋憲章]]を共同で提唱した保守党の[[ウィンストンチャーチル]]政権による[[挙国一致内閣]]の下に勝利を得た[[第二次世界大戦]]後[[イギリス軍]]はドイツの[[ハンブルク]]や[[ハノーファー]]を占領し旧[[西ドイツ]]の形成の一役を担ったアメリカ合衆国は旧南ドイツ連邦と[[オーストリア]]西部を占領したアメリカ合衆国の占領地域は[[オランダ]]と歴史がつながっており[[戦間期]]にまして欧州東西の資本が錯綜した

イギリスは[[1945年]]の[[冷戦]]開始以降にかけて政治経済その他多くの面でアメリカ合衆国に覇権を譲ったまた[[資本主義]][[自由主義]]陣営の[[西側諸国]]の一国として[[ソビエト連邦]]とは敵対しながら政治面では[[労働党 (イギリス)|労働党]]の[[クレメントアトリー]]政権が「'''[[ゆりかごから墓場まで]]'''」をスローガンに[[福祉国家]]を作り上げた経済面ではイングランド銀行が[[ブレトンウッズ協定|ブレトンウッズ体制]]をめぐる駆け引きに競り負け1960年代のポンド危機と1970年代のセカンダリーバンキング危機に遭い、「[[英国病]]とまで呼ばれる[[景気後退|不景気]]に苦しんだ産業面では戦前から[[ゼネラルエレクトリック]]に[[産業革命]]の威光を奪われていたアトリー失脚後は保守党へ政権交代となりチャーチルが首相に再任する

第二次大戦中イギリスは帝国内で最大規模の人口を誇る[[イギリス領インド帝国|インド]]に対してヨーロッパ太平洋で複数の戦線を維持し又城内平和を維持するため戦後[[インド]]の地位に対して大幅な譲歩をせざるを得なかったイギリス政府は1947年にインド独立法を承認し[[印パ分離独立|インドとパキスタンの独立]]を翌[[1948年]]にはセイロン[[スリランカ]]の独立を承認した又大戦中に日本の支配下にあったビルママレーでもイギリス支配下に復することに混乱が見られ[[1948年]]に[[ビルマ]]ミャンマーの[[1957年]]に[[マレーシア]]の独立を承認した

[[1960年代]]に入るとフランス領西アフリカの独立要求を期に[[アフリカ]]諸国の独立運動が活発化し[[1960年]]に[[ナイジェリア]]が[[1962年]]に[[ウガンダ]]が[[1963年]]に[[ケニア]]が[[1964年]]に[[マラウイ]]と[[ザンビア]]がイギリスから独立を宣言した又[[1961年]]に[[南アフリカ共和国|南アフリカ]]が[[1966年]]に[[ローデシア]]が[[アパルトヘイト]]維持のためイギリスからの独立を宣言した

[[1956年]]には[[エジプト]]が[[スエズ運河]]の国有化を宣言し同地帯を占領したためイギリスフランス[[イスラエル]]との間で戦闘が勃発したこれが[[第二次中東戦争]]スエズ危機である英仏は国際世論の支持を得られなかったためスエズから撤退し[[地中海]]と[[紅海]]を結ぶスエズ運河の利権を喪失したまたエジプトの行動に励まされて中東地域でも独立運動が刺激され[[1971年]]に[[バーレーン]][[カタール]][[アラブ首長国連邦]]がイギリスから独立した

残る最大のイギリス植民地は[[香港]]だけになったがこれも1984年にマーガレットサッチャー首相と[[トウ小平|鄧小平]][[中華人民共和国]]中央軍事委員会主席の間で行われた英中首脳会談で新界の租借期限が切れる1997年に割譲地も含めて一斉に中国に返還されることになった[[香港返還|香港を返還]]したことでイギリスは主要な植民地のほぼ全てを喪失することになり世界の7つの海を跨いだ[[イギリス帝国]]は消滅していった

[[1964年]]には[[ハロルドウィルソン]]が首相に就任しアトリー以来13年ぶりに労働党が政権に復帰する[[1969年]]に[[イングランド]][[ウェールズ]] [[スコットランド]][[1973年]]に[[北アイルランド]]で死刑制度が一部例外を除き廃止されたまたウィルソン労働党政権下で[[妊娠中絶]]の合法化[[死刑]]制度の廃止及び[[同性愛]]の非刑罰化[[ソドミー法]]の廃止を含む社会的改革がなされ通貨[[スターリングポンド|ポンド]]の平価切り下げや日本の[[放送大学]]の模倣ともなった[[大学通信教育|通信制公立大学]]である[[オープン大学]]の設置などの政策が実施された

1980年代に成立した[[保守党 (イギリス)|保守党]]の[[マーガレットサッチャー]]政権は[[新自由主義]]による[[構造改革]][[ネオリベラリズム]][[サッチャリズム]]に基づく[[民営化]][[行政改革]][[規制緩和]]を急進させて[[小さな政府]]志向[[自由主義国家論]])、多くの[[失業]]者を出した地方経済は不振を極めロンドンを中心に[[金融]]産業などが成長した

1990年代政権は保守党の[[ジョンメージャー]]から労働党の[[トニーブレア]]に交代しイギリスは[[市場]]化一辺倒の[[政策]]を修正しつつかつての重厚な福祉国家にも逆戻りしない[[第三の道]]への路線に進むことになったまた[[1998年]]人権法を制定し[[死刑]]制度が完全に廃止されたこの頃からイギリスは久しぶりの好況に沸き、「老大国のイメージを払拭すべく「'''[[クールブリタニア]]'''」と呼ばれるイメージ戦略[[文化政策]]に力が入れられるようになった

2000年代2010年代[[21世紀]]に突入し労働党の[[ゴードンブラウン]]保守党の[[デーヴィッドキャメロン]]と政権が続く

[[2014年]]からは[[同性結婚]]が合法化された

[[2016年]][[6月23日]]に[[イギリスの欧州連合離脱是非を問う国民投票]]が実施されその結果僅差をもって離脱賛成派が過半数を占めたため[[イギリスの欧州連合離脱]]通称ブレグジットBrexitが決定された

これを受けてキャメロン首相兼保守党党首が責任を取る形で辞任を表明し[[テリーザメイ]]がサッチャーに続く2人目のイギリスの女性首相兼保守党党首として2016年[[7月13日]]に就任したメイ政権は新たに[[欧州連合離脱省]]を設置した

結果として[[2020年]][[1月31日]]午後11時([[グリニッジ標準時|GMT]])にイギリスは[[欧州連合]](EU)から脱退した<ref>{{Cite web|url=https://mainichi.jp/articles/20200201/k00/00m/030/008000c|title=英国がEU離脱 加盟国の離脱は初|publisher=毎日新聞|date=2020-02-01|accessdate=2020-02-01}}</ref>。

==地理==
{{main|イギリスの地理}}
[[ファイル:Uk topo en.jpg|thumb|200px|イギリスの地形図]]
[[ファイル:BenNevis2005.jpg|thumb|[[ブリテン諸島]]最高峰の[[ベンネビス山]]]]
イギリスはグレートブリテン島のイングランドウェールズスコットランドおよびアイルランド島北東部の北アイルランドで構成されているこの2つの大きな島とその周囲大小の島々を[[ブリテン諸島]]と呼ぶグレートブリテン島は中部から南部を占めるイングランド北部のスコットランド西部のウェールズに大別されるアイルランド島から北アイルランドを除いた地域はアイルランド共和国がある

北アイルランドとアイルランド共和国の国境の他にイギリスは[[大西洋]]に囲まれ東に[[北海]]南に[[イギリス海峡]]がある[[アイリッシュ海]]はグレートブリテン島とアイルランド島の間に位置するイギリスの総面積は243,610km<sup>2</sup>であり[[国の面積順リスト|世界第78位]]及び[[:en:List of European countries by area|ヨーロッパ第11位]]

イングランドの大部分は<!--rolling lowland terrain-->岩の多い低地からなり北西の山がちな地域[[湖水地方]]のカンブリア山脈)、北部ペニンネスの湿地帯ピークディストリクトの[[石灰岩]]丘陵地帯デールと呼ばれる渓谷[[パーベック島]][[リンカンシャー]]の石灰岩質の丘陵地帯から南イングランドの泥炭質のノースダウンズサウスダウンズチルターンにいたるイングランドを流れる主な河川は[[テムズ川]][[セヴァーン川]][[トレント川]][[ウーズ川]]である主な都市はロンドン[[バーミンガム]][[ヨーク (イングランド)|ヨーク]][[ニューカッスルアポンタイン]]などイングランド南部の[[ドーバー (イギリス)|ドーヴァー]]には[[英仏海峡トンネル]]があり対岸のフランスと連絡するイングランドには標高 1000m を超える地点はない

ウェールズは山がちで最高峰は標高 1,085m の[[スノードン山]]である本土の北に[[アングルシー島]]があるウェールズの首都また最大の都市は[[カーディフ]]で南ウェールズに位置する

スコットランドは地理的に多様で南部および東部は比較的標高が低くベンネビス山がある北部および西部は標高が高いベンネビス山はイギリスの最高地点で標高 1343 m であるスコットランドには数多くの半島ロッホと呼ばれる湖がありグレートブリテン島最大の淡水湖である[[ネス湖|ロッホネス]]もスコットランドに位置する西部また北部の海域には[[ヘブリディーズ諸島]][[オークニー諸島]][[シェトランド諸島]]を含む大小さまざまな島が分布するスコットランドの主要都市は首都[[エディンバラ]][[グラスゴー]][[アバディーン]]である

北アイルランドはアイルランド島の北東部を占めほとんどは丘陵地である中央部は平野でほぼ中央に位置する[[ネイ湖]]はイギリス諸島最大の湖である主要都市は[[ベルファスト]]と[[ロンドンデリー|デリー]]

現在イギリスは大小あわせて1098ほどの島々からなるほとんどは自然の島だがいくつかは[[クランノグ]]といわれる過去の時代に石と木を骨組みに作られしだいに廃棄物で大きくなっていった人工の島がある

イギリスの大半はなだらかな丘陵地及び平原で占められており国土のおよそ90%が可住地となっているそのため国土面積自体は[[日本]]のおよそ3分の2[[本州]]と[[四国]]を併せた程度であるが[[可住地面積]]は逆に日本の倍近くに及んでいるイギリスは[[森林]]も少なく日本が国土の3分の2が森林で覆われているのに対しイギリスの[[森林率]]は11%ほどである<ref>{{Cite web |url=http://yoshio-kusano.sakura.ne.jp/nakayamakouen6newpage3.html |title=中山徹奈良女子大教授の記念講演6 どうやって森を再生するかイギリスの例 |publisher=日本共産党宝塚市議 草野義雄 |accessdate=2014-5-10 |archiveurl=https://web.archive.org/web/20140512220911/http://yoshio-kusano.sakura.ne.jp/nakayamakouen6newpage3.html |archivedate=2014年5月12日 |deadlinkdate=2018年3月 }}</ref>。

その他{{仮リンク|領土紛争の一覧|en|List of territorial disputes|label=紛争中}}の[[フォークランド諸島]][[ジブラルタル]][[イギリス領インド洋地域|インド洋地域]]を含む[[イギリスの海外領土|14の海外領土]]を有する<ref>{{cite web |url=http://www.fco.gov.uk/en/about-us/what-we-do/overseas-territories |title=Working with Overseas Territories |publisher=[[:en:Foreign and Commonwealth Office|Foreign and Commonwealth Office]] |accessdate=3 May 2011}}</ref>。[[ガーンジー]]、[[ジャージー]]、[[マン島]]はイギリスの一部ではなく、イギリスの君主をともに君主とし、[[イギリス政府]]が防衛及び国際的表示に対して責任を負う[[イギリスの王室属領|王室属領]]である<ref>{{cite web |url=http://www.direct.gov.uk/en/Governmentcitizensandrights/LivingintheUK/DG_10012517 |title=Key facts about the United Kingdom |accessdate=3 May 2011 |publisher=[[:en:Directgov|Directgov]] |quote=The full title of this country is 'the United Kingdom of Great Britain and Northern Ireland'. 'The UK' is made up of England, Scotland, Wales and Northern Ireland. 'Britain' is used informally, usually meaning the United Kingdom. 'Great Britain' is made up of England, Scotland and Wales. The Channel Islands and the Isle of Man are not part of the UK. |archiveurl=http://webarchive.nationalarchives.gov.uk/20121015000000/http:/www.direct.gov.uk/en/Governmentcitizensandrights/LivingintheUK/DG_10012517 |archivedate=2012年10月15日 |deadlinkdate=2018年3月 }}</ref>。

===主要都市===
{{Main|イギリスの都市の一覧}}
イギリスは四つの非独立国であるイングランドスコットランドウェールズ北アイルランドより構成されるそれぞれの国は首都を持ちロンドンイングランド)、エディンバラスコットランド)、カーディフウェールズ)、ベルファスト北アイルランドがそれである中でもイングランドの首都であるロンドンはイギリス連合王国の首都としての機能も置かれている

イングランドの[[首都]]ロンドンは[[ヨーロッパ]]第2の規模の都市的地域及び[[ユーロスタット]]によれば[[欧州連合]]最大の約1,400万人の人口を有する[[:en:London commuter belt|都市圏]]であり重要な[[世界都市]]及び[[金融センター]]である<ref name="appsso.eurostat.ec.europa.eu show">{{cite web |url=http://appsso.eurostat.ec.europa.eu/nui/show.do?dataset=met_pjanaggr3&lang=en |title=Metropolitan Area Populations |publisher=Eurostat |date=30 August 2012 |accessdate=4 May 2013}}</ref><ref>{{cite web|url=https://www.cia.gov/library/publications/the-world-factbook/geos/uk.html|title=The World Factbook|date=1 February 2014|work=[[Central Intelligence Agency]]|accessdate=23 February 2014}}</ref>。

ウェールズスコットランド北アイルランドの首都は各々カーディフエディンバラベルファストである
[[ファイル:Population density UK 2011 census.png|thumb|right|人口分布2011]]

{| class="infobox" style="text-align:center; width:100%; margin-right:10px; font-size:100%"
! colspan="10" style="background:#e9e9e9; padding:0.3em; line-height:1.2em;"| '''イギリスの主要都市'''
|-
!rowspan=30|
[[ファイル:2019 Greenwich Peninsula & Canary Wharf.jpg|150px]]<br /><small>[[ロンドン]]</small><br />[[ファイル:Birmingham Skyline from Edgbaston Cricket Ground crop.jpg|150px]]<br /><small>[[バーミンガム]]</small><br />
! style="text-align:center; background:#f5f5f5;"| <small>#</small>
! style="text-align:left; background:#f5f5f5;"| 都市名
! style="text-align:left; background:#f5f5f5;"| [[イギリスの地方行政区画|行政区画]]
! style="text-align:center; background:#f5f5f5;"| 人口
! style="text-align:center; background:#f5f5f5;"| <small>#</small>
! style="text-align:left; background:#f5f5f5;"| 都市名
! style="text-align:left; background:#f5f5f5;"| [[イギリスの地方行政区画|行政区画]]
! style="text-align:center; background:#f5f5f5;"| 人口
!rowspan=21|
[[ファイル:Leeds CBD at night.jpg|150px]]<br /><small>[[リーズ]]</small><br />[[ファイル:Glasgow and the Clyde from the air (geograph 4665720).jpg|150px]]<br /><small>[[グラスゴー]]</small><br />
|-
| style="background:#f0f0f0"| 1 ||align=left | '''[[ロンドン]]''' || {{ENG}} || 8,908,081 || 11 ||align=left | '''[[コヴェントリー]]''' || {{ENG}} || 366,785|-
| style="background:#f0f0f0"| 2 ||align=left | '''[[バーミンガム]]''' || {{ENG}} || 1,141,374 || 12 ||align=left | '''[[カーディフ]]''' || {{Flagicon|WAL}}[[ウェールズ]] || 362,800|-
| style="background:#f0f0f0"| 3 ||align=left | '''[[リーズ]]''' || {{ENG}} || 789,194 || 13 ||align=left | '''[[ベルファスト]]''' || {{Flagicon|北アイルランド}}[[北アイルランド]] || 340,200|-
| style="background:#f0f0f0"| 4 ||align=left | '''[[グラスゴー]]''' || {{SCO}} || 626,410 || 14 ||align=left | '''[[レスター]]''' || {{ENG}} || 329,839|-
| style="background:#f0f0f0"| 5 ||align=left | '''[[シェフィールド]]''' || {{ENG}} || 582,506 || 15 ||align=left | '''[[ノッティンガム]]''' || {{ENG}} || 321,500|-
| style="background:#f0f0f0"| 6 ||align=left | '''[[マンチェスター]]''' || {{ENG}} || 547,627 || 16 ||align=left | '''[[ニューカッスルアポンタイン|ニューカッスルアポンタイン]]''' || {{ENG}} || 300,196|-
| style="background:#f0f0f0"| 7 ||align=left | '''[[ブラッドフォード (イングランド)|ブラッドフォード]]''' || {{ENG}} || 537,173 || 17 ||align=left | '''[[プリマス]]''' || {{ENG}} ||  263,100|-
| style="background:#f0f0f0"| 8 ||align=left | '''[[リヴァプール]]''' || {{ENG}} || 494,814 || 18 ||align=left | '''[[ウルヴァーハンプトン]]''' || {{ENG}} || 262,008|-
| style="background:#f0f0f0"| 9 ||align=left | '''[[エディンバラ]]''' || {{SCO}} || 488,050 || 19 ||align=left | '''[[キングストンアポンハル|キングストンアポンハル]]''' || {{ENG}} || 260,645|-
| style="background:#f0f0f0"| 10 ||align=left | '''[[ブリストル]]''' || {{ENG}} || 463,400 || 20 ||align=left | '''[[ストークオントレント|ストークオントレント]]''' || {{ENG}} || 255,833|}
{{Clear}}
4位以下の都市人口が僅差であり順位が変わりやすい2006年以降はロンドンバーミンガムリーズグラスゴーシェフィールドの順となっている

===気候===
イギリスの[[気候]]は2つの要因によって基調が定まっているまず[[メキシコ湾流]]に由来する暖流の北大西洋海流の影響下にあるため北緯50度から60度という高緯度にもかかわらず温暖であること次に中緯度の偏西風の影響を強く受けることである以上から[[西岸海洋性気候]] (Cfb) が卓越する[[大陸性気候]]はまったく見られず気温の年較差は小さい

メキシコ湾流の影響は冬季に強く現れる特に西部において気温の低下が抑制され気温が西岸からの距離に依存するようになる夏季においては緯度と気温の関連が強くなり比較的東部が高温になる水の蒸散量が多い夏季に東部が高温になることから年間を通じて東部が比較的乾燥し西部が湿潤となる

降水量の傾向もメキシコ湾流の影響を受けている東部においては降水量は一年を通じて平均しておりかつ一日当たりの降水量が少ない冬季特に風速が観測できない日には霧が発生しやすいこの傾向が強く当てはまる都市としてロンドンが挙げられる西部においては降水量が2500mmを超えることがある

首都ロンドンの年平均気温は12.81月の平均気温は6.77月の平均気温は19.5<ref>[https://www.weatheronline.co.uk/weather/maps/city?FMM=1&FYY=2001&LMM=12&LYY=2017&WMO=03779&CONT=ukuk&REGION=0003&LAND=UK&ART=TEM&R=0&NOREGION=1&LEVEL=162&LANG=en&MOD=tab London Weather Center 2001年1月から2017年12月までの平均]</ref>、年平均降水量は750.6mmとなっている。

==政治==
[[ファイル:Palace of Westminster, London - Feb 2007.jpg|thumb|[[イギリスの議会|英国議会]]が議事堂として使用する[[ウェストミンスター宮殿]]]]
{{main|イギリスの政治|イギリスの憲法|英国法|英米法}}
[[政体]]はイギリスの君主を[[元首]]に戴く[[立憲君主制]]であり内閣が議会の信任に基づいて存在する[[議院内閣制]]を採用する<ref>[http://www.royal.gov.uk/MonarchUK/HowtheMonarchyworks/Whatisconstitutionalmonarchy.aspx The British Monarchy, ''What is constitutional monarchy?'']. Retrieved 17 July 2013</ref><ref>[https://www.cia.gov/library/publications/the-world-factbook/geos/uk.html CIA, ''The World Factbook'']. Retrieved 17 July 2013</ref>。
===元首===
{{現在のイギリスの君主}}
1952年{{0}}2月{{0}}6日以降のイギリス女王君主[[ウィンザー朝]]第4代君主[[エリザベス2世]]である

======
[[イギリスの憲法]]は一つに成典化されていない[[不文憲法]]であり[[制定法]]議会制定法だけでなく[[マグナカルタ]]のような国王と貴族の契約も含むや[[判例法]]歴史的文書及び[[慣習法]]憲法的習律と呼ばれるなどが憲法を構成しているこれらは他の法律と同様に議会で修正可能なため[[軟性憲法]]であると言えるただし伝統的に憲法を構成する法律については簡単に改正されることはない)。憲法を構成する慣習法の一つに「'''国王は君臨すれども統治せず'''」とあり女王国王の権能は極めて儀礼的である

このように世界でも最も早い段階から立憲君主制と[[法の支配]]を採用しまた[[立法権]]優位の[[議会主権|議会主義]]が発達しており[[議院内閣制]][[ウェストミンスターシステム]]や[[政党制]][[複数政党制]]など現代の多くの国家が採用している[[民主主義]]の諸制度が発祥した国である

===内政===
[[立法権]]は[[イギリスの議会|議会]]に[[行政権]]は首相及び[[内閣 (イギリス)|内閣]]に[[司法権]]は[[イギリス最高裁判所]]及び以下の下級[[裁判所]]によって行使される

イギリスの議会は上院[[貴族院 (イギリス)|貴族院]]と下院[[庶民院 (イギリス)|庶民院]]の[[二院制]]である1911年に制定された[[議会法]]憲法の構成要素の一つにより、「下院の優越が定められている議院内閣制に基づき行政の長である首相は憲法的習律に従って下院第一党党首下院議員を国王が任命閣僚は議会上下両院の議員から選出される下院は単純[[小選挙区制]]による[[直接選挙]][[普通選挙]]で選ばれるが上院は非公選であり任命制である近年従来[[右派]]の保守党と[[左派]]の労働党により[[二大政党制]]化して来たが近年では第三勢力の[[自由民主党 (イギリス)|自由民主党]]旧[[自由党 (イギリス)|自由党]]の継承政党の勢力も拡大している

ウェールズスコットランド北アイルランドは各々異なる{{仮リンク|権限委譲 (イギリス)|en|Devolution in the United Kingdom|label=権限を委譲された}}政権を有しており<ref name="devoladmins">{{cite web|url=https://www.gov.uk/devolution-of-powers-to-scotland-wales-and-northern-ireland#devolved-administrations|title=Devolution of powers to Scotland, Wales, and Northern Ireland|publisher=United Kingdom Government|accessdate=17 April 2013|quote=In a similar way to how the government is formed from members from the two Houses of Parliament, members of the devolved legislatures nominate ministers from among themselves to comprise an executive, known as the devolved administrations...}}</ref><ref>{{cite news |url=http://news.bbc.co.uk/1/hi/education/7859034.stm |title=Fall in UK university students |work=BBC News |date=29 January 2009}}</ref><ref>{{cite web |url=http://www.transport-research.info/web/countryprofiles/uk.cfm |title=Country Overviews:United Kingdom |publisher=Transport Research Knowledge Centre |accessdate=28 March 2010 |archiveurl=https://web.archive.org/web/20100404062853/http://www.transport-research.info/web/countryprofiles/uk.cfm |archivedate=2010年4月4日 |deadlinkdate=2018年3月 }}</ref>、1996年に[[北アイルランド議会]]、1999年には[[スコットランド議会]]と[[ウェールズ議会]]が設置され、自治が始まった。スコットランドには主に[[スコットランド国民党]]による[[スコットランド独立運動]]が存在し、北アイルランドには20世紀から続く[[北アイルランド問題]]も存在する。
2016年{{0}}6月[[イギリスの欧州連合離脱是非を問う国民投票|欧州連合からの離脱を問う国民投票]]で賛成多数となり1973年のEEC加盟以来の大陸との一体化が幕を閉じた[[ブレグジット]])。これを受けてキャメロン首相からメイ首相へ交代した現任の首相は[[ボリスジョンソン]]

===地方行政区分===
[[ファイル:Scotland Parliament Holyrood.jpg|thumb|[[スコットランド議会]]議事堂]]
{{main|イギリスの地方行政区画}}

連合王国の地方行政制度は次の各地方によって異なっている
*{{Flag|ENG}}
*{{Flag|SCO}}
*{{Flag|WAL}}
*[[北アイルランド]]
このほか連合王国には含まれないものの連合王国がその国際関係について責任を負う地域として海外領土および[[王室属領]]が存在する

===外交軍事===
[[ファイル:Donald Trump and Theresa May (33998675310) (cropped).jpg|thumb|left|[[2017年]][[1月27日]]就任直後の[[ドナルドトランプ]]米大統領と[[ホワイトハウス]]で会談する[[テリーザメイ]]元英首相]]
{{Main|イギリスの国際関係|イギリス軍}}
イギリスは19世紀から20世紀前半までの間世界最高位の[[大国]]であった<ref>{{cite book |title=The First Industrial Nation:the Economic History of Britain, 17001914 |publisher=Routledge |location=London |author=Mathias, P. |year=2001 |isbn=0-415-26672-6}}</ref><ref name="ferguson">{{cite book |last=Ferguson |first=Niall |year=2004 |title=Empire:The rise and demise of the British world order and the lessons for global power |publisher=Basic Books |location=New York |isbn=0-465-02328-2}}</ref>現在も[[列強]]であり続け経済文化軍事科学政治で国際的な[[勢力圏|影響力を有する]]<ref>{{cite news |url=http://www.theaustralian.com.au/news/opinion/cameron-has-chance-to-make-uk-great-again/story-e6frg6zo-1225866975992 |author=Sheridan, Greg |title=Cameron has chance to make UK great again |accessdate=23 May 2011 |work=The Australian |location=Sydney |date=15 May 2010}}</ref><ref>{{cite news |url=http://www.independent.co.uk/news/uk/home-news/britain-is-now-most-powerful-nation-on-earth-8326452.html |author=Dugan, Emily |title=Britain is now most powerful nation on earth |accessdate=18 November 2012 |work=The Independent |location=London |date=18 November 2012}}</ref><ref name="David M. McCourt">{{cite book|last=McCourt|first=David|title=Britain and World Power Since 1945:Constructing a Nation's Role in International Politics|publisher=University of Michigan Press|year=28 May 2014|location=United States of America|pages=|isbn=0472072218|url=http://books.google.ie/books?id=lwpOnwEACAAJ&dq=Britain+and+World+Power+Since+1945:+Constructing+a+Nation%27s+Role+in+International+Politics&hl=en&sa=X&ei=TCJkU8TOE6mS7Abw14HIBg&ved=0CDIQ6AEwAA}}</ref>。

[[戦間期]]の[[国際連盟]]時代と同様1946年の第1回[[国際連合安全保障理事会]]以来同国は同理事会[[国際連合安全保障理事会常任理事国|常任理事国]]であり[[G7]][[主要国首脳会議|G8]][[G20]][[北大西洋条約機構|NATO]][[欧州評議会]][[経済協力開発機構|OECD]] [[世界貿易機関|WTO]]の加盟国となっているそしてアメリカ合衆国と歴史的に「'''特別な関係'''(Special relationship)」を持つアメリカ合衆国とヨーロッパ以外にも1920年代までは日本と[[日英同盟]]を結んでいた友好同盟国であったため[[大正]]時代の[[大日本帝国海軍]]現在の[[海上自衛隊]]は[[イギリス海軍]]の伝統に多大な影響を受けながら発展したイギリスと密接な同盟国は[[イギリス連邦|連邦国]]と他の[[英語圏]]の国家を含むイギリスの世界的な存在と影響は各国との相補関係と軍事力を通して拡大されているそれは世界中で約80の軍事基地の設置と軍の配備を維持していることにも現れている<ref>{{cite web|url=http://www.globalpowereurope.eu/|title=Global Power Europe|publisher=<code>Globalpowereurope.eu</code>|language=英語|accessdate=2008-10-17}}</ref>。2011年の軍事支出は627億ドルと一定水準を保っている。

[[ファイル:Soldiers Trooping the Colour, 16th June 2007.jpg|thumb|軍旗分列行進式における[[近衛兵 (イギリス)|近衛兵]]]]
イギリスの[[軍隊]]はイギリス軍<ref>{{lang-en-short|British Armed Forces}}</ref>または陛下の軍<ref>{{lang-en-short|His/Her Majesty's Armed Forces}}</ref>として知られているしかし公式の場ではアームドフォーシーズオブクラウン<!-- 慣例がないため未翻訳 --><ref>{{lang-en-short|Armed Forces of the Crown}}</ref>と呼ばれる<ref>{{Cite web|url=http://www.raf.mod.uk/legalservices/p3chp29.htm|title=Armed Forces Act 1976, Arrangement of Sections|publisher=<code>raf.mod.uk</code>|language=英語|accessdate=2009-02-22|archiveurl=https://web.archive.org/web/20090221072352/http://www.raf.mod.uk/legalservices/p3chp29.htm|archivedate=2009年2月21日|deadlinkdate=2018年3月}}</ref>(クラウンは冠、王冠の意)。全軍の最高司令官はイギリスの君主であるが、それはあくまで名目上に過ぎず、首相が事実上の指揮権を有している。軍の日常的な管理は[[国防省 (イギリス)|国防省]]に設置されている[[国防委員会]]によって行われている。

イギリスの軍隊は各国の軍隊に比べて広範囲にわたる活動を行い世界的な[[戦力投射]]能力を有する軍事大国の1つに数えられ国防省によると[[軍事費]]は世界2位である2008年現在軍事費はGDPの2.5%を占めている<ref>{{Cite web|url=http://www.mod.uk/DefenceInternet/AboutDefence/Organisation/KeyFactsAboutDefence/DefenceSpending.htm|title=Defence Spending|publisher={{lang|en|Ministry of Defence}}|language=英語|accessdate=2008-01-06 }}</ref>。イギリス軍はイギリス本国と海外の領土を防衛しつつ、世界的なイギリスの将来的国益を保護し、国際的な平和維持活動の支援を任ぜられている。

2005年の時点で[[イギリス陸軍|陸軍]]は102,440[[イギリス空軍|空軍]]は49,210海軍[[イギリス海兵隊|海兵隊]]を含むは36,320名の兵員から構成されておりイギリス軍の190,000名が現役軍人として80か国以上の国に展開配置されている<ref>{{lang-en-short|Ministry of Defence}}{{PDFlink|[http://www.mod.uk/NR/rdonlyres/6FBA7459-7407-4B85-AA47-7063F1F22461/0/modara_0405_s1_resources.pdf Annual Reports and Accounts 2004-05]|1.60&nbsp;MB}}」2006-05-14 閲覧。{{En icon}}</ref>。

イギリスは[[核兵器]]の保有を認められている5カ国の1つであり{{仮リンク|国別軍事費の一覧|en|List of countries by military expenditures|label=軍事費は世界第5位又は第6位}}である<ref name="SIPRI">{{cite web |url=http://books.sipri.org/product_info?c_product_id=476 |title=The 15 countries with the highest military expenditure in 2013 (table) |publisher=[[:en:Stockholm International Peace Research Institute|Stockholm International Peace Research Institute]] |format=PDF |accessdate=4 May 2014 |archiveurl=https://web.archive.org/web/20150104033821/http://books.sipri.org/product_info?c_product_id=476 |archivedate=2015年1月4日 |deadlinkdate=2018年3月 }}</ref><ref name="iiss.org">[http://www.iiss.org/en/about%20us/press%20room/press%20releases/press%20releases/archive/2014-dd03/february-0abc/military-balance-2014-press-statement-52d7 The Military Balance 2014:Top 15 Defence Budgets 2013] (IISS)</ref>。[[核弾頭]]搭載の[[トライデント (ミサイル)|トライデント II]] [[潜水艦発射弾道ミサイル]] (SLBM) を運用している。イギリス海軍は、トライデント IIを搭載した[[原子力潜水艦]]4隻で[[核抑止]]力の任務に担っている。
{{See also|イギリスの大量破壊兵器}}

イギリス軍の幅広い活動能力にも関わらず最近の国事的な国防政策でも協同作戦時に最も過酷な任務を引き受けることを想定している<ref>{{lang|en|Office for National Statistics}}{{lang|en|UK 2005:The Official Yearbook of the United Kingdom of Great Britain and Northern Ireland}}p. 89 {{En icon}}</ref>イギリス軍が単独で戦った最後の戦争は[[フォークランド紛争]]で全面的な戦闘が丸々3か月続いた現在は[[ボスニア紛争]][[コソボ紛争]][[アフガニスタン紛争 (2001-)|アフガニスタン侵攻]][[イラク戦争]]などアメリカ軍やNATO諸国との[[連合作戦]]が慣例となっているイギリス海軍の軽歩兵部隊であるイギリス海兵隊は[[上陸戦|水陸両用作戦]]の任務が基本であるがイギリス政府の外交政策を支援するため軽歩兵部隊の特性を生かして海外へ即座に展開できる機動力を持つ

==経済==
{{main|イギリスの経済}}
[[国際通貨基金|IMF]]によると2015年のイギリスの[[国内総生産|GDP]]は2兆8584億ドルであり世界5位欧州では[[ドイツ]]に次ぐ2位である<ref name="GDP1">[https://www.imf.org/external/pubs/ft/weo/2016/02/weodata/weorept.aspx?sy=2015&ey=2015&scsm=1&ssd=1&sort=country&ds=.&br=1&c=112&s=NGDPD%2CNGDPDPC&grp=0&a=&pr.x=28&pr.y=7 World Economic Outlook Database, October 2016] IMF 2016年11月{{0}}3日閲覧。</ref>。同年の一人当たりのGDPは4万3902ドルである<ref name="GDP1"/>。[[人間開発指数]]は[[人間開発指数による国順リスト|世界第14位]]で「非常に高い」に分類される。

[[ファイル:City of London skyline from London City Hall - Oct 2008.jpg|thumb|250px|ロンドンは2016年に発表された世界の都市総合力ランキングにおいて世界1位と評価された<ref>[http://www.mori-m-foundation.or.jp/ius/gpci/ 世界の都市総合力ランキング(GPCI) 2016] 森記念財団都市戦略研究所 2016年10月31日閲覧。</ref>]]
首都ロンドンは2016年時点で[[ニューヨーク]]を上回る世界一の金融センターと評価されている<ref>[http://www.longfinance.net/global-financial-centres--20/1037-gfci-20.html Global Financial Centres Index 20] Z/yen 2016年11月{{0}}3日閲覧。</ref>。ロンドンの[[シティ・オブ・ロンドン|シティ]]には、世界屈指の[[証券取引所]]である[[ロンドン証券取引所]]がある。イギリスの[[外国為替市場]]の1日平均取引額はアメリカを上回り、世界最大である<ref>[http://www.bis.org/publ/rpfx16.htm Triennial Central Bank Survey of foreign exchange and OTC derivatives markets in 2016] 国際決済銀行(BIS) 2016年11月{{0}}3日閲覧。</ref>。[[富裕層|富裕層人口]]も非常に多く、金融資産100万ドル以上を持つ富裕世帯は約41万世帯と推計されており、アメリカ、日本、[[中華人民共和国|中国]]に次ぐ第4位である<ref name="Rich">[http://www.bcg.com/expertise_impact/publications/PublicationDetails.aspx?id=tcm:12-107081 BCG Global Wealth 2012]</ref>。また、金融資産1億ドル以上を持つ超富裕世帯は1,125世帯と推計されており、アメリカに次ぐ第2位である<ref name="Rich"/>。

[[18世紀]]の産業革命以降近代において[[世界経済]]をリードする[[工業国]]で[[造船]]や[[航空機]]製造などの[[工業|重工業]]から金融業や[[エンターテインメント|エンターテイメント]]産業に至るまで様々な産業が盛んである歴史的に造船業は特筆に値し[[複式機関#船舶用複式蒸気機関の例|三段膨張機関]]が登場してから第一次世界大戦勃発までは世界の船の三分のニを生産した<ref>柏戸傳、「[https://hdl.handle.net/11266/1231 大戦間期日・英造船業の企業金融]」『立正経営論集』 2005年 37巻 2号, 立正大学経営学会</ref>。

しかしながら19世紀後半からはアメリカ合衆国ドイツ帝国の工業化により世界的優位は失われたイギリスを含む世界金融資本がイギリス製造業への投資よりドイツアメリカおよび植民地への投資を選好したためであるイギリス製造業はしだいにドイツフランスやアメリカ合衆国に立ち後れるようになってゆく20世紀に入るころより国力は衰え始め二度の世界大戦はイギリス経済に大きな負担を与えた各地の植民地をほとんど独立させた1960年代後半には経済力はいっそう衰退した

戦後の経済政策の基調は市場と国営セクター双方を活用する[[混合経済]]体制となり左派の労働党は[[ゆりかごから墓場まで]]と呼ばれる公共福祉の改善に力を入れ保守党も基本的にこれに近い政策を踏襲1960年代には世界有数の[[福祉国家論|福祉国家]]になったしかし[[オイルショック]]を契機とした不況になんら実用的な手立てを打たなかったために継続的な不況に陥り企業の倒産やストが相次いだ20世紀初頭から沈滞を続けたイギリス経済は深刻に行き詰まり、「[[英国病]]とまで呼ばれた

1979年に登場したサッチャー政権下で国営企業の民営化や各種規制の緩和が進められ1980年代後半には海外からの直接投資や証券投資が拡大したこの過程で製造業や[[鉱業]]部門の労働者が大量解雇され深刻な失業問題が発生基幹産業の一つである[[自動車]]産業の殆どが外国企業の傘下に下ったが外国からの投資の拡大をしだいに自国の産業の活性化や雇用の増大に繋げて行きその後の経済復調のきっかけにして行った[[ウィンブルドン現象]])。

その後1997年に登場したブレア政権における経済政策の成功などにより経済は復調しアメリカや他のヨーロッパの国に先駆けて好景気を享受するようになったがその反面でロンドンを除く地方は経済発展から取り残され[[貧富の差]]の拡大や不動産価格の上昇などの問題が噴出してきている

さらに2008年にはアメリカ合衆国の[[サブプライムローン]]問題の影響をまともに受けて金融不安が増大した上に資源食料の高騰の直撃を受け[[アリスターダーリング]][[財務大臣 (イギリス)|財務大臣]]が過去60年間で恐らく最悪の下降局面に直面していると非常に悲観的な見通しを明らかにしている<ref>{{Cite web|date=2008-08-30|url=http://sankei.jp.msn.com/economy/business/080830/biz0808301850007-n1.htm|work=産経新聞|title=「英経済、過去60年間で最悪の下降局面」英財務相|accessdate=2008-08-30 |archiveurl=https://web.archive.org/web/20080902012013/http://www.sankei.jp.msn.com/economy/business/080830/biz0808301850007-n1.htm |archivedate=2008-09-02}}</ref>。2012年{{0}}2月時点で失業率は8%を超えるまでに悪化した状態にあったが、その後は回復の兆しを見せている。

===鉱業===
[[ファイル:Oil platform in the North SeaPros.jpg|thumb|[[北海油田]]]]
イギリスの鉱業は産業革命を支えた[[石炭]]が著名である300年以上にわたる採炭の歴史があり石炭産業の歴史がどの国よりも長い2002年時点においても3193万トンを採掘しているもののほぼ同量の石炭を輸入している[[北海油田]]からの[[原油]]採掘量は1億1000万トンに及びこれは世界シェアの3.2%に達する最も重要なエネルギー資源は[[天然ガス]]であり世界シェアの4.3%第4位を占める有機鉱物以外では世界第8位となる[[塩化カリウム|カリ塩]] (KCl) 同10位となる[[塩]] (NaCl) がある金属鉱物には恵まれていない最大の[[鉛]]鉱でも1000トンである

===農業===
最も早く工業化された国であり現在でも高度に工業化されている農業の重要性は低下し続けておりGDPに占める農業の割合は2%を下回ったしかしながら世界シェア10位以内に位置する農産物が8品目ある穀物では[[オオムギ]]586万トン世界シェア10位以下2004年時点)、工芸作物では[[亜麻]]2万6000トン5)、[[テンサイ]]790万トン9)、[[アブラナ|ナタネ]]173万トン5)、[[ホップ]]2600トン6である家畜畜産品では[[ヒツジ]]3550万頭7)、[[ウール|羊毛]]6万5000トン5)、[[牛乳]]1480万トン9が主力

===貿易===
イギリスは産業革命成立後自由貿易によって多大な利益を享受してきたただし21世紀初頭においては貿易の比重は低下している2004年時点の貿易依存度すなわち国内総生産に対する輸出入額の割合はヨーロッパ諸国内で比較すると[[イタリア]]と並んでもっとも低いすなわち輸出16.1%輸入21.3%である

[[国際連合]]のInternational Trade Statistics Yearbook 2003によると品目別では輸出輸入とも工業製品が8割弱を占める輸出では電気機械15.2%2003)、機械類自動車医薬品原油輸入では電気機械 (16.3%)自動車機械類衣類医薬品の順になっている

貿易相手国の地域構成は輸出輸入ともヨーロッパ最大の工業国ドイツと似ている輸出入とも対EUの比率が5割強輸出においてはEUが53.4%2003)、次いでアメリカ合衆国15.0%アジア12.1%輸入においてはEU52.3%アジア15.1%アメリカ合衆国9.9%である

国別では主な輸出相手国はアメリカ合衆国15.0%2003)、ドイツ (10.4%)フランス (9.4%)オランダ (5.8%)アイルランド (6.5%)輸入相手国はドイツ (13.5%)アメリカ合衆国 (9.9%)フランス (8.3%)オランダ (6.4%)中華人民共和国 (5.1%) である
===不動産===
イギリスの不動産は人口の約1%の約25,000人の貴族や大企業などがイングランドの土地の48%を保有しており未申告は貴族が家族間で秘密裏に管理していた土地と考えられている
{|
|-
|法人企業
|style="text-align:right"|18
|<!-- 最上段 --><div style="width:180px;height:16px;background:#9999ff"></div>
|-
|銀行の経営者寡頭政治家
|style="text-align:right"|17
|<!-- 2段目 --><div style="width:170px;height:16px;background:#9999ff"></div>
|-
|公的機関
|style="text-align:right"|8.5
|<!-- 3段目 --><div style="width:85px;height:16px;background:#9999ff"></div>
|-
|住宅保有者
|style="text-align:right"|5
|<!-- 4段目 --><div style="width:50px;height:16px;background:#9999ff"></div>
|-
|慈悲団体
|style="text-align:right"|2
|<!-- 5段目 --><div style="width:20px;height:16px;background:#9999ff"></div>
|-
|王室
|style="text-align:right"|1,4
|<!-- 6段目 --><div style="width:14px;height:16px;background:#9999ff"></div>
|-
|イングランド教会
|style="text-align:right"|0.5
|<!-- 7段目 --><div style="width:5px;height:16px;background:#9999ff"></div>
|-
|未申告
|style="text-align:right"|17
|<!-- 最下段 --><div style="width:178px;height:16px;background:#9999ff"></div>
|}

===エネルギー政策===
{{main|{{仮リンク|イギリスのエネルギー|en|Energy in the United Kingdom}}}}

イギリスの原子力発電に対する中華人民共和国の投資と技術協力を積極的に推進することでエネルギー政策と経済力の強化に取り組んでいる<ref>[http://mainichi.jp/select/news/20151022k0000m030079000c.html 習主席:英首相と7兆円商談合意…人民元建てで国債発行へ] {{webarchive|url=https://web.archive.org/web/20151023155717/http://mainichi.jp/select/news/20151022k0000m030079000c.html |date=2015年10月23日 }}毎日新聞 2015年10月21日</ref>。2016年には、中国からの投資による原子炉の建造を承認した<ref>https://www.gov.uk/government/news/multimillion-boost-to-uk-economy-as-china-and-uk-government-sign-civil-nuclear-agreement-and-sign-agreement-to-deepen-cooperation-on-climate-change</ref>。

===通貨===
スターリングポンド (GBP) が使用されている補助単位は[[ペニー]]で1971年より1ポンドは100ペンスであるかつてポンドは[[アメリカ合衆国ドル|USドル]]が世界的に決済通貨として使われるようになる以前イギリス帝国の経済力を背景に国際的な決済通貨として使用されたイギリスの欧州連合加盟に伴いヨーロッパ共通通貨であるユーロにイギリスが参加するか否かが焦点となったがイギリス国内に反対が多く[[欧州連合の経済通貨統合|通貨統合]]は見送られたイングランド銀行が連合王国の[[中央銀行]]であるがスコットランドと北アイルランドでは地元の商業銀行も独自の紙幣を発行しているイングランド銀行の紙幣にはエリザベス女王が刷られており連合王国内で共通に通用するスコットランド紙幣北アイルランド紙幣ともに連合王国内で通用するが受け取りを拒否されることもある
2016年{{0}}6月24日1993年に加盟した欧州連合EUの脱退が国民投票によって正式に決定した

===企業===
{{main|イギリスの企業一覧}}

====通信====
{{Main|{{仮リンク|イギリスの情報通信|en|Telecommunications in the United Kingdom}}}}
イギリスではヒースロー空港などにある自動販売機で[[SIMカード]]が購入できる[[プリペイド|プリペイド式]]となっておりスーパーなどで通話通信料をチャージして使う

おもな通信業者
*[[ボーダフォン]] イギリス
*[[EE (企業)|EE]] ドイツ系の[[T-Mobile]]とフランス系(元イギリス)の[[Orange_(通信会社)|Orange]]([[:en:Orange (UK)|en]])の合弁で現在は[[BTグループ]]傘下
*[[O2]] スペイン[[テレフォニカ]]傘下
*3Three 香港[[ハチソンワンポア]]

==交通==
{{main|{{仮リンク|イギリスの交通|en|Transport in the United Kingdom}}}}

===道路===
{{main|{{仮リンク|イギリスの道路|en|Roads in the United Kingdom}}}}

自動車は[[対面交通|左側通行]]であるまたインドオーストラリア[[香港]][[シンガポール]]など旧イギリス植民地の多くが左側通行を採用している

===鉄道===
{{main|イギリスの鉄道}}
[[ファイル:Eurostar at St Pancras Jan 2008.jpg|thumb|国際列車[[ユーロスター]]の発着駅である[[セントパンクラス駅]]]]
近代鉄道の発祥の地であり国内には鉄道網が張り巡らされロンドンなどの都市には14路線ある[[地下鉄]]チューブトレイン網が整備されているしかし1960年代以降は設備の老朽化のために事故が多発しさらに運行の遅延が常習化するなど問題が多発している

小規模の民間地方鉄道の運営する地方路線の集まりとして誕生したイギリスの鉄道は19世紀から[[20世紀]]前期にかけて競合他社の買収などを通じて比較的大規模な少数の会社が残った1921年にはついに[[ロンドンミッドランドアンドスコティッシュ鉄道]][[ロンドンアンドノースイースタン鉄道]][[グレートウェスタン鉄道]][[サザン鉄道 (イギリス)|サザン鉄道]]の4大鉄道会社にまとまりこれらは1948年に国有化されて[[イギリス国鉄]] (BR) となったしかし[[1994|1994]][[1997|97年]]にBRは旅客輸送貨物輸送と線路や駅などの施設を一括管理する部門に分割されて民営化された

1994年開業したイギリスフランス両国所有の英仏海峡トンネルはイングランドのフォークストンからフランスのカレーまでイギリス海峡の海底130mを長さ50.5kmで走る3本の並行したトンネルからなる1本は貨物専用で残り2本は乗客貨物の輸送に使われるこのトンネルを使ってセントパンクラス駅からはヨーロッパ大陸との間を結ぶ[[ユーロスター]]が運行され[[パリ]]や[[ブリュッセル]][[リール (フランス)|リール]]などのヨーロッパ内の主要都市との間を結んでいる

===海運===
周囲を海に囲まれている上世界中に植民地を持っていたことから古くからの海運立国であり[[P&O]]や[[キュナードライン]]など多くの海運会社があるまた歴史上有名な[[タイタニック (客船)|タイタニック号]][[クイーンエリザベス2]]」、「[[クイーンメリー2]]などの著名な客船を運航している

===航空===
{{main|{{仮リンク|イギリスの航空|en|Air transport in the United Kingdom}}}}

[[ファイル:Heathrow Terminal 5C Iwelumo-1.jpg|thumb|[[:en:London Heathrow Terminal 5|London Heathrow Terminal 5]]. [[ロンドンヒースロー空港]]は[[:en:World's busiest airports by international passenger traffic|国際線利用客数]]では世界随一である]][[ファイル:Airbus A380-841 G-XLEB British Airways (10424102995).jpg|thumb|ブリティッシュエアウェイズ (イギリス最大の航空会社)]]


民間航空が古くから発達し特に国際線の拡張は世界に広がる植民地間をつなぐために重要視されてきた

現在は[[ブリティッシュエアウェイズ]]や[[ヴァージンアトランティック航空]]や[[イージージェット]]などの航空会社がある中でもブリティッシュエアウェイズは[[英国海外航空]]と[[英国欧州航空]]の2つの国営会社が合併して設立され1987年に民営化された世界でも最大規模の航空会社で2009年にはスペインの[[イベリア航空]]と統合合意し2011年に[[インターナショナルエアラインズグループ]]を設立した

航空機製造業も[[BAEシステムズ]]やエンジン製造の[[ロールスロイスホールディングス]]があり1976年にはフランスとともに[[コンコルド]]機を開発して世界初の[[超音速旅客機|超音速旅客]]輸送サービスを開始しかし老朽化とコスト高などにより2003年11月26日をもって運航終了となりコンコルドは空から姿を消した

主な空港としてロンドンのヒースロー空港[[ロンドンガトウィック空港|ガトウィック]][[ロンドンスタンステッド空港|スタンステッド]]のほか[[ロンドンルートン空港|ルートン]][[マンチェスター空港|マンチェスター]][[グラスゴー空港|グラスゴー]]などが挙げられる

日本との間には2016年サマースケジュールではヒースロー空港と[[成田国際空港|成田空港]]の間にブリティッシュエアウェイズのみ1日1便直行便を運航し[[東京国際空港|羽田空港]]の間にもブリティッシュエアウェイズ[[日本航空]][[全日本空輸]]がそれぞれ1日1便直行便を運航しているかつてはヴァージンアトランティック航空が就航していたが2015年に撤退している

==科学技術==
{{Main|{{仮リンク|イギリスの科学技術|en|Science and technology in the United Kingdom}}}}

17世紀の科学革命はイングランドとスコットランドが18世紀の産業革命はイギリスが世界の中心であった重要な発展に貢献した科学者と技術者を多数輩出している[[アイザックニュートン]][[チャールズダーウィン]]電磁波の[[ジェームズクラークマクスウェル]]そして最近では宇宙関係の[[スティーブンホーキング]]科学上の重要な発見者には水素の[[ヘンリーキャヴェンディッシュ]][[ペニシリン]]の[[アレクサンダーフレミング]][[デオキシリボ核酸|DNA]]の[[フランシスクリック]]がいる工学面では[[グラハムベル]]など科学の研究応用は大学の重要な使命であり続け2004年から5年間にイギリスが発表した科学論文は世界の7%を占める学術雑誌[[ネイチャー]]や医学雑誌[[ランセット]]は世界的に著名である

==国民==
{{main|イギリス人|{{仮リンク|イギリスの人口統計|en|Demography of the United Kingdom}}}}
{{See also|{{仮リンク|イギリスの民族|en|Ethnic groups in the United Kingdom}}}}
[[ファイル:UKpop.svg|thumb|right|イギリスの[[人口ピラミッド]]]]
イギリスの人口は2015年時点で推計6,471万人であり[[国の人口順リスト|世界第22位]]である

イギリス民族という民族は存在しない主な民族はイングランドを中心に居住する[[ゲルマン人|ゲルマン民族]]系のイングランド人[[アングロサクソン人]])、[[ケルト人|ケルト]]系のスコットランド人アイルランド人ウェールズ人だが旧植民地出身のインド系[[印僑]])、[[アフリカ系]]カリブ系[[アラブ系]]や[[華僑]]なども多く住む[[多民族国家]]である

イギリスの国籍法では旧植民地関連の者も含め自国民を次の六つの区分に分けている
*GBR:British Citizen - イギリス市民
*:本国人
*BOTC:[[:en:British Overseas Territories citizen|British Overseas Territories citizen]] - [[イギリス海外領土市民]]
*:イギリスの海外領土出身者
*BOC:[[:en:British Overseas Citizen|British Overseas Citizen]] - [[イギリス海外市民]]
*:ギリシャ西岸の諸島インドパキスタンマレーシアなどの旧植民地出身者のうち特殊な歴史的経緯のある者
*GBS:[[:en:British Subject|British Subject]] - [[イギリス臣民]]
*:アイルランド北部以外)・ジブラルタルなどイギリス海外領土市民やイギリス海外市民とは別の経緯のある地域の住民で一定要件に該当する者
*BNO:[[:en:British National (Overseas)|British National (Overseas)]] - [[イギリス国民海外]]※「BN(O)とも書く
*:英国国籍で香港の[[永住権|住民権]]も持つ人
*BPP:[[:en:British Protected Person|British Protected Person]] - [[イギリス保護民]]

いずれの身分に属するかによって国内での様々な取扱いで差異を生ずることがあるほかパスポートにその区分が明示されるため海外渡航の際も相手国により取扱いが異なることがある例えば日本に入国する場合British citizen本国人とBritish National (Overseas)英国籍香港人は短期訪問目的なら[[査証]]ビザ不要となるが残りの四つは数日の[[観光]]訪日であってもビザが必要となる

===言語===
{{main|{{仮リンク|イギリスの言語|en|Languages of the United Kingdom}}}}
[[ファイル:Anglospeak.svg|thumb|250px|世界の[[英語圏]]地域濃い青色は英語が[[公用語]]または事実上の公用語になっている地域薄い青色は英語が公用語であるが主要な言語ではない地域]]
事実上の公用語は英語イギリス英語でありもっとも広く使用されているがイングランドの主に[[コーンウォール]]でコーンウォール語ウェールズの主に北部と中部でウェールズ語スコットランドの主に[[ローランド地方]]でスコットランド語ヘブリディーズ諸島の一部でスコットランドゲール語北アイルランドの一部で[[:en:Ulster Scots dialects|アルスタースコットランド語]]とアイルランド語が話されておりそれぞれの構成国で公用語になっている

特にウェールズでは1993年にウェールズ語が公用語になり英語と同等の法的な地位を得た2001年現在ウェールズ人口の約20%がウェールズ語を使用しその割合は僅かではあるが増加傾向にある公文書や道路標識などはすべてウェールズ語と英語とで併記されるまた16歳までの義務教育においてウェールズ語は必修科目でありウェールズ語を主要な教育言語として使用し英語は第二言語として扱う学校も多く存在する

===宗教===
{{See also|イギリスの宗教}}
10年に一度行われるイギリス政府の国勢調査によれば2001[[キリスト教徒]]が71.7%[[イスラム教徒]]が3.0%[[ヒンドゥー教]]徒が1.0%
2011キリスト教徒59.3%イスラム教徒4.8%ヒンドゥー教徒が1.5%<ref>{{Cite report |publisher=Office for National Statistics |title=Religion in England and Wales 2011 |date=2012-12-11 |url=https://www.ons.gov.uk/peoplepopulationandcommunity/culturalidentity/religion/articles/religioninenglandandwales2011/2012-12-11 }}</ref>。

キリスト教の内訳は[[英国国教会]]が62%[[カトリック]]が13%[[長老派]]が6%[[メソジスト]]が3%程度と推定されている<ref>The Changing Religious Landscape of Europe Hans Knippenberg</ref>

===婚姻===
婚姻の際には夫婦同姓複合姓[[夫婦別姓]]のいずれも選択可能であるまた[[同性結婚]]も可能である<ref>英国イングランドとウェールズ同性婚を初の合法化朝日新聞2014年{{0}}3月29日</ref>また在日英国大使館においても同性結婚登録を行うことが可能である<ref>在日本英国大使館領事館で同性婚登録が可能に 週刊金曜日 2014年{{0}}6月13日</ref><ref>https://www.gov.uk/government/news/introduction-of-same-sex-marriage-at-british-consulates-overseas.ja</ref>。

===移住===
{{main|{{仮リンク|現代イギリスにおける移民|en|Modern immigration to the United Kingdom}}|{{仮リンク|イギリスにおける外国人出生者|en|Foreign-born population of the United Kingdom}}}}
{{節スタブ}}
===教育===
{{main|イギリスの教育}}
イギリスの学校教育は地域や公立私立の別により異なるが5歳より小学校教育が開始される

===医療===
{{Main|イギリスの医療}}
[[ファイル:Royal Aberdeen Children's Hospital.jpg|thumb|right|The Royal Aberdeen Children's HospitalNHSスコットランドの小児病院]]
イギリスの医療は各地域それぞれの[[地方分権]]型であり公的医療とプライベート診療が存在する公的医療は[[国民保健サービス]]NHSによりすべてのイギリス人に提供され医学的必要性が認められる治療は大部分は自己負担なしであり費用は一般税収を原資としている[[公費負担医療]])。NHSにはイギリス国家予算の25.2%が投じられている<ref name="ohe">{{Cite report |publisher=Office of Health Economics |title=OHE Guide to UK Health and Health Care Statistics |date=2013-08 |url=https://www.ohe.org/publications/ohe-guide-uk-health-and-health-care-statistics }}</ref>。

国全体にかかわる規制は{{仮リンク|総合医療評議会|en|General Medical Council}}や{{仮リンク|看護助産評議会|en|Nursing and Midwifery Council}}やまた[[ロイヤルカレッジ]]などの外部機関が行っているしかし政策や現業の責務は各地方行政区である4つの女王陛下の政府北アイルランド政府スコットランド政府ウェールズ政府がそれぞれになっているそれぞれの運営するNHSは各々の政策や優先度を持ち施政に違いをもたらしている<ref>{{cite news |url=http://news.bbc.co.uk/1/hi/health/7586147.stm |title='Huge contrasts' in devolved NHS |work=BBC News |date=28 August 2008}}</ref><ref>{{cite news |url=http://news.bbc.co.uk/1/hi/health/7149423.stm |title=NHS now four different systems |work=BBC News |date=2 January 2008 |first=Nick |last=Triggle}}</ref>。

英国はGDPの8.5%を医療に支出しておりこれはOECD平均と比べて-0.5%EU平均と比べて-1%の値であった<ref>{{cite report|title=OECD Health Data 2009&nbsp; How Does the United Kingdom Compare |publisher=OECD}}</ref>1979年に保健支出が急増したことによりその値はEU平均に近くなってきている<ref>{{Cite journal|url=http://www.healthp.org/node/71|title=The NHS from Thatcher to Blair |first=Peter |last=Fisher |work=NHS Consultants Association |publisher=International Association of Health Policy |quote=The Budget ... was even more generous to the NHS than had been expected amounting to an annual rise of 7.4% above the rate of inflation for the next 5 years. This would take us to 9.4% of GDP spent on health ie around EU average.}}</ref>。WHOは2000年に英国の医療制度を欧州で15位、世界で18位と評している<ref name="Who2000">{{Cite book |editor-last=Haden |editor-first=Angela |editor2-last=Campanini |editor2-first=Barbara |title=The world health report 2000&nbsp;– Health systems:improving performance |year=2000 |location=Geneva |publisher=World Health Organisation |url=http://www.who.int/whr/2000/en/whr00_en.pdf |isbn=92-4-156198-X |accessdate=5 July 2011}}</ref><ref>{{Cite journal |url=http://pages.stern.nyu.edu/~wgreene/Statistics/WHO-COMP-Study-30.pdf |title=Measuring overall health system performance for 191 countries |author=[[World Health Organization]] |publisher=New York University |accessdate=5 July 2011}}</ref>。

==文化==
{{Main|[[:en:Culture of the United Kingdom]]}}

===食文化===
{{Main|イギリス料理}}
[[フィッシュアンドチップス]]や[[ローストビーフ]][[ウナギのゼリー寄せ]]などが有名である{{節スタブ}}

===文学===
[[ファイル:CHANDOS3.jpg|thumb|150px|[[ウィリアムシェイクスピア]]]]
{{Main|イギリス文学}}
多くの傑作を後世に残した[[ウィリアムシェイクスピア]]は[[イギリスルネサンス演劇]]を代表する空前絶後の詩人および劇作家と言われる初期のイギリス文学者としては[[ジェフリーオブモンマス]]や[[ジェフリーチョーサー]][[トマスマロリー]]が著名18世紀になると[[サミュエルリチャードソン]]が登場する彼の作品には3つの小説の基本条件すなわちフィクション性および物語性人間同士の関係愛情結婚など)、個人の性格や心理といった条件が満たされていたことから彼は近代小説の父と呼ばれている

19世紀の初めになると[[ウィリアムブレイク]][[ウィリアムワーズワース]]ら[[ロマン主義]]の詩人が活躍した19世紀には小説分野において革新が見られ[[ジェーンオースティン]][[ブロンテ姉妹]][[チャールズディケンズ]][[トーマスハーディ]]らが活躍した19世紀末には[[耽美主義]]の[[オスカーワイルド]]現代の[[推理小説]]の生みの親[[アーサーコナンドイル]]が登場

20世紀に突入すると、「[[サイエンスフィクション|SF]]の父[[ハーバートジョージウェルズ]][[モダニズム]]を探求した[[デーヴィッドハーバートローレンス]][[ヴァージニアウルフ]]預言者[[ジョージオーウェル]]、「ミステリーの女王[[アガサクリスティ]]などが出てくるそして近年[[ハリーポッターシリーズ]]の[[JKローリング]]がかつての[[JRRトールキン]]のような人気を世界中で湧かせている

===哲学===
{{Main|{{仮リンク|イギリスの哲学|en|British philosophy}}}}
{{節スタブ}}
*[[イギリス経験論]]
*[[イギリス理想主義]]

===音楽===
{{Main|イギリスの音楽}}
<!-- 音楽の欄はジャンルも影響力もバラバラの人名が並んでいるため出典に基づいた整理が必要 -->
[[クラシック音楽]]における特筆すべきイギリス人作曲家として、「ブリタニア音楽の父[[ウィリアムバード]][[ヘンリーパーセル]][[エドワードエルガー]][[アーサーサリヴァン]][[レイフヴォーンウィリアムズ]][[ベンジャミンブリテン]]がいる特に欧州大陸で古典派ロマン派が隆盛をきわめた18世紀後半から19世紀にかけて有力な作曲家が乏しかった時期もあったが旺盛な経済力を背景に演奏市場としては隆盛を続けロンドンはクラシック音楽の都の一つとして現在残るドイツのオーケストラが地方中都市の団体でも四管フル編成を原則としているのに対しロンドン5大オーケストラは長年[[BBC交響楽団]]を除き現在は[[ロンドン交響楽団]]も総員70名台の中規模編成を貫き大曲演奏に際してはフリー奏者を臨時補充するなどの形であったにも関わらずそれなりの世界的声価を維持してきた一時はメンバーの共有も見られ映画音楽の仕事が多いことが批判されることもあるものの持ち前の合理主義によって少なくとも英語圏では随一のクラシック演奏都市であり続けているオペラはロンドンに[[ロイヤルオペラハウス|コヴェントガーデン王立歌劇場]]と[[イングリッシュナショナルオペラ]]を擁し後者は世界手も珍しい英訳上演主義の団体である

====ポピュラー音楽====
[[ファイル:The Fabs.JPG|thumb|200px|[[ビートルズ]]]]
{{Main|ロック (音楽)|{{仮リンク|ブリティッシュロック|en|British rock}}}}
[[ポピュラー音楽]]特にロックミュージックにおいてイギリスは先鋭文化の発信地として世界的に有名である196070年代になると[[ロック (音楽)|ロック]]が誕生し中でも[[ビートルズ]]や[[ローリングストーンズ]]といった[[ロックンロール]]の影響色濃いバンドがその表現の先駆者として活躍したやがて[[キングクリムゾン]]や[[ピンクフロイド]]などの[[プログレッシブロック]]や[[クイーン (バンド)|クイーン]][[クリーム (バンド)|クリーム]][[レッドツェッペリン]][[ディープパープル]][[ブラックサバス]]などの[[R&B]]や[[ハードロック]]がロックの更新に貢献1970年代後半の[[パンクロック]]の勃興においてはアメリカニューヨークからの文化を取り入れロンドンを中心に[[セックスピストルズ]][[ザクラッシュ]]らが国民的なムーブメントを起こす

パンクロック以降はインディーロックを中心に[[ニューウェイヴ (音楽)|ニューウェイヴ]]などといった新たな潮流が生まれ[[テクノポップ]]ドラッグミュージック文化の発達と共に[[ニューオーダー]][[ザストーンローゼズ]][[グリッド]]などがメインストリームでは[[デュランデュラン]][[デペッシュモード]]らの著名なバンドが生まれた90年代は[[ブリットポップ]]や[[エレクトロニカ]]がイギリスから世界中に広まり人気を博し[[オアシス (バンド)|オアシス]][[ブラー]][[レディオヘッド]][[プロディジー]][[マッシヴアタック]]などは特に目覚ましい[[シューゲイザー]][[トリップホップ]][[ビッグビート]]などといった多くの革新的音楽ジャンルも登場した近年では[[エイミーワインハウス]][[マクフライ]][[コールドプレイ]][[スパイスガールズ]]らがポップシーンに名を馳せた

イギリスではロックやポップなどのポピュラー音楽が国内だけでなく世界へ大きな市場を持つ主要な[[外貨]]獲得興業となっておりトニーブレア政権下などではクールブリタニアでロックミュージックに対する国策支援などが行われたりなどその重要度は高いアメリカ合衆国と共にカルチャーの本山として世界的な影響力を保ち続け他国のポピュラー音楽産業の潮流への先駆性は近年もいささかも揺るがない

===映画===
{{Main|イギリスの映画}}
{{節スタブ}}

===コメディ===
イギリス人はユーモアのセンスが高いと言われているまたコメディアンの多くは高学歴である
*[[ローワンアトキンソン]]
*[[チャールズチャップリン]]
*[[ピーターセラーズ]]
*[[モンティパイソン]]
*[[リックウェイクマン]] 但し本職は[[ミュージシャン]]

===国花===
[[国花]]はそれぞれの地域が持っている
*イングランドは[[バラ]]
*ウェールズは[[ラッパスイセン]][[スイセン]]の1種)。[[リーキ]]もより歴史のあるシンボルだがリーキは花ではない
*北アイルランドは[[シャムロック]]
*スコットランドは[[アザミ]]

===世界遺産===
イギリス国内には[[国際連合教育科学文化機関|ユネスコ]]の[[世界遺産]]リストに登録された文化遺産が21件自然遺産が5件ある詳細は[[イギリスの世界遺産]]を参照
<gallery>
PalaceOfWestminsterAtNight.jpg|ウェストミンスター宮殿
Westminster Abbey - West Door.jpg|[[ウェストミンスター寺院]]
Edinburgh Cockburn St dsc06789.jpg|[[エディンバラ旧市街|エディンバラの旧市街]][[エディンバラ新市街|新市街]]
Canterbury Cathedral - Portal Nave Cross-spire.jpeg|[[カンタベリー大聖堂]]
Kew Gardens Palm House, London - July 2009.jpg|[[キューガーデン|キュー王立植物園]]
2005-06-27 - United Kingdom - England - London - Greenwich.jpg|[[グリニッジ|マリタイムグリニッジ]]
Stonehenge2007 07 30.jpg|[[ストーンヘンジ]]
Yard2.jpg|[[ダラム城]]
Durham Kathedrale Nahaufnahme.jpg|[[ダラム大聖堂]]
Roman Baths in Bath Spa, England - July 2006.jpg|[[バース市街]]
Fountains Abbey view02 2005-08-27.jpg|[[ファウンテンズ修道院]]跡を含む[[スタッドリー王立公園]]
Blenheim Palace IMG 3673.JPG|[[ブレナム宮殿]]
Liverpool Pier Head by night.jpg|[[海商都市リヴァプール]]
Hadrian's Wall view near Greenhead.jpg|[[ローマ帝国の国境線]] ([[ハドリアヌスの長城]])
London Tower (1).JPG|[[ロンドン塔]]
</gallery>

===祝祭日===
祝祭日はイングランドウェールズスコットランド北アイルランドの各政府により異なる場合がある銀行など多くの企業が休みとなることから国民の祝祭日をバンクホリデー({{interlang|en|Bank holiday}})銀行休業日と呼ぶ
{|class="wikitable"
!日付!!日本語表記!!現地語表記!!備考
|-
|1月{{0}}1||[[元日]]||{{lang|en|New Year's Day}}||
|-
|1月{{0}}2||元日翌日||-||スコットランドのみ
|-
|3月17日||[[聖パトリックの祝日|聖パトリックの日]]||{{lang|en|St. Patrick's Day}}||北アイルランドのみ
|-
|3 - 4||[[聖金曜日]]||{{lang|en|Good Friday}}||移動祝日
|-
|3 - 4||[[復活祭]]月曜日||{{lang|en|Easter Monday}}||移動祝日
|-
|5月第1月曜日||[[五月祭]]||{{lang|en|Early May Bank Holiday}}||移動祝日
|-
|5月最終月曜日||五月祭終り||{{lang|en|Spring Bank Holiday}}||移動祝日
|-
|7月12日||[[ボイン川の戦い]]記念日||{{lang|en|Battle of the Boyne (Orangemen's Day)}}||北アイルランドのみ
|-
|8月第1月曜日||夏季銀行休業日||{{lang|en|Summer Bank Holiday}}||移動祝日スコットランドのみ
|-
|8月最終月曜日||夏季銀行休業日||{{lang|en|Summer Bank Holiday}}||移動祝日スコットランドを除く
|-
|12月25日||[[クリスマス]]||{{lang|en|Christmas Day}}||
|-
|12月26日||[[ボクシングデー]]||{{lang|en|Boxing Day}}||
|}
*聖金曜日を除く移動祝日は原則的に月曜日に設定されている
*ボクシングデー後の2日も銀行休業日であったが2005年を最後に廃止されている

===スポーツ===
{{main|{{仮リンク|イギリスのスポーツ|en|Sport in the United Kingdom}}}}
[[ファイル:Wembley Stadium, illuminated.jpg|thumb|220px|[[ウェンブリースタジアム]]]]
イギリスは[[サッカー]][[ラグビー]][[クリケット]][[ゴルフ]][[ボクシング]]など多くの競技が発祥もしくは近代スポーツとして整備された地域であり国技としても定着している年間観客動員数は4000万人以上を集めるサッカーが他を大きく凌いでおり[[競馬]]の600万人ユニオンラグビーの300万クリケット200万がそれに続く

このうち団体球技サッカーラグビークリケットは発祥地域の伝統的な配慮から国際競技団体ではイギリス単体ではなくイングランドスコットランドウェールズ北アイルランドラグビーに関してはアイルランドにまとめているの4地域それぞれの加盟を認めているがサッカーが公式なプログラムとして行われている[[近代オリンピック]]では単一国家としての出場が大原則であるため長年出場していなかったしかし2012年の開催が内定した[[ロンドンオリンピック (2012年)|ロンドン五輪]]では4協会が一体となった統一イギリス代表としてエントリーしたまたイギリスの首都であるロンドンで[[夏季オリンピック]]を行ったのは1948年以来64年ぶりであるただし[[野球]]においては早くから[[野球イギリス代表|英国代表]]として[[欧州野球選手権]]や[[ワールドベースボールクラシック|WBC]]などに統一ナショナルチームを送り出している

====サッカー====
{{main|{{仮リンク|イギリスのサッカー|en|Football in England}}}}
数多くのスポーツを誕生させたイギリスでも取り分け人気なのがサッカーであるイギリスでサッカーは「'''フットボール'''」と呼び近代的なルールを確立したことから「'''近代サッカーの母国'''」と呼ばれそれぞれの地域に独自のサッカー協会があるイギリス国内でそれぞれ独立した形でサッカーリーグを展開しており中でもイングランドの[[プレミアリーグ]]は世界的に人気である[[フットボールアソシエーション|イングランドサッカー協会]] (FA) などを含むイギリス国内の地域協会は全て[[国際サッカー連盟]] (FIFA) よりも早くに発足しておりFIFA加盟国では唯一特例で国内の地域単位での加盟を認められている(以降FIFAは海外領土など一定の自治が行われている地域協会を認可している)その為FIFAや[[欧州サッカー連盟]]UEFAが主宰する各種国際大会[[FIFAワールドカップ]][[UEFA欧州選手権]][[UEFAチャンピオンズリーグ]][[UEFAカップ]][[FIFA U-20ワールドカップ]]や[[UEFA U-21欧州選手権]]などの年代別国際大会には地域協会単位でのクラブチームやナショナルチームを参加させておりさらには7人いるFIFA副会長の一人はこの英本土4協会から選ばれるサッカーのルールや重要事項に関してはFIFAと英本土4協会で構成する[[国際サッカー評議会]]が決定するなど特権的な地位が与えられているまたサッカー選手や監督がプロ競技における傑出した実績によって一代限りの騎士や勲爵士となることがある[[デビッドベッカム]][[スティーヴンジェラード]]や[[ボビーロブソン]][[アレックスファーガソン]]など)。

またサッカーはもともとラグビーと同じく中流階級の師弟が通う[[パブリックスクール]]で近代競技として成立したがその過程は労働者階級の娯楽として発展していったただ当時のイギリスの継続的な不況からくる労働者階級の人口の割合とそれ以外の階級者も観戦していたということを注意しなければならない労働者階級がラグビーよりもサッカーを好んでいたとされる理由として[[フーリガン]]というあまり好ましくない暴力的なファンの存在が挙げられることもあるただ相次ぐフーリガン絡みの事件や事故を重く見た政府は1980年代にフーリガン規制法を制定しスタジアムの大幅な安全基準の見直しなどを行った各スタジアムの試合運営スタッフがスタジアムの至る所に監視カメラを設置し特定のサポーターフーリガンに対する厳重な監視や入場制限を行っているそのような取り組みの結果スタジアムではそれまで頻発していたフーリガン絡みの事件や事故の件数が大幅に減少した
*2007-2008シーズンにおけるイングランドサッカー入場者数<ref>2008年12月10日付けの日本経済新聞</ref>
**プレミアリーグ 1370万8875人
**[[フットボールリーグチャンピオンシップ|チャンピオンシップ]] 939万7036人
**[[フットボールリーグ1]] 441万2023人
**[[フットボールリーグ2]] 239万6278人
**[[FAカップ]] 201万1320人
**[[フットボールリーグカップ|リーグカップ]] 133万2841人
**[[UEFAチャンピオンズリーグ|CL]] 122万0127人
**UEFAカップ 46万2002人
**総動員数 3494万人

====クリケット====
クリケットは全面芝のフィールドでプレイされ試合中には[[ティー]]タイムもあるその優雅な雰囲気から別名紳士のスポーツといわれるイギリスでは[[上流階級]]がたしなむスポーツとされており[[イートン]]などの名門校の体育ではクリケットは必修種目とされている16世紀にイングランド南部で初めてプレーされた18世紀末までにはイングランドの国民的スポーツへと発展した大英帝国の拡大によってクリケットは海外でプレーされるようになり19世紀中頃までには初の国際試合が開催されたイングランドは[[国際クリケット評議会]]ICCのフルメンバーである[[クリケットワールドカップ]]は[[FIFAワールドカップ]]と[[夏季オリンピック]]に次いで世界で3番目に視聴者数の多いスポーツイベントであり<ref>[https://www.theguardian.com/sport/blog/2015/feb/12/cricket-world-cup-icc-50-overs More money, more viewers and fewer runs in prospect for intriguing World Cup More money, more viewers and fewer runs in prospect for intriguing World Cup] The Guardian 2019年7月15日閲覧。</ref>、自国開催の[[2019 クリケット・ワールドカップ|2019年]]大会では[[クリケットイングランド代表|イングランド代表]]が初優勝した<ref>[https://www.theguardian.com/sport/live/2019/jul/14/new-zealand-v-england-cricket-world-cup-final-2019-live England beat New Zealand in thrilling Cricket World Cup final – as it happened!] The Guardian 2019年7月18日閲覧。</ref>。女子イングランド代表は[[女子クリケット・ワールドカップ|ワールドカップ]]で4度の優勝経験を誇る。ロンドンにある[[ローズ・クリケット・グラウンド]]はクリケットの聖地と呼ばれ、ワールドカップの決勝戦などが催された。国内リーグは[[カウンティ・チャンピオンシップ]]があり、イングランド所在の17クラブ及びウェールズ所在の1クラブ、合計18クラブにより編成される。

====競馬====
{{main|イギリスの競馬}}
近代競馬発祥の地でもある18世紀ゴルフに次いでスポーツ組織として[[ジョッキークラブ]]が組織され同時期に[[サラブレッド]]も成立したどちらかと言えば[[平地競走]]よりも[[障害競走]]の方が盛んな国であり"Favourite 100 Horses"好きな馬100選では[[アークル]]を初め障害馬が上位を独占した障害の[[チェルトナムフェスティバル]]や[[グランドナショナルミーティング]]は1525万人もの観客動員数がある特に最大の競走であるG3[[グランドナショナル]]の売り上げは700億円近くになり2007年現在世界で最も馬券を売り上げる競走になっている平地競走は[[ダービーステークス|イギリスダービー]][[イギリス王室|王室]]開催の[[ロイヤルアスコット開催]]が知られこちらも1425万人の観客を集めるダービーはこの競走を冠した競走が競馬を行っている国には必ずと言っていい程存在しており世界で最も知られた競走といって良いだろうエリザベス女王も競馬ファンとして知られており自身何頭も競走馬を所有している

イギリスでは日本などと違い競馬など特定の競技だけでなく全てのスポーツがギャンブルの対象となるが売り上げはやはり競馬とサッカーが多い競馬は1970年代を頂点に人気を失いつつあったが後に急速に観客動員数が持ち直す傾向にある売上高も2兆円を超え人口当りの売り上げは香港を除けばオーストラリアに次ぐしかし売り上げの多く2003年で97.1%が主催者側と関係のない[[ブックメーカー]]に占められるという構造的な課題があるなおイギリス人はどんな小さな植民地にも大抵の場合は競馬場を建設したため独立後も旧イギリス領は競馬が盛んな国が多いまた[[馬術]]も盛んであり馬術のバドミントンは3日間で15万人以上の観客動員数がある

====モータースポーツ====
イギリスは[[モータースポーツ]]発祥の地としても知られる[[フォーミュラ1]]F1では多数のチャンピオンドライバーを生み出している最近では2009年世界チャンピオンに[[ジェンソンバトン]]そして200820142015201720182019年世界チャンピオンに6度[[ルイスハミルトン]]が輝きあと1回世界チャンピオンになれば[[ミハエルシューマッハ]]のもつ7度の記録と並ぶことになる

過去には[[チームロータス|ロータス]]や[[ティレル]]現在も[[マクラーレン]][[ウィリアムズF1|ウィリアムズ]]といった数多くの名門レーシングチームが本拠を置き車両の設計製造において常に最先端を行く

イベントにも歴史があり1926年に初開催された[[イギリスグランプリ]]は最も古いグランプリレースのひとつである1950年に始まったF1グランプリはイギリスグランプリを第1戦としたまた[[世界ラリー選手権]]の一戦として組み込まれているラリーグレートブリテン1933年初開催も同シリーズの中でもっとも古いイベントの一つである

====野球====
{{main|ナショナルリーグ (イギリスの野球)}}
知名度は低いが1890年に[[ブリティッシュベースボールリーグ]]という野球リーグが誕生している[[IBAFワールドカップ]]の[[ジョンムーアズトロフィー|第1回大会]]ではアメリカ合衆国との二カ国対抗戦という形ではあったが5回戦制のこの大会を4勝1敗で勝ち最初の優勝国となっている2012年{{0}}9月には[[2013 ワールドベースボールクラシック|第3回WBC]]予選に出場している

==== カーリング ====
あまり知られてはいないがイギリスはカーリングの強豪国でもある<ref>[http://www.curling.or.jp/newinfo/newrankings.html 世界ランク男女]」</ref>

==== 自転車競技 ====
国内での人気はサッカーなどには劣るが[[ロードレース (自転車競技)|ロードレース]]や[[トラックレース]]では世界でも[[フランス]][[スペイン]][[イタリア]]と肩を並べる強豪国であるロードレースでは2012年に[[ブラッドリーウィギンス]]が[[ツールフランス2012|ツールフランス]]を英国人として初めて制覇し[[クリスフルーム]]が2013年2015-2017年と同大会で総合優勝しまた2017年には[[ブエルタエスパーニャ2017|ブエルタエスパーニャ]]を2018年には[[ジロイタリア2018|ジロイタリア]]を制覇し[[グランツール]]と呼ばれる世界三大大会を年を跨いで連続制覇した史上3人目の選手となるなど近年目覚ましい活躍を見せているトラックレースでもウィギンスや[[ゲラントトーマス]][[エドクランシー]]らが[[世界選手権自転車競技大会|世界選手権]]や[[オリンピック]]で数々のメダルを獲得している

==脚注==
{{脚注ヘルプ}}
{{Reflist|2}}

==関連項目==
*[[イギリス関係記事の一覧]]

==外部リンク==
{{ウィキポータルリンク|イギリス}}
{{Sisterlinks|commons=United Kingdom|commonscat=United Kingdom|s=Category:イギリス|n=Category:イギリス|voy=United Kingdom}}
;本国政府
*[https://www.royal.uk/ 英国王室(The British Monarchy)] {{en icon}}
**{{Facebook|TheBritishMonarchy|The British Monarchy}} {{en icon}}
**{{Twitter|BritishMonarchy|BritishMonarchy}} {{en icon}}
**{{flickr|photos/britishmonarchy/|The British Monarchy}} {{en icon}}
**{{YouTube|user=TheRoyalChannel|The British Monarchy}} {{en icon}}
*[https://www.gov.uk/ 英国政府(GOV.UK)] {{en icon}}
*[https://www.gov.uk/government/organisations/prime-ministers-office-10-downing-street 英国首相府(Prime Minister's Office, 10 Downing Street)] {{en icon}}
**{{Facebook|10downingstreet|10 Downing Street}} {{en icon}}
**{{Twitter|@Number10gov|UK Prime Minister}} {{en icon}}
**{{Twitter|@Number10press|No.10 Press Office}} {{en icon}}
**{{flickr|photos/number10gov|Number 10}} {{en icon}}
**{{Pinterest|number10gov|UK Prime Minister}} {{en icon}}
**{{YouTube|user=Number10gov|Number10gov|films and features from Downing Street and the British Prime Minister}} {{en icon}}
**{{YouTube|user=DowningSt|Downing Street|archive footage from Downing Street and past British Prime Ministers}} {{en icon}}
*[https://www.gov.uk/government/world/japan.ja UK and Japan (UK and the world - GOV.UK)] {{ja icon}}{{en icon}}
**[https://www.gov.uk/government/world/organisations/british-embassy-tokyo.ja 駐日英国大使館(GOV.UK)] {{ja icon}}{{en icon}}
***{{Facebook|ukinjapan|British Embassy Tokyo}} {{ja icon}}{{en icon}}使用言語は個々の投稿による
***{{Twitter|UKinJapan|BritishEmbassy英国大使館}} {{ja icon}}{{en icon}}使用言語は個々の投稿による
***{{flickr|photos/uk-in-japan|UK in Japan- FCO}} {{en icon}}
***{{YouTube|user=UKinJapan|UKinJapan|British Embassy in Japan}} {{en icon}}
*[https://www.gov.uk/government/organisations/uk-visas-and-immigration UK Visas and Immigration (GOV.UK)] {{en icon}}
**[https://www.vfsglobal.co.uk/ja-jp 英国ビザ申請センター] - VFS Global Japan (上記「UK Visas and Immigration」日本地区取扱代行サイト) {{ja icon}}{{en icon}}
;日本政府内
*[https://www.mofa.go.jp/mofaj/area/uk/ 日本外務省 - 英国] {{ja icon}}
*[https://www.uk.emb-japan.go.jp/ 在英国日本国大使館] {{ja icon}}
;観光
*[https://www.visitbritain.com/jp/ja 英国政府観光庁(日本語版サイト)] {{ja icon}}
**{{Facebook|LoveGreatBritain|Love GREAT Britain}} {{en icon}}
;その他
*[https://www.jetro.go.jp/world/europe/uk/ JETRO - 英国] {{ja icon}}
*{{CIA World Factbook link|uk|United Kingdom}} {{en icon}}
*{{dmoz|Regional/Europe/United_Kingdom}} {{en icon}}
*{{wikiatlas|United Kingdom}} {{en icon}}
*{{Osmrelation|62149}}

{{Normdaten}}
{{イギリス関連の項目}}
{{ヨーロッパ}}
{{国連安全保障理事会理事国}}
{{G8}}
{{OECD}}
{{イギリス連邦}}
{{EU|1973 - 2020年}}
{{CPLP}}
{{デフォルトソート:いきりす}}
[[Category:イギリス|*]]
[[Category:イギリス連邦加盟国]]
[[Category:英連邦王国|*]]
[[Category:G8加盟国]]
[[Category:欧州連合加盟国|元]]
[[Category:海洋国家]]
[[Category:現存する君主国]]
[[Category:島国]]
[[Category:1801年に成立した国家領域]]
21. カテゴリ名を含む行を抽出

記事中でカテゴリ名を宣言している行を抽出せよ.

  • ^はデフォルトでは文字列全体の先頭にのみマッチ
  • 今回はすべての行をチェックしたい
  • MULTILINEオプションで ^ を各行の先頭にマッチさせる
1
2
3
4
5
import re

pattern = r'^(.*\[\[Category:.*\]\].*)$'
result = '\n'.join(re.findall(pattern, text_uk, re.MULTILINE))
print(result)
1
2
3
4
5
6
7
8
9
[[Category:イギリス|*]]
[[Category:イギリス連邦加盟国]]
[[Category:英連邦王国|*]]
[[Category:G8加盟国]]
[[Category:欧州連合加盟国|元]]
[[Category:海洋国家]]
[[Category:現存する君主国]]
[[Category:島国]]
[[Category:1801年に成立した国家・領域]]
22. カテゴリ名の抽出

記事のカテゴリ名を(行単位ではなく名前で)抽出せよ.

  • 一部のカテゴリ名に含まれる「カテゴリ名|記号」の|以降を拾わないようにするしたい。
  • カッコ内の正規表現にマッチはするが拾ってはこない ?:... を使う
1
2
3
pattern = r'^.*\[\[Category:(.*?)(?:\|.*)?\]\].*$'
result = '\n'.join(re.findall(pattern, text_uk, re.MULTILINE))
print(result)
1
2
3
4
5
6
7
8
9
イギリス
イギリス連邦加盟国
英連邦王国
G8加盟国
欧州連合加盟国
海洋国家
現存する君主国
島国
1801年に成立した国家・領域

IT 一般論

  • シンプルなシステムからの成長
  • ハード構成の基礎:CPU・メモリ・HDD、キャッシュ
  • データ構造とアルゴリズム
    • 連結リストと配列:どんな特性があるか?
    • スタックとキュー:いつどこで使うか?どう実装するか?
1
2
3
a[1], a[15]
for a in lst:
    print(a)
そもそもなぜ IT 一般論の話をしだしたか
  • データ構造の話をするため
  • メモリの話をしないとリストと配列(とベクター)の違いが説明できない
    • 一言でいうと、リストと配列はメモリ上にどうデータを置くかが違う
    • データの置き方によってデータアクセスの仕方が変わり、「何が得意か」が変わる
      • リスト:要素の追加・削除に都合がいいが、ランダムアクセスと値の更新処理に弱い
      • 配列:要素の追加・削除は不便だが、ランダムアクセスと値の更新処理に強い
      • ベクター:要素の追加・削除に比較的強く、ランダムアクセスと値の更新処理も強い
    • 単純にベクターだけ使っていればいいわけでもない:メモリ効率という観点
  • メモリ単独の話をしても多分わからない
  • 統計学がらみの話は割とすぐにパフォーマンス(速度)の話になる
    • いわゆるビッグデータというやつで、大量のデータを何回も計算しないといけない
    • 計算を速くしないとやっていられない
    • GPU 使うなり何なり割とすぐにハード面の話が出てくる

シンプルなシステムからの成長

  • 適当な Web システムを考える。
  • 具体的にはショッピングサイトなどをイメージすればいい。
    • 何を考えても大きくは変わらない話をする。
  • サーバー構成やインフラ設計という言葉で調べると色々出てくる
  • サーバー構成の画像:Google 画像検索
大事で面倒な話:「サーバー」とは何か?
  • 何でもいいが、とりあえず一つ参考ページ
  • 物理的なモノとソフトウェア両方ある
  • 1 つの物理的なサーバーの中に複数のソフトウェアとしてのサーバーが入っていることがある
    • 小規模システムならよくある
  • 仮想化・コンテナみたいな話をしだすともっと面倒なことになる
  • 今回も多少は詳細化するが、まずは「一度は聞いたことがある」レベルにするのが目的。
基本構成
  • ソフトウェアとしてのサーバーが 3 つ
  • Web サーバー:Apache・Nginx:単純に HTML を返すサーバー
  • アプリケーションサーバー:いわゆる「アプリケーション」。プログラマーがプログラムを書く部分で、ログインユーザーごとに処理が分かれるとか。最終的に Web サーバーがクライアントに返す HTML の形でデータをまとめる。もちろんここでデータベースのアクセスもある。
  • データベースサーバー:顧客情報や製品情報を持っている。
一番単純
  • 物理サーバーは 1 つ
  • ソフトウェアとしての Web サーバー・アプリケーションサーバー・データベースサーバーが載っている。
  • 開発者が開発するときは実際にこういう状況で開発している(こともある)
状況に応じていろいろ分かれる
  • 例えば実際にシステムにかかる負荷によって変わる
  • データベースの負荷が高い
    • 物理サーバーを追加してデータベースサーバーをそちらに載せ替える。
  • Web のリクエストがさばききれないとき
    • Web サーバーを切り分けた上で 2 台にわける
    • アプリケーションサーバー・データベースサーバーは 1 つの物理サーバーに載せる。
他の状況
  • データベースの読み込み負荷が高い:Memcache や Redis のようなキャッシュサーバーを(物理サーバーごと)追加する。
  • セキュリティが気になってきた:Web サーバーの前にセキュリティ用のファイアーウォール
  • セキュリティが絡むとサーバー構成がまた複雑になる。
    • 上記画像参考
    • 直接外とやり取りするところに外部向けファイアーウォール
    • DMZ の中で外部とやり取りするサーバーが置かれる:いわゆるアプリケーションサーバー
    • アプリケーションサーバーと「内部」がやり取りするところにまたファイアウォールを置く
      • 「内部」というのは顧客データベースなどの社外に公開しないサーバー
      • ファイアウォールを二重に置くことで、絶対に触ってはいけないところに対して二重の防御を敷く
      • 外部公開しているサーバーがクラックされても内部にアクセスできないようにする
      • 内部から危険な情報を外に出せないようにする

ハードウェア構成の基礎

  • CPU、キャッシュ(キャッシュメモリ)、メモリ、HDD・SSD、キーボード・マウスくらいまでの大まかな話
コンピューター構成の5大要素
  • 参考
  • 制御装置:各装置を制御。担当は CPU
    • 人間でいうと脳やせき髄
  • 演算装置:データを処理。担当は CPU
    • 人間でいうと脳
  • 記憶装置:データを保存。担当はメモリ・ハードディスク・SSD
    • 人間でいうと脳(短期記憶)、「机」、「本棚」
    • それぞれの「記憶装置」に意味がある
    • 短期記憶は容量が小さいが高速に計算に回せる
    • 机は本が置けて、データを本棚に取りに行く手間は省ける分だけ速い
    • 本棚は取りに行くのは大変だが、たくさんモノが置ける
  • 入力装置:データを受けつける。担当はキーボード・マウスなど
  • 出力装置:データや処理の結果を外に出す。ディスプレイ・プリンタ等
CPU からキャッシュ
  • 参考の図
  • CPU もコアという概念がある
    • 最近の分散コンピューティングで重要な要素
    • 「コロナの解析のためにあなたのマシンパワーを貸してください」
    • 「ブロックチェーン・ビットコインの計算をさせていた」
  • 参考ページ
    • レジスターやら何やら細かく見ていくといろいろある
複数のキャッシュレベル

「それぞれのキャッシュには役割があるから」

「キャッシュは容量が大きいほどデータ転送速度が遅く、記憶密度が高く、省電力という性質を持つため、必要性に応じて異なる種類のキャッシュを使い分けるのが有利だから」

補足:キャッシュ
  • キャッシュはいろいろなところにある
    • webシステムでのメモリデータベース(メモリキャッシュ)
    • データベースを使うときのデータベースサーバーでのメモリキャッシュ(Redis などのメモリデータベースのキャッシュとはまた違う)
    • ブラウザのキャッシュ:一度読み込んだwebサイトのデータを取っておいて次に読み込むときのロードを速くする
  • ブラウザのキャッシュについては、「ブラウザが重くなった時」などで調べると「キャッシュを削除しよう」みたいな話が出てくる。
    • cf. このページ
      • 「GoogleのWebブラウザ「Chrome(クローム)」が重いときに考えられる原因には、キャッシュや履歴などの問題が考えられます。」

データ構造とアルゴリズム

  • 鶏と卵で、同時に考えるべきテーマ:何かをするためにはどうデータを持ってどんな処理をすれば効率がいいか?
    • 効率にもいろいろある
    • 単純な処理速度・メモリ消費量・計算量
(連結)リストと配列
  • 何が違うのか?
  • メモリ上の配置やデータの「つなぎ方」
  • 状況によって使い分ける
リストの特徴
  • 要素数は変わることが前提
  • データを(先頭に)追加するのは簡単
  • データの削除も比較的簡単
  • 先頭から 1 つずつ順に処理するならそれなり
  • 検索やデータの書き換えが遅い:連結構造をたどる必要がある
配列の特徴
  • 要素数は固定
  • データの追加・削除が重め
  • データの参照・書き換えが速い:アドレスが連続なので先頭さえわかれば「そこから何番先」と直指定できる
  • 「リストで遅ければ配列で書き直す」みたいなことはよくある
ベクター(参考
  • 「要素数可変の配列」
  • リストのように要素追加・削除が比較的低コストで、要素の参照・書き換えも配列のように速い
  • 何が問題か:要素の追加が楽なように余計なメモリ領域を確保する
  • ハードウェア組み込みプログラムのように、メモリがカツカツの状況では使えない
    • 「メモリがカツカツ」という意味が理解できるか?

2020-07-12 課題

メモ:先に進む前に録画してあるか確認しよう

自分用メモ

  • 勉強のおすすめ:AtCoder はどうか?C++の解説もあるし、仕事・評価にも割と直結するし、具体的な問題つきで勉強できる。
    • https://atcoder.jp/contests/apg4b
      • C++のコードをPythonで書き直してみるだけでもかなりの勉強になるはず
    • Python によるアルゴリズム https://qiita.com/cabernet_rock/items/cdd12b07d213b67d0530
  • 遅延型方程式に対するコメント追加
  • matplotlib のチュートリアルを読もうの会
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる

Matplotlib

  • とりあえず本当に簡単な図を描く
  • 今回はシグモイド関数

\begin{align} \sigma(x) = \frac{1}{1 + e^{-x}}. \end{align}

  • ついでなのでこれの TeX も紹介する
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-10, 10, 501)
y = 1 / (1 + np.exp(-x))

plt.plot(x, y, label="sigmoid")

plt.grid()
plt.legend()
#plt.axes().set_aspect('equal', 'datalim') # アスペクト比を合わせる
plt.show()

TeX の記録

  • 凸不等式
  • geq, nabla, langle, rangle

\begin{align} f(y) \geq f(x) + \langle \nabla f(x), \, y-x \rangle. \end{align}

競プロ、AtCoder

ABC087B - Coins

あなたは、500 円玉を A 枚、100 円玉を B 枚、50 円玉を C 枚持っています。 これらの硬貨の中から何枚かを選び、合計金額をちょうど X 円にする方法は何通りありますか。 同じ種類の硬貨どうしは区別できません。2 通りの硬貨の選び方は、ある種類の硬貨についてその硬貨を選ぶ枚数が異なるとき区別されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def solve(A, B, C, X):
    lst = []
    for a in range(A+1):
        for b in range(B+1):
            for c in range(C+1):
                lst.append(500*a+100*b+50*c == X)
    # 下のセルで補足
    return sum(lst) #len(list(filter(lambda x: x == True, lst)))

[A, B, C, X] = [2, 2, 2, 100]
print(solve(A, B, C, X)) # 2

[A, B, C, X] = [30, 40, 50, 6000]
print(solve(A, B, C, X)) # 213
1
2
2
213
注意

ブール値は True = 1False = 0 として足せるらしい。

1
sum([True, False, True, False, False])
1
2
上のコードをリスト内包表記で簡潔に
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#A, B, C, X = [int(input()) for i in range(4)]
def solve(A, B, C, X):
    return sum(500*a+100*b+50*c == X
               for a in range(A+1)
               for b in range(B+1)
               for c in range(C+1))

[A, B, C, X] = [2, 2, 2, 100]
print(solve(A, B, C, X)) # 2

[A, B, C, X] = [30, 40, 50, 6000]
print(solve(A, B, C, X)) # 213
1
2
2
213

ABC083B

1 以上 N 以下の整数のうち、10 進法での各桁の和が A 以上 B 以下であるものの総和を求めてください。

サンプル
  • 20 以下の整数のうち、各桁の和が 2 以上 5 以下なのは 2,3,4,5,11,12,13,14,20 です。これらの合計である 84 を出力します。
1
list(range(1, 20+1))
1
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
1
2
a <= b && b <= c
a <= b <= c
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
def solve(N, A, B):
    lst = []
    for i in range(1, N+1):
        if A <= sum(map(int, str(i))) <= B:
            lst.append(i)
    return sum(lst)

N, A, B = [20, 2, 5]
print(solve(N, A, B)) # 84

N, A, B = [10, 1, 2]
print(solve(N, A, B)) # 13

N, A, B = [100, 4, 16]
print(solve(N, A, B)) # 4554
1
2
3
84
13
4554
わからなければ分解しよう
  • これ、すぐわかる?
1
sum(map(int, str(i)))
  • 数値を文字列に変換
  • 「文字列」を「文字のリスト」とみなして各要素に int を作用させている

  • 文字:char (character)

  • 文字列:string
1
2
3
4
5
6
7
i = 20
map(int, str(i))

lst = []
for a in str(i):
    lst.append(int(a))
print(lst)
1
[2, 0]
1
2
3
4
5
6
7
8
9
i = 20
print(list(str(i)))
print(list(map(int, str(i))))

i = 123
print(list(map(int, str(i))))

i = 3564565
print(list(map(int, str(i))))
1
2
3
4
['2', '0']
[2, 0]
[1, 2, 3]
[3, 5, 6, 4, 5, 6, 5]
1
2
3
4
i = 3564565
l = len(str(i))
int(i / (10**(l-1)))
i % 10**(l-1)
1
564565
リスト内包表記で簡潔に
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def solve(N, A, B):
    return sum(i for i in range(1, N+1) if A <= sum(map(int, str(i))) <= B)

N, A, B = [20, 2, 5]
print(solve(N, A, B)) # 84

N, A, B = [10, 1, 2]
print(solve(N, A, B)) # 13

N, A, B = [100, 4, 16]
print(solve(N, A, B)) # 4554
1
2
3
84
13
4554

IT 一般論

  • シンプルなシステムからの成長
  • ハード構成の基礎:CPU・メモリ・HDD、キャッシュ
  • データ構造とアルゴリズム
    • 連結リストと配列:どんな特性があるか?
    • スタックとキュー:いつどこで使うか?どう実装するか?

前回

  • システムの成長についていろいろ見た
  • ちょっと復習してからハードの構成へ
そもそもなぜ IT 一般論の話をしだしたか
  • データ構造の話をするため
  • メモリの話をしないとリストと配列(とベクター)の違いが説明できない
    • 一言でいうと、リストと配列はメモリ上にどうデータを置くかが違う
    • データの置き方によってデータアクセスの仕方が変わり、「何が得意か」が変わる
      • リスト:要素の追加・削除に都合がいいが、ランダムアクセスと値の更新処理に弱い
      • 配列:要素の追加・削除は不便だが、ランダムアクセスと値の更新処理に強い
      • ベクター:要素の追加・削除に比較的強く、ランダムアクセスと値の更新処理も強い
    • 単純にベクターだけ使っていればいいわけでもない:メモリ効率という観点
  • メモリ単独の話をしても多分わからない
  • 統計学がらみの話は割とすぐにパフォーマンス(速度)の話になる
    • いわゆるビッグデータというやつで、大量のデータを何回も計算しないといけない
    • 計算を速くしないとやっていられない
    • GPU 使うなり何なり割とすぐにハード面の話が出てくる
      • 「メモリを積もう」みたいな話も出てくる
      • 計算速度は直接には CPU の役割だったり

シンプルなシステムからの成長

  • 適当な Web システムを考える。
  • 具体的にはショッピングサイトなどをイメージすればいい。
    • 何を考えても大きくは変わらない話をする。
  • サーバー構成やインフラ設計という言葉で調べると色々出てくる
  • サーバー構成の画像:Google 画像検索
大事で面倒な話:「サーバー」とは何か?
  • 何でもいいが、とりあえず一つ参考ページ
  • 物理的なモノとソフトウェア両方ある
  • 1 つの物理的なサーバーの中に複数のソフトウェアとしてのサーバーが入っていることがある
    • 小規模システムならよくある
  • 仮想化・コンテナみたいな話をしだすともっと面倒なことになる
  • 今回も多少は詳細化するが、まずは「一度は聞いたことがある」レベルにするのが目的。
基本構成
  • ソフトウェアとしてのサーバーが 3 つ
  • Web サーバー:Apache・Nginx:単純に HTML を返すサーバー
  • アプリケーションサーバー:いわゆる「アプリケーション」。プログラマーがプログラムを書く部分で、ログインユーザーごとに処理が分かれるとか。最終的に Web サーバーがクライアントに返す HTML の形でデータをまとめる。もちろんここでデータベースのアクセスもある。
  • データベースサーバー:顧客情報や製品情報を持っている。
一番単純
  • 物理サーバーは 1 つ
  • ソフトウェアとしての Web サーバー・アプリケーションサーバー・データベースサーバーが載っている。
  • 開発者が開発するときは実際にこういう状況で開発している(こともある)
状況に応じていろいろ分かれる
  • 例えば実際にシステムにかかる負荷によって変わる
  • データベースの負荷が高い
    • 物理サーバーを追加してデータベースサーバーをそちらに載せ替える。
  • Web のリクエストがさばききれないとき
    • Web サーバーを切り分けた上で 2 台にわける
    • アプリケーションサーバー・データベースサーバーは 1 つの物理サーバーに載せる。
他の状況
  • データベースの読み込み負荷が高い:Memcache や Redis のようなキャッシュサーバーを(物理サーバーごと)追加する。
  • セキュリティが気になってきた:Web サーバーの前にセキュリティ用のファイアーウォール
  • セキュリティが絡むとサーバー構成がまた複雑になる。
    • 上記画像参考
    • 直接外とやり取りするところに外部向けファイアーウォール
    • DMZ の中で外部とやり取りするサーバーが置かれる:いわゆるアプリケーションサーバー
    • アプリケーションサーバーと「内部」がやり取りするところにまたファイアウォールを置く
      • 「内部」というのは顧客データベースなどの社外に公開しないサーバー
      • ファイアウォールを二重に置くことで、絶対に触ってはいけないところに対して二重の防御を敷く
      • 外部公開しているサーバーがクラックされても内部にアクセスできないようにする
      • 内部から危険な情報を外に出せないようにする

ハードウェア構成の基礎

  • CPU、キャッシュ(キャッシュメモリ)、メモリ、HDD・SSD、キーボード・マウスくらいまでの大まかな話
コンピューター構成の5大要素
  • 参考
  • 制御装置:命令の実行・周辺装置の制御。担当は CPU
    • 人間でいうと脳やせき髄
  • 演算装置:データを処理。担当は CPU
    • 人間でいうと脳
  • 記憶装置:データを保存。担当はメモリ・ハードディスク・SSD
    • 人間でいうと脳(短期記憶)、「机」、「本棚」
    • それぞれの「記憶装置」に意味がある
    • 短期記憶は容量が小さいが高速に計算に回せる
    • 机は本が置ける
      • 本棚に取りに行く手間が省ける分だけデータを取り出すのは速い
      • もちろん脳内短期記憶から取り出すよりは遅い
      • 本を置ける量は本棚より少ない
    • 本棚はたくさん本が置ける
      • データを本棚まで取りに行くのは大変(時間がかかる)
      • たくさんモノが置ける
  • 入力装置:データを受けつける。担当はキーボード・マウスなど
  • 出力装置:データや処理の結果を外に出す。ディスプレイ・プリンタ等
CPU からキャッシュ

補足コメント
  • CPU にはコアという概念がある
    • 「CPU がクアッドコア」とか何とかいうときの「コア」
    • 最近の分散コンピューティングで重要な要素
      • 他人の CPU を借りることもよくある
      • 「コロナの解析のためにあなたのマシンパワーを貸してください」
      • 「ブロックチェーン・ビットコインの計算をさせていた」
  • 各コアが計算の単位:コアがたくさんあると並列に計算させられて、処理速度が上がる(類の処理もある)
    • コアがたくさんある CPU を使うと個人のコンピューターレベルでもある程度並列処理できる
    • 構成はいろいろあるが「スパコン」でも適当な意味で CPU をたくさん並べて使っている
      • 1 つ 1 つのスペックが高いコンピューターをたくさん並べる
      • 1 つ 1 つのスペックは大したことがないかもしれないが、冗談のようなコンピューター数・並列数で性能を出す
      • Google などではトラックに「PC」レベルのコンピューターを大量に積み込み、それで並列計算させていることもあるらしい
        • しばらく使っていると各トラックごとにどんどんマシンが壊れていく
        • いくつ以上のマシンが壊れたらトラックに積んであるマシンをすべて廃棄して全取り換えする、みたいな話を見たことがある
        • どれが故障しているかをいちいち調べるよりも一定の稼働率から下がったら全部つぶす方が「コスパが高い」
        • トヨタなどで「不良品のねじが入ったらその箱は全部捨てる」みたいなエピソードを聞くが、まさにそういう感じ
        • スケールによってコスパの概念自体が大きく変わるのも大事な認識
  • コアに対してキャッシュがある
    • 距離が近い順に L1, L2, L3
      • キャッシュの容量が大きくなっていく順
      • 速度は落ちていく
    • キャッシュの後ろにいわゆるメモリがある
  • 参考ページ
    • レジスターやら何やら細かく見ていくといろいろある
    • 大事なこと
      • 何はともあれ、現実的にそういう風にできている
      • 必要だからそうなっている:少なくとも何かしら、歴史的な理由はある
複数のキャッシュレベル
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
Latency Comparison Numbers
--------------------------
L1 cache reference                           0.5 ns
Branch mispredict                            5   ns
L2 cache reference                           7   ns                      14x L1 cache
Mutex lock/unlock                           25   ns
Main memory reference                      100   ns                      20x L2 cache, 200x L1 cache
Compress 1K bytes with Zippy            10,000   ns       10 us
Send 1 KB bytes over 1 Gbps network     10,000   ns       10 us
Read 4 KB randomly from SSD*           150,000   ns      150 us          ~1GB/sec SSD
Read 1 MB sequentially from memory     250,000   ns      250 us
Round trip within same datacenter      500,000   ns      500 us
Read 1 MB sequentially from SSD*     1,000,000   ns    1,000 us    1 ms  ~1GB/sec SSD, 4X memory
Disk seek                           10,000,000   ns   10,000 us   10 ms  20x datacenter roundtrip
Read 1 MB sequentially from 1 Gbps  10,000,000   ns   10,000 us   10 ms  40x memory, 10X SSD
Read 1 MB sequentially from disk    30,000,000   ns   30,000 us   30 ms 120x memory, 30X SSD
Send packet CA->Netherlands->CA    150,000,000   ns  150,000 us  150 ms
追加説明

「それぞれのキャッシュには役割があるから」

「キャッシュは容量が大きいほどデータ転送速度が遅く、記憶密度が高く、省電力という性質を持つため、必要性に応じて異なる種類のキャッシュを使い分けるのが有利だから」

  • 省電力の意義:単純にエコなだけではない
    • 省電力だと熱も出にくい
    • 熱が高くなると熱暴走が起こりうる:逆に計算効率が悪くなる
    • マシンを物理的に傷つけにくくので故障もしにくくなる
補足:いろいろなキャッシュ
  • キャッシュはいろいろなところにある
    • ブラウザのキャッシュ:一度読み込んだwebサイトのデータを取っておいて次に読み込むときのロードを速くする
      • サイトのロゴなどの画像はそうそう変わらないうえ、画像ファイルは重い(容量が大きい)のでダウンロードにも時間がかかる
        • それだけ保管しておく意義がある
      • 「自分だけサイトが更新されない?」みたいなことがあったら、それはキャッシュを見ている可能性がある
    • webシステムでのメモリデータベース(メモリキャッシュ)
    • データベースを使うときのデータベースサーバーでのメモリキャッシュ(Redis などのメモリデータベースのキャッシュとはまた違う)
  • ブラウザのキャッシュについては、「ブラウザが重くなった時」などで調べると「キャッシュを削除しよう」みたいな話が出てくる。
    • cf. このページ
      • 「GoogleのWebブラウザ「Chrome(クローム)」が重いときに考えられる原因には、キャッシュや履歴などの問題が考えられます。」
  • ここでコメントしたタイプの「キャッシュ」は日々の PC 利用を快適にする上でも大事
    • 快適にする上での情報収集やその意味を理解する上で大事というべきか
補足その 2:「キャッシュ」があるとなぜ重くなる?
  • ブラウザの話
  • キャッシュが大量にあると必要なキャッシュを探す手間が出てくる
  • 数十くらいの中ならまだしも、数百・数千・数万から探すとなると探すだけで時間がかかる
  • ブラウザを長いこと使っていると、実際にキャッシュがそのくらいに膨れてくる
  • 削除して余計な検索処理(計算)がなくなれば、かえって早くなる
  • こういうところで「検索」「探索」問題が出てくる
    • Google が出てきたのもある意味でこういう文脈
    • 検索はデータ構造・アルゴリズムの中でも一番基本的なテーマ
補足
  • 世の勉強系基本コンテンツの主流はたいてい次の 2 つ
    • 論理的完全性
    • 網羅性
  • 前者の基本コンテンツとその内容は大事だが、構造的に全体像・そこから広がる世界の広がりが見えにくい
  • もちろん各種テーマ特化型のコンテンツやオムニバス型のコンテンツもある
  • 状況に合わせて適切なコンテンツを組み合わせて勉強するべき
  • 複数の本をあえて並行して勉強する意義・意味もある

データ構造とアルゴリズム

  • 鶏と卵で、同時に考えるべきテーマ:何かをするためにはどンな風にデータを持ってどんな処理をすれば効率がいいか?
    • 効率にもいろいろな観点がある
    • 単純な処理速度・メモリ消費量・計算量
  • 「データの持ち方」「データ構造」に関して軽く
    • 本棚をどう整理するか?
      • 本の名前順
      • 分野を分けたうえで名前順
      • 手元に置くのはよく読む本、近い本棚には比較的読む本を分野ごとに名前順、あまり読まない本は押し入れに適当に詰め込む
      • 図書館のような大規模なところでは「閉架」という概念がある
    • 目的に応じて適切な本の置き方は変わる
      • 蔵書の数や質でも変わる
      • 図書館なのか本屋なのか
        • 本屋だと平積み・面陳列といった概念もある
        • 図書館情報学という分野さえある
    • どんなデータ構造がいいかはその時々で変わる
(連結)リストと配列
  • 何が違うのか?
  • メモリ上のデータの配置やデータの「つなぎ方」
    • メモ:zoom の機能で両方の図を描こう
  • 状況によって使い分ける
リストの特徴
  • 要素数は変わることが前提
  • データを(先頭に)追加するのは簡単
  • データの削除も比較的簡単
  • 先頭から 1 つずつ順に処理するならそれなり
  • 検索やデータの書き換えが遅い:連結構造をたどる必要がある
配列の特徴
  • 要素数は固定
  • データの追加・削除が重め
    • 気分的にはその都度メモリ領域を確保しなおす必要がある:特に追加
  • データの参照・書き換えが速い:アドレスが連続なので先頭さえわかれば「そこから何番先」と直指定できる
  • 処理によっては「リストで遅ければ配列で書き直す」みたいなことはよくある
ベクター(参考
  • 「要素数可変の配列」
  • リストのように要素追加・削除が比較的低コストで、要素の参照・書き換えも配列のように速い
  • 何が問題か:要素の追加が楽なように余計なメモリ領域を確保する
  • ハードウェア組み込みプログラムのように、メモリがカツカツの状況では使えない
    • 「メモリがカツカツ」という意味が理解できるか?

シーケンシャルアクセス

  • レイテンシーのところでも出てきた
  • 配列でもリストでも、「先頭から順番になめていく」こと
参考:HDD でのシーケンシャルアクセス・断片化・ディスクデフラグ

デフラグとは、デフラグメンテーション(defragmentation)の略です。PCはハードディスクに読み書きを行っていますが、何度も繰り返すうちに連続した広い領域が確保できなくなり、狭い複数の領域に分散して書き込むようになります。データが分散している状態を「断片化」といい、断片化しているとファイルを読み込むのが遅くなり、PC速度が低下します。

断片化したデータを連続した状態に整理することをデフラグといいます。デフラグを定期的に行うことで、読み込み、書き込みが速くなるだけではなく、PC起動が早くなったり、ハードディスクの残り空き容量が増える、というメリットがあります。

なぜ遅くなるのか
  • ディスク上でデータ断片化すると何が問題か?
  • 例:動画が見たい
    • 動画用のファイルが HDD 上でいろいろなところに散らばっている
    • ある個所からある個所に行くとき、断片化していると、HDD の読み取りの針を物理的に移動させないといけない
    • この時間が長い:処理が重くなる原因
    • 気分的には「連結リスト」
  • こうした話題は何だかんだで普段の PC ライフにも絡んでくる
    • 最近は OS を入れる部分は SSD、データを大量に入れる部分は HDD という構成がよくある
    • SSD はまだ高いので HDD は死んでいない
補足:なぜ空き容量が増えるのか

HDDにデータを書き込む時、データはセクタという最小単位(主に512バイトまたは4,096バイト)に切り分けられ、プラッタの同心円状に作られているトラックと呼ばれる領域に保管されます。

  • データ書き込みには最小単位がある
  • 断片化して「最小単位」未満のデータで書きこまれてしまっていると、その分容量が無駄になる。
  • デフラグするとこの無駄が解放される
  • 「配列では一括でズドンとメモリ領域を取る」という「ズドンと取った」状態はこんな感じ。
    • 他に触らせない・触らせられないのでこの手の無駄ができる
    • ベクターで無駄が出るといったのはこういう状況

2020-07-19 課題

メモ:先に進む前に録画してあるか確認しよう

自分用メモ

  • 勉強のおすすめ:AtCoder はどうか?C++の解説もあるし、仕事・評価にも割と直結するし、具体的な問題つきで勉強できる。
    • https://atcoder.jp/contests/apg4b
      • C++のコードをPythonで書き直してみるだけでもかなりの勉強になるはず
    • Python によるアルゴリズム https://qiita.com/cabernet_rock/items/cdd12b07d213b67d0530
  • 遅延型方程式に対するコメント追加
  • matplotlib のチュートリアルを読もうの会
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる

Matplotlib

  • とりあえず本当に簡単な図を描く
  • 今回は減衰振動

\begin{align} x(t) = e^{-\gamma t} \sin \omega t. \end{align}

  • ついでなのでこれの TeX も紹介する

```python import numpy as np import matplotlib.pyplot as plt

x = np.linspace(0, 10, 501) y = np.exp(-x) * np.sin(5*x)

plt.plot(x, y, label="dump wave")

plt.grid() plt.legend() #plt.axes().set_aspect('equal', 'datalim') # アスペクト比を合わせる plt.show() ```

TeX の記録

  • 熱核
  • まず名前が格好いい

\begin{align} k(x,y,t) = t^{N - \frac{m}{2}} e^{-\frac{d^2(x,y)}{4t}} \mathcal{K}(x,y,t). \end{align}

競プロ、AtCoder

ABC088B - Card Game for Two

$N$枚のカードがあります. $i$ 枚目のカードには, $a_i$ という数が書かれています. Alice と Bob は, これらのカードを使ってゲームを行います. ゲームでは, Alice と Bob が交互に 1 枚ずつカードを取っていきます. Alice が先にカードを取ります. 2 人がすべてのカードを取ったときゲームは終了し, 取ったカードの数の合計がその人の得点になります. 2 人とも自分の得点を最大化するように最適な戦略を取った時, Alice は Bob より何点多く取るか求めてください.

2 3 1

最初, Alice は 3 が書かれたカードを取ります. 次に, Bob は 1 が書かれたカードを取ります. 得点差は 3 - 1 = 2 となります.

説明
  • 逆順(大きい順、sorted(lst, reverse=True)に並べる
  • 最初からお互いに取っていく
  • これで最適戦略になる
  • 相互の得点をどう計算するかも重要

```python #N = int(input()) #a = sorted(map(int, input().split()))[::-1] def solve(lst): a = sorted(lst, reverse=True) print(a) return sum(a[::2]) - sum(a[1::2])

lst = [3, 1] print(solve(lst)) # 2

lst = [2, 7, 4] print(solve(lst)) # 5

lst = [20, 18, 2, 18] # 18 print(solve(lst)) ```

1
2
3
4
5
6
  [3, 1]
  2
  [7, 4, 2]
  5
  [20, 18, 18, 2]
  18

ABC085B - Kagami Mochi

  • いわゆるハノイの塔:ただし同じ半径の円盤が複数枚ある

$X$ 段重ねの鏡餅 ($X \geq 1$) とは、$X$ 枚の円形の餅を縦に積み重ねたものであって、どの餅もその真下の餅より直径が小さい(一番下の餅を除く)もののことです。例えば、直径 10、8、6 センチメートルの餅をこの順に下から積み重ねると 3 段重ねの鏡餅になり、餅を一枚だけ置くと 1 段重ねの鏡餅になります。 ダックスフンドのルンルンは $N$ 枚の円形の餅を持っていて、そのうち $i$ 枚目の餅の直径は $d_i$ センチメートルです。これらの餅のうち一部または全部を使って鏡餅を作るとき、最大で何段重ねの鏡餅を作ることができるでしょうか。

解法
  • 重複をなくせば勝手に順序がつく
  • 餅の積み方や積む順序を聞かれているわけではない
  • 最大数しか聞かれていない
  • 余計な計算をしないことも重要:高速化
仮定
  • めんどいので実際の入力例とは違う入力を想定する。
  • 縦に並んだ数を最初からリストにする
  • 実際には次のように入力を取る必要がある

python N = int(input()) d = [input() for i in range(N)]

  • これを次のように入力を取る

python d = [1,2,3]

```python def solve(lst): return len(set(lst)) # set で重複をつぶす

lst = [10, 8, 8, 6] print(solve(lst)) # 3

lst = [15, 15, 15] print(solve(lst)) # 1

lst = [50, 30, 50, 100, 50, 80, 30] print(solve(lst)) # 4 ```

1
2
3
  3
  1
  4

IT 基礎知識

  • SSD の話:記憶の仕方、書き込み耐性
  • HDD の最小単位

SSD の話

参考記事:SSDの寿命はどれくらい?SSDの寿命に関する情報(SSDの特徴・データ記憶媒体比較・故障予兆・故障症状・寿命延ばす対策)
  • HDDと比べてSSDは読み書き速度が速い
  • 使用環境によっては寿命が短くなってしまう
寿命
  • SSDの寿命を決める要素は3つ
    • 書き込み回数、空き容量、そして使用時間
  • SSD:基本的には半導体
    • NAND型フラッシュメモリ
      • メモリーカードやスマートフォンの記憶媒体と同じタイプのメモリ
    • 参考:HDD は磁気ディスク
  • データの上書きができない
    • 「データの空き容量に新しいデータを書き込み、前のデータを消去する」
    • これがSSDの寿命に大きく影響
  • SSDは書き込み回数が増えると、次第に劣化
    • ゴリゴリの物理の話なので省略:結論だけ受け入れる
  • 書き込み可能回数はデータの保持形式にも依存
    • TLC:低価格大容量SSDの場合
      • 1セルあたりの書き込み可能回数は1千回
      • TLC:Triple、1つのセルに電子3つ
        • 単電子制御というのは尋常ではない
    • 参考:SLC(シングルレベルセル、Single Level Cell)
      • 最も耐久性が高い
      • 1セルに電子が1つ:セルの中の電子の有無で01が記録
      • 1セルに1ビットしか記録できない:データ容量は少ない→高価
        • 10万回程度の書き込みに耐え、信頼性と速度は高くなる
  • 長い間使っていても SSD は劣化
SSD・HDD・eMMC
  • SSD(ソリッドステートドライブ)
    • NAND型メモリにデータを記録
    • 高速で読み書きできる、広く使われているフラッシュメモリ
    • 近年大容量化と低価格化
  • HDD(ハードディスクドライブ)
    • プラッタと呼ばれる円盤型の磁気記憶媒体に磁気ヘッドでデータを書き込み・読み出し
    • 構造上SSDに比べるとデータの読み書き速度が低速
    • 物理的に複雑な構造
      • SSDやeMMCにて比べて大型で重く、電源消費量が多い
      • 衝撃に弱い:物理的に針を使っているため
    • 大容量のデータを保持するのが得意で安価
      • 速度にあまり影響されない画像や動画のバックアップ用
  • eMMC(embedded Multi Media Card)
    • SSDと同様:フラッシュメモリを使用した記憶ストレージ
    • SSDと比較すると読み書きの速度は劣る
    • 消費電力は3つの記憶媒体の中で一番低い
    • SSDよりもさらに小型
    • スマートフォンやタブレットなどモバイル端末用
    • UMPC などにも詰まれている
SSDの寿命が近いときの症状とその対策
  • SSDの寿命が近づいてくるといくつかの予兆がパソコンに現れる
    • 処理速度が低下する
    • 作業時にフリーズする
    • SSDドライブが認識されない
    • エラーメッセージが表示される
    • ブルースクリーン画面(※)が表示される
  • 個人メモ:デスクトップでよくブルースクリーンが出るようになった。画面にはメモリエラーと出ていたが、SSD がまずいかもしれない。

HDD の書き込み最小単位

  • もともとの問題意識:なぜ最小単位があるのか?
セクタの話
  • 参考記事
  • セクタとは、ディスクに記録する最小記録単位の事です。
  • 512 セクタと 4K セクタ
  • 4K セクタのメリット:OSで扱える容量が格段に増える
    • 今までの【WindowsXP】では、512セクタのハードディスクの場合、2TBまでしか認識できない
    • 4Kセクタ対応ハードディスクを使うと大容量ハードディスクを認識できる
  • 2TBバイトまでの認識問題
    • 参考
    • 2TBの壁:OSやマザーボードの仕様で壁を超える容量の製品を使えない
      • 使えても壁を超える部分は認識しない
    • 詳細
      • MBRが管理できるセクタ数が4,294,967,296(約43億)
        • MBR:Master Boot Record
        • ハードディスクなどのストレージ(外部記憶装置)の最も先頭にある、起動に必要なプログラムや情報を記録した小さな領域。コンピュータの起動時に最初に読み込まれる。
      • 1セクタが512バイト 管理可能な容量は4,294,967,296 × 512 = 2,199,023,255,552(約2兆2000億)バイト
        • これが2TB
セクターとクラスター
  • クラスタとは
    • HDDなどのドライブにデータを記録して管理する際に使う最小の単位
  • 「クラスタ」より小さい「セクタ」という単位がある
    • クラスタは複数のセクタで作られる
  • HDD上ではセクター単位ではなくクラスター単位でデータを管理
  • なぜセクタではなくクラスタ単位でデータを管理するのか?
    • HDDの容量が以前に比べて大きくなったため
    • セクタのような小さな単位で読み書きをすると、時間がかかる
    • 効率悪化
    • 「1 ファイル」自体の容量も大きくなっている
    • クラスタで処理しても問題は小さいはず
  • クラスタのサイズは HDD 容量によって変わる
    • 同容量の HDD を使ってもクラスタのサイズが小さい方がデータを効率的に管理できる
    • HDD 内のデータの管理を行うファイルシステムがFATやNTFS
    • 大昔「ファイルをフォーマットします。Macなどでは使えなくなります」とか出てきた理由がこれ:ファイルシステムが違う形でフォーマットするから
    • 参考:実は危険??「exFATフォーマット」との付き合い方

2020-07-26 課題

メモ:先に進む前に録画してあるか確認しよう

自分用メモ

  • 勉強のおすすめ:AtCoder はどうか?C++の解説もあるし、仕事・評価にも割と直結するし、具体的な問題つきで勉強できる。
    • https://atcoder.jp/contests/apg4b
      • C++のコードをPythonで書き直してみるだけでもかなりの勉強になるはず
    • Python によるアルゴリズム https://qiita.com/cabernet_rock/items/cdd12b07d213b67d0530
  • 遅延型方程式に対するコメント追加
  • matplotlib のチュートリアルを読もうの会
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる

Matplotlib

  • とりあえず本当に簡単な図を描く
  • 今回は有限フーリエ級数

\begin{align} f(x) = \frac{4}{\pi} \left( \sin x + \frac{1}{3} \sin 3 x + \frac{1}{5} \sin 5 x + \cdots \right) \end{align}

  • ついでなのでこれの TeX も紹介する

```python import numpy as np import matplotlib.pyplot as plt

x = np.linspace(-3, 3, 1001) y = (4 / np.pi) * (np.sin(x) + np.sin(3x) / 3 + np.sin(5x) / 5 + np.sin(7x) / 7 + np.sin(9x) / 9) y1 = np.ones(len(x)) y2 = -1 * np.ones(len(x))

plt.plot(x, y, label="finite fourier") plt.plot(x, y1, label="y=1") plt.plot(x, y2, label="y=-1")

plt.grid() plt.legend() #plt.axes().set_aspect('equal', 'datalim') # アスペクト比を合わせる plt.show() ```

TeX の記録

  • コンパクト多様体上のラプラシアンの固有値の漸近評価

\begin{align} \lambda_k = 4 \pi \left(\frac{\Gamma (\frac{m}{2} + 1)}{\binom{m}{p} \mathrm{vol}(M)} \right) k^{m/2} + o (k^{m/2}). \end{align}

競プロ、AtCoder

ABC085C - Otoshidama

日本でよく使われる紙幣は、10000 円札、5000 円札、1000 円札です。以下、「お札」とはこれらのみを指します。 青橋くんが言うには、彼が祖父から受け取ったお年玉袋にはお札が $N$ 枚入っていて、合計で $Y$ 円だったそうですが、嘘かもしれません。このような状況がありうるか判定し、ありうる場合はお年玉袋の中身の候補を一つ見つけてください。なお、彼の祖父は十分裕福であり、お年玉袋は十分大きかったものとします。

N 枚のお札の合計金額が Y 円となることがありえない場合は、-1 -1 -1 と出力せよ。 N 枚のお札の合計金額が Y 円となることがありうる場合は、そのような N 枚のお札の組み合わせの一例を「 10000 円札 x 枚、5000 円札 y 枚、1000 円札 z 枚」として、x、y、z を空白で区切って出力せよ。複数の可能性が考えられるときは、そのうちどれを出力してもよい。

入力・出力例 1

# 入力 9 45000 # 出力 4 0 5 お年玉袋に 10000 円札 4 枚と 1000 円札 5 枚が入っていれば、合計枚数が 9 枚、合計金額が 45000 円になります。 5000 円札 9 枚という可能性も考えられるため、0 9 0 も正しい出力です。

入出力例 2

不適格な場合の出力チェックにあたる。

# 入力 20 196000 # 出力 -1 -1 -1

合計枚数が 20 枚の場合、すべてが 10000 円札であれば合計金額は 200000 円になり、そうでなければ 195000 円以下になるため、196000 円という合計金額はありえません。

入出力例 4

変なアルゴリズムを組むと指定計算時間内に終わらない。

# 入力 2000 20000000 # 出力例 2000 0 0

基本方針
  • 全探索をするしかないが一ひねりして計算量(ループの数)を減らす
  • 合計 $Y$ 円が嘘かどうかであり、「何枚以下だったかもしれない」みたいな条件は付いていない

```python # N, Y = map(int, input().split()) def solve(N, Y): for x in range(N+1): for y in range(N-x+1): z = N-x-y # z のループはせずにこれで固定 if 0 <= z <= 2000 and 10000x+5000y+1000*z == Y: return "%s %s %s" % (x, y, z) exit() # ヒットしたので処理終了 # ここまで来たら不適格だったと判断 return "-1 -1 -1"

print(solve(9, 45000)) # 4 0 5 print(solve(20, 196000)) # -1 -1 -1 print(solve(1000, 1234000)) # 14 27 959 他にもありうるはず print(solve(2000, 20000000)) # 2000 0 0 ```

1
2
3
4
  0 9 0
  -1 -1 -1
  2 54 944
  2000 0 0

ABC049C - 白昼夢

英小文字からなる文字列 $S$ が与えられます。 $T$ が空文字列である状態から始め、以下の操作を好きな回数繰り返すことで $S=T$ とすることができるか判定してください。

$T$ の末尾に dream dreamer erase eraser のいずれかを追加する。

# 入力例 1 erasedream # 出力例 1 YES erase dream の順で T の末尾に追加することで S = T とすることができます。

# 入力例 2 dreameraser # 出力例 2 YES

# 入力例 3 dreamerer # 出力例 3 NO

```python import re #S = input() def solve(S): # 正規表現を使って特定 4 文字列の繰り返しだけかどうかを判定する return "YES" if re.match("^(dream|dreamer|erase|eraser)+$", S) else "NO"

print(solve("erasedream")) # YES print(solve("dreameraser")) # YES print(solve("dreamerer")) # NO ```

1
2
3
  YES
  YES
  NO
メモ
  • 正規表現マッチの速度:そんなに速いか?
    • 正規表現自体をいろいろ調べないといけない
    • ケースバイケースでの実測
  • 公式の解説:後ろから文字列マッチしていく

文字列 S を dream, dreamer, erase, eraser に分解していくことを考えます。先頭から分解していこうとす ると、例えば dreamer まで読んだとき、dream で切るべきなのか、dreamer で切るべきなのか判定するこ とができません。(dreameraser は dream eraser と切らなければならないので、dreamer まで読んだときに dream で切らなければいけない場合が存在することが分かります) 逆に、後ろから読んでみましょう。4 つの単語を後ろから読むと、それぞれ maerd, remaerd, esare, resare となります。この 4 つの文字列は、ある文字列が他の文字列の接頭辞 (prefix) になっていないため、後ろか ら読んで当てはまるものが見つかれば即座に分解するしかありません。(参考: 語頭符号) S を最終的に分解す ることができなかった場合 NO を、そうでない場合 YES を出力します。

  • 後ろからのマッチ:今の場合の文字列設定だからできることではある
    • むしろ問題ごとにその勘所を見抜いて問題ごとに適切な手法を見つけて実装する

IT 基礎知識

  • 東大の AWS クラウド講義資料を眺めてみてください。せっかくなので状況を見て(私の勉強も兼ねて)「勉強会前半パート」で取り上げようと思います。
    • これはこれで眺めると大事な用語・概念・操作などがわかる
    • ハードル高そうなのでとりあえず保留
  • 応用情報技術者試験の本を使って浅く広く眺めてみる
    • 根本的にそういう試験
    • 横のつながりを見つつ浅く広く知る

7 章 ネットワーク

  • OSI基本参照モデル、TCP/IP、MACアドレスあたりの話と他のところの関係
  • OSI 基本参照モデル
    • 上の方が「アプリケーション」
    • 下の方はハードウェア
  • 例えばセキュリティの話をしているとポンと出てくる
    • 「下の方(ハードウェア)」レベルでやった方が処理が速いが、複雑なことはできない
      • 高負荷のシステムで手早く最低限の前処理だけしたい場合に有効
      • 複雑なことをしない(できない)からこそ速い
    • 「上の方(ソフトウェア)」レベルでやると処理は遅いが、複雑な処理ができる
      • システムに多少負荷をかけてもいいから、セキュリティを高めたい
      • 複雑な処理・計算が必要なのでその分時間がかかる
OSI参照モデルとは|ファイアウォールの種類をわかりやすく解説
  • レイヤー1:物理層 階層の1段階目は「物理層」です。ハードウェアに最も近い部分であり、電気信号やアナログ信号などによる通信を行っています。主にLANケーブルなどの回線を使って通信を行っています。カプセル化されたデータの単位は「ビット」です。
  • レイヤー2:データリンク層 階層の2段階目は「データリンク層」です。同一ネットワーク上での通信を行う階層で、直接的に接続された通信のための規定です。この通信規定により、LANやWANの間の通信を実現できます。カプセル化されたデータの単位は「フレーム」です。
  • レイヤー3:ネットワーク層 インターネットでの通信を実現するものが、第3階層である「ネットワーク層」です。この階層ではネットワーク間の通信に関する取り決めが行われています。主にIPアドレスが使われ、ルータによって通信が管理されている階層です。カプセル化されたデータの単位は「パケット」であり、この階層からファイアウォールで通信を制御しています。
    • 遥か昔、「ケータイ」のころのパケット通信料は名前が同じだけで本質的には関係ない模様
セキュリティ
  • パケットフィルタリング:レイヤー3・4で動作 パケットフィルタリング型のファイアウォールは「ネットワーク層」「トランスポート層」で動作します。
    • レイヤー3の情報である「送信元IPアドレス」「宛先IPアドレス」をもとに判断することが可能です。このタイプのファイアウォールは構成がシンプルで、ほかの種類よりも処理が速いという特徴があります。
    • しかし、安全性はほかの種類よりも低く、フィルタリングの設定が煩雑になることがデメリットです。
  • サーキットゲートウェイ:レイヤー5で動作 セッション層で動作するファイアウォールが「サーキットゲートウェイ型」という種類です。
    • 先程のパケットフィルタリングの動作に加え、ポート指定や制御ができます。使用するアプリケーションごとに細かく通信の制御を設定することが可能です。
  • アプリケーションレベルゲートウェイ:レイヤー5・6・7で動作
    • 比較的新しいタイプのファイアウォールが「アプリケーションレベルゲートウェイ」です。
    • 主にレイヤー5から7までで動作を行い、アプリケーションレベルのデータをもとに通信を判断します。細かい単位で通信を判断するため、高度な識別が可能です。従来のファイアウォールよりも通信速度が少し落ちますが、なりすましなどの対策ができます。
もう 1 つ参考:ネットワーク各レイヤーのセキュリティを強化するには
  • トランスポートモード:パケットのペイロードだけを暗号化し、それにIPヘッダを付けて開いて送信する。
  • トンネルモード:IPヘッダを含めて暗号化されるため、ネットワーク間の安全な接続に用いられる。

  • 「SSL」「TLS」「SSH」といった第4層の通信プロトコルを使用すると、データを暗号化することによって傍受などから守ることが可能になる(「SSL」は「セキュア・ソケッツ・レイヤー」、「TLS」は「トランスポート・レイヤー・セキュリティ」、「SSH」は「セキュア・シェル」の略)。特に機器をリモートで管理するためにネットワーク接続を行う際に十分考慮に入れるべきものである。

  • SSL:https の s
  • SSH:Linux サーバーにログインするときによく使う。東大のクラウド講義資料でも「SSH で云々」というのがよく出てくる
  • こういう感じで横断的にいろいろ出てくる

2020-08-01 課題

メモ:先に進む前に録画してあるか確認しよう

自分用メモ

  • 遅延型方程式に対するコメント追加
  • matplotlib のチュートリアルを読もうの会
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる

Matplotlib

  • とりあえず本当に簡単な図を描く
  • 適当なランダムグラフ

```python import numpy as np import matplotlib.pyplot as plt

y = np.random.rand(100) x = np.linspace(1, 5, 101)

plt.plot(x, y,label="random data") plt.xlabel("time series") plt.ylabel("power") plt.title("sample graph")

plt.grid() plt.legend() #plt.axes().set_aspect('equal', 'datalim') # アスペクト比を合わせる plt.show() ```

TeX の記録

  • 運動方程式

\begin{align} \dot{p} &= F, \ \frac{dp}{dt} &= F, \ m\ddot{x} &= F, \ m \frac{d^2 x}{dt^2} &= F. \end{align}

競プロ、AtCoder

素数判定A - 素数、コンテスト、素数

ARC N に出場できるとき、すなわち N が素数のときは YES、そうでないときは NO と一行に出力せよ。

  • 要は素数判定
  • $N$ が素数かどうかを判定するには $\sqrt{N}$ 以下の数までチェックすればいい:素直に $N$ まで見ると大変なことになる。
ルートに対するオーダーの感覚
  • 具体的に大きな数でどう振る舞うか見てみよう

python import math lst = [1, 10**3, 10**8, 10**15, 10**30, 10**50] for n in lst: print(f"n = {n}") print(f"sqrt n = {math.ceil(math.sqrt(n))}") print("==============")

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
  n      = 1
  sqrt n = 1
  ==============
  n      = 1000
  sqrt n = 32
  ==============
  n      = 100000000
  sqrt n = 10000
  ==============
  n      = 1000000000000000
  sqrt n = 31622777
  ==============
  n      = 1000000000000000000000000000000
  sqrt n = 1000000000000000
  ==============
  n      = 100000000000000000000000000000000000000000000000000
  sqrt n = 10000000000000000905969664
  ==============
問題の解法

```python import math

def is_prime(n): if n == 1: return False for k in range(2, int(math.sqrt(n)) + 1): if n % k == 0: return False return True

def solve(n): return "YES" if is_prime(n) else "NO"

print(solve(17)) # YES print(solve(18)) # NO print(solve(999983)) # YES print(solve(672263)) # NO, 547, 1229 ```

1
2
3
4
  YES
  NO
  YES
  NO

IT 基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。
    • 次回対応予定:7.4 ネットワーク層のプロトコルと技術
今日の気分
  • What is your address?
  • 173.168.16.11
  • No, you local address
  • 127.0.0.1
  • I mean you physical address
  • 28:05:FF:58:31:05

復習:OSI基本参照モデル

  • 会社の部署と同じ気分
  • 特定層は自分のところにしか責任を持たない
  • 「他の層は他の層で専門的に管轄してね」
  • お互い全くの無関係ではないが、基本的には自分のことだけ考えていればいい。

ある端末が持つ・割り当てられる IP

  • 大前提:同じマシンでも状況に応じて IP はいろいろ変わる
    • 例:スマホ
      • 家の中のネット環境
      • 外で単独で使うとき
      • 適当な Wi-Fi につなぐとき
    • 気分:どのルーターの配下にいるか?
      • ルーターはあとで触れる

外向き IP(グローバルアドレス)と内向き IP(ローカルアドレス)

MACアドレスは、LANカード、ルータ、ハブなどのネットワーク機器に割り当てられます。実際にデータ通信を行う際、最終的にはパソコンなどのコンピュータ同士、つまりIPアドレス間のやり取りになりますが、行き来するデータは途中でルータやハブなどの機器を経由しています。機器から機器へのデータ移動の際に、MACアドレスによって、次のデータの引き渡し先を判別するという仕組みです。

IP 割り当て問題
  • いろいろな切り口がある
  • 1 つの方向性:IP 枯渇問題
  • なぜ IPv4 と IPv6 の 2 つがあるのか?
    • IPv4 では足りなくなったから
    • IPv6 で方式ごと変えて増やした
    • IoT 端末にも IP を振りたい:冷蔵庫を外から操作
  • 内向き・外向きのアドレスが出てくる理由も同じ
    • 外向きのアドレスが「真のアドレス」:会社の代表番号
    • 内向きのアドレスは内線番号
    • 内線番号にまでいちいち正規の電話番号を割り当てない
      • そもそも公開したいとさえ思わない
      • 「公開したいとさえ思わない」というのがまさに別の切り口の 1 つ

本の記述を追いかける

P.386 コネクションレス型通信である
  • Wikipedia
  • TCP/IP の UDP で使われる
  • Wikipedia の UDP から
    • 参考:ハンドシェイク
    • 「トランスポート層でのそのような処理のオーバーヘッドを削減している」

通信中のパケット紛失や重複、改竄の検出やそのための対応が必要な場合はアプリケーションで行う。それによってトランスポート層でのそのような処理のオーバーヘッドを削減している。リアルタイム・システムでは遅れているパケットを待つよりもそういうパケットはないものとして処理する方が好ましいため、適時性を重視するアプリケーションでよく使われている[1]。トランスポート層での誤り検出機能が必須なら、その用途に設計された Transmission Control Protocol (TCP) または Stream Control Transmission Protocol (SCTP) を使えばよい。

  • オーバーヘッドの問題はいろいろなところで出てくる
  • 参考:「ITの分野では、コンピュータで何らかの処理を行う際に、その処理を行うために必要となる付加的、間接的な処理や手続きのことや、そのために機器やシステムへかかる負荷、余分に費やされる処理時間などのことをオーバーヘッドということが多い。」
P.386 ルーターとは
  • 異なるネットワークを相互に接続するネットワーク機器
  • Wikipedia

通常はOSI基本参照モデルでの第1層(物理層)から第3層(ネットワーク層)までの接続を担う。一般的に用いられるルーターは、基本機能として各ネットワーク間でのIPパケット(第3層)をやり取りできるようにする装置であるが、実際は基本に加えてさまざまな付加機能を実現している。

ハードウェアとしてのルーターは、おおまかに通信事業者 (ISP) 向けのコアルーターと企業向けのエッジルーター、コンシューマー向けのブロードバンドルーターに分けられる。

ルーターというのは「会社の電話の内線と外線の交換機」にそっくりです。最初からそう説明すればよかったですね。

あなたが iPad のサファリを開き、キーワード「NETAGE のWiFi レンタルは国内最安?」を Google で検索すると、iPad は WiFi 経由で WiFi ルーターに接続されます。そして WiFi ルーターは LTE(3G や 4G でもいいですけど)で近くの基地局と接続し、その先のインターネットに接続します。 LAN につながった iPad から WiFi 経由でWiFi ルーターにリクエストが送信されたのです。その後、WiFi ルーターから近所のアンテナ基地局へ、そこから更にインターネットを経由して Google サーバにリクエストが届きます。

このようなネットワーク接続状態のとき、WiFi ルーターのこっち側を LAN(ローカルエリアネットワーク)、向こう側を WAN(ワイドエリアネットワーク)と呼びます。(必ずしも正確ではないですが、シンプルに考え、)WAN はインターネット、LAN は WiFi、とすれば分かりやすいと思います。

P.386 (IP)ヘッダ
P.389 特殊なIPアドレス
  • 8.8.8.8:Google の DNS として有名
  • 127.0.0.1:開発時によく使う。Windows だと「c:/Windows/System32/drivers/etc/hosts」ファイルでドメイン名「localhost」を指定して使うこともある。
  • グローバル IP とローカル IP
    • 最初に触れた問題
    • 外向きにグローバル IP アドレス、内向きにプライベート IP アドレスを使う
    • IP の無駄遣いを防ぐためもある
    • クラス A-C:会社の規模によって使い分ける
    • もちろん A が大企業向け、C が小企業・家庭用という感じ
    • 本でいきなり「192.168.」というアドレスが出てくることがあるが、それはまさにこのプライベートアドレスで話をしている。
P.390 サブネットマスク
  • これは社内セキュリティに使われたりする
  • 参考
    • 会社の部署間でデータの参照を制限する場合
    • パソコンやサーバの台数が多く分割して管理する場合
    • 開発環境と本番環境を分けるなど、環境を切り離す場合
  • ネットワーク設計の話
    • 経営関係の資料を一般社員には見せたくない
    • 経営関係者のネットワークとその他社員の領域を切り分け、経営関係者しかその資料があるところにアクセスできないようにする
P.392 IPv6
  • IP アドレスの枯渇
  • IPv4 でも「特殊なIPアドレス」などグローバル・ローカルを分けたりして枯渇対策はしてきた。
  • 「端末」が世にあふれてきて、アドレスが足りなくなってきた
    • 原理的に「IPアドレスは32けたの2進数」としているので、これ以上増やせない
      • IPはよく「インターネット上の住所」に例えられるが、市町村合併で起きる実際の住所変更のように柔軟に変えられるわけではない
        • 実際の住所にしても行政関係はもちろん、郵便や運送業などのシステムのレベルでは修正や対応が必要
    • 既存の機器・プログラムはこの前提で動いていて、勝手に変えられないし、仮に変えられるとしても膨大な手間になる
    • 新たな仕様を作り、それで世界全体に持っていく
    • 少なくとも既存の欠点はつぶしておく必要があるし、しばらく枯渇しないようにしたい
P.392 IPv6 の特徴

2020-08-16 課題

課題

メモ:先に進む前に録画してあるか確認しよう

自分用メモ

  • 遅延型方程式に対するコメント追加
  • matplotlib のチュートリアルを読もうの会
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる

Matplotlib

  • 本当に簡単な図を描く
  • $x^2$ のフーリエ級数:参考

\begin{align} f(x) = x^2 = \frac{\pi^2}{3} + \sum_{n=1}^\infty \frac{(-1)^n}{n^2} 4 \cos nx. \end{align}

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(- np.pi, np.pi, 1001)
xsquared = x**2
y0 = np.full(len(x), np.pi**2 / 3)
y1 = y0 - 4 * np.cos(x)
y2 = y1 + (1/2**2) * 4 * np.cos (2 * x)
y3 = y2 - (1/3**2) * 4 * np.cos (3 * x)
y4 = y3 + (1/4**2) * 4 * np.cos (4 * x)
y5 = y4 - (1/5**2) * 4 * np.cos (5 * x)

plt.plot(x, xsquared, label="$x^2$")
plt.plot(x, y0, label="y0")
plt.plot(x, y1, label="y1")
plt.plot(x, y2, label="y2")
plt.plot(x, y3, label="y3")
plt.plot(x, y4, label="y4")
plt.plot(x, y5, label="y5")
plt.xlabel("$-\pi$ to $\pi$")
plt.ylabel("Fourier")
plt.title("Fourier transform of $x^2$")

plt.grid()
plt.legend()
#plt.axes().set_aspect('equal', 'datalim') # アスペクト比を合わせる
plt.show()

TeX の記録

  • 測地線の方程式

\begin{align} \nabla_{c'} c' &= 0, \ \frac{d^2 c^i}{ds^2} + \Gamma^i_{jk} \frac{dc^j}{ds} \frac{dc^k}{ds} &= 0. \end{align}

競プロ、AtCoder

約数列挙C - Digits in Multiplication

整数 $N$ が与えられます。ここで、$2$ つの正の整数 $A,B$ に対して、$F(A,B)$ を「$10$ 進表記における、$A$ の桁数と $B$ の桁数のうち大きい方」と定義します。例えば、$F(3,11)$ の値は、$3$ は $1$ 桁、$11$ は $2$ 桁であるため、$F(3,11)=2$ となります。$2$ つの正の整数の組 $(A,B)$ が $N=A×B$ を満たすように動くとき、$F(A,B)$ の最小値を求めてください。

約数列挙のポイント

  • 素数判定と同じく $a = 1,2,3,\dots,\sqrt{N}$ で割り続けてためていく。
  • $\sqrt{N}$ までしか見ないので、$a$ を約数にしたら $N/a$ も約数リストにためる。
    • $N$ が $a^2$ を約数に含むとき、$a = N/a$ になるときがあるので、この重複を除いてリストに入れる。
    • Python など集合がある場合は集合にためてもいい。
  • 今回の問題は必ずしも全約数列挙ではないので、このリスト自体は作らなくてもいい。
  • 参考解答
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import math

def solve(N):
    a = math.ceil(math.sqrt(N))
    p = []

    for i in range(1, a+1):
        if N % i == 0:
            x = len(str(i))
            y = len(str(N // i))
            p.append(max(x, y))

    return min(p)

print(solve(10000)) # 3
print(solve(1000003)) # 7
print(solve(9876543210)) # 6
1
2
3
3
7
6

IT 基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。
    • 次回対応予定:7.4 ネットワーク層のプロトコルと技術

復習

OSI基本参照モデル
  • 会社の部署と同じ気分
  • 特定層は自分のところにしか責任を持たない
  • 「他の層は他の層で専門的に管轄してね」
  • お互い全くの無関係ではないが、基本的には自分のことだけ考えていればいい。
ある端末が持つ・割り当てられる IP
  • 大前提:同じマシンでも状況に応じて IP はいろいろ変わる
    • 例:スマホ
      • 家の中のネット環境
      • 外で単独で使うとき
      • 適当な Wi-Fi につなぐとき
    • 気分:どのルーターの配下にいるか?
      • ルーターはあとで触れる
  • 参考:WAN
  • 参考:インターネットの仕組みとISPの構造

本の記述を追いかける

P.386 コネクションレス型通信である
  • Wikipedia
  • TCP/IP の UDP で使われる
  • Wikipedia の UDP から
    • 参考:ハンドシェイク
    • 「トランスポート層でのそのような処理のオーバーヘッドを削減している」

通信中のパケット紛失や重複、改竄の検出やそのための対応が必要な場合はアプリケーションで行う。それによってトランスポート層でのそのような処理のオーバーヘッドを削減している。リアルタイム・システムでは遅れているパケットを待つよりもそういうパケットはないものとして処理する方が好ましいため、適時性を重視するアプリケーションでよく使われている[1]。トランスポート層での誤り検出機能が必須なら、その用途に設計された Transmission Control Protocol (TCP) または Stream Control Transmission Protocol (SCTP) を使えばよい。

  • オーバーヘッドの問題はいろいろなところで出てくる
  • 参考:「ITの分野では、コンピュータで何らかの処理を行う際に、その処理を行うために必要となる付加的、間接的な処理や手続きのことや、そのために機器やシステムへかかる負荷、余分に費やされる処理時間などのことをオーバーヘッドということが多い。」
P.386 ルーターとは
  • 異なるネットワークを相互に接続するネットワーク機器
  • Wikipedia

通常はOSI基本参照モデルでの第1層(物理層)から第3層(ネットワーク層)までの接続を担う。一般的に用いられるルーターは、基本機能として各ネットワーク間でのIPパケット(第3層)をやり取りできるようにする装置であるが、実際は基本に加えてさまざまな付加機能を実現している。

ハードウェアとしてのルーターは、おおまかに通信事業者 (ISP) 向けのコアルーターと企業向けのエッジルーター、コンシューマー向けのブロードバンドルーターに分けられる。

ルーターというのは「会社の電話の内線と外線の交換機」にそっくりです。最初からそう説明すればよかったですね。

あなたが iPad のサファリを開き、キーワード「NETAGE のWiFi レンタルは国内最安?」を Google で検索すると、iPad は WiFi 経由で WiFi ルーターに接続されます。そして WiFi ルーターは LTE(3G や 4G でもいいですけど)で近くの基地局と接続し、その先のインターネットに接続します。 LAN につながった iPad から WiFi 経由でWiFi ルーターにリクエストが送信されたのです。その後、WiFi ルーターから近所のアンテナ基地局へ、そこから更にインターネットを経由して Google サーバにリクエストが届きます。

このようなネットワーク接続状態のとき、WiFi ルーターのこっち側を LAN(ローカルエリアネットワーク)、向こう側を WAN(ワイドエリアネットワーク)と呼びます。(必ずしも正確ではないですが、シンプルに考え、)WAN はインターネット、LAN は WiFi、とすれば分かりやすいと思います。

P.386 (IP)ヘッダ
P.389 特殊なIPアドレス
  • 8.8.8.8:Google の DNS として有名
  • 127.0.0.1:開発時によく使う。Windows だと「c:/Windows/System32/drivers/etc/hosts」ファイルでドメイン名「localhost」を指定して使うこともある。
  • グローバル IP とローカル IP
    • 最初に触れた問題
    • 外向きにグローバル IP アドレス、内向きにプライベート IP アドレスを使う
    • IP の無駄遣いを防ぐためもある
    • クラス A-C:会社の規模によって使い分ける
    • もちろん A が大企業向け、C が小企業・家庭用という感じ
    • 本でいきなり「192.168.」というアドレスが出てくることがあるが、それはまさにこのプライベートアドレスで話をしている。
P.390 サブネットマスク
  • これは社内セキュリティに使われたりする
  • 参考
    • 会社の部署間でデータの参照を制限する場合
    • パソコンやサーバの台数が多く分割して管理する場合
    • 開発環境と本番環境を分けるなど、環境を切り離す場合
  • ネットワーク設計の話
    • 経営関係の資料を一般社員には見せたくない
    • 経営関係者のネットワークとその他社員の領域を切り分け、経営関係者しかその資料があるところにアクセスできないようにする
P.392 IPv6
  • IP アドレスの枯渇
  • IPv4 でも「特殊なIPアドレス」などグローバル・ローカルを分けたりして枯渇対策はしてきた。
  • 「端末」が世にあふれてきて、アドレスが足りなくなってきた
    • 原理的に「IPアドレスは32けたの2進数」としているので、これ以上増やせない
      • IPはよく「インターネット上の住所」に例えられるが、市町村合併で起きる実際の住所変更のように柔軟に変えられるわけではない
        • 実際の住所にしても行政関係はもちろん、郵便や運送業などのシステムのレベルでは修正や対応が必要
    • 既存の機器・プログラムはこの前提で動いていて、勝手に変えられないし、仮に変えられるとしても膨大な手間になる
    • 新たな仕様を作り、それで世界全体に持っていく
    • 少なくとも既存の欠点はつぶしておく必要があるし、しばらく枯渇しないようにしたい
P.392 IPv6 の特徴

- 勉強会の案内: アインシュタインの特殊相対性理論の原論文を多言語で読む会の話

  • bewegter の話をしよう

微分積分

  • 理解という言葉で何を求めているのか?
  • 短期目標と長期目標は何か?
  • 質はともかく量をこなしているか?
    • 量に関する参考:微分幾何計算ノート
  • 基礎をどこまで頑張るか?
    • 高校の数学はだいたいいい加減
    • day3.pdf, P.15 「微分可能性を保証していない」
  • 直近で何を諦めるか?

2020-08-23 課題

課題

TODO

メモ:先に進む前に録画してあるか確認しよう

自分用メモ

  • 遅延型方程式に対するコメント追加
  • matplotlib のチュートリアルを読もうの会
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる

Matplotlib

  • 本当に簡単な図を描く
  • これを参考に scipy お絵描き
  • 他の $m, l$ でもやってみる
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import sph_harm

m,l = 0,0
phi = np.linspace(0, np.pi, 31)
theta = np.linspace(0, 2 * np.pi, 46)
phi, theta = np.meshgrid(phi, theta)

r = sph_harm(m, l, theta, phi).real
x = np.abs(r) * np.sin(phi) * np.cos(theta)
y = np.abs(r) * np.sin(phi) * np.sin(theta)
z = np.abs(r) * np.cos(phi)

fig = plt.figure(figsize=(8, 8))
ax = fig.gca(projection="3d")
ax.plot_surface(x, y, z, color="aqua", edgecolor="k")
plt.axis("off")
plt.show()

TeX の記録

  • 測度の完全加法性

\begin{align} \mu \left( \bigcup_{n \in \mathbb{N}} A_n \right) = \sum_{n=0}^\infty \mu \left( A_n \right) \end{align}

競プロ、AtCoder

素因数分解AOJ Course NTL_1_A Prime Factorize

整数 $n$ を素因数分解してください。

素因数分解のポイント

  • 素数判定と同じく $a = 2,3,\dots,\sqrt{N}$ で割り続けてためていく。

  • 参考解答, 特にこれ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import math

def solve(n):
    str_n = str(n)
    sqrt_n = math.sqrt(n)
    result = []
    i = 2
    while i <= sqrt_n:
        # i を因数として複数持つ場合があるためこういう分岐にする
        if n%i == 0:
            n //= i
            result.append(str(i))
        else:
            i += 1
    if n != 1:
        result.append(str_n)

    print(str_n + ": " + " ".join(result))

solve(12) # 12: 2 2 3
solve(126) # 126: 2 3 3 7
1
2
12: 2 2 3
126: 2 3 3 7

IT 基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。
    • 次回対応予定:7.4 ネットワーク層のプロトコルと技術

復習

OSI基本参照モデル
  • 会社の部署と同じ気分
  • 特定層は自分のところにしか責任を持たない
  • 「他の層は他の層で専門的に管轄してね」
  • お互い全くの無関係ではないが、基本的には自分のことだけ考えていればいい。

いろいろなプロトコル

  • IP, HTTP, SMTP, POP, ARP...
  • 通信の規格
  • 状況に応じて適切なプロトコルを選ぶ
  • ヘッダ・ボディーの概念

本の記述を追いかける

P.386 (IP)ヘッダ
参考
P.389 特殊なIPアドレス
  • 8.8.8.8:Google の DNS として有名
  • 127.0.0.1:開発時によく使う。Windows だと「c:/Windows/System32/drivers/etc/hosts」ファイルでドメイン名「localhost」を指定して使うこともある。
  • グローバル IP とローカル IP
    • 最初に触れた問題
    • 外向きにグローバル IP アドレス、内向きにプライベート IP アドレスを使う
    • IP の無駄遣いを防ぐためもある
    • クラス A-C:会社の規模によって使い分ける
    • もちろん A が大企業向け、C が小企業・家庭用という感じ
    • 本でいきなり「192.168.」というアドレスが出てくることがあるが、それはまさにこのプライベートアドレスで話をしている。
P.390 サブネットマスク
  • これは社内セキュリティに使われたりする
  • 参考
    • 会社の部署間でデータの参照を制限する場合
    • パソコンやサーバの台数が多く分割して管理する場合
    • 開発環境と本番環境を分けるなど、環境を切り離す場合
  • ネットワーク設計の話
    • 経営関係の資料を一般社員には見せたくない
    • 経営関係者のネットワークとその他社員の領域を切り分け、経営関係者しかその資料があるところにアクセスできないようにする
P.392 IPv6
  • IP アドレスの枯渇
  • IPv4 でも「特殊なIPアドレス」などグローバル・ローカルを分けたりして枯渇対策はしてきた。
  • 「端末」が世にあふれてきて、アドレスが足りなくなってきた
    • 原理的に「IPアドレスは32けたの2進数」としているので、これ以上増やせない
      • IPはよく「インターネット上の住所」に例えられるが、市町村合併で起きる実際の住所変更のように柔軟に変えられるわけではない
        • 実際の住所にしても行政関係はもちろん、郵便や運送業などのシステムのレベルでは修正や対応が必要
    • 既存の機器・プログラムはこの前提で動いていて、勝手に変えられないし、仮に変えられるとしても膨大な手間になる
    • 新たな仕様を作り、それで世界全体に持っていく
    • 少なくとも既存の欠点はつぶしておく必要があるし、しばらく枯渇しないようにしたい
P.392 IPv6 の特徴

2020-09-06 課題

  • 今回から日付設定を次回の勉強会開催日に変更。
  • 先に進む前に録画してあるか確認しよう

コンテンツ修正メモ

  • 平面内で回転している様子を表すコードを書く: $R(\theta)$ を定義して関数化する.
  • 矢印を書くときに何を描いているか, 式もきちんと書く.
  • 遊ぶ例についてコメントを残す.

途中で見せたページ・動画

競プロ、AtCoder

IT 基礎知識編

数学・プログラミング

quiver について

課題

TODO

自分用メモ

  • 遅延型方程式に対するコメント追加
  • matplotlib のチュートリアルを読もうの会
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる

Matplotlib

  • 本当に簡単な図を描く
  • これを参考に scipy お絵描き

```python import numpy as np import matplotlib.pyplot as plt from scipy.special import sph_harm

m,l = 0,1 phi = np.linspace(0, np.pi, 31) theta = np.linspace(0, 2 * np.pi, 46) phi, theta = np.meshgrid(phi, theta)

r = sph_harm(m, l, theta, phi).real x = np.abs(r) * np.sin(phi) * np.cos(theta) y = np.abs(r) * np.sin(phi) * np.sin(theta) z = np.abs(r) * np.cos(phi)

fig = plt.figure(figsize=(8, 8)) ax = fig.gca(projection="3d") ax.plot_surface(x, y, z, color="aqua", edgecolor="k") plt.axis("off") plt.show() ```

TeX の記録

\begin{align} Y^m_k(\theta, \phi) &= (-1)^{(m+ |m|)/2} \sqrt{\frac{2k+1}{4 \pi} \frac{(k-|m|)!}{((k+|m|)!}} P^{|n|}k (\cos \theta) e^{im\phi}, \ P^{m}_k (t) &= \frac{1}{2^k} (1-t^2)^{m/2} \sum. \end{align}}^{\lfloor (k-m)/2 \rfloor} \frac{(-1)^j (2k-2j)!}{j!(k-j)!(k-2j-m)!} t^{k-2j-m

競プロ、AtCoder

素因数分解の利用約数の個数

整数 $N$ が与えられます。 $N!$ の正の約数の個数を $10^9+7$ で割った余りを求めてください。

約数の個数のポイント

  • $N= \prod_{k=1}^K p^{e_k}$ と素因数分解できるとき、約数の個数は $(e_1+1)(e_2+1)…(e_K+1)$ 個
    • 具体例で計算すればわかる
  • 約数の個数を求めるだけなら素因数分解はオーバーキル:約数列挙で十分
  • 素因数分解で考えるメリット:約数に関する考察がしやすい

コードの参考

```python #N=int(input()) from collections import defaultdict from functools import reduce

#前回の素因数分解とだいたい同じ def solve(n): p = defaultdict(int)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
  # クロージャー上の p にアクセスしてそこに結果をためる
  def inner(n):
      sqrt_n = int(n ** 0.5)
      for i in range(2, sqrt_n + 1):
          x = 0
          while n % i == 0:
              n //= i
              x += 1
          if x:
              p[i] += x
      if n > 1:
          p[n] += 1

  for i in range(2, n+1):
      inner(i)

  # 関数型でいう fold
  print(reduce(lambda x, y: x * (y+1), p.values(), 1) % (10**9 + 7))

solve(3) # 4: 3! = 6 で 6 の約数は 1, 2, 3, 6 の 4 つ solve(6) # 30: 6! = 720, 約数は 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, 16, 18, 20, 24, 30, 36, 40, 45, 48, 60, 72, 80, 90, 120, 144, 180, 240, 360, 720 solve(1000) # 972926972 ```

1
2
3
  4
  30
  972926972

Project Euler も見てみよう

  • GitHub の回答ページ
  • 中高生の数学・プログラミング学習用によかろうと思い、ちょこちょこやっている $a$
  • F#, Julia の |> を説明する
    • Twitter (私の TL)でも話題になった $f(x)$ か $xf$, $x^f$ か
    • F# や Julia の標準も $f(x)$ 型だが、$xf$ と書くための機構がある
    • Unix のパイプラインと同じ:データがあって、それをコマンドで順に整形していくワンライナーのイメージ
    • この感覚が育っていると実に自然な記法
    • 書いていて楽しい

IT 基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。
    • 次回対応予定:7.4 ネットワーク層のプロトコルと技術

復習

OSI基本参照モデル
  • 会社の部署と同じ気分
  • 特定層は自分のところにしか責任を持たない
  • 「他の層は他の層で専門的に管轄してね」
  • お互い全くの無関係ではないが、基本的には自分のことだけ考えていればいい。

いろいろなプロトコル

  • IP, HTTP, SMTP, POP, ARP...
  • 通信の規格
  • 状況に応じて適切なプロトコルを選ぶ
  • ヘッダ・ボディーの概念

本の記述を追いかける

P.392 IPv6
  • IP アドレスの枯渇
  • IPv4 でも「特殊なIPアドレス」などグローバル・ローカルを分けたりして枯渇対策はしてきた。
  • 「端末」が世にあふれてきて、アドレスが足りなくなってきた
    • 原理的に「IPアドレスは32けたの2進数」としているので、これ以上増やせない
      • IPはよく「インターネット上の住所」に例えられるが、市町村合併で起きる実際の住所変更のように柔軟に変えられるわけではない
        • 実際の住所にしても行政関係はもちろん、郵便や運送業などのシステムのレベルでは修正や対応が必要
    • 既存の機器・プログラムはこの前提で動いていて、勝手に変えられないし、仮に変えられるとしても膨大な手間になる
    • 新たな仕様を作り、それで世界全体に持っていく
    • 少なくとも既存の欠点はつぶしておく必要があるし、しばらく枯渇しないようにしたい
P.392 IPv6 の特徴
  • 家電などへもIP アドレスを採番できるようになった。
  • アドレス空間が32ビットから128ビットに拡張
  • ルーティングに不要なフィールドを拡張ヘッダに分離
    • 基本ヘッダを簡素かつ固定長:固定長のご利益はあとで
    • ルータなどの負荷を軽減
  • IPレベルのセキュリティ機能IPsecに標準対応
    • IPSec
    • 暗号技術で IP パケット単位で改竄検知や秘匿機能を提供するプロトコル
    • 暗号化をサポートしていないトランスポート層やアプリケーションでも通信路の途中での盗聴や改ざんを防止できる。
  • IPアドレスの自動設定機能の組み込み
    • DHCP を使わなくてもよくなる
  • 特定グループのうち経路上最も近いノード,あるいは最適なノードにデータを送信するエニーキャストの追加
    • エニーキャスト
      • ルーティングトポロジーから見てデータを「最も近い」または「最もよい」あて先に送信するネットワークのアドレッシング/ルーティング手法である(anycast―どこかに送信)。
固定長レコードのメリット・デメリット
  • 対義語は可変長レコード
  • 固定長レコード
    • 全てが桁数で決まる
      • メリットであり、デメリットでもある
      • 参考
      • すべてのデータの長さが同じ
      • わざわざ「何文字で終わりか」と考える必要がなくなる
      • データベースにもプログラム(変数の型)にもある:「何文字までを許すデータ型」
  • デメリット
    • データ項目を増やしたりデータ項目の桁数を増やすためにシステムの大規模修正が出る可能性がある
    • 2000 年問題の原因の 1 つ
      • 年号を 2 桁で持っていたため
      • 4 桁で持っていれば問題なかった
    • これが起きた原因
      • 昔は HDD 容量なども限られていた上、恐ろしく高価だったので削れる分は削っていた
      • そんなに長期間にわたって使われると思っていなかった
      • 個別のシステムはともかく、2桁表記というルール自体が一般化してしまった
    • いまの類似の問題:Unix 時間と 2038 年問題
ホップ・リミット
  • パケットの生存時間(通過可能なルータの最大数)
  • なぜこれが必要か?
    • プログラム(アルゴリズム)によってネットワークをたどって目的地に行くために起こる問題
    • 何か・どこかがおかしくて、ネットワークのある一部をループしてしまうかもしれない
      • ループを抜け出すような処理を書くよりはそのパケットを捨てて再送させた方が楽
      • いつ捨てるか:パケットの寿命・生存時間
    • 辿ろうと思っていたネットワークが急な瞬断・故障などで辿れなくなった
      • 適切なところまで戻ってから新たなルートを探す必要がある
      • 計算時間・ネットワーク上での情報の移動時間がかかり、その分帯域も占有し圧迫する
      • そのパケットは捨てた方が早いかもしれない
P.394 アドレス変換技術

インターネットに接続するノードには,IPアドレスが割り当てられている必要があります。しかし,各組織に1つのIPアドレスがあれば,IPアドレスを割り当てられていないノードからもインターネットに接続できるといった技術があります。

  • ルーターやグローバル IP・ローカル IP の発想でもある
P.395 ICMP を利用した ping
  • ネットワークの疎通確認でよく使う
    • 「ネットがつながらない」
    • 「どこまでつながるか、ping 打って試してみて」
  • 疎通
    • 意思疎通の疎通だが、ここではネットワーク用語
  • 参考:疎通確認でよくやること
    • ルーターにつながるか、ルーターの IP を打ってみて確認
      • つながらなければマシンの設定がおかしい可能性がある
      • マシンの無線 Wi-Fi 送受信のハードウェアが壊れている
      • ルーターが死んでいる(壊れた・停電後に電源が落ちたまま)など
    • 適当な DNS につながるか、DNS の IP を打ってみて確認
      • 何らかの理由でルーターから出られていない?
      • DNS が死んでいる?
  • こういう感じの状況切り分けでよく使う
    • 状況切り分けという手法自体、アルゴリズムの二分探索にも近い発想で、プログラミングそれ自体にも非常に重要。
  • 他にもいろいろな応用がある
    • パソコンサポートでの一幕
    • 「パソコンがつかない」
    • 「コンセントは繋いでいますか?」
      • 直接聞くと怒るタイプの社会性が高い人もいる
      • 「まずは電源を差し込んでみてください」
P.395 COLUMN
  • これらのコマンドはたまに使う:ifconfig, netstat, nslookup
  • 覚えなくてもいい:そういうコマンドがあることを知っているだけでも全然違う
P.396 7.5 トランスポート層のプロトコル
P.396 7.5.1 TCP と UDP
  • トランスポート層は IP を補完し、データ送信の品質・信頼性を上げる
  • プロトコルは TCP・UDP
P.396 TCP
  • IP はデータ通信の安全性を保障しないコネクションレス型通信
  • IP の補完のために送達管理・伝送管理の機能を持つコネクション型プロトコル
  • 特に HTTP や FTP のような全て確実に伝わってほしいリクエスト・レスポンスに使われる
  • 参考:一部が落ちてもいいリクエスト・レスポンス
    • 動画:一部が抜け落ちてもそれほど問題なく、かつ大容量で帯域を圧迫するので再送も控えたい
P.397 TCP でのコネクションの確立
  • 3 ウェイハンドシェイク
    • クライアント→サーバー:コネクションの確立要求、SYN(synchronize packet)
    • サーバー→クライアント:上記への ACK(acknowledgement packet)・SYN
    • クライアント→サーバー:上記への ACK
  • TCP コネクションは, あて先 IP アドレス, あて先 TCP ポート番号, 送信元 IP アドレス, 送信元 TCP ポート番号の 4 つによって識別される.
ポート・ポート番号

ポートとは、ネットワークでデータを通信するための扉のようなものだと思うとわかりやすいだろう。ポート番号はその扉の番号だ。

それぞれプログラムの種類によって、使うポート(扉)が違う。例えば、メールを送るにはこの扉、メールを受け取るにはこの扉、Webページを見てもらうのはこの扉、などと決まっているわけだ。

実際TCPやUDPで通信を行うときは、コンピュータ一台という単位ではなく「プログラム単位」つまり「プロセスやスレッド単位」で通信が行われる。そのためプロセス同士、正しく受け渡しをする必要がある。

  • プロセス・スレッドなどいきなりかなり低レイヤーの話がでてくることに注意。

このとき通信しているプロセスには「ポート番号」というものが割り振られる。プロセスやスレッドはこのポート番号を目印にして、どのアプリケーションとどのアプリケーションが通信をとっているのかを判別することになる。

IPアドレスを建物の住所に例えるなら、ポート番号は「部屋の番号は何号室か?」という例えになる。コンピュータネットワークにおいて、プロトコル、IPアドレスとポート番号はまとめると、「どのような方法」で「どこ」の「何号室」に通信をとるのか?という形にいいかえることが出来る。

通信において重要なポート番号だがポートを開くということは、特定の部屋の扉をあけはなっている状態に等しいので、サービスを提供するサーバでもないかぎり、基本的に不必要なポートは開かないように設定しておかなければならない。

  • サーバーのセキュリティなども絡むが分かる。

代表的なポート番号とプロトコル それぞれ「どの様なプロトコルがどの様なポート番号で運用されるのか?」代表的な例をあげると以下のようになる。

  • TCP 20 : FTP (データ)
  • TCP 21 : FTP (制御)
  • TCP 22 : SSH
  • TCP 23 : Telnet
  • TCP 25 : SMTP
  • UDP 53 : DNS
  • UDP 67 : DHCP(サーバ)
  • UDP 68 : DHCP(クライアント)
  • TCP 80 : HTTP
  • TCP 110 : POP3
  • UDP 123 : NTP
  • TCP 443 : HTTPS
  • WELL KNOWN PORT NUMBERS 0~1023
  • MySQL: 3306
P.397 アプリケーション間の通信
  • トランスポート層にはアプリケーション間の通信の実現という役割がある
  • 各アプリケーションはトランスポート層のヘッダにあるポート番号をみて自分宛のデータか判断する。
P.398 7.6 アプリケーション層のプロトコル
P.398 7.6.1 メール関連
P.398 メールプロトコル
  • 送信転送する SMTP (Simple Mail Transfer Protocol)
  • メールを受け取る POP3 (Post Office Protocol 3)
  • IMAP (Internet Message Access Protocol)
補足:POP と IMAP
  • (気分的には)管理する主体が違う
  • POP は単純にサーバーからメールデータを取ってくる
    • 取ってきたらサーバーからデータが消える
    • そのあとは自分で管理する
  • IMAP の説明の参考
    • 郵便にたとえると、(実際にはできませんが)郵便局から手紙は受け取らずコピーをもらってくるような形になり、手紙は郵便局が保管することになります。
    • メールはサーバに保管されますので、既読・未読・削除、フォルダの分類といった管理は、すべてサーバ上で行われます。
    • いろいろな端末でメールが見られる
  • POP と IMAP のメリット・デメリット
    • POP
      • メリット
        • PC などの端末にメールが保存される
        • 端末が許す限りメールを保存できる
        • 端末に保存されたメールはネット接続なしで見られる
      • デメリット
        • 落としてきた端末でしたメールが見られない
        • サーバーに一定期間メールを残す設定で複数端末でメールを見ることもできるが、未読・既読・削除などの状態が反映されない
    • IMAP:サーバー上でメール管理
      • メリット
        • 未読・既読などの状態が共有できる
        • サーバー上で一元管理できる。
      • デメリット
        • メールの閲覧・状態修正のためにサーバーと通信する必要がある
        • サーバーの容量の上限に達するとメールからサーバーを削除する必要がある
Gmail と IMAP
  • (何となくの理解しかないので間違っているかもしれない)
  • Web インターフェースからの Gmail 利用と Thunderbird などのアプリからの利用で事情が違う
  • POP や IMAP が関係してくるのはアプリからの利用
  • アプリを使う場合はふつう IMAP を使う
  • IMAP にしないと他の端末、もっといえば Web インターフェースからも見られなくなる(はず)
  • 会社で特定端末からしかメールを見ないなら POP でもいいかもしれない。
    • マシンが変わるとき、メールデータも引越ししないと昔のメールが掘れない
    • 会社のメールサーバー管理問題・容量問題などはかなり大変
    • 一頃「Gmail でサーバー管理問題を解決して、IT 部門が攻めの IT を提案できるようになった」みたいな記事も出ていた
    • メールが止まると直接的にビジネスに被害が出る
    • 何にせよサーバー管理は大変なので
P.398 メール受信プロトコル、メール関連のプロトコル・規格
  • 昔のプロトコルはセキュリティ関連の仕様がなかった
  • SMTP-AUTH, SMTP over TLS/SSL など
P.399 Web 関連
  • HTTP: HTTP(Hyper Text Transfer Protocol)は WebサーバとWebクライアント(ブラウザ)間でHTMLなどのWeb情報の配信 に使うプロトコル
    • セキュリティ:HTTP に SSL/TLS の認証機能や通信の暗号化を実装した HTTPS が登場
  • SOAP: XML を使ってデータ構造を記述
    • 最近あまり見かけない印象
    • XML 自体もうあまり使わない
    • 最近は JSON や GQL をよく見かける
P.401 DNS(Domain Name System)
  • TCP/IPでは,各ノードに対して一意なIPアドレスが割り当てられている
  • IPアドレスは覚えにくい
  • IP アドレスと対応する別名であるドメイン名がつけた
  • ドメインと IP を対応させるサービスが DNS
  • 原理的には世界中のすべてのノードのドメイン名とIPアドレスの対応関係を知ってい なければならない
    • 事実上不可能
    • DNSの規約では変換表作成の負担を細分化して,DNSを分散データベースとすることで対応しています。
  • DNS ルートサーバー
  • DNS ポイズニングのような攻撃手法もある

2020-09-13 課題

  • 先に進む前に録画してあるか確認しよう

進捗メモ

プログラミング勉強会

  • 2020-09-06:線型代数、02_03 の固有ベクトルの計算その 1 まで
  • 2020-09-13:02_03 固有値・固有ベクトルの計算その 2 から 03_02 の「具体例:関数 $f(x)=3x^2+4x-5$ の $x=1$ での接線」、「sympy による接線の描画」まで

統計学・機械学習勉強会

理系のための語学・リベラルアーツ

課題

TODO

自分用メモ

  • 遅延型方程式に対するコメント追加
  • matplotlib のチュートリアルを読もうの会
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる

Matplotlib

  • 本当に簡単な図を描く
  • これを参考に scipy お絵描き
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import sph_harm

m,l = 0,2
phi = np.linspace(0, np.pi, 31)
theta = np.linspace(0, 2 * np.pi, 46)
phi, theta = np.meshgrid(phi, theta)

r = sph_harm(m, l, theta, phi).real
x = np.abs(r) * np.sin(phi) * np.cos(theta)
y = np.abs(r) * np.sin(phi) * np.sin(theta)
z = np.abs(r) * np.cos(phi)

fig = plt.figure(figsize=(8, 8))
ax = fig.gca(projection="3d")
ax.plot_surface(x, y, z, color="aqua", edgecolor="k")
plt.axis("off")
plt.show()

TODO TeX の記録

競プロ、AtCoder

素因数分解の利用約数の総和

問題文 高橋君は完全なものが大好きです。 自然数には、完全数というものがあります。 完全数というのは、自分以外の約数の総和が自分と等しくなる自然数のことです。 例えば $6$ の場合 $1+2+3=6$ となるので完全数です。 それに対して、自分以外の約数の総和が自分より小さくなる場合は不足数と言い、大きくなる場合は過剰数と言います。 高橋君には今気になっている自然数があります。高橋君のために、それが完全数なのか不足数なのか過剰数なのか判定してください。

約数の総和のポイント

  • 約数を列挙して足せばいい
  • 「約数の個数」を求めたときの考え方を少し改変するだけで求められる
  • $N= \prod_{k=1}^K p^{e_k}$ と素因数分解できるとき、約数の総和は次のように書ける。

\begin{align} \left( \sum_{k=0}^{e_1} p_1^{k} \right) \cdot \left( \sum_{k=0}^{e_2} p_2^{k} \right) \cdots \left( \sum_{k=0}^{e_K} p_K^{k} \right) = \prod_{l=1}^K \left( \sum_{k=0}^{e_K} p_l^{k} \right). \end{align}

  • 単に約数の総和を求めるだけなら普通に約数列挙した方が楽

コードの参考

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#n = int(input())
def solve(n):
    sqrt_n = int(n ** 0.5)
    ans = 0

    for i in range(1, sqrt_n + 1):
        if n % i == 0:
            # 完全数は定義によって自分以外の約数の和を見るので、平方数の場合は約数だけを取る
            if i**2 == n:
                ans += i
                # ans = ans + i
            else:
                # ループで sqrt_n までしか見ないので、sqrt_n 以上の値になるペアも足し込む
                # 例:n = 8 で、sqrt_n + 1 = 3, i = 2 に対して n // i = 4
                ans += i + n // i

    if ans > n*2:
        print("Abundant")
    elif ans < n*2:
        print("Deficient")
    else:
        print("Perfect")

solve(6) # Perfect
solve(24) # Abundant
solve(27) # Deficient
solve(945) # Abundant
1
2
3
4
Perfect
Abundant
Deficient
Abundant

Project Euler も見てみよう

IT 基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。

復習

OSI基本参照モデル
  • 会社の部署と同じ気分
  • 特定層は自分のところにしか責任を持たない
  • 「他の層は他の層で専門的に管轄してね」
  • お互い全くの無関係ではないが、基本的には自分のことだけ考えていればいい。

いろいろなプロトコル

  • IP, HTTP, SMTP, POP, ARP...
  • 通信の規格
  • 状況に応じて適切なプロトコルを選ぶ
  • ヘッダ・ボディーの概念

本の記述を追いかける

P.393 ホップ・リミット
  • パケットの生存時間(通過可能なルータの最大数)
  • なぜこれが必要か?
    • プログラム(アルゴリズム)によってネットワークをたどって目的地に行くために起こる問題
    • 何か・どこかがおかしくて、ネットワークのある一部をループしてしまうかもしれない
      • ループを抜け出すような処理を書くよりはそのパケットを捨てて再送させた方が楽
      • いつ捨てるか:パケットの寿命・生存時間
    • 辿ろうと思っていたネットワークが急な瞬断・故障などで辿れなくなった
      • 適切なところまで戻ってから新たなルートを探す必要がある
      • 計算時間・ネットワーク上での情報の移動時間がかかり、その分帯域も占有し圧迫する
      • そのパケットは捨てた方が早いかもしれない
P.394 アドレス変換技術

インターネットに接続するノードには,IPアドレスが割り当てられている必要があります。しかし,各組織に1つのIPアドレスがあれば,IPアドレスを割り当てられていないノードからもインターネットに接続できるといった技術があります。

  • ルーターやグローバル IP・ローカル IP の発想でもある
P.395 ICMP を利用した ping
  • ネットワークの疎通確認でよく使う
    • 「ネットがつながらない」
    • 「どこまでつながるか、ping 打って試してみて」
  • 監視でも使われる:参考ページ、「PING 監視」とあるところ
    • せっかくなのでいくつかキーワードなどを盛り込む
    • PING 監視、TRAP 監視、RSH、SNMP、SOCKET 通信、POP・SMTP認証、PHN/PNSコマンド、2バイトのコマンド
    • インターフェースコンバータ
      • 「インタフェースコンバータ」は異なるインタフェースを相互に変換して接続する装置です。異なる規格の通信インタフェースを相互接続して、多種多様なシステムを構築することができます。
疎通とは
  • 意思疎通の疎通だが、ここではネットワーク用語
  • 参考:疎通確認でよくやること
    • ルーターにつながるか、ルーターの IP を打ってみて確認
      • つながらなければマシンの設定がおかしい可能性がある
      • マシンの無線 Wi-Fi 送受信のハードウェアが壊れている
      • ルーターが死んでいる(壊れた・停電後に電源が落ちたまま)など
    • 適当な DNS につながるか、DNS の IP を打ってみて確認
      • 何らかの理由でルーターから出られていない?
      • DNS が死んでいる?
  • こういう感じの状況切り分けでよく使う
    • 状況切り分けという手法自体、アルゴリズムの二分探索にも近い発想で、プログラミングそれ自体にも非常に重要。
  • 他にもいろいろな応用がある
    • パソコンサポートでの一幕
    • 「パソコンがつかない」
    • 「コンセントは繋いでいますか?」
      • 直接聞くと怒るタイプの社会性が高い人もいる
      • 「まずは電源を差し込んでみてください」
P.395 COLUMN
  • これらのコマンドはたまに使う:ifconfig, netstat, nslookup
  • 覚えなくてもいい:そういうコマンドがあることを知っているだけでも全然違う
P.396 7.5 トランスポート層のプロトコル
P.396 7.5.1 TCP と UDP
  • トランスポート層は IP を補完し、データ送信の品質・信頼性を上げる
  • プロトコルは TCP・UDP
P.396 TCP
  • IP はデータ通信の安全性を保障しないコネクションレス型通信
  • IP の補完のために送達管理・伝送管理の機能を持つコネクション型プロトコル
  • 特に HTTP や FTP のような全て確実に伝わってほしいリクエスト・レスポンスに使われる
  • 参考:一部が落ちてもいいリクエスト・レスポンス
    • 動画:一部が抜け落ちてもそれほど問題なく、かつ大容量で帯域を圧迫するので再送も控えたい
P.397 TCP でのコネクションの確立
  • 3 ウェイハンドシェイク
    • クライアント→サーバー:コネクションの確立要求、SYN(synchronize packet)
    • サーバー→クライアント:上記への ACK(acknowledgement packet)・SYN
    • クライアント→サーバー:上記への ACK
  • TCP コネクションは, あて先 IP アドレス, あて先 TCP ポート番号, 送信元 IP アドレス, 送信元 TCP ポート番号の 4 つによって識別される.
ポート・ポート番号

ポートとは、ネットワークでデータを通信するための扉のようなものだと思うとわかりやすいだろう。ポート番号はその扉の番号だ。

それぞれプログラムの種類によって、使うポート(扉)が違う。例えば、メールを送るにはこの扉、メールを受け取るにはこの扉、Webページを見てもらうのはこの扉、などと決まっているわけだ。

実際TCPやUDPで通信を行うときは、コンピュータ一台という単位ではなく「プログラム単位」つまり「プロセスやスレッド単位」で通信が行われる。そのためプロセス同士、正しく受け渡しをする必要がある。

  • プロセス・スレッドなどいきなりかなり低レイヤーの話がでてくることに注意。

このとき通信しているプロセスには「ポート番号」というものが割り振られる。プロセスやスレッドはこのポート番号を目印にして、どのアプリケーションとどのアプリケーションが通信をとっているのかを判別することになる。

IPアドレスを建物の住所に例えるなら、ポート番号は「部屋の番号は何号室か?」という例えになる。コンピュータネットワークにおいて、プロトコル、IPアドレスとポート番号はまとめると、「どのような方法」で「どこ」の「何号室」に通信をとるのか?という形にいいかえることが出来る。

通信において重要なポート番号だがポートを開くということは、特定の部屋の扉をあけはなっている状態に等しいので、サービスを提供するサーバでもないかぎり、基本的に不必要なポートは開かないように設定しておかなければならない。

  • サーバーのセキュリティなども絡むが分かる。

代表的なポート番号とプロトコル それぞれ「どの様なプロトコルがどの様なポート番号で運用されるのか?」代表的な例をあげると以下のようになる。

  • TCP 20 : FTP (データ)
  • TCP 21 : FTP (制御)
  • TCP 22 : SSH
  • TCP 23 : Telnet
  • TCP 25 : SMTP
  • UDP 53 : DNS
  • UDP 67 : DHCP(サーバ)
  • UDP 68 : DHCP(クライアント)
  • TCP 80 : HTTP
  • TCP 110 : POP3
  • UDP 123 : NTP
  • TCP 443 : HTTPS
  • WELL KNOWN PORT NUMBERS 0~1023
  • MySQL: 3306
P.397 アプリケーション間の通信
  • トランスポート層にはアプリケーション間の通信の実現という役割がある
  • 各アプリケーションはトランスポート層のヘッダにあるポート番号をみて自分宛のデータか判断する。
P.398 7.6 アプリケーション層のプロトコル
P.398 7.6.1 メール関連
P.398 メールプロトコル
  • 送信転送する SMTP (Simple Mail Transfer Protocol)
  • メールを受け取る POP3 (Post Office Protocol 3)
  • IMAP (Internet Message Access Protocol)
補足:POP と IMAP
  • (気分的には)管理する主体が違う
  • POP は単純にサーバーからメールデータを取ってくる
    • 取ってきたらサーバーからデータが消える
    • そのあとは自分で管理する
  • IMAP の説明の参考
    • 郵便にたとえると、(実際にはできませんが)郵便局から手紙は受け取らずコピーをもらってくるような形になり、手紙は郵便局が保管することになります。
    • メールはサーバに保管されますので、既読・未読・削除、フォルダの分類といった管理は、すべてサーバ上で行われます。
    • いろいろな端末でメールが見られる
  • POP と IMAP のメリット・デメリット
    • POP
      • メリット
        • PC などの端末にメールが保存される
        • 端末が許す限りメールを保存できる
        • 端末に保存されたメールはネット接続なしで見られる
      • デメリット
        • 落としてきた端末でしたメールが見られない
        • サーバーに一定期間メールを残す設定で複数端末でメールを見ることもできるが、未読・既読・削除などの状態が反映されない
    • IMAP:サーバー上でメール管理
      • メリット
        • 未読・既読などの状態が共有できる
        • サーバー上で一元管理できる。
      • デメリット
        • メールの閲覧・状態修正のためにサーバーと通信する必要がある
        • サーバーの容量の上限に達するとメールからサーバーを削除する必要がある
Gmail と IMAP
  • (何となくの理解しかないので間違っているかもしれない)
  • Web インターフェースからの Gmail 利用と Thunderbird などのアプリからの利用で事情が違う
  • POP や IMAP が関係してくるのはアプリからの利用
  • アプリを使う場合はふつう IMAP を使う
  • IMAP にしないと他の端末、もっといえば Web インターフェースからも見られなくなる(はず)
  • 会社で特定端末からしかメールを見ないなら POP でもいいかもしれない。
    • マシンが変わるとき、メールデータも引越ししないと昔のメールが掘れない
    • 会社のメールサーバー管理問題・容量問題などはかなり大変
    • 一頃「Gmail でサーバー管理問題を解決して、IT 部門が攻めの IT を提案できるようになった」みたいな記事も出ていた
    • メールが止まると直接的にビジネスに被害が出る
    • 何にせよサーバー管理は大変なので
P.398 メール受信プロトコル、メール関連のプロトコル・規格
  • 昔のプロトコルはセキュリティ関連の仕様がなかった
  • SMTP-AUTH, SMTP over TLS/SSL など
P.399 Web 関連
  • HTTP: HTTP(Hyper Text Transfer Protocol)は WebサーバとWebクライアント(ブラウザ)間でHTMLなどのWeb情報の配信 に使うプロトコル
    • セキュリティ:HTTP に SSL/TLS の認証機能や通信の暗号化を実装した HTTPS が登場
  • SOAP: XML を使ってデータ構造を記述
    • 最近あまり見かけない印象
    • XML 自体もうあまり使わない
    • 最近は JSON や GQL をよく見かける
P.401 DNS(Domain Name System)
  • TCP/IPでは,各ノードに対して一意なIPアドレスが割り当てられている
  • IPアドレスは覚えにくい
  • IP アドレスと対応する別名であるドメイン名がつけた
  • ドメインと IP を対応させるサービスが DNS
  • 原理的には世界中のすべてのノードのドメイン名とIPアドレスの対応関係を知ってい なければならない
    • 事実上不可能
    • DNSの規約では変換表作成の負担を細分化して,DNSを分散データベースとすることで対応しています。
  • DNS ルートサーバー
  • DNS ポイズニングのような攻撃手法もある
P.402 DNS クライアント(リゾルバ)の名前解決要求

コンテンツサーバへの問い合わせを繰り返すのは非効率なので,通常,自組織内にキャッシュサーバを置きます。この場合,リゾルバはキャッシュサーバに問い合わせを行い,キャッシュサーバ内に該当情報がキャッシュされていれば直接回答を得ることができます。ない場合は,キャッシュサーバが組織外のコンテンツサーバに問い合わせを行い,その結果をリゾルバに回答します。また,キャッシュサーバは,同様の問い合わせの際に再利用できるよう,問い合わせで得た結果を一定期間キャッシュします。

リゾルバからキャッシュサーバに送られる問い合わせを再帰的な問合せという。"再 帰 的"とは,「再び帰ってくる」という意味で,再帰的な問合せに対しては,最終的な結果を回答する必要がある。

  • 例えばディレクトリツリーを掘るタイプのプログラムではよくやる処理
  • (F# で)競プロをやっていると意外と再帰を使う(使える)ことに気づいた
    • いわゆる関数型言語は(命令型で)ループを使うところは高階関数か再帰で処理する
    • たいてい高階関数で足りる
    • 再帰は末尾再帰など面倒ポイントがある
P.402 インターネット上の電話サービスで用いるプロトコル
  • VoIP(Voice over Internet Protocol)
  • IPネットワークで音声をやり取りするための技術
  • データの伝送にはリアルタイム性に優れたUDPをベースとしたプロトコルが使われる
    • 届かなかったらもう一度しゃべらせればいい
P.403 その他のアプリケーション層プロトコル
  • FTP:ファイルを送る。ポートは 20、21
    • セキュリティが甘いので FTP、FTPS、SFTP、SCP などがある
  • Telnet:(あまり使ったことない)
  • SSH(Secure SHell):サーバーにログインするときに使う。とにかくよく使う。
    • テキストベースの通信であるTelnetに対し,暗号化や認証技術を利用して安全に遠隔操作するためのプロトコル
  • NTP・SNTP(Network Time Protocol):時刻合わせ
  • LDAP(Lightweight Directory Access Protocol):ディレクトリサービスにアクセスするためのプロトコル
    • Windows の ActiveDirectory も LDAP を使っている
    • 社員情報をやり取りするシステム間連携で出てくる
P.404 7.7 伝送技術
P.404 誤り制御
P.404 パリティチェック
  • 最もシンプルな検査方法
  • 7 ビットのデータを送信する場合,8 ビット目に誤り検出用のパリティビットを入れてデータの整合性を検査
    • 偶数パリティ:8ビットの各ビットについて"1"の数が偶数になるようにパリティビットを挿入する
    • 奇数パリティ:上で奇数にする
  • 有限体(ガロア体)$\mathbb{F}_2$ (ビット)で考えるといってもいい。
  • 微分形式で偶数次と偶数次・偶数次と奇数の積が偶数次になり、奇数次と奇数次の積がと奇数次になるのも一種のパリティチェック。
  • cf. P.405 水平垂直パリティチェック
P.404 CRC
  • CRC:巡回冗長検査(Cyclic Redundancy Check)
  • 送信するデータに生成多項式を適用して誤り検出用の冗長データを作成し,それを付けて送信
  • 受信側は送信側と同じ生成多項式で受信データを割り,同じ結果であればデータ誤りが ないと判断
  • CRCでは複雑な演算を使ってバースト誤り も検出できる
    • バースト誤り:データ転送回線上で連続して発生するビットの誤りのこと。ノイズの混入で生じることが多い。
  • HDLC 手順が採用
P.404 ハミング符号
  • 上で紹介した動画で簡単に数学的な原理を紹介している
  • 情報ビットに対して検査ビットをつけて 2 ビットまでの誤り検出と,1 ビットの誤り自動訂正機能をもつ誤り制御方式
    • 原理的には何ビットの誤り検出・自動訂正でもできる
  • 代数幾何符号もある
    • 数学的にはもちろん難しい
    • 有限体上の(非特異な射影)代数曲線を使う
P.406 同期制御
  • 通信時に送信側と受信側でタイミングを合わせる必要がある。
  • 本の話題とは別に同期・非同期にはいろいろな話があって難しい。
  • プログラミング、特に JavaScript フロントエンド周り。
  • データベースの同期・非同期
    • 大規模サービスでの問題、READ-WRITE、マスター・スレーブ
    • ふつう読み込みに比べて書き込みは少ない
    • 場合によっては読み込みは完全に最新の情報でなくてもいい
    • 書き込みメインのデータベースと、その内容を適当なタイミングでもらってくる読み込み専用のデータベースがある:これがマスターとスレーブ
    • 参考:前にやった Twitter のシステム構成など
    • 適当な意味で完全同期していないとまずいシステムもある:銀行・金融系
      • cf. トランザクション
      • トランザクションはふつう銀行が例になるくらい、そちらの話が有名でしかもイメージしやすい

2020-09-20 課題

  • 先に進む前に録画してあるか確認しよう

進捗メモ

  • 今回は 03-02 からはじめ、03-03 の「sympy による偏導関数の実装」まで
  • 次回は「高階の偏導関数」から

プログラミング勉強会

  • 2020-09-06:線型代数、02_03 の固有ベクトルの計算その 1 まで
  • 2020-09-13:02_03 固有値・固有ベクトルの計算その 2 から 03_02 の「具体例:関数 $f(x)=3x^2+4x-5$ の $x=1$ での接線」、「sympy による接線の描画」まで

統計学・機械学習勉強会

理系のための語学・リベラルアーツ

課題

TODO

自分用メモ

  • 遅延型方程式に対するコメント追加
  • matplotlib のチュートリアルを読もうの会
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる

Matplotlib

  • 本当に簡単な図を描く
  • これを参考に scipy お絵描き
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import sph_harm

m,l = 0,3
phi = np.linspace(0, np.pi, 101)
theta = np.linspace(0, 2 * np.pi, 151)
phi, theta = np.meshgrid(phi, theta)

r = sph_harm(m, l, theta, phi).real
x = np.abs(r) * np.sin(phi) * np.cos(theta)
y = np.abs(r) * np.sin(phi) * np.sin(theta)
z = np.abs(r) * np.cos(phi)

fig = plt.figure(figsize=(8, 8))
ax = fig.gca(projection="3d")
ax.plot_surface(x, y, z, color="aqua", edgecolor="k")
plt.axis("off")
plt.show()

TeX の記録

  • シュレディンガー方程式

\begin{align} i \hbar \frac{\partial}{\partial t} \left| \psi \right\rangle = \hat{H} \left| \psi \right\rangle \end{align}

競プロ、AtCoder

素因数分解の利用オイラー関数

正の整数 $N$ が与えられたとき $1,2,\dots,N$ のうち $N$ と互いに素であるものの個数を $\phi(N)$ と表します。これをオイラー関数とよびます。

問題

正の整数 $N$ が与えられる。$1,2,\dots,N$ のうち、$N$ と互いに素であるものの個数を求めよ。

(数値例)

・$N=12$

答え: 4

$1,2,3,4,5,6,7,8,9,10,11,12$ のうち、$12$ と互いに素であるものは、$1,5,7,11$ の $4$ 個です。

オイラー関数のポイント

  • 素因数分解 $N = p_1^{e_1}p_2^{e_2} \cdots p_K^{e_K}$ に対してオイラー関数は次のように書ける。

\begin{align} \phi(N) = N (1 − 1/p_1)(1 − 1 / p_2) \cdots (1 − 1 / p_K) = N \prod_{i=1}^K \left(1 - \frac{1}{p_i} \right). \end{align}

コードメモ
1
2
3
4
5
6
7
#http://www.tohoho-web.com/python/operators.html
#切り捨て割り算 //
print(15 // 2) # 7
print(15 / 2)  # 7.5
print("-----")
print(7 // 3) # 2
print(7 / 3)  # 2.3333333333333335
1
2
3
4
5
7
7.5
-----
2
2.3333333333333335

コードの参考

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def solve(n):
    # p はオイラー関数の結果をためていく変数
    p = n
    sqrt_n = n ** 0.5
    d = 2

    # いつも通り √n まで計算
    while d <= sqrt_n:
        # 割り切れるときに処理
        if n%d == 0:
            # (d-1) // d は (1 - 1/d) のこと
            p = p * (d - 1) // d
            # 互いに素な数だけ引っ張りたいので、因数に持っていたら割れるだけ割ってしまう
            while n % d == 0: n //= d
        # 一通り計算したら d を増やす
        d += 1
    # n が素数なら n > 1, True で 1 になる
    # n が合成数なら n = 1, False で 0 になる
    lst = [p, p * (n-1) // n]
    print(lst)
    return lst[n > 1]

print(solve(6)) # 2
print(solve(12)) # 4
print(solve(17)) # 16
print(solve(1000000)) # 400000
1
2
3
4
5
6
7
8
[3, 2]
2
[4, 0]
4
[17, 16]
16
[400000, 0]
400000

Project Euler も見てみよう

  • Problem3
  • GitHub の回答集
  • 中高生の数学・プログラミング学習用によかろうと思い、ちょこちょこやっている

https://projecteuler.net/problem=9

A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,

a2 + b2 = c2 For example, 32 + 42 = 9 + 16 = 25 = 52.

There exists exactly one Pythagorean triplet for which a + b + c = 1000. Find the product abc.

1
2
3
4
5
6
7
8
N = 1001
for a in range(1, N):
    for b in range(a, N):
        c = 1000 - a - b
        if a**2 + b**2 == c**2:
            print(a,b,c)

200 * 375 * 425
1
2
3
4
5
6
7
200 375 425





31875000

IT 基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。

復習

OSI基本参照モデル
  • 会社の部署と同じ気分
  • 特定層は自分のところにしか責任を持たない
  • 「他の層は他の層で専門的に管轄してね」
  • お互い全くの無関係ではないが、基本的には自分のことだけ考えていればいい。

いろいろなプロトコル

  • IP, HTTP, SMTP, POP, ARP...
  • 通信の規格
  • 状況に応じて適切なプロトコルを選ぶ
  • ヘッダ・ボディーの概念

本の記述を追いかける

P.395 COLUMN
  • これらのコマンドはたまに使う:ifconfig, netstat, nslookup
  • 覚えなくてもいい:そういうコマンドがあることを知っているだけでも全然違う
P.396 7.5 トランスポート層のプロトコル
P.396 7.5.1 TCP と UDP
  • トランスポート層は IP を補完し、データ送信の品質・信頼性を上げる
  • プロトコルは TCP・UDP
P.396 TCP
  • IP はデータ通信の安全性を保障しないコネクションレス型通信
  • IP の補完のために送達管理・伝送管理の機能を持つコネクション型プロトコル
  • 特に HTTP や FTP のような全て確実に伝わってほしいリクエスト・レスポンスに使われる
  • 参考:一部が落ちてもいいリクエスト・レスポンス
    • 動画:一部が抜け落ちてもそれほど問題なく、かつ大容量で帯域を圧迫するので再送も控えたい
P.397 TCP でのコネクションの確立
  • 3 ウェイハンドシェイク
    • クライアント→サーバー:コネクションの確立要求、SYN(synchronize packet)
    • サーバー→クライアント:上記への ACK(acknowledgement packet)・SYN
    • クライアント→サーバー:上記への ACK
  • TCP コネクションは, あて先 IP アドレス, あて先 TCP ポート番号, 送信元 IP アドレス, 送信元 TCP ポート番号の 4 つによって識別される.
ポート・ポート番号

ポートとは、ネットワークでデータを通信するための扉のようなものだと思うとわかりやすいだろう。ポート番号はその扉の番号だ。

それぞれプログラムの種類によって、使うポート(扉)が違う。例えば、メールを送るにはこの扉、メールを受け取るにはこの扉、Webページを見てもらうのはこの扉、などと決まっているわけだ。

実際TCPやUDPで通信を行うときは、コンピュータ一台という単位ではなく「プログラム単位」つまり「プロセスやスレッド単位」で通信が行われる。そのためプロセス同士、正しく受け渡しをする必要がある。

  • プロセス・スレッドなどいきなりかなり低レイヤーの話がでてくることに注意。

このとき通信しているプロセスには「ポート番号」というものが割り振られる。プロセスやスレッドはこのポート番号を目印にして、どのアプリケーションとどのアプリケーションが通信をとっているのかを判別することになる。

IPアドレスを建物の住所に例えるなら、ポート番号は「部屋の番号は何号室か?」という例えになる。コンピュータネットワークにおいて、プロトコル、IPアドレスとポート番号はまとめると、「どのような方法」で「どこ」の「何号室」に通信をとるのか?という形にいいかえることが出来る。

通信において重要なポート番号だがポートを開くということは、特定の部屋の扉をあけはなっている状態に等しいので、サービスを提供するサーバでもないかぎり、基本的に不必要なポートは開かないように設定しておかなければならない。

  • サーバーのセキュリティなども絡むが分かる。

代表的なポート番号とプロトコル それぞれ「どの様なプロトコルがどの様なポート番号で運用されるのか?」代表的な例をあげると以下のようになる。

  • TCP 20 : FTP (データ)
  • TCP 21 : FTP (制御)
  • TCP 22 : SSH
  • TCP 23 : Telnet
  • TCP 25 : SMTP
  • UDP 53 : DNS
  • UDP 67 : DHCP(サーバ)
  • UDP 68 : DHCP(クライアント)
  • TCP 80 : HTTP
  • TCP 110 : POP3
  • UDP 123 : NTP
  • TCP 443 : HTTPS
  • WELL KNOWN PORT NUMBERS 0~1023
  • MySQL: 3306
P.397 アプリケーション間の通信
  • トランスポート層にはアプリケーション間の通信の実現という役割がある
  • 各アプリケーションはトランスポート層のヘッダにあるポート番号をみて自分宛のデータか判断する。
P.398 7.6 アプリケーション層のプロトコル
P.398 7.6.1 メール関連
P.398 メールプロトコル
  • 送信転送する SMTP (Simple Mail Transfer Protocol)
  • メールを受け取る POP3 (Post Office Protocol 3)
  • IMAP (Internet Message Access Protocol)
補足:POP と IMAP
  • (気分的には)管理する主体が違う
  • POP は単純にサーバーからメールデータを取ってくる
    • 取ってきたらサーバーからデータが消える
    • そのあとは自分で管理する
  • IMAP の説明の参考
    • 郵便にたとえると、(実際にはできませんが)郵便局から手紙は受け取らずコピーをもらってくるような形になり、手紙は郵便局が保管することになります。
    • メールはサーバに保管されますので、既読・未読・削除、フォルダの分類といった管理は、すべてサーバ上で行われます。
    • いろいろな端末でメールが見られる
  • POP と IMAP のメリット・デメリット
    • POP
      • メリット
        • PC などの端末にメールが保存される
        • 端末が許す限りメールを保存できる
        • 端末に保存されたメールはネット接続なしで見られる
      • デメリット
        • 落としてきた端末でしたメールが見られない
        • サーバーに一定期間メールを残す設定で複数端末でメールを見ることもできるが、未読・既読・削除などの状態が反映されない
    • IMAP:サーバー上でメール管理
      • メリット
        • 未読・既読などの状態が共有できる
        • サーバー上で一元管理できる。
      • デメリット
        • メールの閲覧・状態修正のためにサーバーと通信する必要がある
        • サーバーの容量の上限に達するとメールからサーバーを削除する必要がある
Gmail と IMAP
  • (何となくの理解しかないので間違っているかもしれない)
  • Web インターフェースからの Gmail 利用と Thunderbird などのアプリからの利用で事情が違う
  • POP や IMAP が関係してくるのはアプリからの利用
  • アプリを使う場合はふつう IMAP を使う
  • IMAP にしないと他の端末、もっといえば Web インターフェースからも見られなくなる(はず)
  • 会社で特定端末からしかメールを見ないなら POP でもいいかもしれない。
    • マシンが変わるとき、メールデータも引越ししないと昔のメールが掘れない
    • 会社のメールサーバー管理問題・容量問題などはかなり大変
    • 一頃「Gmail でサーバー管理問題を解決して、IT 部門が攻めの IT を提案できるようになった」みたいな記事も出ていた
    • メールが止まると直接的にビジネスに被害が出る
    • 何にせよサーバー管理は大変なので
P.398 メール受信プロトコル、メール関連のプロトコル・規格
  • 昔のプロトコルはセキュリティ関連の仕様がなかった
  • SMTP-AUTH, SMTP over TLS/SSL など
P.399 Web 関連
  • HTTP: HTTP(Hyper Text Transfer Protocol)は WebサーバとWebクライアント(ブラウザ)間でHTMLなどのWeb情報の配信 に使うプロトコル
    • セキュリティ:HTTP に SSL/TLS の認証機能や通信の暗号化を実装した HTTPS が登場
  • SOAP: XML を使ってデータ構造を記述
    • 最近あまり見かけない印象
    • XML 自体もうあまり使わない
    • 最近は JSON や GQL をよく見かける
P.401 DNS(Domain Name System)
  • TCP/IPでは,各ノードに対して一意なIPアドレスが割り当てられている
  • IPアドレスは覚えにくい
  • IP アドレスと対応する別名であるドメイン名がつけた
  • ドメインと IP を対応させるサービスが DNS
  • 原理的には世界中のすべてのノードのドメイン名とIPアドレスの対応関係を知ってい なければならない
    • 事実上不可能
    • DNSの規約では変換表作成の負担を細分化して,DNSを分散データベースとすることで対応しています。
  • DNS ルートサーバー
  • DNS ポイズニングのような攻撃手法もある
P.402 DNS クライアント(リゾルバ)の名前解決要求

コンテンツサーバへの問い合わせを繰り返すのは非効率なので,通常,自組織内にキャッシュサーバを置きます。この場合,リゾルバはキャッシュサーバに問い合わせを行い,キャッシュサーバ内に該当情報がキャッシュされていれば直接回答を得ることができます。ない場合は,キャッシュサーバが組織外のコンテンツサーバに問い合わせを行い,その結果をリゾルバに回答します。また,キャッシュサーバは,同様の問い合わせの際に再利用できるよう,問い合わせで得た結果を一定期間キャッシュします。

リゾルバからキャッシュサーバに送られる問い合わせを再帰的な問合せという。"再 帰 的"とは,「再び帰ってくる」という意味で,再帰的な問合せに対しては,最終的な結果を回答する必要がある。

  • 例えばディレクトリツリーを掘るタイプのプログラムではよくやる処理
  • (F# で)競プロをやっていると意外と再帰を使う(使える)ことに気づいた
    • いわゆる関数型言語は(命令型で)ループを使うところは高階関数か再帰で処理する
    • たいてい高階関数で足りる
    • 再帰は末尾再帰など面倒ポイントがある
P.402 インターネット上の電話サービスで用いるプロトコル
  • VoIP(Voice over Internet Protocol)
  • IPネットワークで音声をやり取りするための技術
  • データの伝送にはリアルタイム性に優れたUDPをベースとしたプロトコルが使われる
    • 届かなかったらもう一度しゃべらせればいい
P.403 その他のアプリケーション層プロトコル
  • FTP:ファイルを送る。ポートは 20、21
    • セキュリティが甘いので FTP、FTPS、SFTP、SCP などがある
  • Telnet:(あまり使ったことない)
  • SSH(Secure SHell):サーバーにログインするときに使う。とにかくよく使う。
    • テキストベースの通信であるTelnetに対し,暗号化や認証技術を利用して安全に遠隔操作するためのプロトコル
  • NTP・SNTP(Network Time Protocol):時刻合わせ
  • LDAP(Lightweight Directory Access Protocol):ディレクトリサービスにアクセスするためのプロトコル
    • Windows の ActiveDirectory も LDAP を使っている
    • 社員情報をやり取りするシステム間連携で出てくる
P.404 7.7 伝送技術
P.404 誤り制御
P.404 パリティチェック
  • 最もシンプルな検査方法
  • 7 ビットのデータを送信する場合,8 ビット目に誤り検出用のパリティビットを入れてデータの整合性を検査
    • 偶数パリティ:8ビットの各ビットについて"1"の数が偶数になるようにパリティビットを挿入する
    • 奇数パリティ:上で奇数にする
  • 有限体(ガロア体)$\mathbb{F}_2$ (ビット)で考えるといってもいい。
  • 微分形式で偶数次と偶数次・偶数次と奇数の積が偶数次になり、奇数次と奇数次の積がと奇数次になるのも一種のパリティチェック。
  • cf. P.405 水平垂直パリティチェック
P.404 CRC
  • CRC:巡回冗長検査(Cyclic Redundancy Check)
  • 送信するデータに生成多項式を適用して誤り検出用の冗長データを作成し,それを付けて送信
  • 受信側は送信側と同じ生成多項式で受信データを割り,同じ結果であればデータ誤りが ないと判断
  • CRCでは複雑な演算を使ってバースト誤り も検出できる
    • バースト誤り:データ転送回線上で連続して発生するビットの誤りのこと。ノイズの混入で生じることが多い。
  • HDLC 手順が採用
P.404 ハミング符号
  • 上で紹介した動画で簡単に数学的な原理を紹介している
  • 情報ビットに対して検査ビットをつけて 2 ビットまでの誤り検出と,1 ビットの誤り自動訂正機能をもつ誤り制御方式
    • 原理的には何ビットの誤り検出・自動訂正でもできる
  • 代数幾何符号もある
    • 数学的にはもちろん難しい
    • 有限体上の(非特異な射影)代数曲線を使う
P.406 同期制御
  • 通信時に送信側と受信側でタイミングを合わせる必要がある。
  • 本の話題とは別に同期・非同期にはいろいろな話があって難しい。
  • プログラミング、特に JavaScript フロントエンド周り。
  • データベースの同期・非同期
    • 大規模サービスでの問題、READ-WRITE、マスター・スレーブ
    • ふつう読み込みに比べて書き込みは少ない
    • 場合によっては読み込みは完全に最新の情報でなくてもいい
    • 書き込みメインのデータベースと、その内容を適当なタイミングでもらってくる読み込み専用のデータベースがある:これがマスターとスレーブ
    • 参考:前にやった Twitter のシステム構成など
    • 適当な意味で完全同期していないとまずいシステムもある:銀行・金融系
      • cf. トランザクション
      • トランザクションはふつう銀行が例になるくらい、そちらの話が有名でしかもイメージしやすい
P.408 7.8 交換方式
P.408 パケット交換方式
  • 回線交換方式と対になる概念
    • 回線交換方式:通信を行うノード間で物理的な通信路を確保してから通信する
    • 例:電話
  • パケット交換方式について
    • データ送信するノードはデータをパケットに区切る。
    • ひとつひとつのパケットにヘッダを付けて送信。
    • ネットワーク内ではパケット交換機にパケットがたまる
    • ネットワークの状況に応じて順次送られる
パケット通信のメリット・デメリット
メリット
  • 耐障害性
    • 通信路を固定しないため,迂回経路が取れる。
    • パケット交換機にデータが蓄積されているため,復旧まで待てる。
  • パケット多重
    • 1 対 1 の通信で回線を占有する必要がないため,1つの回線を多くのノードで共有でき,回線を効率的につかえる
  • 異機種間接続性
    • パケット交換機で中継するときにプロトコル変換・速度変換でエンドノードどうしが同じプロトコルをサポートしていなくても通信できる
デメリット
  • ネットワーク内の蓄積交換処理による遅延
    • 蓄積交換処理による遅延解消のために主に回線の帯域を広げることで対応してきた
    • 構造上,完全には遅延をなくせない
  • パケット到着順序の不整合
P.408 ATM 交換方式
  • ATM(Asynchronous Transfer Mode:非同期転送モード)
  • 遅延のない回線交換方式とパケット交換方式の利点を得たい
  • パケット交換方式の発展
  • 遅延の原因をつぶす:特にパケットの多様性
    • 多種多様なパケットに対応するために,パケット交換機はソフトウェア処理が必要
    • ATM での工夫の一例:最も特徴的なのは,パケット(ATMではセルという)の長さをヘッダ部 5 バイト,ペイロード 48 バイトの53バイトに統一
    • パケット解析がハードウェアだけでできる。
    • ソフトウェアは不要になった。
  • Wikipedia から
    • 当初の意図に反して非常に複雑な技術になってしまった
    • ATM は次世代の主流にならず限定的な使用にとどまった
    • ATM の設計思想は MPLS へと引き継がれた
    • 汎用のレイヤ 2 のパケットスイッチングのプロトコルとして、ルーターを介したIPの通信網で利用されている。
P.408 ペイロード(payload)
  • データ通信で本来転送したいデータ本体の部分、ボディを指す。
  • ATM ではペイロードのサイズを固定して処理を簡素化
  • 難点:パケット全体に占めるペイロードのサイズが相対的に小さくオーバヘッドが大きい

2020-09-27 課題

  • FTP: file transfer protocol
  • 先に進む前に録画してあるか確認しよう

進捗

  • 今日の進捗
    • 基礎知識編:P.370 プロトコルとサービス、ポート・ポート番号、P.397 アプリケーション間の通信、P.398 7.6 アプリケーション層のプロトコル、P.398 7.6.1 メール関連、P.398 メールプロトコル、補足:POP と IMAP、Gmail と IMAP
    • 本編:03_03 終了
  • 次回
    • 本編:03_04 はじめから

課題

TODO

自分用メモ

  • 遅延型方程式に対するコメント追加
  • matplotlib のチュートリアルを読もうの会
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる

Matplotlib

  • 本当に簡単な図を描く
  • これを参考に scipy お絵描き
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import sph_harm

m,l = 0,4
theta = np.linspace(0, np.pi, 101)
phi = np.linspace(0, 2 * np.pi, 151)
theta, phi = np.meshgrid(theta, phi)

r = sph_harm(m, l, phi, theta).real
x = np.abs(r) * np.sin(theta) * np.cos(phi)
y = np.abs(r) * np.sin(theta) * np.sin(phi)
z = np.abs(r) * np.cos(theta)

fig = plt.figure(figsize=(8, 8))
ax = fig.gca(projection="3d")
ax.plot_surface(x, y, z, color="aqua", edgecolor="k")
plt.axis("off")
plt.show()

TeX の記録

  • 3 次元極座標

\begin{align} x &= r \sin \theta \cos \phi, \ y &= r \sin \theta \sin \phi, \ z &= r \cos \phi. \end{align}

競プロ、AtCoder

6. 素因数分解を活用した考察6-2. ひねった状況でも「約数の個数」がわかる

問題

$N!$ の正の約数の個数を $1000000007$ で割ったあまりを求めよ。

$1 \le N \le 1000$

(数値例)

・$N = 3$

答え: 4

$3! = 6$ の約数は、$1, 2, 3, 6$ の $4$ 個です。

ポイント
  • $N!$ は巨大なので約数列挙では途方もない時間がかかる。
  • $N!$ を求めてからの約数列挙は非現実的。
  • 素因数分解で約数の個数を求める

    • 正の整数 $M$ が $M = p_{1}^{e_{1}} p_{2}^{e_{2}} \dots p_{K}^{e_{K}}$ と素因数分解できるとき、$M$ の約数の個数は $(e_{1} + 1)(e_{2} + 1) \dots (e_{K} + 1)$ 個
    • $N!$ を計算しなくても $N!$ の素因数分解が分かれば十分
  • n_1 = p_1^{e_1} ...

  • n_2 = p_1^{e_1} ...
  • N! = p_1^{e_1} ...

コードの参考

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
def is_factor_table(N):
    """[0, N] の整数が N の因数かどうかを調べる"""
    table = [True for _ in range(N+1)]
    table[0] = False
    table[1] = False
    for i in range(2, N+1):
        # いったん因数ではない判定をされたらチェック不要
        if table[i] == False:
            continue
        # i を因数に持たないなら i*j も因数に持たない
        for j in range(2, N // i):
            table[i * j] = False
    return table

def factors(N):
    table = is_factor_table(N)

    p = [] # 素因数をためるリスト
    for i in range(N+1):
        if table[i]:
            p.append(i)

    n = len(p) # 素因数の数
    cnt = [0 for _ in range(n)]
    for i in range(2, N+1):
        x = i
        j = 0
        while x > 1:
            while x % p[j]==0:
                cnt[j] += 1 # j 番目の素数で割れるうちは素因数のべきを足していく
                x //= p[j] # ループチェック用の x をどんどん小さくしていく
            j += 1

    return (n, cnt)

def solve(N):
    n, cnt = factors(N)
    ans = 1
    MOD = 1000000007
    for i in range(n):
        ans *= cnt[i] + 1 # 約数の個数計算
        ans %= MOD
    return ans

print(solve(3)) # 4
print(solve(6)) # 30
print(solve(1000)) # 972926972
1
2
3
4
30
972926972

Project Euler も見てみよう

  • Problem5
  • GitHub の回答集
  • 中高生の数学・プログラミング学習用によかろうと思い、ちょこちょこやっている

IT 基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。

復習

OSI基本参照モデル
  • 会社の部署と同じ気分
  • 特定層は自分のところにしか責任を持たない
  • 「他の層は他の層で専門的に管轄してね」
  • お互い全くの無関係ではないが、基本的には自分のことだけ考えていればいい。

いろいろなプロトコル

  • IP, HTTP, SMTP, POP, ARP...
  • 通信の規格
  • 状況に応じて適切なプロトコルを選ぶ
  • ヘッダ・ボディーの概念

本の記述を追いかける

ポート・ポート番号

ポートとは、ネットワークでデータを通信するための扉のようなものだと思うとわかりやすいだろう。ポート番号はその扉の番号だ。

それぞれプログラムの種類によって、使うポート(扉)が違う。例えば、メールを送るにはこの扉、メールを受け取るにはこの扉、Webページを見てもらうのはこの扉、などと決まっているわけだ。

実際TCPやUDPで通信を行うときは、コンピュータ一台という単位ではなく「プログラム単位」つまり「プロセスやスレッド単位」で通信が行われる。そのためプロセス同士、正しく受け渡しをする必要がある。

  • プロセス・スレッドなどいきなりかなり低レイヤーの話がでてくることに注意。

このとき通信しているプロセスには「ポート番号」というものが割り振られる。プロセスやスレッドはこのポート番号を目印にして、どのアプリケーションとどのアプリケーションが通信をとっているのかを判別することになる。

IPアドレスを建物の住所に例えるなら、ポート番号は「部屋の番号は何号室か?」という例えになる。コンピュータネットワークにおいて、プロトコル、IPアドレスとポート番号はまとめると、「どのような方法」で「どこ」の「何号室」に通信をとるのか?という形にいいかえることが出来る。

通信において重要なポート番号だがポートを開くということは、特定の部屋の扉をあけはなっている状態に等しいので、サービスを提供するサーバでもないかぎり、基本的に不必要なポートは開かないように設定しておかなければならない。

  • サーバーのセキュリティなども絡むが分かる。

代表的なポート番号とプロトコル それぞれ「どの様なプロトコルがどの様なポート番号で運用されるのか?」代表的な例をあげると以下のようになる。

  • TCP 20 : FTP (データ)
  • TCP 21 : FTP (制御)
  • TCP 22 : SSH
  • TCP 23 : Telnet
  • TCP 25 : SMTP
  • UDP 53 : DNS
  • UDP 67 : DHCP(サーバ)
  • UDP 68 : DHCP(クライアント)
  • TCP 80 : HTTP
  • TCP 110 : POP3
  • UDP 123 : NTP
  • TCP 443 : HTTPS
  • WELL KNOWN PORT NUMBERS 0~1023
  • MySQL: 3306
P.397 アプリケーション間の通信
  • トランスポート層にはアプリケーション間の通信の実現という役割がある
  • 各アプリケーションはトランスポート層のヘッダにあるポート番号をみて自分宛のデータか判断する。
P.398 7.6 アプリケーション層のプロトコル
P.398 7.6.1 メール関連
P.398 メールプロトコル
  • 送信転送する SMTP (Simple Mail Transfer Protocol)
  • メールを受け取る POP3 (Post Office Protocol 3)
  • IMAP (Internet Message Access Protocol)
補足:POP と IMAP
  • (気分的には)管理する主体が違う
  • POP は単純にサーバーからメールデータを取ってくる
    • 取ってきたらサーバーからデータが消える
    • そのあとは自分で管理する
  • IMAP の説明の参考
    • 郵便にたとえると、(実際にはできませんが)郵便局から手紙は受け取らずコピーをもらってくるような形になり、手紙は郵便局が保管することになります。
    • メールはサーバに保管されますので、既読・未読・削除、フォルダの分類といった管理は、すべてサーバ上で行われます。
    • いろいろな端末でメールが見られる
  • POP と IMAP のメリット・デメリット
    • POP
      • メリット
        • PC などの端末にメールが保存される
        • 端末が許す限りメールを保存できる
        • 端末に保存されたメールはネット接続なしで見られる
      • デメリット
        • 落としてきた端末でしたメールが見られない
        • サーバーに一定期間メールを残す設定で複数端末でメールを見ることもできるが、未読・既読・削除などの状態が反映されない
    • IMAP:サーバー上でメール管理
      • メリット
        • 未読・既読などの状態が共有できる
        • サーバー上で一元管理できる。
      • デメリット
        • メールの閲覧・状態修正のためにサーバーと通信する必要がある
        • サーバーの容量の上限に達するとメールからサーバーを削除する必要がある
Gmail と IMAP
  • (何となくの理解しかないので間違っているかもしれない)
  • Web インターフェースからの Gmail 利用と Thunderbird などのアプリからの利用で事情が違う
  • POP や IMAP が関係してくるのはアプリからの利用
  • アプリを使う場合はふつう IMAP を使う
  • IMAP にしないと他の端末、もっといえば Web インターフェースからも見られなくなる(はず)
  • 会社で特定端末からしかメールを見ないなら POP でもいいかもしれない。
    • マシンが変わるとき、メールデータも引越ししないと昔のメールが掘れない
    • 会社のメールサーバー管理問題・容量問題などはかなり大変
    • 一頃「Gmail でサーバー管理問題を解決して、IT 部門が攻めの IT を提案できるようになった」みたいな記事も出ていた
    • メールが止まると直接的にビジネスに被害が出る
    • 何にせよサーバー管理は大変なので
P.398 メール受信プロトコル、メール関連のプロトコル・規格
  • 昔のプロトコルはセキュリティ関連の仕様がなかった
  • SMTP-AUTH, SMTP over TLS/SSL など
P.399 Web 関連
  • HTTP: HTTP(Hyper Text Transfer Protocol)は WebサーバとWebクライアント(ブラウザ)間でHTMLなどのWeb情報の配信 に使うプロトコル
    • セキュリティ:HTTP に SSL/TLS の認証機能や通信の暗号化を実装した HTTPS が登場
  • SOAP: XML を使ってデータ構造を記述
    • 最近あまり見かけない印象
    • XML 自体もうあまり使わない
    • 最近は JSON や GQL をよく見かける
P.401 DNS(Domain Name System)
  • TCP/IPでは,各ノードに対して一意なIPアドレスが割り当てられている
  • IPアドレスは覚えにくい
  • IP アドレスと対応する別名であるドメイン名がつけた
  • ドメインと IP を対応させるサービスが DNS
  • 原理的には世界中のすべてのノードのドメイン名とIPアドレスの対応関係を知ってい なければならない
    • 事実上不可能
    • DNSの規約では変換表作成の負担を細分化して,DNSを分散データベースとすることで対応しています。
  • DNS ルートサーバー
  • DNS ポイズニングのような攻撃手法もある
P.402 DNS クライアント(リゾルバ)の名前解決要求

コンテンツサーバへの問い合わせを繰り返すのは非効率なので,通常,自組織内にキャッシュサーバを置きます。この場合,リゾルバはキャッシュサーバに問い合わせを行い,キャッシュサーバ内に該当情報がキャッシュされていれば直接回答を得ることができます。ない場合は,キャッシュサーバが組織外のコンテンツサーバに問い合わせを行い,その結果をリゾルバに回答します。また,キャッシュサーバは,同様の問い合わせの際に再利用できるよう,問い合わせで得た結果を一定期間キャッシュします。

リゾルバからキャッシュサーバに送られる問い合わせを再帰的な問合せという。"再 帰 的"とは,「再び帰ってくる」という意味で,再帰的な問合せに対しては,最終的な結果を回答する必要がある。

  • 例えばディレクトリツリーを掘るタイプのプログラムではよくやる処理
  • (F* で)競プロをやっていると意外と再帰を使う(使える)ことに気づいた
    • いわゆる関数型言語は(命令型で)ループを使うところは高階関数か再帰で処理する
    • たいてい高階関数で足りる
    • 再帰は末尾再帰など面倒ポイントがある
P.402 インターネット上の電話サービスで用いるプロトコル
  • VoIP(Voice over Internet Protocol)
  • IPネットワークで音声をやり取りするための技術
  • データの伝送にはリアルタイム性に優れたUDPをベースとしたプロトコルが使われる
    • 届かなかったらもう一度しゃべらせればいい
P.403 その他のアプリケーション層プロトコル
  • FTP:ファイルを送る。ポートは 20、21
    • セキュリティが甘いので FTP、FTPS、SFTP、SCP などがある
  • Telnet:(あまり使ったことない)
  • SSH(Secure SHell):サーバーにログインするときに使う。とにかくよく使う。
    • テキストベースの通信であるTelnetに対し,暗号化や認証技術を利用して安全に遠隔操作するためのプロトコル
  • NTP・SNTP(Network Time Protocol):時刻合わせ
  • LDAP(Lightweight Directory Access Protocol):ディレクトリサービスにアクセスするためのプロトコル
    • Windows の ActiveDirectory も LDAP を使っている
    • 社員情報をやり取りするシステム間連携で出てくる
P.404 7.7 伝送技術
P.404 誤り制御
P.404 パリティチェック
  • 最もシンプルな検査方法
  • 7 ビットのデータを送信する場合,8 ビット目に誤り検出用のパリティビットを入れてデータの整合性を検査
    • 偶数パリティ:8ビットの各ビットについて"1"の数が偶数になるようにパリティビットを挿入する
    • 奇数パリティ:上で奇数にする
  • 有限体(ガロア体)$\mathbb{F}_2$ (ビット)で考えるといってもいい。
  • 微分形式で偶数次と偶数次・偶数次と奇数の積が偶数次になり、奇数次と奇数次の積がと奇数次になるのも一種のパリティチェック。
  • cf. P.405 水平垂直パリティチェック
P.404 CRC
  • CRC:巡回冗長検査(Cyclic Redundancy Check)
  • 送信するデータに生成多項式を適用して誤り検出用の冗長データを作成し,それを付けて送信
  • 受信側は送信側と同じ生成多項式で受信データを割り,同じ結果であればデータ誤りが ないと判断
  • CRCでは複雑な演算を使ってバースト誤り も検出できる
    • バースト誤り:データ転送回線上で連続して発生するビットの誤りのこと。ノイズの混入で生じることが多い。
  • HDLC 手順が採用
P.404 ハミング符号
  • 上で紹介した動画で簡単に数学的な原理を紹介している
  • 情報ビットに対して検査ビットをつけて 2 ビットまでの誤り検出と,1 ビットの誤り自動訂正機能をもつ誤り制御方式
    • 原理的には何ビットの誤り検出・自動訂正でもできる
  • 代数幾何符号もある
    • 数学的にはもちろん難しい
    • 有限体上の(非特異な射影)代数曲線を使う
P.406 同期制御
  • 通信時に送信側と受信側でタイミングを合わせる必要がある。
  • 本の話題とは別に同期・非同期にはいろいろな話があって難しい。
  • プログラミング、特に JavaScript フロントエンド周り。
  • データベースの同期・非同期
    • 大規模サービスでの問題、READ-WRITE、マスター・スレーブ
    • ふつう読み込みに比べて書き込みは少ない
    • 場合によっては読み込みは完全に最新の情報でなくてもいい
    • 書き込みメインのデータベースと、その内容を適当なタイミングでもらってくる読み込み専用のデータベースがある:これがマスターとスレーブ
    • 参考:前にやった Twitter のシステム構成など
    • 適当な意味で完全同期していないとまずいシステムもある:銀行・金融系
      • cf. トランザクション
      • トランザクションはふつう銀行が例になるくらい、そちらの話が有名でしかもイメージしやすい
P.408 7.8 交換方式
P.408 パケット交換方式
  • 回線交換方式と対になる概念
    • 回線交換方式:通信を行うノード間で物理的な通信路を確保してから通信する
    • 例:電話
  • パケット交換方式について
    • データ送信するノードはデータをパケットに区切る。
    • ひとつひとつのパケットにヘッダを付けて送信。
    • ネットワーク内ではパケット交換機にパケットがたまる
    • ネットワークの状況に応じて順次送られる
パケット通信のメリット・デメリット
メリット

耐障害性 - 通信路を固定しないため,迂回経路が取れる。 - パケット交換機にデータが蓄積されているため,復旧まで待てる。 - パケット多重 - 1 対 1 の通信で回線を占有する必要がないため,1つの回線を多くのノードで共有でき,回線を効率的につかえる - 異機種間接続性 - パケット交換機で中継するときにプロトコル変換・速度変換でエンドノードどうしが同じプロトコルをサポートしていなくても通信できる

デメリット
  • ネットワーク内の蓄積交換処理による遅延
    • 蓄積交換処理による遅延解消のために主に回線の帯域を広げることで対応してきた
    • 構造上,完全には遅延をなくせない
  • パケット到着順序の不整合
P.408 ATM 交換方式
  • ATM(Asynchronous Transfer Mode:非同期転送モード)
  • 遅延のない回線交換方式とパケット交換方式の利点を得たい
  • パケット交換方式の発展
  • 遅延の原因をつぶす:特にパケットの多様性
    • 多種多様なパケットに対応するために,パケット交換機はソフトウェア処理が必要 ^ ATM での工夫の一例:最も特徴的なのは,パケット(ATMではセルという)の長さをヘッダ部 5 バイト,ペイロード 48 バイトの53バイトに統一
    • パケット解析がハードウェアだけでできる。
    • ソフトウェアは不要になった。
  • Wikipedia から
    • 当初の意図に反して非常に複雑な技術になってしまった
    • ATM は次世代の主流にならず限定的な使用にとどまった
    • ATM の設計思想は MPLS へと引き継がれた
    • 汎用のレイヤ 2 のパケットスイッチングのプロトコルとして、ルーターを介したIPの通信網で利用されている。
P.408 ペイロード(payload)
  • データ通信で本来転送したいデータ本体の部分、ボディを指す。
  • ATM ではペイロードのサイズを固定して処理を簡素化
  • 難点:パケット全体に占めるペイロードのサイズが相対的に小さくオーバヘッドが大きい
P.410 輻輳
  • フレームリレー:パケット交換方式の一種
    • 1 つの回線を多数のユーザで共有。
    • 回線がもつ潜在的な伝送能力(ワイヤスピード)を十分に引き出すうえで効果がある
  • 輻輳:ユーザの利用が一時期に集中すると,ワイヤスピードを超えるパケットがネットワーク上に流れる
    • ネットワークが輻輳状態になるとスループットが落ちる
  • フレームリレーサービスを提供する事業者は,ネットワークが輻輳状態に陥ってスループットが低下しても最低限保証する通信速度を決めている
    • CIR(Committed Information Rate:認定情 報速度)
P.370 7 ネットワーク
  • 確か 7.4 から始めた気がするので 7 章はじめから
P.370 7.1.1 OSI基本参照モデル
  • 改めて復習
  • OSI(Open System Interconnection)基本参照モデル- 異なる設計思想・世代のシステムと円滑に通信するのが目的に標準化
  • プロトコルの単機能化,交換の容易さが目的
    • 階層化のおかげで一部の階層の技術体系が変わっても、その階層だけ取り替えればいい
    • コスト・リスクを小さくする
P.370 プロトコルとサービス
  • N 層:それぞれの階層のこと
  • エンティティ:N 層に存在する通信機器などの実体
    • この言葉はいろいろなところで出てきていろいろな意味で使われる
    • もちろん気分的には適当な実体を指すことが多い
  • プロトコル:N 層に属するエンティティが通信するための取り決め
  • 上位の層が下位の層を利用しながら通信する
    • 別の階層間のエンティティどうしが通信する窓口が必要
    • これを提供するのが下位層:この機能をサービスと呼ぶ
  • プロトコルに沿った仕様で製品を開発すれば別のベンダの機器でも通信できる
  • 参考:ベンダーロックイン

特定ベンダー(メーカー)の独自技術に大きく依存した製品、サービス、システム等を採用した際に、他ベンダーの提供する同種の製品、サービス、システム等への乗り換えが困難になる現象のこと。

出来上がった情報システムの正確な仕様が、システムを開発・構築したベンダーにしか解らなくなる場合がある。結果、システムの保守・拡張・改修等の際、現存システムを開発・構築したベンダーに引き続き発注せざるを得なくなる。

  • 「Excel で行政に提出する書類を作れ」事案もそれ。
  • Apple 製品で身の回りを固めるのも同じ。
  • 「多様性が大事」事案でもある。
7.1.2 TCP/IPプロトコルスイート
  • プロトコル同士には相性がある
    • 「ネットワーク層がこのプロトコルならトランスポート層はこのプロトコルにしておくとトラブルが少ない」
  • 一般に同じ団体が作ったプロトコルはセットで使われることが多い
    • このセットがプロトコルスイート ^ 最も代表的なのは IP を中心に組まれた TCP/IP プロトコルスイート
    • 独自の階層モデルをもつ
P.372 TCP/IPの通信
  • データをパケットに区切る
    • 各パケットにヘッダを付けて送信
    • ヘッダは各階層ごとに付加されて次の階層へと渡される
    • 各ヘッダにはその階層で必要となる送信元や送信先,大きさ,順番などパケット自体に関する情報を含む
    • TCPヘッダを付加したパケット:TCP セグメント
    • IP ヘッダを付加したパケット:IP パケット
    • MACヘッダを付加したパケット:MAC フレームあるいはイーサネットフレーム
P.372 MAC(Media Access Control)アドレス
  • イーサネットや FDDI で使用される物理アドレス
    • イーサネット (Ethernet):コンピューターネットワークの規格の1つ。オフィスや家庭で一般的に使用されている有線LAN (Local Area Network) の技術規格
    • FDDI:LAN でデータ転送を行うための標準の一つ
      • Fiber distributed data interface
  • データリンク層
  • 同じネットワークに接続された隣接ノード間の通信で相手を識別するために使う
  • MACアドレスの長さ:6バイト
    • 先頭24ビットの OUI(ベンダID)
    • 後続24ビットの固有製造番号(製品に割り当てた番号)
  • MAC アドレスは機器が固有にもつ番号
    • 必ず一意に定まるように IEEE が管理
P372 ポート番号
  • トランスポート層にでノード内のアプリケーションの識別に使う識別子番号
    • 0-65535の範囲
  • TCP/IPではパケット交換方式でデータをやり取りする
  • よく使われるアプリケーションについてのポート番号は Well-Known ポートとして標準化
    • TCP・UDPそれぞれで 0-1023 番までの番号を割り当てている
    • SSH:TCP22番
    • Telnet:TCP23番
    • SMTP:TCP25番
    • HTTP:TCP80番
    • POP3:TCP110番
    • IMAP4:TCP143番
    • HTTPS :TCP443番
    • NTP:UDP123番
    • SNMP:UDP161番
    • SNMP Trap :UDP162番
  • セキュリティ対策のために標準とはポート番号を変えることもある
  • Web 開発の本を読んでいると、いろいろな都合から http のポートを 80 以外にしていることもよくある。
    • 80 の場合はポートを指定しなくてもいい
      • 例:http://localhost/hoge/fuga
      • 例:http://localhost:5000/hoge/fuga
P.373 ネットワーク間の通信
  • 同じネットワークに接続されたノード間はデータリンク層(第 2 層)の通信
  • ネットワークを超えたノード間はネットワーク層(第 3 層)の通信 -実際に図 7.1.4 を見よう
    • どこが IP アドレスでのやりとりか?
    • どこが MAC アドレスでのやり取りか?
P.374 7.2 ネットワーク接続装置と関連技術
P.374 7.2.1 物理層の接続
P.374 リピータ
  • ネットワーク上を流れる電流の増幅装置・整流装置
  • 物理層:第 1 層
  • データ通信はネットワーク上を流れる電流
    • ケーブルが長いと電流が減衰・波形が乱れが起きる
    • データが読み取れなくなる
    • これを増幅するのがリピータ
  • 大昔の電話は距離が遠いと音が小さく聞こえにくかった
    • まさにこの減衰が問題
  • リピータは 1:1 で繋ぐ
    • 現在では複数のノードを接続できるマルチポートリピータ(ハブ)が使われるのが一般的
P.374 7.2.2 データリンク層の接続
  • 第2層
P374 ブリッジ
  • データリンク層に位置
  • ネットワーク上を流れているフレーム(情報の単位)の MAC アドレスを認識して通信を中継する
    • 接続されているノードをコリジョンドメイン(セグメント)という単位に分割
    • MAC アドレスで判定したフレームのあて先のあるセグメントだけにフレームを送信
    • 無駄なトラフィックの回避

2020-10-04 進捗

  • 今日の進捗
    • 基礎知識編:P.406 の同期制御まで
    • 本編:03_04 はじめから、03-05 最急降下法の簡単な説明まで
  • 次回
    • 基礎知識編:P.408 7.8 交換方式から
    • 本編:03-05 最急降下法の復習

課題

TODO

自分用メモ

  • 遅延型方程式に対するコメント追加
  • matplotlib のチュートリアルを読もうの会
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる

Matplotlib

  • 本当に簡単な図を描く
  • これを参考に scipy お絵描き
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import sph_harm

m,l = 1,1
theta = np.linspace(0, np.pi, 101)
phi = np.linspace(0, 2 * np.pi, 151)
theta, phi = np.meshgrid(theta, phi)

r = sph_harm(m, l, phi, theta).real
x = np.abs(r) * np.sin(theta) * np.cos(phi)
y = np.abs(r) * np.sin(theta) * np.sin(phi)
z = np.abs(r) * np.cos(theta)

fig = plt.figure(figsize=(8, 8))
ax = fig.gca(projection="3d")
ax.plot_surface(x, y, z, color="aqua", edgecolor="k")
plt.axis("off")
plt.show()

TeX の記録

  • 拡散方程式

\begin{align} u_t = \triangle u. \end{align}

競プロ、AtCoder

6. 素因数分解を活用した考察6-3. 素数を分け合う

問題

$N$ 個の $1$ 以上の整数 $a_1,a_2,\dots,a_N$ があります. $a_1,a_2,\dots,a_N$ の値はわかりませんが, $a_1 \times a_2 \times \cdots \times a_N = P$ がわかっています. $a_1,a_2,\dots,a_N$ の最大公約数として考えられるもののうち, 最も大きいものを求めてください.

ポイント
  • 「(整数の積) = (整数)」という形の式を見たら素因数分解を考えてみる
  • $P$ を素因数分解する
    • $a_1 a_2 \cdots a_N= p_1^{e_1} p_2^{e_2} \cdots p_K^{e_K}$
    • $e_1$ 個の $p_1$
    • $e_2$ 個の $p_2$
    • ...
    • $e_K$ 個の $p_K$
  • $a_1,a_2,\cdots,a_N$ の $N$ 人で分け合う
  • $a_1,a_2,\cdots,a_N$ の最大公約数をなるべく大きくするには素数をなるべく均等に分配する
  • 注意:「各素因数ごとに独立に考えて良い」
  • まとめ
    • $P=p_1^{e_1} e_2^{p_2} \cdots p_K^{e_K}$ と素因数分解する
    • 各素因数 $p_i$ について、$e_i/N$ を計算し、あまりは切り捨てる
    • その個数だけ $p_i$ をかける

コードの参考

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
def prime_factorize(p):
    # 計算結果を積む変数
    arr = []

    # 各素因数ごとに考えればいい
    # 2 だけ別に処理: 割れるだけ割っておく
    if p % 2 == 0:
        # 「べき」を積む変数を初期化
        cnt = 0
        while p % 2 == 0:
            cnt += 1
            p //= 2 # どんどん割っていく
        # 2 のべきをリストで積む
        arr.append([2, cnt])

    # 奇素数に対する処理
    q = 3
    # 素数のループの定型処理: p の平方根まで計算すればいい
    # ループ中で p 自体をどんどん小さくしていくのではじめに sqrt_p を計算してはいけない
    while q * q <= p:
        if p % q == 0:
            cnt = 0
            while p % q == 0:
                p //= q # q でどんどん割って小さくする
                cnt += 1 # 割れたらカウントアップ
            arr.append([q, cnt])
            q += 2 # 偶数は既に処理しているので偶数は飛ばしていい
        else:
            q += 2 # 偶数は既に処理しているので偶数は飛ばしていい
            continue

    # p が素数の場合の処理
    if p != 1:
        arr.append([p, 1])

    return arr

def solve(n, p):
    # n, p = map(int, input().split())
    # 計算結果を積む変数
    ans = 1

    # p = 1 は別処理
    if p == 1:
        return 1

    pr_list = prime_factorize(p)

    # a^b が p の素因数分解に含まれる
    for a, b in pr_list:
        # b は p の素因数分解のべきで, n 等分できないなら無視する
        if b >= n:
            # 最大公約数を考えるので a^b を適切な形で積む
            ans *= a ** (b // n)

    return ans

print(solve(3, 24))           # 2
print(solve(5, 1))            # 1
print(solve(1, 111))          # 111
print(solve(4, 972439611840)) # 206
1
2
3
4
2
1
111
206
1
2
3
4
2
1
111
206
1
206

Project Euler も見てみよう

  • Problem5
  • GitHub の回答集
  • 中高生の数学・プログラミング学習用によかろうと思い、ちょこちょこやっている
基礎知識
  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。

復習

OSI基本参照モデル
  • 会社の部署と同じ気分
  • 特定層は自分のところにしか責任を持たない
  • 「他の層は他の層で専門的に管轄してね」
  • お互い全くの無関係ではないが、基本的には自分のことだけ考えていればいい。

いろいろなプロトコル

  • IP, HTTP, SMTP, POP, ARP...
  • 通信の規格
  • 状況に応じて適切なプロトコルを選ぶ
  • ヘッダ・ボディーの概念

本の記述を追いかける

[P.398 メール受信プロトコル、メール関連のプロトコル・規格]{#P398}
  • 昔のプロトコルはセキュリティ関連の仕様がなかった
  • SMTP-AUTH, SMTP over TLS/SSL など
P.399 Web 関連
  • HTTP: HTTP(Hyper Text Transfer Protocol)は WebサーバとWebクライアント(ブラウザ)間でHTMLなどのWeb情報の配信 に使うプロトコル
    • セキュリティ:HTTP に SSL/TLS の認証機能や通信の暗号化を実装した HTTPS が登場
  • SOAP: XML を使ってデータ構造を記述
    • 最近あまり見かけない印象
    • XML 自体もうあまり使わない
    • 最近は JSON や GQL をよく見かける
[P.401 DNS(Domain Name System)]{#P401_DNSDomain_Name_System}
  • TCP/IPでは,各ノードに対して一意なIPアドレスが割り当てられている
  • IPアドレスは覚えにくい
  • IP アドレスと対応する別名であるドメイン名がつけた
  • ドメインと IP を対応させるサービスが DNS
  • 原理的には世界中のすべてのノードのドメイン名とIPアドレスの対応関係を知ってい なければならない
    • 事実上不可能
    • DNSの規約では変換表作成の負担を細分化して,DNSを分散データベースとすることで対応しています。
  • DNS ルートサーバー
  • DNS ポイズニングのような攻撃手法もある
[P.402 DNS クライアント(リゾルバ)の名前解決要求]{#P402_DNS}

コンテンツサーバへの問い合わせを繰り返すのは非効率なので,通常,自組織内にキャッシュサーバを置きます。この場合,リゾルバはキャッシュサーバに問い合わせを行い,キャッシュサーバ内に該当情報がキャッシュされていれば直接回答を得ることができます。ない場合は,キャッシュサーバが組織外のコンテンツサーバに問い合わせを行い,その結果をリゾルバに回答します。また,キャッシュサーバは,同様の問い合わせの際に再利用できるよう,問い合わせで得た結果を一定期間キャッシュします。

リゾルバからキャッシュサーバに送られる問い合わせを再帰的な問合せという。"再 帰 的"とは,「再び帰ってくる」という意味で,再帰的な問合せに対しては,最終的な結果を回答する必要がある。

  • 例えばディレクトリツリーを掘るタイプのプログラムではよくやる処理
  • (F# で)競プロをやっていると意外と再帰を使う(使える)ことに気づいた
    • いわゆる関数型言語は(命令型で)ループを使うところは高階関数か再帰で処理する
    • たいてい高階関数で足りる
    • 再帰は末尾再帰など面倒ポイントがある
[P.402 インターネット上の電話サービスで用いるプロトコル]{#P402}
  • VoIP(Voice over Internet Protocol)
  • IPネットワークで音声をやり取りするための技術
  • データの伝送にはリアルタイム性に優れたUDPをベースとしたプロトコルが使われる
    • 届かなかったらもう一度しゃべらせればいい
[P.403 その他のアプリケーション層プロトコル]{#P403}
  • FTP:ファイルを送る。ポートは 20、21
    • セキュリティが甘いので FTPS、SFTP、SCP などがある
  • Telnet:(あまり使ったことない)
  • SSH(Secure SHell):サーバーにログインするときに使う。とにかくよく使う。
    • テキストベースの通信であるTelnetに対し,暗号化や認証技術を利用して安全に遠隔操作するためのプロトコル
  • NTP・SNTP(Network Time Protocol):時刻合わせ
  • LDAP(Lightweight Directory Access Protocol):ディレクトリサービスにアクセスするためのプロトコル
    • Windows の ActiveDirectory も LDAP を使っている
    • 社員情報をやり取りするシステム間連携で出てくる
[P.404 7.7 伝送技術]{#P404_77}
[P.404 誤り制御]{#P404}
[P.404 パリティチェック]{#P404-2}
  • 最もシンプルな検査方法
  • 7 ビットのデータを送信する場合,8 ビット目に誤り検出用のパリティビットを入れてデータの整合性を検査
    • 偶数パリティ:8ビットの各ビットについて"1"の数が偶数になるようにパリティビットを挿入する
    • 奇数パリティ:上で奇数にする
  • 有限体(ガロア体)$\mathbb{F}_2$ (ビット)で考えるといってもいい。
  • 微分形式で偶数次と偶数次・偶数次と奇数の積が偶数次になり、奇数次と奇数次の積がと奇数次になるのも一種のパリティチェック。
  • cf. P.405 水平垂直パリティチェック
[P.404 CRC]{#P404_CRC}
  • CRC:巡回冗長検査(Cyclic Redundancy Check)
  • 送信するデータに生成多項式を適用して誤り検出用の冗長データを作成し,それを付けて送信
  • 受信側は送信側と同じ生成多項式で受信データを割り,同じ結果であればデータ誤りが\ ないと判断
  • CRCでは複雑な演算を使ってバースト誤り も検出できる
    • バースト誤り:データ転送回線上で連続して発生するビットの誤りのこと。ノイズの混入で生じることが多い。
  • HDLC 手順が採用
[P.404 ハミング符号]{#P404-3}
  • 上で紹介した動画で簡単に数学的な原理を紹介している
  • 情報ビットに対して検査ビットをつけて 2 ビットまでの誤り検出と,1 ビットの誤り自動訂正機能をもつ誤り制御方式
    • 原理的には何ビットの誤り検出・自動訂正でもできる
  • 代数幾何符号もある
    • 数学的にはもちろん難しい
    • 有限体上の(非特異な射影)代数曲線を使う
[P.406 同期制御]{#P406}
  • 通信時に送信側と受信側でタイミングを合わせる必要がある。
  • 本の話題とは別に同期・非同期にはいろいろな話があって難しい。
  • プログラミング、特に JavaScript フロントエンド周り。
  • データベースの同期・非同期
    • 大規模サービスでの問題、READ-WRITE、マスター・スレーブ
    • ふつう読み込みに比べて書き込みは少ない
    • 場合によっては読み込みは完全に最新の情報でなくてもいい
    • 書き込みメインのデータベースと、その内容を適当なタイミングでもらってくる読み込み専用のデータベースがある:これがマスターとスレーブ
    • 参考:前にやった Twitter のシステム構成など
    • 適当な意味で完全同期していないとまずいシステムもある:銀行・金融系
      • cf. トランザクション
      • トランザクションはふつう銀行が例になるくらい、そちらの話が有名でしかもイメージしやすい
[P.408 7.8 交換方式]{#P408_78}
[P.408 パケット交換方式]{#P408}
  • 回線交換方式と対になる概念
    • 回線交換方式:通信を行うノード間で物理的な通信路を確保してから通信する
    • 例:電話
  • パケット交換方式について
    • データ送信するノードはデータをパケットに区切る。
    • ひとつひとつのパケットにヘッダを付けて送信。
    • ネットワーク内ではパケット交換機にパケットがたまる
    • ネットワークの状況に応じて順次送られる
[パケット通信のメリット・デメリット]{#i-10}
[メリット]{#i-11}

耐障害性\ -- 通信路を固定しないため,迂回経路が取れる。\ -- パケット交換機にデータが蓄積されているため,復旧まで待てる。

  • パケット多重
    • 1 対 1 の通信で回線を占有する必要がないため,1つの回線を多くのノードで共有でき,回線を効率的につかえる
  • 異機種間接続性
    • パケット交換機で中継するときにプロトコル変換・速度変換でエンドノードどうしが同じプロトコルをサポートしていなくても通信できる
[デメリット]{#i-12}
  • ネットワーク内の蓄積交換処理による遅延
    • 蓄積交換処理による遅延解消のために主に回線の帯域を広げることで対応してきた
    • 構造上,完全には遅延をなくせない
  • パケット到着順序の不整合
[P.408 ATM 交換方式]{#P408_ATM}
  • ATM(Asynchronous Transfer Mode:非同期転送モード)
  • 遅延のない回線交換方式とパケット交換方式の利点を得たい
  • パケット交換方式の発展
  • 遅延の原因をつぶす:特にパケットの多様性
    • 多種多様なパケットに対応するために,パケット交換機はソフトウェア処理が必要\ \^ ATM での工夫の一例:最も特徴的なのは,パケット(ATMではセルという)の長さをヘッダ部 5 バイト,ペイロード 48 バイトの53バイトに統一
    • パケット解析がハードウェアだけでできる。
    • ソフトウェアは不要になった。
  • Wikipedia から
    • 当初の意図に反して非常に複雑な技術になってしまった
    • ATM は次世代の主流にならず限定的な使用にとどまった
    • ATM の設計思想は MPLS へと引き継がれた
    • 汎用のレイヤ 2 のパケットスイッチングのプロトコルとして、ルーターを介したIPの通信網で利用されている。
[P.408 ペイロード(payload)]{#P408_payload}
  • データ通信で本来転送したいデータ本体の部分、ボディを指す。
  • ATM ではペイロードのサイズを固定して処理を簡素化
  • 難点:パケット全体に占めるペイロードのサイズが相対的に小さくオーバヘッドが大きい
[P.410 輻輳]{#P410}
  • フレームリレー:パケット交換方式の一種
    • 1 つの回線を多数のユーザで共有。
    • 回線がもつ潜在的な伝送能力(ワイヤスピード)を十分に引き出すうえで効果がある
  • 輻輳:ユーザの利用が一時期に集中すると,ワイヤスピードを超えるパケットがネットワーク上に流れる
    • ネットワークが輻輳状態になるとスループットが落ちる
  • フレームリレーサービスを提供する事業者は,ネットワークが輻輳状態に陥ってスループットが低下しても最低限保証する通信速度を決めている
    • CIR(Committed Information Rate:認定情\ 報速度)
P.370 7 ネットワーク]{#P370_7}
  • 確か 7.4 から始めた気がするので 7 章はじめから
[P.370 7.1.1 OSI基本参照モデル]{#P370_711_OSI}
  • 改めて復習
  • OSI(Open System Interconnection)基本参照モデル- 異なる設計思想・世代のシステムと円滑に通信するのが目的に標準化
  • プロトコルの単機能化,交換の容易さが目的
    • 階層化のおかげで一部の階層の技術体系が変わっても、その階層だけ取り替えればいい
    • コスト・リスクを小さくする
[P.370 プロトコルとサービス]{#P370}
  • N 層:それぞれの階層のこと
  • エンティティ:N 層に存在する通信機器などの実体
    • この言葉はいろいろなところで出てきていろいろな意味で使われる
    • もちろん気分的には適当な実体を指すことが多い
  • プロトコル:N 層に属するエンティティが通信するための取り決め
  • 上位の層が下位の層を利用しながら通信する
    • 別の階層間のエンティティどうしが通信する窓口が必要
    • これを提供するのが下位層:この機能をサービスと呼ぶ
  • プロトコルに沿った仕様で製品を開発すれば別のベンダの機器でも通信できる
  • 参考:ベンダーロックイン

特定ベンダー(メーカー)の独自技術に大きく依存した製品、サービス、システム等を採用した際に、他ベンダーの提供する同種の製品、サービス、システム等への乗り換えが困難になる現象のこと。

出来上がった情報システムの正確な仕様が、システムを開発・構築したベンダーにしか解らなくなる場合がある。結果、システムの保守・拡張・改修等の際、現存システムを開発・構築したベンダーに引き続き発注せざるを得なくなる。

  • 「Excel で行政に提出する書類を作れ」事案もそれ。
  • Apple 製品で身の回りを固めるのも同じ。
  • 「多様性が大事」事案でもある。
[7.1.2 TCP/IPプロトコルスイート]{#712_TCPIP}
  • プロトコル同士には相性がある
    • 「ネットワーク層がこのプロトコルならトランスポート層はこのプロトコルにしておくとトラブルが少ない」
  • 一般に同じ団体が作ったプロトコルはセットで使われることが多い
    • このセットがプロトコルスイート\ \^ 最も代表的なのは IP を中心に組まれた TCP/IP プロトコルスイート
    • 独自の階層モデルをもつ
[P.372 TCP/IPの通信]{#P372_TCPIP}
  • データをパケットに区切る
    • 各パケットにヘッダを付けて送信
    • ヘッダは各階層ごとに付加されて次の階層へと渡される
    • 各ヘッダにはその階層で必要となる送信元や送信先,大きさ,順番などパケット自体に関する情報を含む
    • TCPヘッダを付加したパケット:TCP セグメント
    • IP ヘッダを付加したパケット:IP パケット
    • MACヘッダを付加したパケット:MAC フレームあるいはイーサネットフレーム
[P.372 MAC(Media Access Control)アドレス]{#P372_MACMedia_Access_Control}
  • イーサネットや FDDI で使用される物理アドレス
    • イーサネット (Ethernet):コンピューターネットワークの規格の1つ。オフィスや家庭で一般的に使用されている有線LAN (Local Area Network) の技術規格
    • FDDI:LAN でデータ転送を行うための標準の一つ
      • Fiber distributed data interface
  • データリンク層
  • 同じネットワークに接続された隣接ノード間の通信で相手を識別するために使う
  • MACアドレスの長さ:6バイト
    • 先頭24ビットの OUI(ベンダID)
    • 後続24ビットの固有製造番号(製品に割り当てた番号)
  • MAC アドレスは機器が固有にもつ番号
    • 必ず一意に定まるように IEEE が管理
[P372 ポート番号]{#P372}
  • トランスポート層にでノード内のアプリケーションの識別に使う識別子番号
    • 0-65535の範囲
  • TCP/IPではパケット交換方式でデータをやり取りする
  • よく使われるアプリケーションについてのポート番号は Well-Known ポートとして標準化
    • TCP・UDPそれぞれで 0-1023 番までの番号を割り当てている
    • SSH:TCP22番
    • Telnet:TCP23番
    • SMTP:TCP25番
    • HTTP:TCP80番
    • POP3:TCP110番
    • IMAP4:TCP143番
    • HTTPS :TCP443番
    • NTP:UDP123番
    • SNMP:UDP161番
    • SNMP Trap :UDP162番
  • セキュリティ対策のために標準とはポート番号を変えることもある
  • Web 開発の本を読んでいると、いろいろな都合から http のポートを 80 以外にしていることもよくある。
    • 80 の場合はポートを指定しなくてもいい
      • 例:http://localhost/hoge/fuga
      • 例:http://localhost:5000/hoge/fuga
[P.373 ネットワーク間の通信]{#P373}
  • 同じネットワークに接続されたノード間はデータリンク層(第 2 層)の通信
  • ネットワークを超えたノード間はネットワーク層(第 3 層)の通信 -実際に図 7.1.4 を見よう
    • どこが IP アドレスでのやりとりか?
    • どこが MAC アドレスでのやり取りか?
[P.374 7.2 ネットワーク接続装置と関連技術]{#P374_72}
[P.374 7.2.1 物理層の接続]{#P374_721}
[P.374 リピータ]{#P374}
  • ネットワーク上を流れる電流の増幅装置・整流装置
  • 物理層:第 1 層
  • データ通信はネットワーク上を流れる電流
    • ケーブルが長いと電流が減衰・波形が乱れが起きる
    • データが読み取れなくなる
    • これを増幅するのがリピータ
  • 大昔の電話は距離が遠いと音が小さく聞こえにくかった
    • まさにこの減衰が問題
  • リピータは 1:1 で繋ぐ
    • 現在では複数のノードを接続できるマルチポートリピータ(ハブ)が使われるのが一般的
[P.374 7.2.2 データリンク層の接続]{#P374_722}
  • 第2層
[P374 ブリッジ]{#P374-2}
  • データリンク層に位置
  • ネットワーク上を流れているフレーム(情報の単位)の MAC アドレスを認識して通信を中継する
    • 接続されているノードをコリジョンドメイン(セグメント)という単位に分割
    • MAC アドレスで判定したフレームのあて先のあるセグメントだけにフレームを送信
    • 無駄なトラフィックの回避
  • ポートの記憶
    • 通信のたびにある MAC アドレスをもつノードがどのポート\ に接続されているか学習
    • 次回の通信時には余分なポートには通信を中継しない。
  • ブリッジの動作
    • あて先MACアドレスをもとにMACアドレステーブルを参照する
    • あて先MACアドレスの接続ポートがフレームを受信したポー トと別ポートであれば,そのポートにフレームを送信し
      • 同一ポートであればフレームを破棄する
    • あて先MACアドレスが記憶されていない場合やブロードキャス\ トアドレス(FF-FF-FF-FF-FF-FF)の場合は,受信ポート以外のすべてのポートにフレームを送信する
[P.375 スイッチングハブ]{#P375}
  • レイヤ2スイッチ(L2スイッチ)とも呼ばれる
  • データリンク層に位置
  • ブリッジと同じ働きをする
    • MAC アドレスを認識してフレームのあて先を決めて通信を行います。
  • 試験での問われ方
    • スイッチングハブはフレームの蓄積機能、速度変換機能や交換機\ 能をもっている。
    • このようなスイッチングハブと同等の機能をもち,同じプロトコル階層で動作する装置はどれか
    • 答えは「ブリッジ」
[P.375 ブロードキャストストリーム]{#P375-2}
  • データリンク層で動作するブリッジやスイッチングハブなどの\ LANスイッチはブロードキャストフレームを受信ポート以外\ のすべてのポートに転送
  • これらの機器をループ状に接続し冗長化させると信頼性はあがる
    • ブロードキャストフレームは永遠に回り続けながら増える
    • 最終的にはネットワークダウンを招く
    • この現象をブロードキャストストームという
  • ブロードキャストストームを防ぐプロトコル:スパニングツリープロトコル(Spanning Tree Protocol:STP)
    • ループを構成している一部のポートを通常運用時にはブロック(論理的に切断)する
    • ネットワーク全体をループをもたない論理的なツリー構造にする
[P.376 ネットワーク層の接続]{#P376}
  • 第 3 層(レイヤ 3)
[P.376 ルータ]{#P376-2}
  • ルータはネットワーク層(第 3 層)に位置する
    • あて先IPアドレスを見てパケットの送り先を決め通信を制御する
  • IP のローカルネットワークの境界線に設置して利用され,ネットワークの基本単位として機能
  • 世界中に散在しているローカルネットワークどうしをルータが結ぶ
    • 全体としてインターネットというインフラが機能
  • ルータで分けられたネットワークの単位をブロードキャストドメインという
  • ルータがパケットを受け取ったあと
    • あて先IPアドレスを見る
    • 自分のネットワークあてであれば,破棄
    • 他のネットワークあてであれば転送
      • どのルータへ送ればあて先のネットワークへの通信が速く行えるかを判断することを経路制御(ルーティング)
      • ルータはそのための経路表(ルーティングテーブル)を備えている
[P.376 デフォルトゲートウェイ]{#P376-3}
  • 会社Aのネットワークに属するPCは会社BのPCと直接通信できない
  • 会社AのPCは他ネットワークへの接点であるルータAに転送を依頼
  • デフォルトゲートウェイ:会社AのPCから見て直近のルータA
  • 自分と直接接続していない相手と通信するときはすべてデフォルト\ ゲートウェイを中継する
[P.376 ルーティング]{#P376-4}
  • 経路表(ルーティングテーブル)の作成方法
    • 手作業で作る:スタティックルーティング
    • ルーティングプロトコル利用:ルータ同士が経路情報を交換し、自立的に経路表を作るダイナミックルーティング
  • ダイナミックルーティングのための代表的なルーティングプロトコル:RIP、OSPF
  • RIP:ディスタンスベクタ型(距離ベクトル型)
    • ルーティングテーブルの情報(経路情報)を一定時間間隔で交換しあう
    • あて先ネットワークにいたるまでに経由するルータの数(ホップ数)最小経路を選ぶ
    • あて先に到達可能な最大ホップ数は 15
      • これを超えた経路は採用されない
  • OSPF:リンクステート型
    • コストを経路選択の要素に取り入れ、コスト最小経路を選ぶ
    • コスト値は,回線速度を基に自動的に算出されるが手動設定もできる
    • コスト算出式「コスト=100Mbps/経路の通信帯域(bps)」
  • コスト計算例は P.377 の図を見ること
[P.377 ルータの冗長構成]{#P377}
  • ルータを冗長構成のために使うプロトコル:VRRP(Virtual Router Redundancy Protocol )
  • 同じ LAN に接続された複数のルータを仮想的に 1 台のルータ\ として見えるようにして冗長構成を実現する
  • 複数のルータでグループ(VRRP グループ)を作る
  • VRRP グループごとに仮想 IP アドレスと仮想 MAC アドレスを割り当て
  • PC などのノードは仮想ルータの IP アドレスに対して通信
  • 通常時はグループのマスタルータが仮想ルータの IP アドレス(仮想 IP アドレス)を保持
  • マスタルータに障害が発生すると他のバックアップルータがこれを継承
[P.377 レイヤ3スイッチ(L3スイッチ)]{#P377_3L3}
  • ルータと同じネットワーク層(第 3 層)の通信機器
  • 特徴
    • ルータ:ソフトウェアで転送処理
    • レイヤ 3 スイッチ:専用ハードウェアで転送処理
  • 高速処理できる:大容量のファイルを扱うファイルサーバへのアクセスなど
[P.378 トランスポート層以上の層の接続]{#P378}
[P.378 ゲートウェイ]{#P378-2}
  • トランスポート層(第 4 層)-アプリケーション層(第7層)でネットワーク接続するための装置
  • 第 3 層のネットワーク層まででエンドツーエンド(E2E)の通信は完成する
    • E2E = 通信を行う二者、あるいは、二者間を結ぶ経路全体
    • エンドツーエンド原理:高度な通信制御や複雑な機能は末端のシステムが担い、経路上のシステムは単純に信号やデータの中継・転送だけすべし
    • TCP/IP ネットワークの原理
    • 誤り訂正・フロー制御・再送:TCP 層(第4層、トランスポート層)など上位側の機器やソフトウェア・プロトコル
    • 単純な送受信・転送処理:IP 層(第3層、ネットワーク層)
  • ゲートウェイ:第 4 層のトランスポート層以上が違う LAN システム相互間のプロトコル・データ形式の変換を担う
  • ゲートウェイはアプリケーションプロトコルの内容を 解釈できる
    • アプリケーションヘッダの不正な情報混入を検出可能
    • ファイアウォール・プロキシサーバもゲートウェイの一種
[P.378 L4スイッチ・L7スイッチ]{#P378_L4L7}
  • L4スイッチ(レイヤ4スイッチ)はトランスポート層(第4層)の装置
    • 定義としてはゲートウェイ
    • 機能的にはレイヤ2スイッチ・レイヤ3スイッチの延長上
    • ルータやレイヤ3スイッチはIPアドレスを参照して経路制御する
    • L4スイッチではTCPポート番号やUDPポート番号も経路制御判断に使える:第4層の機器だから
  • L7スイッチ:アプリケーション層(第7層)までの情報を使って通信制御する
[P.379 7.2.5 VLAN]{#P379_725_VLAN}
  • VLAN(Virtual LAN:仮想LAN)
  • スイッチ(レイヤ2スイッチ,レイヤ3スイッチ)で物理的な接続形態とは独立に仮想的なLANグループを構成する仕組み,あるいはそう構成されたLAN
  • 複雑な形態のネットワークを楽に構築できる
  • サブネット構成も柔軟に変えられる
[P.380 データ林宗の制御とプロトコル]{#P380}
  • データリンク層:第2層

2020-10-24 課題

  • 先に進む前に録画してあるか確認しよう

進捗

  • 前回の進捗
    • 基礎知識編:P.408 7.8 交換方式から
      • ネットワークの話に飽きてきたのでデータベースの話をする
    • 本編:03-05 最急降下法の復習
      • メモ:あとで 2 次元の場合のグラフなどを追加する
      • 等高線が密なところは勾配が急:ここを通って最小化していく
  • 今回の進捗
    • 基礎知識編:(ネットワークを飛ばして)「P.290 物理設計」まで
    • 本編:03-05 「グラフの解説」まで

課題

TODO

自分用メモ

  • 遅延型方程式に対するコメント追加
  • matplotlib のチュートリアルを読もうの会
    • 公式情報に触れる重要性
    • 古い情報が古いと書いてあったりする:たとえば pylab
    • Gallery
      • 見ていて面白い
      • 「どこをいじるとどう変わるか」が視覚的にわかる
      • 公式情報なのできちんとアップデートしてくれている(はず)
      • 公式情報にソースがあるので自分でいろいろ書き換えていて破滅したとき、必ずオリジナルを復元できる

Matplotlib

  • 本当に簡単な図を描く
  • これを参考に scipy お絵描き
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import sph_harm

m,l = 1,2
theta = np.linspace(0, np.pi, 101)
phi = np.linspace(0, 2 * np.pi, 151)
theta, phi = np.meshgrid(theta, phi)

r = sph_harm(m, l, phi, theta).real
x = np.abs(r) * np.sin(theta) * np.cos(phi)
y = np.abs(r) * np.sin(theta) * np.sin(phi)
z = np.abs(r) * np.cos(theta)

fig = plt.figure(figsize=(8, 8))
ax = fig.gca(projection="3d")
ax.plot_surface(x, y, z, color="aqua", edgecolor="k")
plt.axis("off")
plt.show()

TeX の記録

  • 波動方程式

\begin{align} u_{tt} = \triangle u. \end{align}

競プロ、AtCoder

6. 素因数分解を活用した考察6-4. 約数の構造を知る)

問題

正整数 A,B が与えられます。 A と B の正の公約数の中からいくつかを選びます。 ただし、選んだ整数の中のどの異なる 2 つの整数についても互いに素でなければなりません。 最大でいくつ選べるでしょうか。

(数値例)

・A=60

・B=72

答え:3

60 と 72 の公約数は 1, 2, 3, 4, 6, 12 の 6 個ですが、このうち 1, 3, 4 を選ぶと「どの二つも互いに素」となっています。

ポイント
  • 2 つの整数に関する問題から 1 つの整数に関する次の問題のように書き換える

正の整数 $G$ が与えられる。$G$ の約数の中から、「どの二つも互いに素となるように」いくつか選びたい。選べる個数の最大値を求めよ。

  • $G$ を素因数分解する
    • $a_1 a_2 \cdots a_N= p_1^{e_1} p_2^{e_2} \cdots p_K^{e_K}$
  • どの 2 つも互いに素になるように約数を取る = 各素因数だけ取ってくる
    • 最大公約数が 1 の数のペアが互いに素な数のペアなので、1 をいれてもいい
    • 「素因数の個数+1」が求める最大数
    • 1 を含めないといけないのが割とはまりポイントになりそう。

コードの参考

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#最大公約数の計算: 再帰的に書いた
#gcd = Greatest Common Divisor
def gcd(a,b):
    return a if b == 0 else gcd(b, a % b)

def factorize(n):
    i = 2
    res = []
    # いつものルート n までの処理
    while i*i <= n:
        while n % i == 0:
            # 割り切れる間は割り続ける
            n //= i
            # 各素因数のべきなど細分してもいいが, とりあえずリストにバンバン突っ込む
            # あとの処理を考えるならはじめから set にしてもいい
            res.append(i)
        i += 1
    # n が素数の場合の処理
    if n > 1:
        res.append(n)
    return res

def solve(a, b):
    g = gcd(a, b)
    pf = factorize(g)
    # 素因数のべきを考えずにただただ素因数をリストに突っ込んでいるので, set で素因数の個数が取れる
    return len(set(pf)) + 1

print(solve(12, 18)) # 12, 18 => 3
print(solve(420, 660)) # 420 660 => 4
print(solve(1, 2019)) # 1 2019 => 1
1
2
3
3
4
1

IT 基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。
  • ネットワークの話もいい加減飽きたので、DB の話を先行してやるか?

復習

OSI基本参照モデル
  • 会社の部署と同じ気分
  • 特定層は自分のところにしか責任を持たない
  • 「他の層は他の層で専門的に管轄してね」
  • お互い全くの無関係ではないが、基本的には自分のことだけ考えていればいい。
いろいろなプロトコル
  • IP, HTTP, SMTP, POP, ARP...
  • 通信の規格
  • 状況に応じて適切なプロトコルを選ぶ
  • ヘッダ・ボディーの概念

本の記述を追いかける

P.408 7.8 交換方式
P.408 パケット交換方式
  • 回線交換方式と対になる概念
    • 回線交換方式:通信を行うノード間で物理的な通信路を確保してから通信する
    • 例:電話
  • パケット交換方式について
    • データ送信するノードはデータをパケットに区切る。
    • ひとつひとつのパケットにヘッダを付けて送信。
    • ネットワーク内ではパケット交換機にパケットがたまる
    • ネットワークの状況に応じて順次送られる
パケット通信のメリット・デメリット
メリット

耐障害性 - 通信路を固定しないため,迂回経路が取れる。 - パケット交換機にデータが蓄積されているため,復旧まで待てる。 - パケット多重 - 1 対 1 の通信で回線を占有する必要がないため,1つの回線を多くのノードで共有でき,回線を効率的につかえる - 異機種間接続性 - パケット交換機で中継するときにプロトコル変換・速度変換でエンドノードどうしが同じプロトコルをサポートしていなくても通信できる

デメリット
  • ネットワーク内の蓄積交換処理による遅延
    • 蓄積交換処理による遅延解消のために主に回線の帯域を広げることで対応してきた
    • 構造上,完全には遅延をなくせない
  • パケット到着順序の不整合
P.408 ATM 交換方式
  • ATM(Asynchronous Transfer Mode:非同期転送モード)
  • 遅延のない回線交換方式とパケット交換方式の利点を得たい
  • パケット交換方式の発展
  • 遅延の原因をつぶす:特にパケットの多様性
    • 多種多様なパケットに対応するために,パケット交換機はソフトウェア処理が必要 ^ ATM での工夫の一例:最も特徴的なのは,パケット(ATMではセルという)の長さをヘッダ部 5 バイト,ペイロード 48 バイトの53バイトに統一
    • パケット解析がハードウェアだけでできる。
    • ソフトウェアは不要になった。
  • Wikipedia から
    • 当初の意図に反して非常に複雑な技術になってしまった
    • ATM は次世代の主流にならず限定的な使用にとどまった
    • ATM の設計思想は MPLS へと引き継がれた
    • 汎用のレイヤ 2 のパケットスイッチングのプロトコルとして、ルーターを介したIPの通信網で利用されている。
P.408 ペイロード(payload)
  • データ通信で本来転送したいデータ本体の部分、ボディを指す。
  • ATM ではペイロードのサイズを固定して処理を簡素化
  • 難点:パケット全体に占めるペイロードのサイズが相対的に小さくオーバヘッドが大きい
P.410 輻輳
  • フレームリレー:パケット交換方式の一種
    • 1 つの回線を多数のユーザで共有。
    • 回線がもつ潜在的な伝送能力(ワイヤスピード)を十分に引き出すうえで効果がある
  • 輻輳:ユーザの利用が一時期に集中すると,ワイヤスピードを超えるパケットがネットワーク上に流れる
    • ネットワークが輻輳状態になるとスループットが落ちる
  • フレームリレーサービスを提供する事業者は,ネットワークが輻輳状態に陥ってスループットが低下しても最低限保証する通信速度を決めている
    • CIR(Committed Information Rate:認定情 報速度)
P.370 7 ネットワーク
  • 確か 7.4 から始めた気がするので 7 章はじめから
P.370 7.1.1 OSI基本参照モデル
  • 改めて復習
  • OSI(Open System Interconnection)基本参照モデル- 異なる設計思想・世代のシステムと円滑に通信するのが目的に標準化
  • プロトコルの単機能化,交換の容易さが目的
    • 階層化のおかげで一部の階層の技術体系が変わっても、その階層だけ取り替えればいい
    • コスト・リスクを小さくする
P.370 プロトコルとサービス
  • N 層:それぞれの階層のこと
  • エンティティ:N 層に存在する通信機器などの実体
    • この言葉はいろいろなところで出てきていろいろな意味で使われる
    • もちろん気分的には適当な実体を指すことが多い
  • プロトコル:N 層に属するエンティティが通信するための取り決め
  • 上位の層が下位の層を利用しながら通信する
    • 別の階層間のエンティティどうしが通信する窓口が必要
    • これを提供するのが下位層:この機能をサービスと呼ぶ
  • プロトコルに沿った仕様で製品を開発すれば別のベンダの機器でも通信できる
  • 参考:ベンダーロックイン

特定ベンダー(メーカー)の独自技術に大きく依存した製品、サービス、システム等を採用した際に、他ベンダーの提供する同種の製品、サービス、システム等への乗り換えが困難になる現象のこと。

出来上がった情報システムの正確な仕様が、システムを開発・構築したベンダーにしか解らなくなる場合がある。結果、システムの保守・拡張・改修等の際、現存システムを開発・構築したベンダーに引き続き発注せざるを得なくなる。

  • 「Excel で行政に提出する書類を作れ」事案もそれ。
  • Apple 製品で身の回りを固めるのも同じ。
  • 「多様性が大事」事案でもある。
7.1.2 TCP/IPプロトコルスイート
  • プロトコル同士には相性がある
    • 「ネットワーク層がこのプロトコルならトランスポート層はこのプロトコルにしておくとトラブルが少ない」
  • 一般に同じ団体が作ったプロトコルはセットで使われることが多い
    • このセットがプロトコルスイート ^ 最も代表的なのは IP を中心に組まれた TCP/IP プロトコルスイート
    • 独自の階層モデルをもつ
P.372 TCP/IPの通信
  • データをパケットに区切る
    • 各パケットにヘッダを付けて送信
    • ヘッダは各階層ごとに付加されて次の階層へと渡される
    • 各ヘッダにはその階層で必要となる送信元や送信先,大きさ,順番などパケット自体に関する情報を含む
    • TCPヘッダを付加したパケット:TCP セグメント
    • IP ヘッダを付加したパケット:IP パケット
    • MACヘッダを付加したパケット:MAC フレームあるいはイーサネットフレーム
P.372 MAC(Media Access Control)アドレス
  • イーサネットや FDDI で使用される物理アドレス
    • イーサネット (Ethernet):コンピューターネットワークの規格の1つ。オフィスや家庭で一般的に使用されている有線LAN (Local Area Network) の技術規格
    • FDDI:LAN でデータ転送を行うための標準の一つ
      • Fiber distributed data interface
  • データリンク層
  • 同じネットワークに接続された隣接ノード間の通信で相手を識別するために使う
  • MACアドレスの長さ:6バイト
    • 先頭24ビットの OUI(ベンダID)
    • 後続24ビットの固有製造番号(製品に割り当てた番号)
  • MAC アドレスは機器が固有にもつ番号
    • 必ず一意に定まるように IEEE が管理
P372 ポート番号
  • トランスポート層にでノード内のアプリケーションの識別に使う識別子番号
    • 0-65535の範囲
  • TCP/IPではパケット交換方式でデータをやり取りする
  • よく使われるアプリケーションについてのポート番号は Well-Known ポートとして標準化
    • TCP・UDPそれぞれで 0-1023 番までの番号を割り当てている
    • SSH:TCP22番
    • Telnet:TCP23番
    • SMTP:TCP25番
    • HTTP:TCP80番
    • POP3:TCP110番
    • IMAP4:TCP143番
    • HTTPS :TCP443番
    • NTP:UDP123番
    • SNMP:UDP161番
    • SNMP Trap :UDP162番
  • セキュリティ対策のために標準とはポート番号を変えることもある
  • Web 開発の本を読んでいると、いろいろな都合から http のポートを 80 以外にしていることもよくある。
    • 80 の場合はポートを指定しなくてもいい
      • 例:http://localhost/hoge/fuga
      • 例:http://localhost:5000/hoge/fuga
P.373 ネットワーク間の通信
  • 同じネットワークに接続されたノード間はデータリンク層(第 2 層)の通信
  • ネットワークを超えたノード間はネットワーク層(第 3 層)の通信 -実際に図 7.1.4 を見よう
    • どこが IP アドレスでのやりとりか?
    • どこが MAC アドレスでのやり取りか?
P.374 7.2 ネットワーク接続装置と関連技術
P.374 7.2.1 物理層の接続
P.374 リピータ
  • ネットワーク上を流れる電流の増幅装置・整流装置
  • 物理層:第 1 層
  • データ通信はネットワーク上を流れる電流
    • ケーブルが長いと電流が減衰・波形が乱れが起きる
    • データが読み取れなくなる
    • これを増幅するのがリピータ
  • 大昔の電話は距離が遠いと音が小さく聞こえにくかった
    • まさにこの減衰が問題
  • リピータは 1:1 で繋ぐ
    • 現在では複数のノードを接続できるマルチポートリピータ(ハブ)が使われるのが一般的
P.374 7.2.2 データリンク層の接続
  • 第2層
P374 ブリッジ
  • データリンク層に位置
  • ネットワーク上を流れているフレーム(情報の単位)の MAC アドレスを認識して通信を中継する
    • 接続されているノードをコリジョンドメイン(セグメント)という単位に分割
    • MAC アドレスで判定したフレームのあて先のあるセグメントだけにフレームを送信
    • 無駄なトラフィックの回避
  • ポートの記憶
    • 通信のたびにある MAC アドレスをもつノードがどのポート に接続されているか学習
    • 次回の通信時には余分なポートには通信を中継しない。
  • ブリッジの動作
    • あて先MACアドレスをもとにMACアドレステーブルを参照する
    • あて先MACアドレスの接続ポートがフレームを受信したポー トと別ポートであれば,そのポートにフレームを送信し
      • 同一ポートであればフレームを破棄する
    • あて先MACアドレスが記憶されていない場合やブロードキャス トアドレス(FF-FF-FF-FF-FF-FF)の場合は,受信ポート以外のすべてのポートにフレームを送信する
P.375 スイッチングハブ
  • レイヤ2スイッチ(L2スイッチ)とも呼ばれる
  • データリンク層に位置
  • ブリッジと同じ働きをする
    • MAC アドレスを認識してフレームのあて先を決めて通信を行います。
  • 試験での問われ方
    • スイッチングハブはフレームの蓄積機能、速度変換機能や交換機 能をもっている。
    • このようなスイッチングハブと同等の機能をもち,同じプロトコル階層で動作する装置はどれか
    • 答えは「ブリッジ」
P.375 ブロードキャストストリーム
  • データリンク層で動作するブリッジやスイッチングハブなどの LANスイッチはブロードキャストフレームを受信ポート以外 のすべてのポートに転送
  • これらの機器をループ状に接続し冗長化させると信頼性はあがる
    • ブロードキャストフレームは永遠に回り続けながら増える
    • 最終的にはネットワークダウンを招く
    • この現象をブロードキャストストームという
  • ブロードキャストストームを防ぐプロトコル:スパニングツリープロトコル(Spanning Tree Protocol:STP)
    • ループを構成している一部のポートを通常運用時にはブロック(論理的に切断)する
    • ネットワーク全体をループをもたない論理的なツリー構造にする
P.376 ネットワーク層の接続
  • 第 3 層(レイヤ 3)
P.376 ルータ
  • ルータはネットワーク層(第 3 層)に位置する
    • あて先IPアドレスを見てパケットの送り先を決め通信を制御する
  • IP のローカルネットワークの境界線に設置して利用され,ネットワークの基本単位として機能
  • 世界中に散在しているローカルネットワークどうしをルータが結ぶ
    • 全体としてインターネットというインフラが機能
  • ルータで分けられたネットワークの単位をブロードキャストドメインという
  • ルータがパケットを受け取ったあと
    • あて先IPアドレスを見る
    • 自分のネットワークあてであれば,破棄
    • 他のネットワークあてであれば転送
      • どのルータへ送ればあて先のネットワークへの通信が速く行えるかを判断することを経路制御(ルーティング)
      • ルータはそのための経路表(ルーティングテーブル)を備えている
P.376 デフォルトゲートウェイ
  • 会社Aのネットワークに属するPCは会社BのPCと直接通信できない
  • 会社AのPCは他ネットワークへの接点であるルータAに転送を依頼
  • デフォルトゲートウェイ:会社AのPCから見て直近のルータA
  • 自分と直接接続していない相手と通信するときはすべてデフォルト ゲートウェイを中継する
P.376 ルーティング
  • 経路表(ルーティングテーブル)の作成方法
    • 手作業で作る:スタティックルーティング
    • ルーティングプロトコル利用:ルータ同士が経路情報を交換し、自立的に経路表を作るダイナミックルーティング
  • ダイナミックルーティングのための代表的なルーティングプロトコル:RIP、OSPF
  • RIP:ディスタンスベクタ型(距離ベクトル型)
    • ルーティングテーブルの情報(経路情報)を一定時間間隔で交換しあう
    • あて先ネットワークにいたるまでに経由するルータの数(ホップ数)最小経路を選ぶ
    • あて先に到達可能な最大ホップ数は 15
      • これを超えた経路は採用されない
  • OSPF:リンクステート型
    • コストを経路選択の要素に取り入れ、コスト最小経路を選ぶ
    • コスト値は,回線速度を基に自動的に算出されるが手動設定もできる
    • コスト算出式「コスト=100Mbps/経路の通信帯域(bps)」
  • コスト計算例は P.377 の図を見ること
P.377 ルータの冗長構成
  • ルータを冗長構成のために使うプロトコル:VRRP(Virtual Router Redundancy Protocol )
  • 同じ LAN に接続された複数のルータを仮想的に 1 台のルータ として見えるようにして冗長構成を実現する
  • 複数のルータでグループ(VRRP グループ)を作る
  • VRRP グループごとに仮想 IP アドレスと仮想 MAC アドレスを割り当て
  • PC などのノードは仮想ルータの IP アドレスに対して通信
  • 通常時はグループのマスタルータが仮想ルータの IP アドレス(仮想 IP アドレス)を保持
  • マスタルータに障害が発生すると他のバックアップルータがこれを継承
P.377 レイヤ3スイッチ(L3スイッチ)
  • ルータと同じネットワーク層(第 3 層)の通信機器
  • 特徴
    • ルータ:ソフトウェアで転送処理
    • レイヤ 3 スイッチ:専用ハードウェアで転送処理
  • 高速処理できる:大容量のファイルを扱うファイルサーバへのアクセスなど
P.378 トランスポート層以上の層の接続
P.378 ゲートウェイ
  • トランスポート層(第 4 層)-アプリケーション層(第7層)でネットワーク接続するための装置
  • 第 3 層のネットワーク層まででエンドツーエンド(E2E)の通信は完成する
    • E2E = 通信を行う二者、あるいは、二者間を結ぶ経路全体
    • エンドツーエンド原理:高度な通信制御や複雑な機能は末端のシステムが担い、経路上のシステムは単純に信号やデータの中継・転送だけすべし
    • TCP/IP ネットワークの原理
    • 誤り訂正・フロー制御・再送:TCP 層(第4層、トランスポート層)など上位側の機器やソフトウェア・プロトコル
    • 単純な送受信・転送処理:IP 層(第3層、ネットワーク層)
  • ゲートウェイ:第 4 層のトランスポート層以上が違う LAN システム相互間のプロトコル・データ形式の変換を担う
  • ゲートウェイはアプリケーションプロトコルの内容を 解釈できる
    • アプリケーションヘッダの不正な情報混入を検出可能
    • ファイアウォール・プロキシサーバもゲートウェイの一種
P.378 L4スイッチ・L7スイッチ
  • L4スイッチ(レイヤ4スイッチ)はトランスポート層(第4層)の装置
    • 定義としてはゲートウェイ
    • 機能的にはレイヤ2スイッチ・レイヤ3スイッチの延長上
    • ルータやレイヤ3スイッチはIPアドレスを参照して経路制御する
    • L4スイッチではTCPポート番号やUDPポート番号も経路制御判断に使える:第4層の機器だから
  • L7スイッチ:アプリケーション層(第7層)までの情報を使って通信制御する
P.379 7.2.5 VLAN
  • VLAN(Virtual LAN:仮想LAN)
  • スイッチ(レイヤ2スイッチ,レイヤ3スイッチ)で物理的な接続形態とは独立に仮想的なLANグループを構成する仕組み,あるいはそう構成されたLAN
  • 複雑な形態のネットワークを楽に構築できる
  • サブネット構成も柔軟に変えられる
P.380 データリンク層の制御とプロトコル
  • データリンク層:第2層
P.380 7.3.1 メディアアクセス制御
  • 複数のデータを1つのケーブルを通して送受する場合,データの衝突(コリジョン)を回避するための制御が必要
    • これがメディアアクセス制御(Media Access Control:MAC)
コリジョン(衝突)

イーサネットや無線LANで複数の端末が送信し、データが衝突する現象を指す。旧式のイーサネット規格では、端末同士を接続するときに1組の通信路で双方向の通信を行う半二重通信のため、送信と受信を同時に行うことができない。送信と受信をその都度切り替えて行うので、端末がお互いデータを送信してしまうと衝突する可能性が高くなる。

P.380 CSMA/CD
  • CSMA/CD:Carrier Sense Multiple Access with Collision Detection:搬送波感知多重アクセ ス/衝突検出)の略。
  • イーサネットで採用されている方式
    • 衝突検知方式を採用
    • イーサネット:IEEE 802.3として標準化されている LAN規格
  • CSMA/CD
    • 各ノードは伝送媒体が使用中かどうかを調べて,使用中でなければデータを送りはじめる
    • 複数のノードが同時に通信しはじめるとデータの衝突が起こる
    • 衝突を検知し,一定時間(ランダム)待った後で,再送
    • 一定の距離以上のケーブルでは衝突が検知できない
  • CSMA/CD方式の限界
    • トラフィックが増加するにつれて衝突が多くなる
    • 再送が増え,さらにトラフィックが増加する悪循環に陥る可能性がある
    • 特に伝送路の使用率が30%を超えると実用的でなくなる
P.381トークンパッシング方式
  • トークンによる送信制御を行う方式で
    • トークンバス方式
    • トークンリング方式
P.381 トークンパッシング方式
  • ネットワーク上をフリートークンと呼ばれる送信権のためのパケットが巡回する
    • フリートークンを獲得したノードだけが送信できるので衝突を避けられる
    • ふつうはコンセントレータ(集線器)でネットワ ークとノードを結ぶ
  • トークンパッシング方式を採用したLAN規格
    • 例:FDDI:Fiber Distributed Data Interface
    • FDDIは物理媒体に光ファイバを利用し,最大100Mビ ッ ト/秒の通信
  • 特徴
    • 伝送媒体上では衝突しない
    • トラフィックが増えるにつれてトークンを獲得しにくくなり,少しずつ遅延時間が増える
    • 衝突による再送制御の必要がないため伝送路の使用率に対する遅延時間の増加率はCSMA/CD方式より緩やか
P.382 TDMA 方式
  • TDM(時分割多重)
    • ネットワーク上にデータを送信する時間を割 り当てる(タイムスロット)
    • タイムスロットごとに別のデータを送って多重化する
    • TDM によるアクセス制御が TDMA
  • TDMA(Time Division Multiple Access:時分割多重アクセス)
    • CSMA/CD・トークンパッシング方式と並ぶ主要なデー タリンク技術
    • TDMA ではネットワーク(伝送路)を使える時間を細かく区切る
    • 割り当てられた時間は各ノードが独占する方式
    • TDMAはコネクション型の通信
P.382 7.3.2 無線LANのアクセス制御方式
P.382 CSMA/CA方式
  • CSMA/CA:Carrier Sense Multiple Access with Collision Avoidance、搬送波感知多重アクセス/衝突回避
  • 無線 LAN の制御方式
  • CSMA/CD との違い:「衝突検出」が「衝突回避」になった
  • 無線 LAN:物理層媒体は電波で衝突の検出は不可能だから回避する
  • 特徴
    • 送信ノードは使いたい周波数帯の使えるか確認後、必ずランダムな時間だけ待ってから送信をはじめる
      • 待ち時間をバックオフ制御時間とよぶ
    • 衝突してフレームが壊れても検出できない
      • データを受け取ったノードは ACK を返す
P.328 RTS/CTS
  • 無線 LAN の話
  • 隠れ端末問題
    • 他のノードのデータ送信を感知できないことがある
    • 通信ノード間の距離が遠い
    • ノード間に障害物がある
  • 回避のための RTS/CTS 方式
  • 無線 LAN ノード
    • データ送信前にRTS(Request ToSend:送信リクエスト)をアクセスポイントに送信
    • これを受理したアクセスポイントがCTS(Clear to Send:送信OK)を返信
      • 他のノードは CTS を傍受して自分以外の別のノードに送信権があると解釈
      • データ送信を延期
    • 無線LANノードはアクセスポイントからCTSを受信したらデータ送信開始します
    • 衝突抑制:CTSに書かれた他のノードに対する送信抑制時間を使う
  • データ送信開始前にデータ送信のネゴシエーシ ョンとして RTS/CTS 方式を使った CSMA/CA を CSMA/CA with RTS/CTS とよぶ
P.383 無線LANの動作モード
  • 無線 LAN の動作モード:図7.3.4参照
  • 2 つのモードがある
  • インフラストラクチャモード:無線LANノードがアク セスポイントを通じて相互に通信
  • アドホックモード:アクセスポイントなしに無線LANノードどうしが直接通信
P.383 COLUMN FDMA,CDMA
  • 表7.3.1:多元接続する技術グループ
    • TDMA とセット
  • FDMA
    • ある周波数帯をさらに細かい周波数帯に分割
    • 接続できる端末数を増やす技術
  • CDMA
    • 周波数も時間も分割しない
    • 符号で各端末の通信を識別・分離
    • 接続できる端末数を増やす
P.383 7.3.3 データリンク層の主なプロトコル
  • 第 2 層
P.384 ARP
  • ARP(Address Resolution Protocol):通信相手のIPアドレスからMACアドレスを取るためのプロトコル
  • ARPの動作
    • ブロードキャストで目的IPアドレスを指定したARP要求パケットをLAN全体に流す
      • ブロードキャスト:ネットワークに参加するすべての機器に同時に信号やデータを送ること
    • 各ノードは自分のIPアドレスと比較
    • 一致したノードだけARP応答パケットに自分のMACアドレスを入れて返す(ユニキャスト)
  • 参考:GARP(Gratuitous ARP)
    • 主な目的:自身に設定するIPアドレスの重複確認・ARPテ ーブルの更新
    • 目的IPアドレスに自身が使うIPアドレスを指定し,MACアドレスを問い合わせる
P.384 RARP
  • Reverse-ARP:逆アドレス解決プロトコル
    • MACアドレスからIPアドレスを取る
  • 電源オフ時にIPアドレスを保持できない(IPアドレスを保持するハードディスクをもたない)機器が電源オン時に自分のMACアドレスから自身に割り当てられているIPアドレスを知るために使う
  • RARP サーバー
    • MACアドレスとIPアドレスの対応表を持ったサーバー(RARPサーバー)が必要
P.384 PPP
  • PPP:Point to Point Protocol
    • 2 点間をポイントツーポイントでつなぐためのデータリンクプロトコル
    • WANを介して2つのノードをダイヤルアップ接続するときに使う
  • ネットワーク層(第3層)とネゴシエーションする NCP(ネットワーク制御プロトコル)とリンクネゴシエーションするLCP(リンク制御プロトコル)からなる
    • NCP:Network Control Protocol
    • LCP:Link Control Protocol
  • リンク制御やエラー処理機能を持つ
P.384 PPPoE
  • PPPoE:PPP over Ethernet
  • PPPと同等な機能をイーサネット(LAN)上で実現するプロトコル
  • PPPフレームをイーサネットフレームでカプセル化して実現
P.384 7.3.4 IEEE 802.3規格
  • メディアアクセス制御に CSMA/CD 方式を使う LAN についての標準
  • OSI基本参照モデルにおけるデータリンク層(第 2 層)と物理層(第 1 層)のプロトコルおよびサービスを規定
    • OSI 基本参照モデルでのデータリンク層を LLC 副層と MAC 副層の2つに分割
    • 物理層での LAN で使う伝送媒体や MAC 副層でのフレーム構成や衝突検出の仕組みを規定
  • ツイストケーブルの企画が表 7.3.2 にまとまっている
P.386 7.4 ネットワーク層のプロトコルと技術
  • もうやった
P.286 6.1 データベースの基礎
P.286 6.1.1 データベースの種類
  • 代表的なデータベース
    • 階層型データベース
    • 網型データベース
    • 関係データベース
  • 関係データベースが一番よく使われている
    • MySQL (MariaDB), PostgreSQL, SQL Server, Oracle
  • (疑問)いわゆる NoSQL はどれなのだろうか?
    • redis, mongoDB, memcache
P.286 階層型データベース
  • (具体的なデータベース名(製品名)を知らない)
  • 階層構造(木構造)でデータの構造を表現
  • レコードどうしが親子関係をもつ
    • ある親レコードに対する子レコードは 1 つ以上存在
    • 子レコードに対する親レコードはただ1つ
  • データの操作
    • 親レコードと子レコードを結ぶポインタをたどる
P.286 網型データベース
  • ネットワーク型データベースとも
  • 親レコードと子レコードに「多対多」の関係がある
    • 親レコードは複数の子レコードをもてる
    • 子レコードは複数の親レコードをもてる
  • データの操作
    • 親レコードと子レコードを親子組(セット)
    • 親子間や兄弟間のリンクをたどって 1 つのデータを取り出す
P.287 関係データベース
  • データの集合を平坦な2次元の表で表現:リレーショナルデータベースとも
  • 親レコード・子レコードという概念をもたない
  • レコード間を結ぶポインタやリンクがない
    • データ操作の結合でレコードを関連づける
  • 1 つの表の 1 つの行と別の表との関連づけ
    • 数学の集合概念に基礎をおく
    • 値の一致(たとえば,外部キーと主キー)による
P.288 6.1.2 データベースの設計
  • プロの技
P.288 データベースの設計プロセス
  • 「概念設計→論理設計→物理設計」の順
  • ER 図、関係モデル
P.288 概念設計
  • 所有データを調査・分析して抽象化した概念データモデルを作る
  • まずはデータのもつ意味やデータ間の関係を崩さずあるがままに表現する
  • 概念データモデルは単純にデータのもつ意味とその関係を表したモデル
  • コンピュータへの実装とは独立の、特定の DBMS に依存しないデータモデル
    • DBMS:DataBase Management System、データベース管理システム
    • E-Rモデル:EntityRelationship Model、エンティティリレーションシップモデル
      • cf.P.292, 6.1.4
    • UML のクラス図
      • cf. P.496, 9.3.4
P.288 データ分析
  • 概念設計のデータ分析
  • 洗い出しが大事
    • どのようなデータがあるのか
    • 必要なデータはなにか
  • 2 つの大きな目的
    • 異音同義語(シノニム)や同名異義語(ホモニム)の排除
    • 複数箇所に存在する同一内容データ(データ重複)の排除
  • 手法
    • データ項目を標準化
    • 正規化:データ項目間の関連を明確にする
P.289 POINT データ項目洗出しの留意点
  • 簡単なアプリ作成をしてみると気分がつかめる
    • もしくは具体的なアプリのデータベース設計に関する本を読んでみる
  • データ項目名の標準化
  • データ項目の意味の定義
    • "日付"・"年月日" の 2 つの項目をどう扱うか
    • 別物ならデータ項目を定義して本当に別の実体にする
  • データ項目のけた数や型の統一
    • 型:文字列、日付型、数値、TEXT、バイナリなどなど
  • 各データ項目の発生源や発生量の明確化
P.289 トップダウンアプローチとボトムアップアプローチ
  • データの分析手法
    • トップダウンアプローチ:最初に理想型の概念データモデルを作ってからデータ分析する
    • ボトムアップアプローチ:画面や帳票などから項目を洗い出してデータ分析した結果として現実的な概念データモデルを作る
  • 最終的なデータモデルへの要求事項
    • 適切な正規化
      • 正規化にもいくつかの段階がある
      • いろいろな状況に応じて完全な正規化をしないこともある
        • 例えばバッチ集計すると時間がかかりすぎる場合、あえて正規化を崩す
    • 業務上のデータ項目をすべて持つ
  • どちらかだけで済むことはない
    • 主に後者で組んだ上で前者の視点で見直すなど
    • 業務・状況に応じて適切な方法を使う・組み合わせる
P.289 論理設計
  • E-R 図などで表現された概念データモデルはそのままではデータベースに実装できない
  • 概念データモデルを論理データモデルに変換する
    • 階層モデル,ネットワーク(網)モデル,関係モデルの 3 つ
    • それぞれのDBMSの制約に合わせて変換
  • 関係データベース
    • 概念データモデルを基に主キーや外部キーを含めたテーブル構造を作る
    • テーブルの各列(データ項目)に設定される制約を検討
  • 処理・利用しやすいようなビュー設計も必要
    • ビュー(P.325 参照):データベースの実表のうち,利用者が必要とするものだけを利用に適した形で表として定義したもの
    • SELECT 文を呼びやすくするために名前をつけただけ
P.290 物理設計
  • 実際にデータベース内にデータ実装するときの注意
    • 論理データモデルに基づいた特定のデータベース管理システム(DBMS)でデータ量・データの利用頻度・パフォーマンス・運用を考えてデータベースの物理的構造を決める
      • データ量:初期データ量,増加度合い
      • 利用頻度:トランザクション発生頻度,トランザクション種類(検索,更新)など
      • 前に Twitter のシステムの話で紹介した事案
  • 論理設計:データベースの見かけ上の設計
  • 物理設計:実際に磁気ディスク上に記憶される形式などの具体的な設計
P.290 6.1.3 データベースの3層スキーマ
P.290 スキーマ
  • schema
  • データの性質・形式・ほかのデータとの関連などデータ定義の集合
P.290 ANSI/SPARC3層スキーマ
  • データベースの3層スキーマ
    • データを扱う立場を3つのグループに分け,それぞれに対応したデータ定義するためのモデル
  • 目的:次の2点の確立
    • 論理データ独立性:論理的なデータと利用者やアプリケーションプログラムから見たデータとの独立
    • 物理データ独立性:記憶装置との独立
  • cf. P.291 の図。
  • 外部スキーマ
    • 利用者やアプリケーションプログラムから見たデータを定義
    • 実世界が変化するとそれに合わせて概念スキーマは変わる
    • アプリケーションプログラムが影響を受けないようにするためにするためのスキーマ
    • 例:関係データベースのビュー
  • 概念スキーマ
    • 実際のデータの物理的な表現方法とは別
    • データベースの論理的構造とその内容を定義
    • 例:論理設計段階の論理データモデル
  • 内部スキーマ
    • データを記憶装置上にどのような形式や編成で記録するか、物理的内容の定義
    • 障害回復処理(リカバリ),セキュリティなども考えた実際にコンピュータに実装させる格納表現
P.291 COLUMN インメモリデータベース
  • データを直接メモリに配置してパフォーマンスを上げる
    • キャッシュとして使われることもよくある
  • DB の基本はあくまでディスクにデータを記録してメモリに読み込む
    • ディスク入出力がボトルネック
    • 前に紹介した速度表を参照すること
  • インメモリデータベースではディスク入出力がない
    • 基本の処理がメモリ上で閉じるので処理が速い
  • 最近のインメモリデータベースの傾向
    • データをカラム(列)型フォーマットでメモリに配置する列指向(カラム指向)を採用
    • 集計や分析処理などのクエリが高速化します
  • 欠点
    • 揮発性:メモリ上のデータは電源を切ると失われてしまう
    • 何かの事故が起きたらデータが(すべて)飛ぶ
    • HDD・SDD よりもメモリは高い
  • 対策
    • データを定期的にディスクに保存する機能
    • 別のスタンバイデータベースにデータの複製を取るレプリケーション機能
P.292 6.1.4 E-R図
  • 実世界にあるデータ構造をなるべくそのまま表現したい
  • データベース管理システムに依存しないデータモデルを作りたい
  • ER 図:E-Rモデルを図で表現
    • Entity-Relationship Diagram
P.292 E-R図の構成要素
  • エンティティ:データベース化の対象となる実世界を構成する実体
    • 大きく分けて 2 種類
    • 物理的実体がある:顧客、商品など
    • 物理的実体がない:顧客と購入商品の「関係」そのもの:後の例参照
    • RDB の例をいろいろ見るとわかる
  • アトリビュート:エンティティがもつその性質や特徴を表すいくつかの属性
  • 例:顧客エンティティ
    • 顧客番号,顧客名
  • 識別子:エンティティを一意に識別するための属性
    • いわゆる ID:関係データベースの表の主キー
    • 例:顧客番号
    • 内部 ID と外部(?)ID がある。
    • 内部 ID:システム内で固定の ID。よく数値を使う
    • 外部(?)ID:ログイン ID などユーザーが決める ID。
      • メールアドレスなどある時点では一意。
      • ユーザーが変更できるのでシステム内でその値を永続的に使えない
  • 関連(リレーションシップ):業務上の規則やルールなどによって発生するエンティティ間の関係
    • 顧客はいくつもの商品を注文する
  • カーディナリティ:エンティティ間の「1対1」、「1対 多 」、「 多 対 多 」といった対応関係の表現
    • 数学で基数・濃度を cardinal number というその cardinal
P.292 「多対多」の関係
  • 「多対多」の関係は,関係データベースとして実装できない
    • 「1対多」と「多対1」の関係に分解する
  • リレーションシップそれ自体を1つのエンティティとする
    • 図 6.1.8 参照
    • 識別子に顧客エンティティの識別子(顧客番号)と商品エンティティの識別子(商品番号)をもたせる
    • 顧客と注文の関係は「1対多」、注文と商品の関係は「多対1」の関係
    • このときの「注文」を連関エンティティと呼ぶ
  • 注意:リレーションシップも属性をもつ
    • 例:注文日、注文数量
      • 顧客と商品の両方が特定されてはじめて確定する概念
P.292 独立エンティティと依存エンティティ
  • エンティティ間に「1対多」の関係があるとき
  • 「多」側のエンティティは「1」側のエンティティの識別子を外部キーとしてもつ
    • 外部キーがまさに RDB の R
  • 外部キーが識別子の一部となる場合、そのエンティティは「1」側のエンティティに依存する
    • cf. P.292 図6.1.8 の注文エンティティ
    • 注文はある顧客がある商品を注文するという概念
    • 顧客番号と商品番号がないと存在できない
    • これを依存エンティティ(弱実体)と呼ぶ
  • これを独立化したければしてもいい
    • 注文番号を導入
    • 注文エンティティを図 6.1.9 のように捉える
    • 親エンティティに依存しない独立エンティティ (強実体)とみなせる
    • 「発注書に ID を振りたい」といった要望も多いはずで、よくある対応
  • 独立化させる必要がないケースの例も見てみよう
    • e-ラーニングでの受講履歴
    • 「誰がどのコースのどの単元を受講したか」
    • 特に ID を振って独立に管理したいわけではない
    • いつ何を受講してどういう結果だったか(テスト系ならどの問題にどう回答して正否はどうか)といったことは知りたい
P.294 6.2 関係データベース
P.294 6.2.1 関係データベースの特徴
  • 関係データベース:RDB(Relational DataBase)
  • 1970年 E.F.コッド博士によって提案された関係モデルをもとにしたデータベース
  • 現在,最も多く使われているデータベース
  • 一応集合論をもとにしているらしいが、集合論を知らなくても全く問題ない
  • 計算機科学の専門家は集合を勉強しないと駄目らしいという事案ではある模様
P.294 関係データベースの構造
  • 意味的にひとまとまりのデータを 2 次元の平坦な表で表す
    • 列が「あるユーザの情報」
    • 行が「ある属性の情報」:名前やメールアドレス
  • 表に格納されるデータ:単位は次の通り
    • 行(組、タプル)
    • 列(属性、アトリビュート)
  • 2 次元の平坦な表
    • 行と列が交差する 1 つのマスには 1 つの値しか入らない
      • 「1 つの値」とはいうが、JSON を叩き込むこともある
      • 参考
      • インデックスが張れず検索のパフォーマンスは厳しいので、検索したいなら JSON を張るのはやめた方がいい
      • NoSQL だと列そのものが JSON だったりもする
    • 第 1 正規形:cf. P.300 6.3.2
次数と基数
  • (この言葉を使った記憶がない)
  • 次数:1 組のデータを表す行を構成する列の数
  • 基数:1 つの表を構成する行の数
    • テーブルを集合とみなしたときの要素数
  • 本曰く「次数は変わることはありません」
    • テーブル定義を変えると変わる
    • 実際にテーブル定義を変えることはよくある:特に開発中は。
    • 機能追加・改修案件で追加されることもよくある
  • 1 行は 1 組のデータを表す:表に対するデータの追加・削除で基数はよく変わる
P.295 定義域(ドメイン)
  • テーブル全体を $\mathcal{T} = A \times B \times \cdots \times Z$ と書いたときの各 $A,B,\dots,Z$ をドメイン(定義域、domain)と呼ぶ
  • 数学の集合と違って $\mathcal{T}$ の中に同じ集合を含まない:つまり $\mathcal{T} = \mathbb{R}^n$ といったテーブルは考えない
  • ドメインは「属性が取り得る値の集合」
    • RDB では適当なデータ型を対応させる:日付,金額,数量,量
  • ドメインを新たなデータ型として定義すると違うデー タ項目でも同じ入力チェックや同じ出力編集ができる
P.296 6.2.2 関係データベースのキー
  • 表中の行を一意に識別するためのキー(スーパキー,候補キー,主キー)
  • 別の表を参照し関連づけるための外部キー
P.296 スーパキー
  • 表中の行を一意に特定できる属性,あるいは属性の組
    • 組について:購入履歴を知るためにはユーザーID・商品ID・購入日がわからないといけない、という程度の意味
    • かなり広い意味のようなのでたぶんそんなに使わない
  • 補足:なぜスーパ「ー」キーではないのか
P.296 候補キー
  • 行を一意に決めるための必要最小限の属性で構成されるスーパーキー
    • 一意性制約が必要
  • 何かの履歴のように複数のIDの組になることもある
    • 外部キーが入るテーブルでよくある
P.296 主キー
  • 複数存在する候補キーの中から任意に選んだ1つの候補キーを主キー(primary key)
  • 主キーに選ばれなかった残りの候補キーを代理キー(alternate key)
  • 主キー制約
    • 一意性制約
    • 実体を保証するため空値(NULL)は許さないという NOT NULL制約
P.296 外部キー
  • 関連する他の表を参照する属性あるいは属性の組
  • 2 つの表の間に「1対多」の関係がある場合
    • 「多」側の表に「1」側の表の主キーあるいは主キー以外の候補キーを参照する属性をもたせて外部キーにする
  • 参照制約:外部キーの値が外部キーで参照される表に存在することを保証
    • 参照制約があると「親テーブル」のカラムを勝手に消せなくなる
  • 複数の表を参照するなら表内に複数の外部キーを持つ
    • 外部キーの値に NOT NULL 制約がなければ NULL が許される
  • 一般に外部キーは被参照表の主キーを参照
    • UNIQUE 指 定 さ れ た候補キーを参照する場合もある
  • cf. 参照制約:P.320
P.297 COLUMN 代用のキー設定
  • 主キーが複数の属性から構成される複合キー(連結キー)でその構成属性数が多すぎると運用が面倒
  • 連番のような必ずしも積極的な意味がない属性を追加してそれを代用のキー(surrogate key)にする
    • 複合キーを構成している属性はすべて非キー属性にして代理キーにする
P.298 6.3 正規化
P.298 6.3.1 関数従属
  • 関数従属:ある属性xの値が決まると他の属性yの値が一意的に決まる関係で、$x \mapsto y$ と書く
    • 属性 $x$:独立属性(決定項)
    • 属性 $y$:従属属性(従属項)
  • 正規化:1 つの表の中の属性間にある関数従属性に着目して整理する
    • 整合性を維持しやすいデータベースが設計できる
P.298 部分関数従属
  • 関係 $x \mapsto y$ で $y$ が $x$ の真部分集合に関数従属するとき、$y$ は $x$ に部分関数従属するという
    • どこの業界の用語なのかよくわからない。情報系?
  • 部分関数従属は独立属性 $x$ が複数の属性からなるときに起こりうる関数従属
    • あまりピンとこない:P.299 に商品マスタ的な例が載っていた
  • 本の例:独立属性 $x$ が $x_1$ と $x_2$ の 2 つの属性からなるとき
    • ${x_1, x_2} \mapsto y$ が成り立ち、かつ $x_1 \mapsto y$ または $x_2 \mapsto y$ のどちらかが成り立つ
    • このとき ${x_1, x_2 }$ と $y$ の間に部分関数従属がある
  • 例:社員所属部門テーブル
    • 社員番号・部門コード・部門名があるテーブル
    • 主キー:社員番号と部門コード
    • 部門コードに対して部門名は一意に紐づく
    • このとき部門名は主キーに部分関数従属する
P.298 完全関数従属
  • 完全関数従属:関係 $x \mapsto y$ で $y$ が $x$ のどの真部分集合にも関数従属しない
  • 独立属性 $x$ が 1 つの属性かなるときは常に完全関数従属
P.299 推移的関数従属
  • 直接ではなく間接的に関数従属している関係
  • 例:社員マスタ
    • 社員番号・社員名・住所・郵便番号からなるテーブル
    • 社員番号から住所が一意に紐づく
    • 住所から郵便番号が一意に紐づく
    • 郵便番号は社員番号に推移的関数従属している
    • 念のため:住所は住所マスタなどに外出し(正規化)するべきで、こういうテーブルを作ってはいけない
    • 詳しくは次の 6.3.2 で議論される

2020-11-01 課題

  • 先に進む前に録画してあるか確認しよう

進捗

  • 前回の進捗
    • 基礎知識編:(ネットワークを飛ばして)「P.290 物理設計」まで
    • 本編:03-05 「グラフの解説」まで
  • 今回の進捗
    • 基礎知識編
      • 何か適当なアプリのスキーマ持ってくる
      • 「COLUMN インメモリデータベース」まで
    • 本編:03-06「定積分の例 $f(x)=x^2$」まで

課題

TODO

自分用メモ

Matplotlib

  • 本当に簡単な図を描く
  • これを参考に scipy お絵描き
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import sph_harm

m,l = 1,3
theta = np.linspace(0, np.pi, 101)
phi = np.linspace(0, 2 * np.pi, 151)
theta, phi = np.meshgrid(theta, phi)

r = sph_harm(m, l, phi, theta).real
x = np.abs(r) * np.sin(theta) * np.cos(phi)
y = np.abs(r) * np.sin(theta) * np.sin(phi)
z = np.abs(r) * np.cos(theta)

fig = plt.figure(figsize=(8, 8))
ax = fig.gca(projection="3d")
ax.plot_surface(x, y, z, color="aqua", edgecolor="k")
plt.axis("off")
plt.show()

TeX の記録

  • ヘルダーの不等式

\begin{align} \Vert fg \Vert_1 \leq \Vert f \Vert_p \cdot \Vert g \Vert_q, \quad p^{-1} + q^{-1} = 1. \end{align}

日々の勉強

Julia

数学英語

P.20 注意1

C) の場合を日常の文と比べてみよう。例えば犬好きの人が "A dog is a friendly animal" といった場合、現実には例外があって吠えかかる犬もいる。しかし、数学の文の場合は例外なしに成り立つと解釈する。

P.26 存在文の主語
  • (文章を文法的に解析するうえで主語・述語に注目するのが大事という話がある)
  • 文の構造を把握するために、There is 構文では形式的に there を主語として調べる
P.37 種明かしの but

実はもうこれで証明は完成している

  • 気分はわかるが、どの程度「一般的な言明(?)」なのだろうか?
P.40 2.6 冠詞はこわくない
  • ざっくりした見分け方
  • 原則として単数の可算名詞には冠詞がつく.
  • 名前のついている定理・公式は一通りに決まるので the.
    • (同じ名前の定理もいろいろあるが、文脈に応じて決まる扱いでいいのだろう.)
  • 初出か既出か?
    • 既出:the
    • 初出:前後の文脈・常識から読者にとって一通りに決まるか?
      • Yes:the
      • No:単数なら a/an, 複数なら冠詞なし
  • 冠詞と同時には名詞につかない語
  • every, each, any, some, no, another, either, neither, both, this, that, these, those, our, its, their, Cauchy's など代名詞・名詞の所有格

IT 基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。
  • ネットワークの話もいい加減飽きたので、DB の話を先行してやるか?

復習

OSI基本参照モデル
  • 会社の部署と同じ気分
  • 特定層は自分のところにしか責任を持たない
  • 「他の層は他の層で専門的に管轄してね」
  • お互い全くの無関係ではないが、基本的には自分のことだけ考えていればいい。
いろいろなプロトコル
  • IP, HTTP, SMTP, POP, ARP...
  • 通信の規格
  • 状況に応じて適切なプロトコルを選ぶ
  • ヘッダ・ボディーの概念

本の記述を追いかける

P.408 7.8 交換方式
P.408 パケット交換方式
  • 回線交換方式と対になる概念
    • 回線交換方式:通信を行うノード間で物理的な通信路を確保してから通信する
    • 例:電話
  • パケット交換方式について
    • データ送信するノードはデータをパケットに区切る。
    • ひとつひとつのパケットにヘッダを付けて送信。
    • ネットワーク内ではパケット交換機にパケットがたまる
    • ネットワークの状況に応じて順次送られる
パケット通信のメリット・デメリット
メリット

耐障害性 - 通信路を固定しないため,迂回経路が取れる。 - パケット交換機にデータが蓄積されているため,復旧まで待てる。 - パケット多重 - 1 対 1 の通信で回線を占有する必要がないため,1つの回線を多くのノードで共有でき,回線を効率的につかえる - 異機種間接続性 - パケット交換機で中継するときにプロトコル変換・速度変換でエンドノードどうしが同じプロトコルをサポートしていなくても通信できる

デメリット
  • ネットワーク内の蓄積交換処理による遅延
    • 蓄積交換処理による遅延解消のために主に回線の帯域を広げることで対応してきた
    • 構造上,完全には遅延をなくせない
  • パケット到着順序の不整合
P.408 ATM 交換方式
  • ATM(Asynchronous Transfer Mode:非同期転送モード)
  • 遅延のない回線交換方式とパケット交換方式の利点を得たい
  • パケット交換方式の発展
  • 遅延の原因をつぶす:特にパケットの多様性
    • 多種多様なパケットに対応するために,パケット交換機はソフトウェア処理が必要 ^ ATM での工夫の一例:最も特徴的なのは,パケット(ATMではセルという)の長さをヘッダ部 5 バイト,ペイロード 48 バイトの53バイトに統一
    • パケット解析がハードウェアだけでできる。
    • ソフトウェアは不要になった。
  • Wikipedia から
    • 当初の意図に反して非常に複雑な技術になってしまった
    • ATM は次世代の主流にならず限定的な使用にとどまった
    • ATM の設計思想は MPLS へと引き継がれた
    • 汎用のレイヤ 2 のパケットスイッチングのプロトコルとして、ルーターを介したIPの通信網で利用されている。
P.408 ペイロード(payload)
  • データ通信で本来転送したいデータ本体の部分、ボディを指す。
  • ATM ではペイロードのサイズを固定して処理を簡素化
  • 難点:パケット全体に占めるペイロードのサイズが相対的に小さくオーバヘッドが大きい
P.410 輻輳
  • フレームリレー:パケット交換方式の一種
    • 1 つの回線を多数のユーザで共有。
    • 回線がもつ潜在的な伝送能力(ワイヤスピード)を十分に引き出すうえで効果がある
  • 輻輳:ユーザの利用が一時期に集中すると,ワイヤスピードを超えるパケットがネットワーク上に流れる
    • ネットワークが輻輳状態になるとスループットが落ちる
  • フレームリレーサービスを提供する事業者は,ネットワークが輻輳状態に陥ってスループットが低下しても最低限保証する通信速度を決めている
    • CIR(Committed Information Rate:認定情 報速度)
P.370 7 ネットワーク
  • 確か 7.4 から始めた気がするので 7 章はじめから
P.370 7.1.1 OSI基本参照モデル
  • 改めて復習
  • OSI(Open System Interconnection)基本参照モデル- 異なる設計思想・世代のシステムと円滑に通信するのが目的に標準化
  • プロトコルの単機能化,交換の容易さが目的
    • 階層化のおかげで一部の階層の技術体系が変わっても、その階層だけ取り替えればいい
    • コスト・リスクを小さくする
P.370 プロトコルとサービス
  • N 層:それぞれの階層のこと
  • エンティティ:N 層に存在する通信機器などの実体
    • この言葉はいろいろなところで出てきていろいろな意味で使われる
    • もちろん気分的には適当な実体を指すことが多い
  • プロトコル:N 層に属するエンティティが通信するための取り決め
  • 上位の層が下位の層を利用しながら通信する
    • 別の階層間のエンティティどうしが通信する窓口が必要
    • これを提供するのが下位層:この機能をサービスと呼ぶ
  • プロトコルに沿った仕様で製品を開発すれば別のベンダの機器でも通信できる
  • 参考:ベンダーロックイン

特定ベンダー(メーカー)の独自技術に大きく依存した製品、サービス、システム等を採用した際に、他ベンダーの提供する同種の製品、サービス、システム等への乗り換えが困難になる現象のこと。

出来上がった情報システムの正確な仕様が、システムを開発・構築したベンダーにしか解らなくなる場合がある。結果、システムの保守・拡張・改修等の際、現存システムを開発・構築したベンダーに引き続き発注せざるを得なくなる。

  • 「Excel で行政に提出する書類を作れ」事案もそれ。
  • Apple 製品で身の回りを固めるのも同じ。
  • 「多様性が大事」事案でもある。
7.1.2 TCP/IPプロトコルスイート
  • プロトコル同士には相性がある
    • 「ネットワーク層がこのプロトコルならトランスポート層はこのプロトコルにしておくとトラブルが少ない」
  • 一般に同じ団体が作ったプロトコルはセットで使われることが多い
    • このセットがプロトコルスイート ^ 最も代表的なのは IP を中心に組まれた TCP/IP プロトコルスイート
    • 独自の階層モデルをもつ
P.372 TCP/IPの通信
  • データをパケットに区切る
    • 各パケットにヘッダを付けて送信
    • ヘッダは各階層ごとに付加されて次の階層へと渡される
    • 各ヘッダにはその階層で必要となる送信元や送信先,大きさ,順番などパケット自体に関する情報を含む
    • TCPヘッダを付加したパケット:TCP セグメント
    • IP ヘッダを付加したパケット:IP パケット
    • MACヘッダを付加したパケット:MAC フレームあるいはイーサネットフレーム
P.372 MAC(Media Access Control)アドレス
  • イーサネットや FDDI で使用される物理アドレス
    • イーサネット (Ethernet):コンピューターネットワークの規格の1つ。オフィスや家庭で一般的に使用されている有線LAN (Local Area Network) の技術規格
    • FDDI:LAN でデータ転送を行うための標準の一つ
      • Fiber distributed data interface
  • データリンク層
  • 同じネットワークに接続された隣接ノード間の通信で相手を識別するために使う
  • MACアドレスの長さ:6バイト
    • 先頭24ビットの OUI(ベンダID)
    • 後続24ビットの固有製造番号(製品に割り当てた番号)
  • MAC アドレスは機器が固有にもつ番号
    • 必ず一意に定まるように IEEE が管理
P372 ポート番号
  • トランスポート層にでノード内のアプリケーションの識別に使う識別子番号
    • 0-65535の範囲
  • TCP/IPではパケット交換方式でデータをやり取りする
  • よく使われるアプリケーションについてのポート番号は Well-Known ポートとして標準化
    • TCP・UDPそれぞれで 0-1023 番までの番号を割り当てている
    • SSH:TCP22番
    • Telnet:TCP23番
    • SMTP:TCP25番
    • HTTP:TCP80番
    • POP3:TCP110番
    • IMAP4:TCP143番
    • HTTPS :TCP443番
    • NTP:UDP123番
    • SNMP:UDP161番
    • SNMP Trap :UDP162番
  • セキュリティ対策のために標準とはポート番号を変えることもある
  • Web 開発の本を読んでいると、いろいろな都合から http のポートを 80 以外にしていることもよくある。
    • 80 の場合はポートを指定しなくてもいい
      • 例:http://localhost/hoge/fuga
      • 例:http://localhost:5000/hoge/fuga
P.373 ネットワーク間の通信
  • 同じネットワークに接続されたノード間はデータリンク層(第 2 層)の通信
  • ネットワークを超えたノード間はネットワーク層(第 3 層)の通信 -実際に図 7.1.4 を見よう
    • どこが IP アドレスでのやりとりか?
    • どこが MAC アドレスでのやり取りか?
P.374 7.2 ネットワーク接続装置と関連技術
P.374 7.2.1 物理層の接続
P.374 リピータ
  • ネットワーク上を流れる電流の増幅装置・整流装置
  • 物理層:第 1 層
  • データ通信はネットワーク上を流れる電流
    • ケーブルが長いと電流が減衰・波形が乱れが起きる
    • データが読み取れなくなる
    • これを増幅するのがリピータ
  • 大昔の電話は距離が遠いと音が小さく聞こえにくかった
    • まさにこの減衰が問題
  • リピータは 1:1 で繋ぐ
    • 現在では複数のノードを接続できるマルチポートリピータ(ハブ)が使われるのが一般的
P.374 7.2.2 データリンク層の接続
  • 第2層
P374 ブリッジ
  • データリンク層に位置
  • ネットワーク上を流れているフレーム(情報の単位)の MAC アドレスを認識して通信を中継する
    • 接続されているノードをコリジョンドメイン(セグメント)という単位に分割
    • MAC アドレスで判定したフレームのあて先のあるセグメントだけにフレームを送信
    • 無駄なトラフィックの回避
  • ポートの記憶
    • 通信のたびにある MAC アドレスをもつノードがどのポート に接続されているか学習
    • 次回の通信時には余分なポートには通信を中継しない。
  • ブリッジの動作
    • あて先MACアドレスをもとにMACアドレステーブルを参照する
    • あて先MACアドレスの接続ポートがフレームを受信したポー トと別ポートであれば,そのポートにフレームを送信し
      • 同一ポートであればフレームを破棄する
    • あて先MACアドレスが記憶されていない場合やブロードキャス トアドレス(FF-FF-FF-FF-FF-FF)の場合は,受信ポート以外のすべてのポートにフレームを送信する
P.375 スイッチングハブ
  • レイヤ2スイッチ(L2スイッチ)とも呼ばれる
  • データリンク層に位置
  • ブリッジと同じ働きをする
    • MAC アドレスを認識してフレームのあて先を決めて通信を行います。
  • 試験での問われ方
    • スイッチングハブはフレームの蓄積機能、速度変換機能や交換機 能をもっている。
    • このようなスイッチングハブと同等の機能をもち,同じプロトコル階層で動作する装置はどれか
    • 答えは「ブリッジ」
P.375 ブロードキャストストリーム
  • データリンク層で動作するブリッジやスイッチングハブなどの LANスイッチはブロードキャストフレームを受信ポート以外 のすべてのポートに転送
  • これらの機器をループ状に接続し冗長化させると信頼性はあがる
    • ブロードキャストフレームは永遠に回り続けながら増える
    • 最終的にはネットワークダウンを招く
    • この現象をブロードキャストストームという
  • ブロードキャストストームを防ぐプロトコル:スパニングツリープロトコル(Spanning Tree Protocol:STP)
    • ループを構成している一部のポートを通常運用時にはブロック(論理的に切断)する
    • ネットワーク全体をループをもたない論理的なツリー構造にする
P.376 ネットワーク層の接続
  • 第 3 層(レイヤ 3)
P.376 ルータ
  • ルータはネットワーク層(第 3 層)に位置する
    • あて先IPアドレスを見てパケットの送り先を決め通信を制御する
  • IP のローカルネットワークの境界線に設置して利用され,ネットワークの基本単位として機能
  • 世界中に散在しているローカルネットワークどうしをルータが結ぶ
    • 全体としてインターネットというインフラが機能
  • ルータで分けられたネットワークの単位をブロードキャストドメインという
  • ルータがパケットを受け取ったあと
    • あて先IPアドレスを見る
    • 自分のネットワークあてであれば,破棄
    • 他のネットワークあてであれば転送
      • どのルータへ送ればあて先のネットワークへの通信が速く行えるかを判断することを経路制御(ルーティング)
      • ルータはそのための経路表(ルーティングテーブル)を備えている
P.376 デフォルトゲートウェイ
  • 会社Aのネットワークに属するPCは会社BのPCと直接通信できない
  • 会社AのPCは他ネットワークへの接点であるルータAに転送を依頼
  • デフォルトゲートウェイ:会社AのPCから見て直近のルータA
  • 自分と直接接続していない相手と通信するときはすべてデフォルト ゲートウェイを中継する
P.376 ルーティング
  • 経路表(ルーティングテーブル)の作成方法
    • 手作業で作る:スタティックルーティング
    • ルーティングプロトコル利用:ルータ同士が経路情報を交換し、自立的に経路表を作るダイナミックルーティング
  • ダイナミックルーティングのための代表的なルーティングプロトコル:RIP、OSPF
  • RIP:ディスタンスベクタ型(距離ベクトル型)
    • ルーティングテーブルの情報(経路情報)を一定時間間隔で交換しあう
    • あて先ネットワークにいたるまでに経由するルータの数(ホップ数)最小経路を選ぶ
    • あて先に到達可能な最大ホップ数は 15
      • これを超えた経路は採用されない
  • OSPF:リンクステート型
    • コストを経路選択の要素に取り入れ、コスト最小経路を選ぶ
    • コスト値は,回線速度を基に自動的に算出されるが手動設定もできる
    • コスト算出式「コスト=100Mbps/経路の通信帯域(bps)」
  • コスト計算例は P.377 の図を見ること
P.377 ルータの冗長構成
  • ルータを冗長構成のために使うプロトコル:VRRP(Virtual Router Redundancy Protocol )
  • 同じ LAN に接続された複数のルータを仮想的に 1 台のルータ として見えるようにして冗長構成を実現する
  • 複数のルータでグループ(VRRP グループ)を作る
  • VRRP グループごとに仮想 IP アドレスと仮想 MAC アドレスを割り当て
  • PC などのノードは仮想ルータの IP アドレスに対して通信
  • 通常時はグループのマスタルータが仮想ルータの IP アドレス(仮想 IP アドレス)を保持
  • マスタルータに障害が発生すると他のバックアップルータがこれを継承
P.377 レイヤ3スイッチ(L3スイッチ)
  • ルータと同じネットワーク層(第 3 層)の通信機器
  • 特徴
    • ルータ:ソフトウェアで転送処理
    • レイヤ 3 スイッチ:専用ハードウェアで転送処理
  • 高速処理できる:大容量のファイルを扱うファイルサーバへのアクセスなど
P.378 トランスポート層以上の層の接続
P.378 ゲートウェイ
  • トランスポート層(第 4 層)-アプリケーション層(第7層)でネットワーク接続するための装置
  • 第 3 層のネットワーク層まででエンドツーエンド(E2E)の通信は完成する
    • E2E = 通信を行う二者、あるいは、二者間を結ぶ経路全体
    • エンドツーエンド原理:高度な通信制御や複雑な機能は末端のシステムが担い、経路上のシステムは単純に信号やデータの中継・転送だけすべし
    • TCP/IP ネットワークの原理
    • 誤り訂正・フロー制御・再送:TCP 層(第4層、トランスポート層)など上位側の機器やソフトウェア・プロトコル
    • 単純な送受信・転送処理:IP 層(第3層、ネットワーク層)
  • ゲートウェイ:第 4 層のトランスポート層以上が違う LAN システム相互間のプロトコル・データ形式の変換を担う
  • ゲートウェイはアプリケーションプロトコルの内容を 解釈できる
    • アプリケーションヘッダの不正な情報混入を検出可能
    • ファイアウォール・プロキシサーバもゲートウェイの一種
P.378 L4スイッチ・L7スイッチ
  • L4スイッチ(レイヤ4スイッチ)はトランスポート層(第4層)の装置
    • 定義としてはゲートウェイ
    • 機能的にはレイヤ2スイッチ・レイヤ3スイッチの延長上
    • ルータやレイヤ3スイッチはIPアドレスを参照して経路制御する
    • L4スイッチではTCPポート番号やUDPポート番号も経路制御判断に使える:第4層の機器だから
  • L7スイッチ:アプリケーション層(第7層)までの情報を使って通信制御する
P.379 7.2.5 VLAN
  • VLAN(Virtual LAN:仮想LAN)
  • スイッチ(レイヤ2スイッチ,レイヤ3スイッチ)で物理的な接続形態とは独立に仮想的なLANグループを構成する仕組み,あるいはそう構成されたLAN
  • 複雑な形態のネットワークを楽に構築できる
  • サブネット構成も柔軟に変えられる
P.380 データリンク層の制御とプロトコル
  • データリンク層:第2層
P.380 7.3.1 メディアアクセス制御
  • 複数のデータを1つのケーブルを通して送受する場合,データの衝突(コリジョン)を回避するための制御が必要
    • これがメディアアクセス制御(Media Access Control:MAC)
コリジョン(衝突)

イーサネットや無線LANで複数の端末が送信し、データが衝突する現象を指す。旧式のイーサネット規格では、端末同士を接続するときに1組の通信路で双方向の通信を行う半二重通信のため、送信と受信を同時に行うことができない。送信と受信をその都度切り替えて行うので、端末がお互いデータを送信してしまうと衝突する可能性が高くなる。

P.380 CSMA/CD
  • CSMA/CD:Carrier Sense Multiple Access with Collision Detection:搬送波感知多重アクセ ス/衝突検出)の略。
  • イーサネットで採用されている方式
    • 衝突検知方式を採用
    • イーサネット:IEEE 802.3として標準化されている LAN規格
  • CSMA/CD
    • 各ノードは伝送媒体が使用中かどうかを調べて,使用中でなければデータを送りはじめる
    • 複数のノードが同時に通信しはじめるとデータの衝突が起こる
    • 衝突を検知し,一定時間(ランダム)待った後で,再送
    • 一定の距離以上のケーブルでは衝突が検知できない
  • CSMA/CD方式の限界
    • トラフィックが増加するにつれて衝突が多くなる
    • 再送が増え,さらにトラフィックが増加する悪循環に陥る可能性がある
    • 特に伝送路の使用率が30%を超えると実用的でなくなる
P.381トークンパッシング方式
  • トークンによる送信制御を行う方式で
    • トークンバス方式
    • トークンリング方式
P.381 トークンパッシング方式
  • ネットワーク上をフリートークンと呼ばれる送信権のためのパケットが巡回する
    • フリートークンを獲得したノードだけが送信できるので衝突を避けられる
    • ふつうはコンセントレータ(集線器)でネットワ ークとノードを結ぶ
  • トークンパッシング方式を採用したLAN規格
    • 例:FDDI:Fiber Distributed Data Interface
    • FDDIは物理媒体に光ファイバを利用し,最大100Mビ ッ ト/秒の通信
  • 特徴
    • 伝送媒体上では衝突しない
    • トラフィックが増えるにつれてトークンを獲得しにくくなり,少しずつ遅延時間が増える
    • 衝突による再送制御の必要がないため伝送路の使用率に対する遅延時間の増加率はCSMA/CD方式より緩やか
P.382 TDMA 方式
  • TDM(時分割多重)
    • ネットワーク上にデータを送信する時間を割 り当てる(タイムスロット)
    • タイムスロットごとに別のデータを送って多重化する
    • TDM によるアクセス制御が TDMA
  • TDMA(Time Division Multiple Access:時分割多重アクセス)
    • CSMA/CD・トークンパッシング方式と並ぶ主要なデー タリンク技術
    • TDMA ではネットワーク(伝送路)を使える時間を細かく区切る
    • 割り当てられた時間は各ノードが独占する方式
    • TDMAはコネクション型の通信
P.382 7.3.2 無線LANのアクセス制御方式
P.382 CSMA/CA方式
  • CSMA/CA:Carrier Sense Multiple Access with Collision Avoidance、搬送波感知多重アクセス/衝突回避
  • 無線 LAN の制御方式
  • CSMA/CD との違い:「衝突検出」が「衝突回避」になった
  • 無線 LAN:物理層媒体は電波で衝突の検出は不可能だから回避する
  • 特徴
    • 送信ノードは使いたい周波数帯の使えるか確認後、必ずランダムな時間だけ待ってから送信をはじめる
      • 待ち時間をバックオフ制御時間とよぶ
    • 衝突してフレームが壊れても検出できない
      • データを受け取ったノードは ACK を返す
P.328 RTS/CTS
  • 無線 LAN の話
  • 隠れ端末問題
    • 他のノードのデータ送信を感知できないことがある
    • 通信ノード間の距離が遠い
    • ノード間に障害物がある
  • 回避のための RTS/CTS 方式
  • 無線 LAN ノード
    • データ送信前にRTS(Request ToSend:送信リクエスト)をアクセスポイントに送信
    • これを受理したアクセスポイントがCTS(Clear to Send:送信OK)を返信
      • 他のノードは CTS を傍受して自分以外の別のノードに送信権があると解釈
      • データ送信を延期
    • 無線LANノードはアクセスポイントからCTSを受信したらデータ送信開始します
    • 衝突抑制:CTSに書かれた他のノードに対する送信抑制時間を使う
  • データ送信開始前にデータ送信のネゴシエーシ ョンとして RTS/CTS 方式を使った CSMA/CA を CSMA/CA with RTS/CTS とよぶ
P.383 無線LANの動作モード
  • 無線 LAN の動作モード:図7.3.4参照
  • 2 つのモードがある
  • インフラストラクチャモード:無線LANノードがアク セスポイントを通じて相互に通信
  • アドホックモード:アクセスポイントなしに無線LANノードどうしが直接通信
P.383 COLUMN FDMA,CDMA
  • 表7.3.1:多元接続する技術グループ
    • TDMA とセット
  • FDMA
    • ある周波数帯をさらに細かい周波数帯に分割
    • 接続できる端末数を増やす技術
  • CDMA
    • 周波数も時間も分割しない
    • 符号で各端末の通信を識別・分離
    • 接続できる端末数を増やす
P.383 7.3.3 データリンク層の主なプロトコル
  • 第 2 層
P.384 ARP
  • ARP(Address Resolution Protocol):通信相手のIPアドレスからMACアドレスを取るためのプロトコル
  • ARPの動作
    • ブロードキャストで目的IPアドレスを指定したARP要求パケットをLAN全体に流す
      • ブロードキャスト:ネットワークに参加するすべての機器に同時に信号やデータを送ること
    • 各ノードは自分のIPアドレスと比較
    • 一致したノードだけARP応答パケットに自分のMACアドレスを入れて返す(ユニキャスト)
  • 参考:GARP(Gratuitous ARP)
    • 主な目的:自身に設定するIPアドレスの重複確認・ARPテ ーブルの更新
    • 目的IPアドレスに自身が使うIPアドレスを指定し,MACアドレスを問い合わせる
P.384 RARP
  • Reverse-ARP:逆アドレス解決プロトコル
    • MACアドレスからIPアドレスを取る
  • 電源オフ時にIPアドレスを保持できない(IPアドレスを保持するハードディスクをもたない)機器が電源オン時に自分のMACアドレスから自身に割り当てられているIPアドレスを知るために使う
  • RARP サーバー
    • MACアドレスとIPアドレスの対応表を持ったサーバー(RARPサーバー)が必要
P.384 PPP
  • PPP:Point to Point Protocol
    • 2 点間をポイントツーポイントでつなぐためのデータリンクプロトコル
    • WANを介して2つのノードをダイヤルアップ接続するときに使う
  • ネットワーク層(第3層)とネゴシエーションする NCP(ネットワーク制御プロトコル)とリンクネゴシエーションするLCP(リンク制御プロトコル)からなる
    • NCP:Network Control Protocol
    • LCP:Link Control Protocol
  • リンク制御やエラー処理機能を持つ
P.384 PPPoE
  • PPPoE:PPP over Ethernet
  • PPPと同等な機能をイーサネット(LAN)上で実現するプロトコル
  • PPPフレームをイーサネットフレームでカプセル化して実現
P.384 7.3.4 IEEE 802.3規格
  • メディアアクセス制御に CSMA/CD 方式を使う LAN についての標準
  • OSI基本参照モデルにおけるデータリンク層(第 2 層)と物理層(第 1 層)のプロトコルおよびサービスを規定
    • OSI 基本参照モデルでのデータリンク層を LLC 副層と MAC 副層の2つに分割
    • 物理層での LAN で使う伝送媒体や MAC 副層でのフレーム構成や衝突検出の仕組みを規定
  • ツイストケーブルの企画が表 7.3.2 にまとまっている
P.386 7.4 ネットワーク層のプロトコルと技術
  • もうやった
P.290 6.1.3 データベースの3層スキーマ
P.290 スキーマ
  • schema
  • データの性質・形式・ほかのデータとの関連などデータ定義の集合
P.290 ANSI/SPARC3層スキーマ
  • データベースの3層スキーマ
    • データを扱う立場を3つのグループに分け,それぞれに対応したデータ定義するためのモデル
  • 目的:次の2点の確立
    • 論理データ独立性:論理的なデータと利用者やアプリケーションプログラムから見たデータとの独立
    • 物理データ独立性:記憶装置との独立
  • cf. P.291 の図。
  • 外部スキーマ
    • 利用者やアプリケーションプログラムから見たデータを定義
    • 実世界が変化するとそれに合わせて概念スキーマは変わる
    • アプリケーションプログラムが影響を受けないようにするためにするためのスキーマ
    • 例:関係データベースのビュー
  • 概念スキーマ
    • 実際のデータの物理的な表現方法とは別
    • データベースの論理的構造とその内容を定義
    • 例:論理設計段階の論理データモデル
  • 内部スキーマ
    • データを記憶装置上にどのような形式や編成で記録するか、物理的内容の定義
    • 障害回復処理(リカバリ),セキュリティなども考えた実際にコンピュータに実装させる格納表現
P.291 COLUMN インメモリデータベース
  • データを直接メモリに配置してパフォーマンスを上げる
    • キャッシュとして使われることもよくある
  • DB の基本はあくまでディスクにデータを記録してメモリに読み込む
    • ディスク入出力がボトルネック
    • 前に紹介した速度表を参照すること
  • インメモリデータベースではディスク入出力がない
    • 基本の処理がメモリ上で閉じるので処理が速い
  • 最近のインメモリデータベースの傾向
    • データをカラム(列)型フォーマットでメモリに配置する列指向(カラム指向)を採用
    • 集計や分析処理などのクエリが高速化します
  • 欠点
    • 揮発性:メモリ上のデータは電源を切ると失われてしまう
    • 何かの事故が起きたらデータが(すべて)飛ぶ
    • HDD・SDD よりもメモリは高い
  • 対策
    • データを定期的にディスクに保存する機能
    • 別のスタンバイデータベースにデータの複製を取るレプリケーション機能
P.292 6.1.4 E-R図
  • 実世界にあるデータ構造をなるべくそのまま表現したい
  • データベース管理システムに依存しないデータモデルを作りたい
  • ER 図:E-Rモデルを図で表現
    • Entity-Relationship Diagram
P.292 E-R図の構成要素
  • エンティティ:データベース化の対象となる実世界を構成する実体
    • 大きく分けて 2 種類
    • 物理的実体がある:顧客、商品など
    • 物理的実体がない:顧客と購入商品の「関係」そのもの:後の例参照
    • RDB の例をいろいろ見るとわかる
  • アトリビュート:エンティティがもつその性質や特徴を表すいくつかの属性
  • 例:顧客エンティティ
    • 顧客番号,顧客名
  • 識別子:エンティティを一意に識別するための属性
    • いわゆる ID:関係データベースの表の主キー
    • 例:顧客番号
    • 内部 ID と外部(?)ID がある。
    • 内部 ID:システム内で固定の ID。よく数値を使う
    • 外部(?)ID:ログイン ID などユーザーが決める ID。
      • メールアドレスなどある時点では一意。
      • ユーザーが変更できるのでシステム内でその値を永続的に使えない
  • 関連(リレーションシップ):業務上の規則やルールなどによって発生するエンティティ間の関係
    • 顧客はいくつもの商品を注文する
  • カーディナリティ:エンティティ間の「1対1」、「1対 多 」、「 多 対 多 」といった対応関係の表現
    • 数学で基数・濃度を cardinal number というその cardinal
P.292 「多対多」の関係
  • 「多対多」の関係は,関係データベースとして実装できない
    • 「1対多」と「多対1」の関係に分解する
  • リレーションシップそれ自体を1つのエンティティとする
    • 図 6.1.8 参照
    • 識別子に顧客エンティティの識別子(顧客番号)と商品エンティティの識別子(商品番号)をもたせる
    • 顧客と注文の関係は「1対多」、注文と商品の関係は「多対1」の関係
    • このときの「注文」を連関エンティティと呼ぶ
  • 注意:リレーションシップも属性をもつ
    • 例:注文日、注文数量
      • 顧客と商品の両方が特定されてはじめて確定する概念
P.292 独立エンティティと依存エンティティ
  • エンティティ間に「1対多」の関係があるとき
  • 「多」側のエンティティは「1」側のエンティティの識別子を外部キーとしてもつ
    • 外部キーがまさに RDB の R
  • 外部キーが識別子の一部となる場合、そのエンティティは「1」側のエンティティに依存する
    • cf. P.292 図6.1.8 の注文エンティティ
    • 注文はある顧客がある商品を注文するという概念
    • 顧客番号と商品番号がないと存在できない
    • これを依存エンティティ(弱実体)と呼ぶ
  • これを独立化したければしてもいい
    • 注文番号を導入
    • 注文エンティティを図 6.1.9 のように捉える
    • 親エンティティに依存しない独立エンティティ (強実体)とみなせる
    • 「発注書に ID を振りたい」といった要望も多いはずで、よくある対応
  • 独立化させる必要がないケースの例も見てみよう
    • e-ラーニングでの受講履歴
    • 「誰がどのコースのどの単元を受講したか」
    • 特に ID を振って独立に管理したいわけではない
    • いつ何を受講してどういう結果だったか(テスト系ならどの問題にどう回答して正否はどうか)といったことは知りたい
P.294 6.2 関係データベース
P.294 6.2.1 関係データベースの特徴
  • 関係データベース:RDB(Relational DataBase)
  • 1970年 E.F.コッド博士によって提案された関係モデルをもとにしたデータベース
  • 現在,最も多く使われているデータベース
  • 一応集合論をもとにしているらしいが、集合論を知らなくても全く問題ない
  • 計算機科学の専門家は集合を勉強しないと駄目らしいという事案ではある模様
P.294 関係データベースの構造
  • 意味的にひとまとまりのデータを 2 次元の平坦な表で表す
    • 列が「あるユーザの情報」
    • 行が「ある属性の情報」:名前やメールアドレス
  • 表に格納されるデータ:単位は次の通り
    • 行(組、タプル)
    • 列(属性、アトリビュート)
  • 2 次元の平坦な表
    • 行と列が交差する 1 つのマスには 1 つの値しか入らない
      • 「1 つの値」とはいうが、JSON を叩き込むこともある
      • 参考
      • インデックスが張れず検索のパフォーマンスは厳しいので、検索したいなら JSON を張るのはやめた方がいい
      • NoSQL だと列そのものが JSON だったりもする
    • 第 1 正規形:cf. P.300 6.3.2
次数と基数
  • (この言葉を使った記憶がない)
  • 次数:1 組のデータを表す行を構成する列の数
  • 基数:1 つの表を構成する行の数
    • テーブルを集合とみなしたときの要素数
  • 本曰く「次数は変わることはありません」
    • テーブル定義を変えると変わる
    • 実際にテーブル定義を変えることはよくある:特に開発中は。
    • 機能追加・改修案件で追加されることもよくある
  • 1 行は 1 組のデータを表す:表に対するデータの追加・削除で基数はよく変わる
P.295 定義域(ドメイン)
  • テーブル全体を $\mathcal{T} = A \times B \times \cdots \times Z$ と書いたときの各 $A,B,\dots,Z$ をドメイン(定義域、domain)と呼ぶ
  • 数学の集合と違って $\mathcal{T}$ の中に同じ集合を含まない:つまり $\mathcal{T} = \mathbb{R}^n$ といったテーブルは考えない
  • ドメインは「属性が取り得る値の集合」
    • RDB では適当なデータ型を対応させる:日付,金額,数量,量
  • ドメインを新たなデータ型として定義すると違うデー タ項目でも同じ入力チェックや同じ出力編集ができる
P.296 6.2.2 関係データベースのキー
  • 表中の行を一意に識別するためのキー(スーパキー,候補キー,主キー)
  • 別の表を参照し関連づけるための外部キー
P.296 スーパキー
  • 表中の行を一意に特定できる属性,あるいは属性の組
    • 組について:購入履歴を知るためにはユーザーID・商品ID・購入日がわからないといけない、という程度の意味
    • かなり広い意味のようなのでたぶんそんなに使わない
  • 補足:なぜスーパ「ー」キーではないのか
P.296 候補キー
  • 行を一意に決めるための必要最小限の属性で構成されるスーパーキー
    • 一意性制約が必要
  • 何かの履歴のように複数のIDの組になることもある
    • 外部キーが入るテーブルでよくある
P.296 主キー
  • 複数存在する候補キーの中から任意に選んだ1つの候補キーを主キー(primary key)
  • 主キーに選ばれなかった残りの候補キーを代理キー(alternate key)
  • 主キー制約
    • 一意性制約
    • 実体を保証するため空値(NULL)は許さないという NOT NULL制約
P.296 外部キー
  • 関連する他の表を参照する属性あるいは属性の組
  • 2 つの表の間に「1対多」の関係がある場合
    • 「多」側の表に「1」側の表の主キーあるいは主キー以外の候補キーを参照する属性をもたせて外部キーにする
  • 参照制約:外部キーの値が外部キーで参照される表に存在することを保証
    • 参照制約があると「親テーブル」のカラムを勝手に消せなくなる
  • 複数の表を参照するなら表内に複数の外部キーを持つ
    • 外部キーの値に NOT NULL 制約がなければ NULL が許される
  • 一般に外部キーは被参照表の主キーを参照
    • UNIQUE 指 定 さ れ た候補キーを参照する場合もある
  • cf. 参照制約:P.320
P.297 COLUMN 代用のキー設定
  • 主キーが複数の属性から構成される複合キー(連結キー)でその構成属性数が多すぎると運用が面倒
  • 連番のような必ずしも積極的な意味がない属性を追加してそれを代用のキー(surrogate key)にする
    • 複合キーを構成している属性はすべて非キー属性にして代理キーにする
P.298 6.3 正規化
P.298 6.3.1 関数従属
  • 関数従属:ある属性xの値が決まると他の属性yの値が一意的に決まる関係で、$x \mapsto y$ と書く
    • 属性 $x$:独立属性(決定項)
    • 属性 $y$:従属属性(従属項)
  • 正規化:1 つの表の中の属性間にある関数従属性に着目して整理する
    • 整合性を維持しやすいデータベースが設計できる
P.298 部分関数従属
  • 関係 $x \mapsto y$ で $y$ が $x$ の真部分集合に関数従属するとき、$y$ は $x$ に部分関数従属するという
    • どこの業界の用語なのかよくわからない。情報系?
  • 部分関数従属は独立属性 $x$ が複数の属性からなるときに起こりうる関数従属
    • あまりピンとこない:P.299 に商品マスタ的な例が載っていた
  • 本の例:独立属性 $x$ が $x_1$ と $x_2$ の 2 つの属性からなるとき
    • ${x_1, x_2} \mapsto y$ が成り立ち、かつ $x_1 \mapsto y$ または $x_2 \mapsto y$ のどちらかが成り立つ
    • このとき ${x_1, x_2 }$ と $y$ の間に部分関数従属がある
  • 例:社員所属部門テーブル
    • 社員番号・部門コード・部門名があるテーブル
    • 主キー:社員番号と部門コード
    • 部門コードに対して部門名は一意に紐づく
    • このとき部門名は主キーに部分関数従属する
P.298 完全関数従属
  • 完全関数従属:関係 $x \mapsto y$ で $y$ が $x$ のどの真部分集合にも関数従属しない
  • 独立属性 $x$ が 1 つの属性かなるときは常に完全関数従属
P.299 推移的関数従属
  • 直接ではなく間接的に関数従属している関係
  • 例:社員マスタ
    • 社員番号・社員名・住所・郵便番号からなるテーブル
    • 社員番号から住所が一意に紐づく
    • 住所から郵便番号が一意に紐づく
    • 郵便番号は社員番号に推移的関数従属している
    • 念のため:住所は住所マスタなどに外出し(正規化)するべきで、こういうテーブルを作ってはいけない
    • 詳しくは次の 6.3.2 で議論される
P.300 6.3.2 正規化の手順
P.300 第 1 正規化
  • 非正規:くり返し部分をもつテーブルのこと
    • まずもってくり返しという言葉の理解自体がたぶん面倒
    • いろいろな例に触れてみよう
  • RDB は平坦な 2 次元の表(テーブル)
    • くり返し部分をもつ表から繰り返しを排除してスリム化したい
  • 第 1 正規化:くり返しを排除する操作
    • 第 1 正規形:第 1 正規化して得られた表のこと
    • cf. P.300 図6.3.4 の売上表
  • P.300 図 6.3.5
    • 売り上げ明細表:主キーの売上番号とくり返し部分を一意に決める商品番号が複合キー
    • 別の表に分解する
    • 外部キー:他のテーブルの主キーである売上番号を参照している
  • 分解・独立させた表に元の表の主キーをもたせる理由:結合で元の表を再現するため
P.301 第1正規形におけるデータ操作での不具合
  • 第1正規形になった表は RDB 上で定義できる
  • データの冗長性のためにデータ操作時に不整合を起こさないように注意が必要:更新時異常の概念
  • 種類は以下の通り
  • 例は本 P.300 の売り上げ表・売上明細表から
  • 第 1 正規形では以下のような更新時異常が起きる可能性がある
    • 防止策が第 2 正規化・第 3 正規化
    • どこまでどうやるかは状況次第
P.301 修正時異常
  • 商品名「オレンジ」を「清見オレンジ」に変更したい
    • 該当する行をすべて同時に変更しなければならない
    • 1行でも変更し忘れるとデータ不整合が起きる
  • 先に対策を書いておく
    • 売上明細には商品番号だけ持たせて、商品名を削る
    • 削った代わりに商品テーブルを作る
    • (ふつう商品テーブルには単価も切り出す)
    • (単価に消費税を載せるかどうかといった問題もある)
P.301 挿入時異常
  • 売上明細表の主キーは売上番号と商品番号の複合キ ー
  • 売上のない("売上番号"が空値)商品は登録できない
    • どうやらこの本の「売上表」は商品テーブルも兼ねているらしい
  • 先に対策
    • 商品テーブルを別に作って、そこからの参照という形にする
P.301 削除時異常
  • (先程と同じくこの本の売り上げ表は商品テーブルも兼ねている模様)
  • 売上実績が 1 つしかない商品のの売上データを削除す ると商品データも削除される
  • 逆に商品データを残そうとすれば売上データは削除できない
  • 先に対策:商品テーブルを切り出す
P.301 第2正規化
  • 第2正規化:すべての非キー属性が各候補キーに完全関数従属である状態にする操作
    • 第1正規形の表に対して行われる操作
    • 候補キーの一部に部分関数従属する非キー属性を別の表に分解する
    • 第2正規化して得られた表を第2正規形という
  • 例:図6.3.7の売上明細表
    • 候補キーは主キーの{売上番号,商品番号}の1
    • 非キー属性である商品名と単価は主キーの一部である商品番号に部分関数従属している
      • 商品表として独立させる
  • 分解の仕方
    • 商品表の主キーを商品番号
    • 図6.3.7の上の表を再現できるようにする
      • 売上明細表(図6.3.7の下の表)には商品表の主キーを参照する外部キーとして"商品番号"を残す
P.302 メモ
  • 第2正規化するのは候補キーが複数の属性で構成されている場合。
    • 1つの属性で構成されているのであれば部分関数従属は存在しない
    • 既に第2正規形
  • 非キー属性:どの候補キーにも属さない属性
  • 第2正規形:どの非キー属性も候補キーの真部分集合に対して関数従属しない
    • どの非キー属性も候補キーに完全関数従属
P.302 第3正規化
  • 第3正規化:非キー属性間の関数従属をなくしてどの非キー属性も候補キーに直接に関数従属している状態にする
    • 第2正規形の表に対して行われる操作
    • 候補キーに推移的関数従属している非キー属性を別の表に分解
    • 第3正規化して得られた表を第3正規形
  • 例:図6.3.8の売上表
    • これは第2正規形
    • 顧客番号→顧客名いう非キー属性間の関数従属がある
    • 顧客番号を主キーとした顧客表として独立させる
    • 売上表には顧客表の主キーを参照する外部キーとして顧客番号を残す
P.303 メモ
  • 第3正規形:どの非キー属性も候補キーに推移的関数従属しない
    • どの非キー属性も候補キーに直接に関数従属している
  • ボイス・コッド正規形
    • 第3正規形では次の関数従属が存在する可能性がある
      • 候補キーの真部分集合から他の候補キーの真部分集合への関数従属
      • 候補キー以外の属性から候補キーの真部分集合への関数従属
    • この関係を分解したのがボイス・コッド正規形
P.303 正規化と非正規化
  • 正規形には第1正規形から第5正規形まである
    • たいていの用途ではデータベースの場合、第3正規形まで正規化されていれば十分といわれている
  • 正規化の目的はデータ操作にともなう更新時異常の発生を防ぐこと
    • 属性間の関数従属を少なくする
    • データの重複を排除する
  • 正規化のデメリット
    • 表がいくつにも分割される
    • 必要なデータを取り出すために表を結合しないといけない
    • 処理時間がかかる
  • 処理速度が必要な時や更新時異常の発生が低い場合はあえて正規化しない・正規化を解く
    • たとえば更新が少ない表は正規化しない
  • ここでの「非正規化」:アクセスパターンを考えたうえでどの表を統合するか、どの属性を表間に重複させるか考える
P.304 6.4 関係データベースの演算
P.304 6.4.1 集合演算
  • 関係データベースでの集合演算
    • 同じ型の表間での和、共通部分(積)、差
    • 直積:同じ型の表でなくてもいい
P.304 和、共通(積)、差
  • 図6.4.1の表AとBに対するそれぞれの演算結果を見る
  • 本参照
P.305 直積演算(Cartesian Product:×)
  • 社員表と部門表の直積は社員表の各行に対して部門表の行を1つずつつなぎ合わせた表
  • 直積の結果として得られる新しい表を直積表と呼ぶ
    • 次数(属性の数)は両方の表の次数を足した数
    • 位数(タプルの数)は両方の位数を掛けた数
  • 直積が役に立つイメージがない:実際には結合 (JOIN) を本当によく使う
P.305 6.4.2 関係演算
  • 関係演算:関係データベース特有の演算
    • 射影,選択,結合,商
  • 関係代数:関係演算と集合演算を合わせた代数
    • 導出表:これらの演算によって得られた表
P.306 SQL の例
  • 先に持ってきてみた

SELECT 社員コード, 社員名, 部門表.部門コード, 部門名

FROM 社員表, 部門表

WHERE 社員表.部門コード = 部門表.部門コード

P.305 選択と射影
  • 選択演算:表から指定した行を取り出す関係演算
    • SQL でいう WHERE
  • 射影演算:表から指定した列を取り出す関係演算
    • SQL でいう SELECT column_name
P.306 結合
  • 参考:P.306 の下の表
  • 結合演算:2つの表が共通にもつ項目(結合列)で結合して新しい表をつくり出す関係演算
    • まさに正規化でわけたテーブルを結合させる演算
  • SQL:SELECT文のFROM句で複数の表名をカンマで区切って指定
    • WHERE句で結合条件を指定
  • 結合条件
    • 結合列の値を>,≧,=,≠,≦,<のいずれかの比較演算子で比較して結びつける
  • 等結合:比較演算子が「=(等号)」である結合
    • 2つの表から作成される直積表から結合列の値が等 しいものだけを取り出す
    • 得られた新たな表には結合列が重複して含まれる
    • SELECT句でどちらか一方の結合列を指定して見かけ上の重複を除く
  • 自然結合(natural join):重複する結合列を取り除く(一方のみ残す)ようにした結合
    • 結合列の列名が2つの表で同じ場合に使える
    • 参考
      • (意識的に使ったことがない)
P.307 内結合と外結合
  • 参考:P.307 の図 6.4.8
  • 内結合(INNER JOIN)
    • 結合列の値が等しい行だけを取り出す結合演算
    • 片方の表にしか存在しない行は取り出せない
    • データベース言語仕様(JIS X 3005)
  • 外結合(OUTER JOIN)
    • 片方の表にしか存在しない行も取り出せる結合
    • 結合相手の表に該当するデータが存在しない場合はNULL(空)値で結合
    • 左外結合・右外結合・完全外結合
  • 等結合
    • 結合する表をFROM句で指定、結合条件はWHERE句 で指定
  • 内結合・外結合
    • 結合する表をFROM句の中でJOINを使って指定
    • 結合条件は JOIN に続くON句で指定する
    • 参考:p309のコラム「内結合と外結合のSQL文」
P.307 左外結合(LEFT OUTER JOIN)
  • 参考:P307 図 6.4.9、P309 の SQL 文
  • 結合する左の表(社員表)が基準
  • 右の表(部門表)に存在しない行を空値(NULL)として結合
P.308 右外結合(RIGHT OUTER JOIN)
  • 参考:P.308 図 6.4.10
  • 結合する右の表(部門表)が基準
  • 左の表(社員表)に存在しない行をNULLとして結合
P.308 完全外結合(FULL OUTER JOIN)
  • 参考:P.308 図 6.4.11
  • 片方だけに存在する場合もう片方をNULLとして結合
P.308 商
  • (これ何だろうか?where の in?)
  • 参考:P.308 図 6.4.12
  • 関係R(X,Y1,Y2)とS(Y3,Y4)がある
  • S(Y3,Y4)のすべての行がR(Y1,Y2)に含まれる場合に対応するR(X)を求める演算
    • 商(R÷S)は関係Rの中から関係Sのすべての行を含む行を取り出し、そこから関係Sの項目を除く
    • 重複行も除く

2020-11-15 課題

  • 先に進む前に録画してあるか確認しよう

進捗

  • 前回の進捗
    • 基礎知識編:「COLUMN インメモリデータベース」まで
    • 本編:03-06「定積分の例 $f(x)=x^2$」まで
  • 今回の進捗
    • 基礎知識編:次数と基数まで
    • 本編:04-01 の冒頭

課題

TODO

自分用メモ

Matplotlib

  • 本当に簡単な図を描く
  • これを参考に scipy お絵描き
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import sph_harm

m,l = 1,4
theta = np.linspace(0, np.pi, 101)
phi = np.linspace(0, 2 * np.pi, 151)
theta, phi = np.meshgrid(theta, phi)

r = sph_harm(m, l, phi, theta).real
x = np.abs(r) * np.sin(theta) * np.cos(phi)
y = np.abs(r) * np.sin(theta) * np.sin(phi)
z = np.abs(r) * np.cos(theta)

fig = plt.figure(figsize=(8, 8))
ax = fig.gca(projection="3d")
ax.plot_surface(x, y, z, color="aqua", edgecolor="k")
plt.axis("off")
plt.show()

TeX の記録

  • ミンコフスキーの不等式

\begin{align} \Vert f+g \Vert_p \leq \Vert f \Vert_p + \Vert g \Vert_p, \quad p \geq 1. \end{align}

日々の勉強

Julia

IT 基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。
  • ネットワークの話もいい加減飽きたので、DB の話を先行してやるか?

復習

  • 3 つのスキーマ
    • ユーザーが見るレベル
    • 正規化などをかけておいたデータベースにもっていけるレベル
    • 個々のデータベースに合わせた具体的なレベル
  • インメモリの DB:コンピューターの基本的なハードウェア構成と意味を復習しよう

本の記述を追いかける

P.408 7.8 交換方式
P.408 パケット交換方式
  • 回線交換方式と対になる概念
    • 回線交換方式:通信を行うノード間で物理的な通信路を確保してから通信する
    • 例:電話
  • パケット交換方式について
    • データ送信するノードはデータをパケットに区切る。
    • ひとつひとつのパケットにヘッダを付けて送信。
    • ネットワーク内ではパケット交換機にパケットがたまる
    • ネットワークの状況に応じて順次送られる
パケット通信のメリット・デメリット
メリット

耐障害性 - 通信路を固定しないため,迂回経路が取れる。 - パケット交換機にデータが蓄積されているため,復旧まで待てる。 - パケット多重 - 1 対 1 の通信で回線を占有する必要がないため,1つの回線を多くのノードで共有でき,回線を効率的につかえる - 異機種間接続性 - パケット交換機で中継するときにプロトコル変換・速度変換でエンドノードどうしが同じプロトコルをサポートしていなくても通信できる

デメリット
  • ネットワーク内の蓄積交換処理による遅延
    • 蓄積交換処理による遅延解消のために主に回線の帯域を広げることで対応してきた
    • 構造上,完全には遅延をなくせない
  • パケット到着順序の不整合
P.408 ATM 交換方式
  • ATM(Asynchronous Transfer Mode:非同期転送モード)
  • 遅延のない回線交換方式とパケット交換方式の利点を得たい
  • パケット交換方式の発展
  • 遅延の原因をつぶす:特にパケットの多様性
    • 多種多様なパケットに対応するために,パケット交換機はソフトウェア処理が必要 ^ ATM での工夫の一例:最も特徴的なのは,パケット(ATMではセルという)の長さをヘッダ部 5 バイト,ペイロード 48 バイトの53バイトに統一
    • パケット解析がハードウェアだけでできる。
    • ソフトウェアは不要になった。
  • Wikipedia から
    • 当初の意図に反して非常に複雑な技術になってしまった
    • ATM は次世代の主流にならず限定的な使用にとどまった
    • ATM の設計思想は MPLS へと引き継がれた
    • 汎用のレイヤ 2 のパケットスイッチングのプロトコルとして、ルーターを介したIPの通信網で利用されている。
P.408 ペイロード(payload)
  • データ通信で本来転送したいデータ本体の部分、ボディを指す。
  • ATM ではペイロードのサイズを固定して処理を簡素化
  • 難点:パケット全体に占めるペイロードのサイズが相対的に小さくオーバヘッドが大きい
P.410 輻輳
  • フレームリレー:パケット交換方式の一種
    • 1 つの回線を多数のユーザで共有。
    • 回線がもつ潜在的な伝送能力(ワイヤスピード)を十分に引き出すうえで効果がある
  • 輻輳:ユーザの利用が一時期に集中すると,ワイヤスピードを超えるパケットがネットワーク上に流れる
    • ネットワークが輻輳状態になるとスループットが落ちる
  • フレームリレーサービスを提供する事業者は,ネットワークが輻輳状態に陥ってスループットが低下しても最低限保証する通信速度を決めている
    • CIR(Committed Information Rate:認定情 報速度)
P.370 7 ネットワーク
  • 確か 7.4 から始めた気がするので 7 章はじめから
P.370 7.1.1 OSI基本参照モデル
  • 改めて復習
  • OSI(Open System Interconnection)基本参照モデル- 異なる設計思想・世代のシステムと円滑に通信するのが目的に標準化
  • プロトコルの単機能化,交換の容易さが目的
    • 階層化のおかげで一部の階層の技術体系が変わっても、その階層だけ取り替えればいい
    • コスト・リスクを小さくする
P.370 プロトコルとサービス
  • N 層:それぞれの階層のこと
  • エンティティ:N 層に存在する通信機器などの実体
    • この言葉はいろいろなところで出てきていろいろな意味で使われる
    • もちろん気分的には適当な実体を指すことが多い
  • プロトコル:N 層に属するエンティティが通信するための取り決め
  • 上位の層が下位の層を利用しながら通信する
    • 別の階層間のエンティティどうしが通信する窓口が必要
    • これを提供するのが下位層:この機能をサービスと呼ぶ
  • プロトコルに沿った仕様で製品を開発すれば別のベンダの機器でも通信できる
  • 参考:ベンダーロックイン

特定ベンダー(メーカー)の独自技術に大きく依存した製品、サービス、システム等を採用した際に、他ベンダーの提供する同種の製品、サービス、システム等への乗り換えが困難になる現象のこと。

出来上がった情報システムの正確な仕様が、システムを開発・構築したベンダーにしか解らなくなる場合がある。結果、システムの保守・拡張・改修等の際、現存システムを開発・構築したベンダーに引き続き発注せざるを得なくなる。

  • 「Excel で行政に提出する書類を作れ」事案もそれ。
  • Apple 製品で身の回りを固めるのも同じ。
  • 「多様性が大事」事案でもある。
7.1.2 TCP/IPプロトコルスイート
  • プロトコル同士には相性がある
    • 「ネットワーク層がこのプロトコルならトランスポート層はこのプロトコルにしておくとトラブルが少ない」
  • 一般に同じ団体が作ったプロトコルはセットで使われることが多い
    • このセットがプロトコルスイート ^ 最も代表的なのは IP を中心に組まれた TCP/IP プロトコルスイート
    • 独自の階層モデルをもつ
P.372 TCP/IPの通信
  • データをパケットに区切る
    • 各パケットにヘッダを付けて送信
    • ヘッダは各階層ごとに付加されて次の階層へと渡される
    • 各ヘッダにはその階層で必要となる送信元や送信先,大きさ,順番などパケット自体に関する情報を含む
    • TCPヘッダを付加したパケット:TCP セグメント
    • IP ヘッダを付加したパケット:IP パケット
    • MACヘッダを付加したパケット:MAC フレームあるいはイーサネットフレーム
P.372 MAC(Media Access Control)アドレス
  • イーサネットや FDDI で使用される物理アドレス
    • イーサネット (Ethernet):コンピューターネットワークの規格の1つ。オフィスや家庭で一般的に使用されている有線LAN (Local Area Network) の技術規格
    • FDDI:LAN でデータ転送を行うための標準の一つ
      • Fiber distributed data interface
  • データリンク層
  • 同じネットワークに接続された隣接ノード間の通信で相手を識別するために使う
  • MACアドレスの長さ:6バイト
    • 先頭24ビットの OUI(ベンダID)
    • 後続24ビットの固有製造番号(製品に割り当てた番号)
  • MAC アドレスは機器が固有にもつ番号
    • 必ず一意に定まるように IEEE が管理
P372 ポート番号
  • トランスポート層にでノード内のアプリケーションの識別に使う識別子番号
    • 0-65535の範囲
  • TCP/IPではパケット交換方式でデータをやり取りする
  • よく使われるアプリケーションについてのポート番号は Well-Known ポートとして標準化
    • TCP・UDPそれぞれで 0-1023 番までの番号を割り当てている
    • SSH:TCP22番
    • Telnet:TCP23番
    • SMTP:TCP25番
    • HTTP:TCP80番
    • POP3:TCP110番
    • IMAP4:TCP143番
    • HTTPS :TCP443番
    • NTP:UDP123番
    • SNMP:UDP161番
    • SNMP Trap :UDP162番
  • セキュリティ対策のために標準とはポート番号を変えることもある
  • Web 開発の本を読んでいると、いろいろな都合から http のポートを 80 以外にしていることもよくある。
    • 80 の場合はポートを指定しなくてもいい
      • 例:http://localhost/hoge/fuga
      • 例:http://localhost:5000/hoge/fuga
P.373 ネットワーク間の通信
  • 同じネットワークに接続されたノード間はデータリンク層(第 2 層)の通信
  • ネットワークを超えたノード間はネットワーク層(第 3 層)の通信 -実際に図 7.1.4 を見よう
    • どこが IP アドレスでのやりとりか?
    • どこが MAC アドレスでのやり取りか?
P.374 7.2 ネットワーク接続装置と関連技術
P.374 7.2.1 物理層の接続
P.374 リピータ
  • ネットワーク上を流れる電流の増幅装置・整流装置
  • 物理層:第 1 層
  • データ通信はネットワーク上を流れる電流
    • ケーブルが長いと電流が減衰・波形が乱れが起きる
    • データが読み取れなくなる
    • これを増幅するのがリピータ
  • 大昔の電話は距離が遠いと音が小さく聞こえにくかった
    • まさにこの減衰が問題
  • リピータは 1:1 で繋ぐ
    • 現在では複数のノードを接続できるマルチポートリピータ(ハブ)が使われるのが一般的
P.374 7.2.2 データリンク層の接続
  • 第2層
P374 ブリッジ
  • データリンク層に位置
  • ネットワーク上を流れているフレーム(情報の単位)の MAC アドレスを認識して通信を中継する
    • 接続されているノードをコリジョンドメイン(セグメント)という単位に分割
    • MAC アドレスで判定したフレームのあて先のあるセグメントだけにフレームを送信
    • 無駄なトラフィックの回避
  • ポートの記憶
    • 通信のたびにある MAC アドレスをもつノードがどのポート に接続されているか学習
    • 次回の通信時には余分なポートには通信を中継しない。
  • ブリッジの動作
    • あて先MACアドレスをもとにMACアドレステーブルを参照する
    • あて先MACアドレスの接続ポートがフレームを受信したポー トと別ポートであれば,そのポートにフレームを送信し
      • 同一ポートであればフレームを破棄する
    • あて先MACアドレスが記憶されていない場合やブロードキャス トアドレス(FF-FF-FF-FF-FF-FF)の場合は,受信ポート以外のすべてのポートにフレームを送信する
P.375 スイッチングハブ
  • レイヤ2スイッチ(L2スイッチ)とも呼ばれる
  • データリンク層に位置
  • ブリッジと同じ働きをする
    • MAC アドレスを認識してフレームのあて先を決めて通信を行います。
  • 試験での問われ方
    • スイッチングハブはフレームの蓄積機能、速度変換機能や交換機 能をもっている。
    • このようなスイッチングハブと同等の機能をもち,同じプロトコル階層で動作する装置はどれか
    • 答えは「ブリッジ」
P.375 ブロードキャストストリーム
  • データリンク層で動作するブリッジやスイッチングハブなどの LANスイッチはブロードキャストフレームを受信ポート以外 のすべてのポートに転送
  • これらの機器をループ状に接続し冗長化させると信頼性はあがる
    • ブロードキャストフレームは永遠に回り続けながら増える
    • 最終的にはネットワークダウンを招く
    • この現象をブロードキャストストームという
  • ブロードキャストストームを防ぐプロトコル:スパニングツリープロトコル(Spanning Tree Protocol:STP)
    • ループを構成している一部のポートを通常運用時にはブロック(論理的に切断)する
    • ネットワーク全体をループをもたない論理的なツリー構造にする
P.376 ネットワーク層の接続
  • 第 3 層(レイヤ 3)
P.376 ルータ
  • ルータはネットワーク層(第 3 層)に位置する
    • あて先IPアドレスを見てパケットの送り先を決め通信を制御する
  • IP のローカルネットワークの境界線に設置して利用され,ネットワークの基本単位として機能
  • 世界中に散在しているローカルネットワークどうしをルータが結ぶ
    • 全体としてインターネットというインフラが機能
  • ルータで分けられたネットワークの単位をブロードキャストドメインという
  • ルータがパケットを受け取ったあと
    • あて先IPアドレスを見る
    • 自分のネットワークあてであれば,破棄
    • 他のネットワークあてであれば転送
      • どのルータへ送ればあて先のネットワークへの通信が速く行えるかを判断することを経路制御(ルーティング)
      • ルータはそのための経路表(ルーティングテーブル)を備えている
P.376 デフォルトゲートウェイ
  • 会社Aのネットワークに属するPCは会社BのPCと直接通信できない
  • 会社AのPCは他ネットワークへの接点であるルータAに転送を依頼
  • デフォルトゲートウェイ:会社AのPCから見て直近のルータA
  • 自分と直接接続していない相手と通信するときはすべてデフォルト ゲートウェイを中継する
P.376 ルーティング
  • 経路表(ルーティングテーブル)の作成方法
    • 手作業で作る:スタティックルーティング
    • ルーティングプロトコル利用:ルータ同士が経路情報を交換し、自立的に経路表を作るダイナミックルーティング
  • ダイナミックルーティングのための代表的なルーティングプロトコル:RIP、OSPF
  • RIP:ディスタンスベクタ型(距離ベクトル型)
    • ルーティングテーブルの情報(経路情報)を一定時間間隔で交換しあう
    • あて先ネットワークにいたるまでに経由するルータの数(ホップ数)最小経路を選ぶ
    • あて先に到達可能な最大ホップ数は 15
      • これを超えた経路は採用されない
  • OSPF:リンクステート型
    • コストを経路選択の要素に取り入れ、コスト最小経路を選ぶ
    • コスト値は,回線速度を基に自動的に算出されるが手動設定もできる
    • コスト算出式「コスト=100Mbps/経路の通信帯域(bps)」
  • コスト計算例は P.377 の図を見ること
P.377 ルータの冗長構成
  • ルータを冗長構成のために使うプロトコル:VRRP(Virtual Router Redundancy Protocol )
  • 同じ LAN に接続された複数のルータを仮想的に 1 台のルータ として見えるようにして冗長構成を実現する
  • 複数のルータでグループ(VRRP グループ)を作る
  • VRRP グループごとに仮想 IP アドレスと仮想 MAC アドレスを割り当て
  • PC などのノードは仮想ルータの IP アドレスに対して通信
  • 通常時はグループのマスタルータが仮想ルータの IP アドレス(仮想 IP アドレス)を保持
  • マスタルータに障害が発生すると他のバックアップルータがこれを継承
P.377 レイヤ3スイッチ(L3スイッチ)
  • ルータと同じネットワーク層(第 3 層)の通信機器
  • 特徴
    • ルータ:ソフトウェアで転送処理
    • レイヤ 3 スイッチ:専用ハードウェアで転送処理
  • 高速処理できる:大容量のファイルを扱うファイルサーバへのアクセスなど
P.378 トランスポート層以上の層の接続
P.378 ゲートウェイ
  • トランスポート層(第 4 層)-アプリケーション層(第7層)でネットワーク接続するための装置
  • 第 3 層のネットワーク層まででエンドツーエンド(E2E)の通信は完成する
    • E2E = 通信を行う二者、あるいは、二者間を結ぶ経路全体
    • エンドツーエンド原理:高度な通信制御や複雑な機能は末端のシステムが担い、経路上のシステムは単純に信号やデータの中継・転送だけすべし
    • TCP/IP ネットワークの原理
    • 誤り訂正・フロー制御・再送:TCP 層(第4層、トランスポート層)など上位側の機器やソフトウェア・プロトコル
    • 単純な送受信・転送処理:IP 層(第3層、ネットワーク層)
  • ゲートウェイ:第 4 層のトランスポート層以上が違う LAN システム相互間のプロトコル・データ形式の変換を担う
  • ゲートウェイはアプリケーションプロトコルの内容を 解釈できる
    • アプリケーションヘッダの不正な情報混入を検出可能
    • ファイアウォール・プロキシサーバもゲートウェイの一種
P.378 L4スイッチ・L7スイッチ
  • L4スイッチ(レイヤ4スイッチ)はトランスポート層(第4層)の装置
    • 定義としてはゲートウェイ
    • 機能的にはレイヤ2スイッチ・レイヤ3スイッチの延長上
    • ルータやレイヤ3スイッチはIPアドレスを参照して経路制御する
    • L4スイッチではTCPポート番号やUDPポート番号も経路制御判断に使える:第4層の機器だから
  • L7スイッチ:アプリケーション層(第7層)までの情報を使って通信制御する
P.379 7.2.5 VLAN
  • VLAN(Virtual LAN:仮想LAN)
  • スイッチ(レイヤ2スイッチ,レイヤ3スイッチ)で物理的な接続形態とは独立に仮想的なLANグループを構成する仕組み,あるいはそう構成されたLAN
  • 複雑な形態のネットワークを楽に構築できる
  • サブネット構成も柔軟に変えられる
P.380 データリンク層の制御とプロトコル
  • データリンク層:第2層
P.380 7.3.1 メディアアクセス制御
  • 複数のデータを1つのケーブルを通して送受する場合,データの衝突(コリジョン)を回避するための制御が必要
    • これがメディアアクセス制御(Media Access Control:MAC)
コリジョン(衝突)

イーサネットや無線LANで複数の端末が送信し、データが衝突する現象を指す。旧式のイーサネット規格では、端末同士を接続するときに1組の通信路で双方向の通信を行う半二重通信のため、送信と受信を同時に行うことができない。送信と受信をその都度切り替えて行うので、端末がお互いデータを送信してしまうと衝突する可能性が高くなる。

P.380 CSMA/CD
  • CSMA/CD:Carrier Sense Multiple Access with Collision Detection:搬送波感知多重アクセ ス/衝突検出)の略。
  • イーサネットで採用されている方式
    • 衝突検知方式を採用
    • イーサネット:IEEE 802.3として標準化されている LAN規格
  • CSMA/CD
    • 各ノードは伝送媒体が使用中かどうかを調べて,使用中でなければデータを送りはじめる
    • 複数のノードが同時に通信しはじめるとデータの衝突が起こる
    • 衝突を検知し,一定時間(ランダム)待った後で,再送
    • 一定の距離以上のケーブルでは衝突が検知できない
  • CSMA/CD方式の限界
    • トラフィックが増加するにつれて衝突が多くなる
    • 再送が増え,さらにトラフィックが増加する悪循環に陥る可能性がある
    • 特に伝送路の使用率が30%を超えると実用的でなくなる
P.381トークンパッシング方式
  • トークンによる送信制御を行う方式で
    • トークンバス方式
    • トークンリング方式
P.381 トークンパッシング方式
  • ネットワーク上をフリートークンと呼ばれる送信権のためのパケットが巡回する
    • フリートークンを獲得したノードだけが送信できるので衝突を避けられる
    • ふつうはコンセントレータ(集線器)でネットワ ークとノードを結ぶ
  • トークンパッシング方式を採用したLAN規格
    • 例:FDDI:Fiber Distributed Data Interface
    • FDDIは物理媒体に光ファイバを利用し,最大100Mビ ッ ト/秒の通信
  • 特徴
    • 伝送媒体上では衝突しない
    • トラフィックが増えるにつれてトークンを獲得しにくくなり,少しずつ遅延時間が増える
    • 衝突による再送制御の必要がないため伝送路の使用率に対する遅延時間の増加率はCSMA/CD方式より緩やか
P.382 TDMA 方式
  • TDM(時分割多重)
    • ネットワーク上にデータを送信する時間を割 り当てる(タイムスロット)
    • タイムスロットごとに別のデータを送って多重化する
    • TDM によるアクセス制御が TDMA
  • TDMA(Time Division Multiple Access:時分割多重アクセス)
    • CSMA/CD・トークンパッシング方式と並ぶ主要なデー タリンク技術
    • TDMA ではネットワーク(伝送路)を使える時間を細かく区切る
    • 割り当てられた時間は各ノードが独占する方式
    • TDMAはコネクション型の通信
P.382 7.3.2 無線LANのアクセス制御方式
P.382 CSMA/CA方式
  • CSMA/CA:Carrier Sense Multiple Access with Collision Avoidance、搬送波感知多重アクセス/衝突回避
  • 無線 LAN の制御方式
  • CSMA/CD との違い:「衝突検出」が「衝突回避」になった
  • 無線 LAN:物理層媒体は電波で衝突の検出は不可能だから回避する
  • 特徴
    • 送信ノードは使いたい周波数帯の使えるか確認後、必ずランダムな時間だけ待ってから送信をはじめる
      • 待ち時間をバックオフ制御時間とよぶ
    • 衝突してフレームが壊れても検出できない
      • データを受け取ったノードは ACK を返す
P.328 RTS/CTS
  • 無線 LAN の話
  • 隠れ端末問題
    • 他のノードのデータ送信を感知できないことがある
    • 通信ノード間の距離が遠い
    • ノード間に障害物がある
  • 回避のための RTS/CTS 方式
  • 無線 LAN ノード
    • データ送信前にRTS(Request ToSend:送信リクエスト)をアクセスポイントに送信
    • これを受理したアクセスポイントがCTS(Clear to Send:送信OK)を返信
      • 他のノードは CTS を傍受して自分以外の別のノードに送信権があると解釈
      • データ送信を延期
    • 無線LANノードはアクセスポイントからCTSを受信したらデータ送信開始します
    • 衝突抑制:CTSに書かれた他のノードに対する送信抑制時間を使う
  • データ送信開始前にデータ送信のネゴシエーシ ョンとして RTS/CTS 方式を使った CSMA/CA を CSMA/CA with RTS/CTS とよぶ
P.383 無線LANの動作モード
  • 無線 LAN の動作モード:図7.3.4参照
  • 2 つのモードがある
  • インフラストラクチャモード:無線LANノードがアク セスポイントを通じて相互に通信
  • アドホックモード:アクセスポイントなしに無線LANノードどうしが直接通信
P.383 COLUMN FDMA,CDMA
  • 表7.3.1:多元接続する技術グループ
    • TDMA とセット
  • FDMA
    • ある周波数帯をさらに細かい周波数帯に分割
    • 接続できる端末数を増やす技術
  • CDMA
    • 周波数も時間も分割しない
    • 符号で各端末の通信を識別・分離
    • 接続できる端末数を増やす
P.383 7.3.3 データリンク層の主なプロトコル
  • 第 2 層
P.384 ARP
  • ARP(Address Resolution Protocol):通信相手のIPアドレスからMACアドレスを取るためのプロトコル
  • ARPの動作
    • ブロードキャストで目的IPアドレスを指定したARP要求パケットをLAN全体に流す
      • ブロードキャスト:ネットワークに参加するすべての機器に同時に信号やデータを送ること
    • 各ノードは自分のIPアドレスと比較
    • 一致したノードだけARP応答パケットに自分のMACアドレスを入れて返す(ユニキャスト)
  • 参考:GARP(Gratuitous ARP)
    • 主な目的:自身に設定するIPアドレスの重複確認・ARPテ ーブルの更新
    • 目的IPアドレスに自身が使うIPアドレスを指定し,MACアドレスを問い合わせる
P.384 RARP
  • Reverse-ARP:逆アドレス解決プロトコル
    • MACアドレスからIPアドレスを取る
  • 電源オフ時にIPアドレスを保持できない(IPアドレスを保持するハードディスクをもたない)機器が電源オン時に自分のMACアドレスから自身に割り当てられているIPアドレスを知るために使う
  • RARP サーバー
    • MACアドレスとIPアドレスの対応表を持ったサーバー(RARPサーバー)が必要
P.384 PPP
  • PPP:Point to Point Protocol
    • 2 点間をポイントツーポイントでつなぐためのデータリンクプロトコル
    • WANを介して2つのノードをダイヤルアップ接続するときに使う
  • ネットワーク層(第3層)とネゴシエーションする NCP(ネットワーク制御プロトコル)とリンクネゴシエーションするLCP(リンク制御プロトコル)からなる
    • NCP:Network Control Protocol
    • LCP:Link Control Protocol
  • リンク制御やエラー処理機能を持つ
P.384 PPPoE
  • PPPoE:PPP over Ethernet
  • PPPと同等な機能をイーサネット(LAN)上で実現するプロトコル
  • PPPフレームをイーサネットフレームでカプセル化して実現
P.384 7.3.4 IEEE 802.3規格
  • メディアアクセス制御に CSMA/CD 方式を使う LAN についての標準
  • OSI基本参照モデルにおけるデータリンク層(第 2 層)と物理層(第 1 層)のプロトコルおよびサービスを規定
    • OSI 基本参照モデルでのデータリンク層を LLC 副層と MAC 副層の2つに分割
    • 物理層での LAN で使う伝送媒体や MAC 副層でのフレーム構成や衝突検出の仕組みを規定
  • ツイストケーブルの企画が表 7.3.2 にまとまっている
P.386 7.4 ネットワーク層のプロトコルと技術
  • もうやった
P.290 6.1.3 データベースの3層スキーマ
P.290 スキーマ
  • schema
  • データの性質・形式・ほかのデータとの関連などデータ定義の集合
P.290 ANSI/SPARC3層スキーマ
  • データベースの3層スキーマ
    • データを扱う立場を3つのグループに分け,それぞれに対応したデータ定義するためのモデル
  • 目的:次の2点の確立
    • 論理データ独立性:論理的なデータと利用者やアプリケーションプログラムから見たデータとの独立
    • 物理データ独立性:記憶装置との独立
  • cf. P.291 の図。
  • 外部スキーマ
    • 利用者やアプリケーションプログラムから見たデータを定義
    • 実世界が変化するとそれに合わせて概念スキーマは変わる
    • アプリケーションプログラムが影響を受けないようにするためにするためのスキーマ
    • 例:関係データベースのビュー
  • 概念スキーマ
    • 実際のデータの物理的な表現方法とは別
    • データベースの論理的構造とその内容を定義
    • 例:論理設計段階の論理データモデル
  • 内部スキーマ
    • データを記憶装置上にどのような形式や編成で記録するか、物理的内容の定義
    • 障害回復処理(リカバリ),セキュリティなども考えた実際にコンピュータに実装させる格納表現
P.292 6.1.4 E-R図
  • 実世界にあるデータ構造をなるべくそのまま表現したい
  • データベース管理システムに依存しないデータモデルを作りたい
  • ER 図:E-Rモデルを図で表現
    • Entity-Relationship Diagram
P.292 E-R図の構成要素
  • エンティティ:データベース化の対象となる実世界を構成する実体
    • 大きく分けて 2 種類
    • 物理的実体がある:顧客、商品など
    • 物理的実体がない:顧客と購入商品の「関係」そのもの:後の例参照
    • RDB の例をいろいろ見るとわかる
  • アトリビュート:エンティティがもつその性質や特徴を表すいくつかの属性
  • 例:顧客エンティティ
    • 顧客番号,顧客名
  • 識別子:エンティティを一意に識別するための属性
    • いわゆる ID:関係データベースの表の主キー
    • 例:顧客番号
    • 内部 ID と外部(?)ID がある。
    • 内部 ID:システム内で固定の ID。よく数値を使う
    • 外部(?)ID:ログイン ID などユーザーが決める ID。
      • メールアドレスなどある時点では一意。
      • ユーザーが変更できるのでシステム内でその値を永続的に使えない
  • 関連(リレーションシップ):業務上の規則やルールなどによって発生するエンティティ間の関係
    • 顧客はいくつもの商品を注文する
  • カーディナリティ:エンティティ間の「1対1」、「1対 多 」、「 多 対 多 」といった対応関係の表現
    • 数学で基数・濃度を cardinal number というその cardinal
P.292 「多対多」の関係
  • 「多対多」の関係は,関係データベースとして実装できない
    • 「1対多」と「多対1」の関係に分解する
  • リレーションシップそれ自体を1つのエンティティとする
    • 図 6.1.8 参照
    • 識別子に顧客エンティティの識別子(顧客番号)と商品エンティティの識別子(商品番号)をもたせる
    • 顧客と注文の関係は「1対多」、注文と商品の関係は「多対1」の関係
    • このときの「注文」を連関エンティティと呼ぶ
  • 注意:リレーションシップも属性をもつ
    • 例:注文日、注文数量
      • 顧客と商品の両方が特定されてはじめて確定する概念
P.292 独立エンティティと依存エンティティ
  • エンティティ間に「1対多」の関係があるとき
  • 「多」側のエンティティは「1」側のエンティティの識別子を外部キーとしてもつ
    • 外部キーがまさに RDB の R
  • 外部キーが識別子の一部となる場合、そのエンティティは「1」側のエンティティに依存する
    • cf. P.292 図6.1.8 の注文エンティティ
    • 注文はある顧客がある商品を注文するという概念
    • 顧客番号と商品番号がないと存在できない
    • これを依存エンティティ(弱実体)と呼ぶ
  • これを独立化したければしてもいい
    • 注文番号を導入
    • 注文エンティティを図 6.1.9 のように捉える
    • 親エンティティに依存しない独立エンティティ (強実体)とみなせる
    • 「発注書に ID を振りたい」といった要望も多いはずで、よくある対応
  • 独立化させる必要がないケースの例も見てみよう
    • e-ラーニングでの受講履歴
    • 「誰がどのコースのどの単元を受講したか」
    • 特に ID を振って独立に管理したいわけではない
    • いつ何を受講してどういう結果だったか(テスト系ならどの問題にどう回答して正否はどうか)といったことは知りたい
P.294 6.2 関係データベース
P.294 6.2.1 関係データベースの特徴
  • 関係データベース:RDB(Relational DataBase)
  • 1970年 E.F.コッド博士によって提案された関係モデルをもとにしたデータベース
  • 現在,最も多く使われているデータベース
  • 一応集合論をもとにしているらしいが、集合論を知らなくても全く問題ない
  • 計算機科学の専門家は集合を勉強しないと駄目らしいという事案ではある模様
P.294 関係データベースの構造
  • 意味的にひとまとまりのデータを 2 次元の平坦な表で表す
    • 列が「あるユーザの情報」
    • 行が「ある属性の情報」:名前やメールアドレス
  • 表に格納されるデータ:単位は次の通り
    • 行(組、タプル)
    • 列(属性、アトリビュート)
  • 2 次元の平坦な表
    • 行と列が交差する 1 つのマスには 1 つの値しか入らない
      • 「1 つの値」とはいうが、JSON を叩き込むこともある
      • 参考
      • インデックスが張れず検索のパフォーマンスは厳しいので、検索したいなら JSON を張るのはやめた方がいい
      • NoSQL だと列そのものが JSON だったりもする
    • 第 1 正規形:cf. P.300 6.3.2
次数と基数
  • (この言葉を使った記憶がない)
  • 次数:1 組のデータを表す行を構成する列の数
  • 基数:1 つの表を構成する行の数
    • テーブルを集合とみなしたときの要素数
  • 本曰く「次数は変わることはありません」
    • テーブル定義を変えると変わる
    • 実際にテーブル定義を変えることはよくある:特に開発中は。
    • 機能追加・改修案件で追加されることもよくある
  • 1 行は 1 組のデータを表す:表に対するデータの追加・削除で基数はよく変わる
P.295 定義域(ドメイン)
  • テーブル全体を $\mathcal{T} = A \times B \times \cdots \times Z$ と書いたときの各 $A,B,\dots,Z$ をドメイン(定義域、domain)と呼ぶ
  • 数学の集合と違って $\mathcal{T}$ の中に同じ集合を含まない:つまり $\mathcal{T} = \mathbb{R}^n$ といったテーブルは考えない
  • ドメインは「属性が取り得る値の集合」
    • RDB では適当なデータ型を対応させる:日付,金額,数量,量
  • ドメインを新たなデータ型として定義すると違うデー タ項目でも同じ入力チェックや同じ出力編集ができる
P.296 6.2.2 関係データベースのキー
  • 表中の行を一意に識別するためのキー(スーパキー,候補キー,主キー)
  • 別の表を参照し関連づけるための外部キー
P.296 スーパキー
  • 表中の行を一意に特定できる属性,あるいは属性の組
    • 組について:購入履歴を知るためにはユーザーID・商品ID・購入日がわからないといけない、という程度の意味
    • かなり広い意味のようなのでたぶんそんなに使わない
  • 補足:なぜスーパ「ー」キーではないのか
P.296 候補キー
  • 行を一意に決めるための必要最小限の属性で構成されるスーパーキー
    • 一意性制約が必要
  • 何かの履歴のように複数のIDの組になることもある
    • 外部キーが入るテーブルでよくある
P.296 主キー
  • 複数存在する候補キーの中から任意に選んだ1つの候補キーを主キー(primary key)
  • 主キーに選ばれなかった残りの候補キーを代理キー(alternate key)
  • 主キー制約
    • 一意性制約
    • 実体を保証するため空値(NULL)は許さないという NOT NULL制約
P.296 外部キー
  • 関連する他の表を参照する属性あるいは属性の組
  • 2 つの表の間に「1対多」の関係がある場合
    • 「多」側の表に「1」側の表の主キーあるいは主キー以外の候補キーを参照する属性をもたせて外部キーにする
  • 参照制約:外部キーの値が外部キーで参照される表に存在することを保証
    • 参照制約があると「親テーブル」のカラムを勝手に消せなくなる
  • 複数の表を参照するなら表内に複数の外部キーを持つ
    • 外部キーの値に NOT NULL 制約がなければ NULL が許される
  • 一般に外部キーは被参照表の主キーを参照
    • UNIQUE 指 定 さ れ た候補キーを参照する場合もある
  • cf. 参照制約:P.320
P.297 COLUMN 代用のキー設定
  • 主キーが複数の属性から構成される複合キー(連結キー)でその構成属性数が多すぎると運用が面倒
  • 連番のような必ずしも積極的な意味がない属性を追加してそれを代用のキー(surrogate key)にする
    • 複合キーを構成している属性はすべて非キー属性にして代理キーにする
P.298 6.3 正規化
P.298 6.3.1 関数従属
  • 関数従属:ある属性xの値が決まると他の属性yの値が一意的に決まる関係で、$x \mapsto y$ と書く
    • 属性 $x$:独立属性(決定項)
    • 属性 $y$:従属属性(従属項)
  • 正規化:1 つの表の中の属性間にある関数従属性に着目して整理する
    • 整合性を維持しやすいデータベースが設計できる
P.298 部分関数従属
  • 関係 $x \mapsto y$ で $y$ が $x$ の真部分集合に関数従属するとき、$y$ は $x$ に部分関数従属するという
    • どこの業界の用語なのかよくわからない。情報系?
  • 部分関数従属は独立属性 $x$ が複数の属性からなるときに起こりうる関数従属
    • あまりピンとこない:P.299 に商品マスタ的な例が載っていた
  • 本の例:独立属性 $x$ が $x_1$ と $x_2$ の 2 つの属性からなるとき
    • ${x_1, x_2} \mapsto y$ が成り立ち、かつ $x_1 \mapsto y$ または $x_2 \mapsto y$ のどちらかが成り立つ
    • このとき ${x_1, x_2 }$ と $y$ の間に部分関数従属がある
  • 例:社員所属部門テーブル
    • 社員番号・部門コード・部門名があるテーブル
    • 主キー:社員番号と部門コード
    • 部門コードに対して部門名は一意に紐づく
    • このとき部門名は主キーに部分関数従属する
P.298 完全関数従属
  • 完全関数従属:関係 $x \mapsto y$ で $y$ が $x$ のどの真部分集合にも関数従属しない
  • 独立属性 $x$ が 1 つの属性かなるときは常に完全関数従属
P.299 推移的関数従属
  • 直接ではなく間接的に関数従属している関係
  • 例:社員マスタ
    • 社員番号・社員名・住所・郵便番号からなるテーブル
    • 社員番号から住所が一意に紐づく
    • 住所から郵便番号が一意に紐づく
    • 郵便番号は社員番号に推移的関数従属している
    • 念のため:住所は住所マスタなどに外出し(正規化)するべきで、こういうテーブルを作ってはいけない
    • 詳しくは次の 6.3.2 で議論される
P.300 6.3.2 正規化の手順
P.300 第 1 正規化
  • 非正規:くり返し部分をもつテーブルのこと
    • まずもってくり返しという言葉の理解自体がたぶん面倒
    • いろいろな例に触れてみよう
  • RDB は平坦な 2 次元の表(テーブル)
    • くり返し部分をもつ表から繰り返しを排除してスリム化したい
  • 第 1 正規化:くり返しを排除する操作
    • 第 1 正規形:第 1 正規化して得られた表のこと
    • cf. P.300 図6.3.4 の売上表
  • P.300 図 6.3.5
    • 売り上げ明細表:主キーの売上番号とくり返し部分を一意に決める商品番号が複合キー
    • 別の表に分解する
    • 外部キー:他のテーブルの主キーである売上番号を参照している
  • 分解・独立させた表に元の表の主キーをもたせる理由:結合で元の表を再現するため
P.301 第1正規形におけるデータ操作での不具合
  • 第1正規形になった表は RDB 上で定義できる
  • データの冗長性のためにデータ操作時に不整合を起こさないように注意が必要:更新時異常の概念
  • 種類は以下の通り
  • 例は本 P.300 の売り上げ表・売上明細表から
  • 第 1 正規形では以下のような更新時異常が起きる可能性がある
    • 防止策が第 2 正規化・第 3 正規化
    • どこまでどうやるかは状況次第
P.301 修正時異常
  • 商品名「オレンジ」を「清見オレンジ」に変更したい
    • 該当する行をすべて同時に変更しなければならない
    • 1行でも変更し忘れるとデータ不整合が起きる
  • 先に対策を書いておく
    • 売上明細には商品番号だけ持たせて、商品名を削る
    • 削った代わりに商品テーブルを作る
    • (ふつう商品テーブルには単価も切り出す)
    • (単価に消費税を載せるかどうかといった問題もある)
P.301 挿入時異常
  • 売上明細表の主キーは売上番号と商品番号の複合キ ー
  • 売上のない("売上番号"が空値)商品は登録できない
    • どうやらこの本の「売上表」は商品テーブルも兼ねているらしい
  • 先に対策
    • 商品テーブルを別に作って、そこからの参照という形にする
P.301 削除時異常
  • (先程と同じくこの本の売り上げ表は商品テーブルも兼ねている模様)
  • 売上実績が 1 つしかない商品のの売上データを削除す ると商品データも削除される
  • 逆に商品データを残そうとすれば売上データは削除できない
  • 先に対策:商品テーブルを切り出す
P.301 第2正規化
  • 第2正規化:すべての非キー属性が各候補キーに完全関数従属である状態にする操作
    • 第1正規形の表に対して行われる操作
    • 候補キーの一部に部分関数従属する非キー属性を別の表に分解する
    • 第2正規化して得られた表を第2正規形という
  • 例:図6.3.7の売上明細表
    • 候補キーは主キーの{売上番号,商品番号}の1
    • 非キー属性である商品名と単価は主キーの一部である商品番号に部分関数従属している
      • 商品表として独立させる
  • 分解の仕方
    • 商品表の主キーを商品番号
    • 図6.3.7の上の表を再現できるようにする
      • 売上明細表(図6.3.7の下の表)には商品表の主キーを参照する外部キーとして"商品番号"を残す
P.302 メモ
  • 第2正規化するのは候補キーが複数の属性で構成されている場合。
    • 1つの属性で構成されているのであれば部分関数従属は存在しない
    • 既に第2正規形
  • 非キー属性:どの候補キーにも属さない属性
  • 第2正規形:どの非キー属性も候補キーの真部分集合に対して関数従属しない
    • どの非キー属性も候補キーに完全関数従属
P.302 第3正規化
  • 第3正規化:非キー属性間の関数従属をなくしてどの非キー属性も候補キーに直接に関数従属している状態にする
    • 第2正規形の表に対して行われる操作
    • 候補キーに推移的関数従属している非キー属性を別の表に分解
    • 第3正規化して得られた表を第3正規形
  • 例:図6.3.8の売上表
    • これは第2正規形
    • 顧客番号→顧客名いう非キー属性間の関数従属がある
    • 顧客番号を主キーとした顧客表として独立させる
    • 売上表には顧客表の主キーを参照する外部キーとして顧客番号を残す
P.303 メモ
  • 第3正規形:どの非キー属性も候補キーに推移的関数従属しない
    • どの非キー属性も候補キーに直接に関数従属している
  • ボイス・コッド正規形
    • 第3正規形では次の関数従属が存在する可能性がある
      • 候補キーの真部分集合から他の候補キーの真部分集合への関数従属
      • 候補キー以外の属性から候補キーの真部分集合への関数従属
    • この関係を分解したのがボイス・コッド正規形
P.303 正規化と非正規化
  • 正規形には第1正規形から第5正規形まである
    • たいていの用途ではデータベースの場合、第3正規形まで正規化されていれば十分といわれている
  • 正規化の目的はデータ操作にともなう更新時異常の発生を防ぐこと
    • 属性間の関数従属を少なくする
    • データの重複を排除する
  • 正規化のデメリット
    • 表がいくつにも分割される
    • 必要なデータを取り出すために表を結合しないといけない
    • 処理時間がかかる
  • 処理速度が必要な時や更新時異常の発生が低い場合はあえて正規化しない・正規化を解く
    • たとえば更新が少ない表は正規化しない
  • ここでの「非正規化」:アクセスパターンを考えたうえでどの表を統合するか、どの属性を表間に重複させるか考える
P.304 6.4 関係データベースの演算
P.304 6.4.1 集合演算
  • 関係データベースでの集合演算
    • 同じ型の表間での和、共通部分(積)、差
    • 直積:同じ型の表でなくてもいい
P.304 和、共通(積)、差
  • 図6.4.1の表AとBに対するそれぞれの演算結果を見る
  • 本参照
P.305 直積演算(Cartesian Product:×)
  • 社員表と部門表の直積は社員表の各行に対して部門表の行を1つずつつなぎ合わせた表
  • 直積の結果として得られる新しい表を直積表と呼ぶ
    • 次数(属性の数)は両方の表の次数を足した数
    • 位数(タプルの数)は両方の位数を掛けた数
  • 直積が役に立つイメージがない:実際には結合 (JOIN) を本当によく使う
P.305 6.4.2 関係演算
  • 関係演算:関係データベース特有の演算
    • 射影,選択,結合,商
  • 関係代数:関係演算と集合演算を合わせた代数
    • 導出表:これらの演算によって得られた表
P.306 SQL の例
  • 先に持ってきてみた

SELECT 社員コード, 社員名, 部門表.部門コード, 部門名

FROM 社員表, 部門表

WHERE 社員表.部門コード = 部門表.部門コード

P.305 選択と射影
  • 選択演算:表から指定した行を取り出す関係演算
    • SQL でいう WHERE
  • 射影演算:表から指定した列を取り出す関係演算
    • SQL でいう SELECT column_name
P.306 結合
  • 参考:P.306 の下の表
  • 結合演算:2つの表が共通にもつ項目(結合列)で結合して新しい表をつくり出す関係演算
    • まさに正規化でわけたテーブルを結合させる演算
  • SQL:SELECT文のFROM句で複数の表名をカンマで区切って指定
    • WHERE句で結合条件を指定
  • 結合条件
    • 結合列の値を>,≧,=,≠,≦,<のいずれかの比較演算子で比較して結びつける
  • 等結合:比較演算子が「=(等号)」である結合
    • 2つの表から作成される直積表から結合列の値が等 しいものだけを取り出す
    • 得られた新たな表には結合列が重複して含まれる
    • SELECT句でどちらか一方の結合列を指定して見かけ上の重複を除く
  • 自然結合(natural join):重複する結合列を取り除く(一方のみ残す)ようにした結合
    • 結合列の列名が2つの表で同じ場合に使える
    • 参考
      • (意識的に使ったことがない)
P.307 内結合と外結合
  • 参考:P.307 の図 6.4.8
  • 内結合(INNER JOIN)
    • 結合列の値が等しい行だけを取り出す結合演算
    • 片方の表にしか存在しない行は取り出せない
    • データベース言語仕様(JIS X 3005)
  • 外結合(OUTER JOIN)
    • 片方の表にしか存在しない行も取り出せる結合
    • 結合相手の表に該当するデータが存在しない場合はNULL(空)値で結合
    • 左外結合・右外結合・完全外結合
  • 等結合
    • 結合する表をFROM句で指定、結合条件はWHERE句 で指定
  • 内結合・外結合
    • 結合する表をFROM句の中でJOINを使って指定
    • 結合条件は JOIN に続くON句で指定する
    • 参考:p309のコラム「内結合と外結合のSQL文」
P.307 左外結合(LEFT OUTER JOIN)
  • 参考:P307 図 6.4.9、P309 の SQL 文
  • 結合する左の表(社員表)が基準
  • 右の表(部門表)に存在しない行を空値(NULL)として結合
P.308 右外結合(RIGHT OUTER JOIN)
  • 参考:P.308 図 6.4.10
  • 結合する右の表(部門表)が基準
  • 左の表(社員表)に存在しない行をNULLとして結合
P.308 完全外結合(FULL OUTER JOIN)
  • 参考:P.308 図 6.4.11
  • 片方だけに存在する場合もう片方をNULLとして結合
P.308 商
  • (これ何だろうか?where の in?)
    • 普通に in または =`= でよさそう?
    • select も含んでいる?
  • 参考:P.308 図 6.4.12
  • 関係R(X,Y1,Y2)とS(Y3,Y4)がある
  • S(Y3,Y4)のすべての行がR(Y1,Y2)に含まれる場合に対応するR(X)を求める演算
    • 商(R÷S)は関係Rの中から関係Sのすべての行を含む行を取り出し、そこから関係Sの項目を除く
    • 重複行も除く
  • 参考:P.309、図6.4.13
    • 社員表から東京に住み営業2課(E02)に勤務する社員を探す場合に商演算を使う
P.309 COLUMN ない結合と外結合の SQL
  • 本を読もう
P.310 6.5 SQL
P. 310 6.5.1 データベース言語SQLとは
  • SQL(Structured Query Language)
  • RDB の標準的な操作言語
  • ほとんどの RDBMS が SQL を使っている
    • Relational DataBase Management System
P.310 SQLの分類
  • RDB のデータを検索(参照)、操作
  • データ定義
  • トランザクション制御
  • 参照:表 6.5.1 に SQL 文が書いてある
P.310 表 6.5.1 重要な SQL
  • DDL (Data Definition Language)
    • CREATE, DROP, GRANT, REVOKE
  • DML (Data Manipulate Language)
    • SELECT, INSERT, UPDATE, DELETE, COMMIT, ROLLBACK, DECLARE CURSOR, OPEN, FETCH, CLOSE
  • DECLARE CURSOR以降は親言語方式などで使用されるSQL
  • 親言語方式
    • CやCOBOLなどのプログラム中にSQL文を組み込んでデータベースにアクセスする方式。
    • 埋込みSQL:p328参照
P.311 6.5.2 SELECT文
  • データ操作言語(DML)
    • 問合せ(SELECT)文
    • 挿入(INSERT)文
    • 更新(UPDATE)文
    • 削除(DELETE)文
    • などなど
  • SELECT文以外のDMLは「6.5.3 その他のDML文」(p319)参照
P.311 SELECT文の構文
  • SELECT文の基本構文
    • [ ]内は省略可能

SELECT

[DISTINCT]

列名のリスト

FROM 表名のリスト

[WHERE 選択条件や結合条件]

[GROUP BY 列名のリスト]

[HAVING グループ選択条件]

[ORDER BY 列名のリスト]

  • リスト:列名および表名をカンマ(,)で区切って列挙したもの。
P.311 行、列の取り出し
  • 選択:WHERE句に選択条件を指定すると特定の行を取り出せる
    • in とリストを使うと複数行に対する
    • 具体例を考えないと使い分けや気分はわからなそう
  • 射影:SELECT句に列名を指定すると特定の列を取り出せる
  • SELECT句への *:全部の列を取りだす
  • 選択条件と論理演算子(AND・OR・NOT):複数の条件を組み合わせる
  • 表 6.5.2:選択条件に使う比較演算子の表
  • 参考:列の値が「空値(NULL)であるか」という検索条件
    • WHERE 列 IS NULL
    • WHERE 列 = NULLではない
    • NULL は他にもいろいろ邪悪な面がある
    • 空文字列などとは違う概念でよくはまる
SQL 例
  • P.312、図 6.5.1
  • 社員表から年齢が24以上28以下の社員コード・社員名を表示するサンプル

SELECT 社員コード, 社員名 FROM 社員表 WHERE 年齢 >= 24 AND 年齢 <= 28

P.312 BETWEEN述語
  • 先のSELECT文はBETWEEN述語やIN述語を使って同じ内容を表せる
  • BETWEEN述語は「値1~値2」の範囲(値1,値2を含む)に列の値が含まれるかを選択条件にする

SELECT 社員コード, 社員名 FROM 社員表 WHERE 年齢 BETWEEN 24 AND 28

P.312 IN述語
  • IN述語は列の値が指定された値のいずれかと等しいかを選ぶ条件にする場合に使う
  • INの前にNOTをつけると指定された値のいずれでもないという選択条件になる
  • IN述語の使用例については副問合せ(p317)も参照
P.313 重複行の排除
  • 取り出された行の中から重複するものを除きたい場合
  • SELECT句の列名指定にDISTINCT述語を使う
P.314 出力順の指定
  • ORDER BY 句:特定の列の値で昇順・降順に並べ替えて表示する
    • ORDER BY のあとに続けて並べ替えのキー(列名)を指定
    • 降順の場合はDESC、昇順の場合はASC
    • ふつう ASC がデフォルトで省略できる

SELECT 社員名, 年齢 FROM 社員表 ORDER BY 年齢 DESC

P.314 グループ化
  • GROUP BY 句:取り出した行を指定した列の値でグループ化
    • グループごとの合計や最大値などを求める
  • HAVING 句:条件に合ったグループだけを取り出す

SELECT 所属, COUNT(), AVG(年齢) FROM 社員表 GROUP BY 所属 HAVING COUNT() >= 2

  • SQL の簡単な解説
    • 社員表のデータをGROUP BY句を使って所属でグループ化
    • HAVING 句で「グループに所属する人数が2人以上」のグループだけを取り出す
    • 取り出したグループごとにその所属・人数・平均年齢を求める
P.315 表の結合
  • 2 つの結合
    • SELECT A FROM B WHEREによる等結合
    • FROM 句の中での JOIN ... ON による内結合や外結合
  • どちらであっても結合表には結合条件で指定した結合列が重複して含まれる
    • 列名を指定するときは「表名.列名」という形式で表す
P.316 表に別名をつける
  • FROM句で「表名 AS 別名」あるいは「表名 別名」と指定すると表名に対して別名(相関名)を設定できる
  • 自己結合:表に別名を与えると同じ表どうしを結合できる
  • 自己結合については P.317 の例を参照
    • 上司コードを使ってある社員とその上司の氏名や関連情報を見たい場合に使う
P.317 副問い合わせ
  • サブクエリともいう
  • SELECT文のFROM句やWHERE句・HAVING句などに指定されている入れ子になったSELECT文

SELECT 社員コード, 社員名, 年齢 FROM 社員表 WHERE 年齢 IN (SELECT 指定年齢 FROM 調査対象)

  • サブクエリにはいろいろ面倒な話がある
  • 参考:MySQL のサブクエリって、ほんとに遅いの?
    • これは 2017 年の記事:この辺はお金になるので割と日進月歩で、3 年程度の昔の情報でも既に参考にならないことも多い。
    • 簡単なまとめ
      • 遅いのは2番目、DEPENDENT SUBQUERYである
      • MySQL 5.5 までサブクエリはやっぱり遅い
      • MySQL 5.6 からはそんなに遅くなくなった
      • MySQL とはいってもバージョンによって全然違う:オプティマイザは進化している
    • 現状についてはきちんと最新の話を追う、または自分が必要なケースについて実測する
P.318 EXISTS述語
  • サブクエリはEXISTS述語でも表せる
  • 参照:P.318 の例
    • EXISTS は相関副問合せが何らかの結果を返した場合にTRUE(真),何も返さなかった場合にFALSE(偽)を返す
    • 主問合せの結果1行に対して相関副問合せから何らかの結果が戻されれば、主問合せの選択条件は成り立ち、何も返されなければ選択条件は成り立たない
  • EXISTS 述語でほかの表にも存在するものを調べられる
  • ANY でも同じ操作を表せる
    • 参考:P.318 の例
    • 副問合せの結果のいずれか(ANY)と等しい
  • どれがいいかは最終的にはテーブルの実装や使っている RDBMS とバージョンに依存する
    • 実測してチューニングしよう
P.319 6.5.3 その他の DML 文
P.319 INSERT文
  • 表に行を挿入する:2つ方法がある
    • 参考:本の P.319
    • 挿入する値をVALUES句で指定する
    • 問合せの結果をすべて挿入する
    • (DBMS によるかもしれないが)個別INSERTと一括INSERTもある:パフォーマンスでよく問題になる
  • 一部の列に対して INSERT
    • どの列に対して挿入するのか列名リストで指定
    • 省略された列の値はDEFAULT制約があればその既定値、そうでなければNULL値
    • NULL はなるべく使うのをやめよう
    • DEFAULT は P.322 表 6.6.1
P.319 UPDATE文
  • 表中のデータを変更
    • 列の変更値を直接指定する
    • 変更値をCASE式で決める
    • 副問合せの結果を変更値にする
  • SET句には変更したい列の値を「列名 = 変更値」の形で指定
  • 1 つのUPDATE文で複数の列の値を変えるときはカンマ(,)で区切って指定
  • WHERE句を省略すると表中のすべての行が変わる
    • ふつうはやらない
    • WHERE句を指定すれば条件に合った行だけ変わる
P.320 DELETE文
  • 表中の行を削除する
    • 表中の全行を削除しても表自体は残る
    • 表を削除するのはDROP文
  • WHERE句を省略すると表中のすべての行が削除される
  • WHERE句を指定するとその条件に一致した行だけを削除できる
P.320 参照関係をもつ表の更新
  • 関連する2つの表の間に参照制約が設定できる
    • 被参照表の主キー(候補キー)にない値を参照表の外部キーに追加できない
  • 被参照表の行の削除・変更時に制約が出る:図6.5.10参照
  • 参照動作指定:削除・変更時の制約は明示的に指定できる
    • 次節のCREATE TABLE文を参照
    • REFERENCES句(参照指定)の後に次の構文で指定

参照動作指定 REFERENCES 被参照表(参照する列リスト) ON DELETE 参照動作] [ON UPDATE 参照動作] (*[ ]内は省略可能)

  • 指摘できる参照動作:表 6.5.5 の 5つ
    • デフォルトは NO ACTION
P.320 補足
  • 参照制約
    • 外部キーの値が被参照表の主キーあるいは主キー以外の候補キーに存在することを保証する制約。
    • 関連する2つの表の間に参照制約を設定する目的:データ矛盾を起こすような行の追加や削除・変更を排除するため
  • REFERENCES指定:p322-324を参照
  • データの整合性を保つための制約
    • 一意性制約
    • 参照制約
    • データ項目のデータ型や桁数に関する形式制約
    • データ項目が取り得る値の範囲に関するドメイン制約がある。
P.322 6.6 データ定義言語(DDL)
P.322 6.6.1 実表の定義
P.322 CREATE TABLE文
  • 表の定義はには CREATE TABLE 文
  • 基本構文は P.322 参照
P.322 列制約
  • 表を構成する列に対する制約
  • 参考:表6.6.1
  • 一意性制約:同一表内に同じ値が複数存在しないことを保証する制約
    • 主キーとなる列には一意性制約にとNOT NULL制約を加えたPRIMARY KEY指定
    • 主キー以外の候補キーにも一意性制約がある
    • 一般にNULL(ナル)値は重複値とは扱われない
    • 候補キーにはNULL値を許すUNIQUE指定
  • 参照制約:外部キーの値が被参照表に存在することを保証する制約
  • 外部キー:REFERENCES指定(参照指定)す。
P.323 表制約
  • 一意性制約・参照制約・検査制約は表制約(表定義の要素として定義される制約)にもできる
  • 列制約:1つの列に対する制約
  • 主キーや外部キーが複数列から構成される場合、これを列制約として定義できない
    • このときは表制約を使う
P.323 主なデータ型
  • 一般的な文字型,数値型は覚えておくといい
P.324 実表の定義例
  • P.324 の社員表と部門表を定義を見てみよう
P.325 6.6.2 ビューの定義
P.325 ビューとは
  • 実表:ディスク装置上にあり実際にデータが格納される表
  • ビュー:実表の一部または複数の表から必要な行や属性(列)を取り出してあたかも1つの表 であるかのように見せかけた仮想表
    • 利用者から見れば実表と同じ
    • データを検索するだけなら制約はあっても同じように操作できる
  • ビューのメリット
    • あくまでも仮想の表:対象となった元の表(基底表)の列名と別の名前で定義できる
    • ビューに定義することで情報を公開
    • ビューに定義しないことで情報を非公開にできる
    • 元の表に新たな列が追加されても既存のビューには影響がなく再定義する必要がない
  • ビューは仮想的な表
    • 一般には実体化されずデータ格納領域をとら ない。
    • 実表のように実体化されるビューもある:体現ビュー(materialized view)
P.325 CREATE VIEW文
  • ビューの定義:CREATE VIEW文による:詳細は本の P.325
  • ビュー:対象となる実表(あるいは他のビュー)からSELECT文で必要データを導出する方法で定義される定義するビューの列名に命名規則はない
    • 列数はAS句に続くSELECTで問い合わせた結果の列数と同じでなければならない
    • 列名は省略可能:省略した場合はSELECTで問い合わせた結果の列名がそのまま定義される
  • ビューに対する参照や更新処理
    • ビューの対象となった表(基底表)に対す る参照あるいは更新処理に変換されて実行される
P.326 ビューの定義例
  • 本の P.326 参照
  • 社員表と部門表から社員コードと社員名、その社員が所属する部門名からなる表をビュー「社員表2」
    • JOIN して必要なカラムだけ取り出す
P.326 ビューの更新
  • ビューへの更新処理 ビュー定義を基にビューが参照している表(基底表)への対応する処理に変換されて実行
  • 更新のための条件
    • 更新にかかる実際の表が更新可能
    • 更新される表の列や行が一意に決まる
  • 更新できないビューの例
    • SELECT句で式、集合関数、DISTINCT を使ったSELECT文で定義されている
    • ・GROUP BY句やHAVING句を使ったSELECT文で定義されている
P.327 6.6.3 オブジェクト(表)の処理権限
  • スキーマに定義された実表やビューはそのスキーマ所有者(作成者)にしか処理権限が与えられない
  • 複数の利用者がデータベースを利用できるようにしたければ、スキーマ所有者以外にも処理権限を付与する必要がある
    • データベース管理ユーザーは全権を持っていて危険な処理もできてしまう
    • できることを制限したユーザーで操作したい
  • オブジェクト(表)の処理権限
    • 読取(SELECT)権限
    • 削除(DELETE)権限
    • 挿入(INSERT)権限
    • 更新(UPDATE)権限
  • cf. スキーマ
    • 1つのデータベースの枠組み
    • スキーマ内に複数の表やビューを定義できる
P.327 処理権限の付与
  • 権限の付与:GRANT文による
  • GRANTの基本構文は次の通り
1
GRANT 権限 ON 表名 TO 許可識別子
  • 権限指定
    • 4 つの処理権限(SELECT,INSERT,UPDATE,DELETE)
    • ALL PRIVILEGES(すべて)を指定できる
  • 権限を複数付与する場合はカンマ(,)で区切って指定
P.327 処理権限の取消し(変更)
  • 一度付与された権限を取消し(変更)できる
  • 権限の取消しはREVOKE文
  • REVOKEの基本構文
1
REVOKE 権限 ON 表名 FROM 許可識別子
P.328 6.7 埋込み方式
P.328 6.7.1 埋込みSQLの基本事項
P.328 静的SQLと動的SQL
  • 静的 SQL:あらかじめ決められたSQL文をプログラム中に埋込んで実行する方式
    • 実際のアプリケーションではあまり見かけない
  • 非カーソル処理:データベースの表から1行を取り出すこと
    • 次のような SELECT 文
    • この INTO を見たことがない

SELECT 社員名, 年齢 INTO :name, :age FROM 社員表 WHERE 社員コード = '100';

  • 動的 SQL:実行する SQL 文がプログラム実行中でな ければ決まらない場合に SQL 文を動的に作成し実行する方式
  • 上の社員コードがふつう変わる:それが「動的」。
  • この動的な部分に変なコードを埋め込むとまずいというのがセキュリティ問題で、例えば SQL インジェクションの問題。
P.328 ホスト変数
  • ホスト変数:データベースとプログラムのインタフェースとなる変数
  • 埋め込み SQL では SQL を実行すると取り出されたデータをINTO句で指定したホスト変数に格納する
  • ホスト変数は通常の変数としてもアクセスできる
    • 出力関数で表示
    • 入力関数で値を入力してそれをSELECT文の条件としても使える
P.329 6.7.2 カーソル処理とFETCH
P.329 カーソル処理
  • 「SELECT・・・・INTO・・・」形式では,1行のデータしか取り出せない
    • (見たことがないのでイメージがつかない)
  • 検索結果が複数行の場合は1行ずつ取り出せるカーソル処理を使う
  • カーソル処理は SQL 文で問い合わせた結果をあたかも1つのファイルであるかのようにとらえる
  • FETCH文でそこから1行ずつ取り出す方式
    • 1つのSELECT文に対してカーソルを宣言(定義)
    • カーソルのオープンでSELECT文が実行
    • カーソルで1行ずつ取り出せる
    • FETCH文で繰返し行を取り出して処理
    • 終了したらカーソルを閉じる
P.330 FETCHで取り出した行の更新
  • 参考:図 6.7.2:FETCHで取り出した行の更新処理
  • FETCH文で取り出した行を更新あるいは削除する場合,FETCH文のあとに続くUPDATE文やDELETE文のWHERE句 に「WHERE CURRENT OF カーソル名」と指定する。
  • (FETCH 文を見たことがないのでイメージつかない)
P.330 処理の確定と取消し

2020-12-06 課題

  • 先に進む前に録画してあるか確認しよう

進捗

  • 前回の進捗
    • 基礎知識編:次数と基数まで
    • 本編:04-01 の冒頭
  • 今回の進捗
    • 基礎知識編:6.3.2 正規化の手順まで
    • 本編:「04-01 以下、高校数学水準で」

課題

TODO

自分用メモ

Matplotlib

  • 本当に簡単な図を描く
  • これを参考に scipy お絵描き
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import sph_harm

m,l = 1,5
theta = np.linspace(0, np.pi, 101)
phi = np.linspace(0, 2 * np.pi, 151)
theta, phi = np.meshgrid(theta, phi)

r = sph_harm(m, l, phi, theta).real
x = np.abs(r) * np.sin(theta) * np.cos(phi)
y = np.abs(r) * np.sin(theta) * np.sin(phi)
z = np.abs(r) * np.cos(theta)

fig = plt.figure(figsize=(8, 8))
ax = fig.gca(projection="3d")
ax.plot_surface(x, y, z, color="aqua", edgecolor="k")
plt.axis("off")
plt.show()

TeX の記録

  • ゴルディングの不等式

\begin{align} \Vert s \Vert_{H^2_{k+1}} \leq C_k \left( \Vert Ds \Vert_{H^2_k} + \Vert s \Vert_{L^2} \right) \end{align}

日々の勉強

Julia

IT 基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。
  • ネットワークの話もいい加減飽きたので、しばらく DB の話

復習

  • 3 つのスキーマ
    • ユーザーが見るレベル
    • 正規化などをかけておいたデータベースにもっていけるレベル
    • 個々のデータベースに合わせた具体的なレベル
  • インメモリの DB:コンピューターの基本的なハードウェア構成と意味を復習しよう

本の記述を追いかける

P.408 7.8 交換方式
P.408 パケット交換方式
  • 回線交換方式と対になる概念
    • 回線交換方式:通信を行うノード間で物理的な通信路を確保してから通信する
    • 例:電話
  • パケット交換方式について
    • データ送信するノードはデータをパケットに区切る。
    • ひとつひとつのパケットにヘッダを付けて送信。
    • ネットワーク内ではパケット交換機にパケットがたまる
    • ネットワークの状況に応じて順次送られる
パケット通信のメリット・デメリット
メリット

耐障害性 - 通信路を固定しないため,迂回経路が取れる。 - パケット交換機にデータが蓄積されているため,復旧まで待てる。 - パケット多重 - 1 対 1 の通信で回線を占有する必要がないため,1つの回線を多くのノードで共有でき,回線を効率的につかえる - 異機種間接続性 - パケット交換機で中継するときにプロトコル変換・速度変換でエンドノードどうしが同じプロトコルをサポートしていなくても通信できる

デメリット
  • ネットワーク内の蓄積交換処理による遅延
    • 蓄積交換処理による遅延解消のために主に回線の帯域を広げることで対応してきた
    • 構造上,完全には遅延をなくせない
  • パケット到着順序の不整合
P.408 ATM 交換方式
  • ATM(Asynchronous Transfer Mode:非同期転送モード)
  • 遅延のない回線交換方式とパケット交換方式の利点を得たい
  • パケット交換方式の発展
  • 遅延の原因をつぶす:特にパケットの多様性
    • 多種多様なパケットに対応するために,パケット交換機はソフトウェア処理が必要 ^ ATM での工夫の一例:最も特徴的なのは,パケット(ATMではセルという)の長さをヘッダ部 5 バイト,ペイロード 48 バイトの53バイトに統一
    • パケット解析がハードウェアだけでできる。
    • ソフトウェアは不要になった。
  • Wikipedia から
    • 当初の意図に反して非常に複雑な技術になってしまった
    • ATM は次世代の主流にならず限定的な使用にとどまった
    • ATM の設計思想は MPLS へと引き継がれた
    • 汎用のレイヤ 2 のパケットスイッチングのプロトコルとして、ルーターを介したIPの通信網で利用されている。
P.408 ペイロード(payload)
  • データ通信で本来転送したいデータ本体の部分、ボディを指す。
  • ATM ではペイロードのサイズを固定して処理を簡素化
  • 難点:パケット全体に占めるペイロードのサイズが相対的に小さくオーバヘッドが大きい
P.410 輻輳
  • フレームリレー:パケット交換方式の一種
    • 1 つの回線を多数のユーザで共有。
    • 回線がもつ潜在的な伝送能力(ワイヤスピード)を十分に引き出すうえで効果がある
  • 輻輳:ユーザの利用が一時期に集中すると,ワイヤスピードを超えるパケットがネットワーク上に流れる
    • ネットワークが輻輳状態になるとスループットが落ちる
  • フレームリレーサービスを提供する事業者は,ネットワークが輻輳状態に陥ってスループットが低下しても最低限保証する通信速度を決めている
    • CIR(Committed Information Rate:認定情 報速度)
P.370 7 ネットワーク
  • 確か 7.4 から始めた気がするので 7 章はじめから
P.370 7.1.1 OSI基本参照モデル
  • 改めて復習
  • OSI(Open System Interconnection)基本参照モデル- 異なる設計思想・世代のシステムと円滑に通信するのが目的に標準化
  • プロトコルの単機能化,交換の容易さが目的
    • 階層化のおかげで一部の階層の技術体系が変わっても、その階層だけ取り替えればいい
    • コスト・リスクを小さくする
P.370 プロトコルとサービス
  • N 層:それぞれの階層のこと
  • エンティティ:N 層に存在する通信機器などの実体
    • この言葉はいろいろなところで出てきていろいろな意味で使われる
    • もちろん気分的には適当な実体を指すことが多い
  • プロトコル:N 層に属するエンティティが通信するための取り決め
  • 上位の層が下位の層を利用しながら通信する
    • 別の階層間のエンティティどうしが通信する窓口が必要
    • これを提供するのが下位層:この機能をサービスと呼ぶ
  • プロトコルに沿った仕様で製品を開発すれば別のベンダの機器でも通信できる
  • 参考:ベンダーロックイン

特定ベンダー(メーカー)の独自技術に大きく依存した製品、サービス、システム等を採用した際に、他ベンダーの提供する同種の製品、サービス、システム等への乗り換えが困難になる現象のこと。

出来上がった情報システムの正確な仕様が、システムを開発・構築したベンダーにしか解らなくなる場合がある。結果、システムの保守・拡張・改修等の際、現存システムを開発・構築したベンダーに引き続き発注せざるを得なくなる。

  • 「Excel で行政に提出する書類を作れ」事案もそれ。
  • Apple 製品で身の回りを固めるのも同じ。
  • 「多様性が大事」事案でもある。
7.1.2 TCP/IPプロトコルスイート
  • プロトコル同士には相性がある
    • 「ネットワーク層がこのプロトコルならトランスポート層はこのプロトコルにしておくとトラブルが少ない」
  • 一般に同じ団体が作ったプロトコルはセットで使われることが多い
    • このセットがプロトコルスイート ^ 最も代表的なのは IP を中心に組まれた TCP/IP プロトコルスイート
    • 独自の階層モデルをもつ
P.372 TCP/IPの通信
  • データをパケットに区切る
    • 各パケットにヘッダを付けて送信
    • ヘッダは各階層ごとに付加されて次の階層へと渡される
    • 各ヘッダにはその階層で必要となる送信元や送信先,大きさ,順番などパケット自体に関する情報を含む
    • TCPヘッダを付加したパケット:TCP セグメント
    • IP ヘッダを付加したパケット:IP パケット
    • MACヘッダを付加したパケット:MAC フレームあるいはイーサネットフレーム
P.372 MAC(Media Access Control)アドレス
  • イーサネットや FDDI で使用される物理アドレス
    • イーサネット (Ethernet):コンピューターネットワークの規格の1つ。オフィスや家庭で一般的に使用されている有線LAN (Local Area Network) の技術規格
    • FDDI:LAN でデータ転送を行うための標準の一つ
      • Fiber distributed data interface
  • データリンク層
  • 同じネットワークに接続された隣接ノード間の通信で相手を識別するために使う
  • MACアドレスの長さ:6バイト
    • 先頭24ビットの OUI(ベンダID)
    • 後続24ビットの固有製造番号(製品に割り当てた番号)
  • MAC アドレスは機器が固有にもつ番号
    • 必ず一意に定まるように IEEE が管理
P372 ポート番号
  • トランスポート層にでノード内のアプリケーションの識別に使う識別子番号
    • 0-65535の範囲
  • TCP/IPではパケット交換方式でデータをやり取りする
  • よく使われるアプリケーションについてのポート番号は Well-Known ポートとして標準化
    • TCP・UDPそれぞれで 0-1023 番までの番号を割り当てている
    • SSH:TCP22番
    • Telnet:TCP23番
    • SMTP:TCP25番
    • HTTP:TCP80番
    • POP3:TCP110番
    • IMAP4:TCP143番
    • HTTPS :TCP443番
    • NTP:UDP123番
    • SNMP:UDP161番
    • SNMP Trap :UDP162番
  • セキュリティ対策のために標準とはポート番号を変えることもある
  • Web 開発の本を読んでいると、いろいろな都合から http のポートを 80 以外にしていることもよくある。
    • 80 の場合はポートを指定しなくてもいい
      • 例:http://localhost/hoge/fuga
      • 例:http://localhost:5000/hoge/fuga
P.373 ネットワーク間の通信
  • 同じネットワークに接続されたノード間はデータリンク層(第 2 層)の通信
  • ネットワークを超えたノード間はネットワーク層(第 3 層)の通信 -実際に図 7.1.4 を見よう
    • どこが IP アドレスでのやりとりか?
    • どこが MAC アドレスでのやり取りか?
P.374 7.2 ネットワーク接続装置と関連技術
P.374 7.2.1 物理層の接続
P.374 リピータ
  • ネットワーク上を流れる電流の増幅装置・整流装置
  • 物理層:第 1 層
  • データ通信はネットワーク上を流れる電流
    • ケーブルが長いと電流が減衰・波形が乱れが起きる
    • データが読み取れなくなる
    • これを増幅するのがリピータ
  • 大昔の電話は距離が遠いと音が小さく聞こえにくかった
    • まさにこの減衰が問題
  • リピータは 1:1 で繋ぐ
    • 現在では複数のノードを接続できるマルチポートリピータ(ハブ)が使われるのが一般的
P.374 7.2.2 データリンク層の接続
  • 第2層
P374 ブリッジ
  • データリンク層に位置
  • ネットワーク上を流れているフレーム(情報の単位)の MAC アドレスを認識して通信を中継する
    • 接続されているノードをコリジョンドメイン(セグメント)という単位に分割
    • MAC アドレスで判定したフレームのあて先のあるセグメントだけにフレームを送信
    • 無駄なトラフィックの回避
  • ポートの記憶
    • 通信のたびにある MAC アドレスをもつノードがどのポート に接続されているか学習
    • 次回の通信時には余分なポートには通信を中継しない。
  • ブリッジの動作
    • あて先MACアドレスをもとにMACアドレステーブルを参照する
    • あて先MACアドレスの接続ポートがフレームを受信したポー トと別ポートであれば,そのポートにフレームを送信し
      • 同一ポートであればフレームを破棄する
    • あて先MACアドレスが記憶されていない場合やブロードキャス トアドレス(FF-FF-FF-FF-FF-FF)の場合は,受信ポート以外のすべてのポートにフレームを送信する
P.375 スイッチングハブ
  • レイヤ2スイッチ(L2スイッチ)とも呼ばれる
  • データリンク層に位置
  • ブリッジと同じ働きをする
    • MAC アドレスを認識してフレームのあて先を決めて通信を行います。
  • 試験での問われ方
    • スイッチングハブはフレームの蓄積機能、速度変換機能や交換機 能をもっている。
    • このようなスイッチングハブと同等の機能をもち,同じプロトコル階層で動作する装置はどれか
    • 答えは「ブリッジ」
P.375 ブロードキャストストリーム
  • データリンク層で動作するブリッジやスイッチングハブなどの LANスイッチはブロードキャストフレームを受信ポート以外 のすべてのポートに転送
  • これらの機器をループ状に接続し冗長化させると信頼性はあがる
    • ブロードキャストフレームは永遠に回り続けながら増える
    • 最終的にはネットワークダウンを招く
    • この現象をブロードキャストストームという
  • ブロードキャストストームを防ぐプロトコル:スパニングツリープロトコル(Spanning Tree Protocol:STP)
    • ループを構成している一部のポートを通常運用時にはブロック(論理的に切断)する
    • ネットワーク全体をループをもたない論理的なツリー構造にする
P.376 ネットワーク層の接続
  • 第 3 層(レイヤ 3)
P.376 ルータ
  • ルータはネットワーク層(第 3 層)に位置する
    • あて先IPアドレスを見てパケットの送り先を決め通信を制御する
  • IP のローカルネットワークの境界線に設置して利用され,ネットワークの基本単位として機能
  • 世界中に散在しているローカルネットワークどうしをルータが結ぶ
    • 全体としてインターネットというインフラが機能
  • ルータで分けられたネットワークの単位をブロードキャストドメインという
  • ルータがパケットを受け取ったあと
    • あて先IPアドレスを見る
    • 自分のネットワークあてであれば,破棄
    • 他のネットワークあてであれば転送
      • どのルータへ送ればあて先のネットワークへの通信が速く行えるかを判断することを経路制御(ルーティング)
      • ルータはそのための経路表(ルーティングテーブル)を備えている
P.376 デフォルトゲートウェイ
  • 会社Aのネットワークに属するPCは会社BのPCと直接通信できない
  • 会社AのPCは他ネットワークへの接点であるルータAに転送を依頼
  • デフォルトゲートウェイ:会社AのPCから見て直近のルータA
  • 自分と直接接続していない相手と通信するときはすべてデフォルト ゲートウェイを中継する
P.376 ルーティング
  • 経路表(ルーティングテーブル)の作成方法
    • 手作業で作る:スタティックルーティング
    • ルーティングプロトコル利用:ルータ同士が経路情報を交換し、自立的に経路表を作るダイナミックルーティング
  • ダイナミックルーティングのための代表的なルーティングプロトコル:RIP、OSPF
  • RIP:ディスタンスベクタ型(距離ベクトル型)
    • ルーティングテーブルの情報(経路情報)を一定時間間隔で交換しあう
    • あて先ネットワークにいたるまでに経由するルータの数(ホップ数)最小経路を選ぶ
    • あて先に到達可能な最大ホップ数は 15
      • これを超えた経路は採用されない
  • OSPF:リンクステート型
    • コストを経路選択の要素に取り入れ、コスト最小経路を選ぶ
    • コスト値は,回線速度を基に自動的に算出されるが手動設定もできる
    • コスト算出式「コスト=100Mbps/経路の通信帯域(bps)」
  • コスト計算例は P.377 の図を見ること
P.377 ルータの冗長構成
  • ルータを冗長構成のために使うプロトコル:VRRP(Virtual Router Redundancy Protocol )
  • 同じ LAN に接続された複数のルータを仮想的に 1 台のルータ として見えるようにして冗長構成を実現する
  • 複数のルータでグループ(VRRP グループ)を作る
  • VRRP グループごとに仮想 IP アドレスと仮想 MAC アドレスを割り当て
  • PC などのノードは仮想ルータの IP アドレスに対して通信
  • 通常時はグループのマスタルータが仮想ルータの IP アドレス(仮想 IP アドレス)を保持
  • マスタルータに障害が発生すると他のバックアップルータがこれを継承
P.377 レイヤ3スイッチ(L3スイッチ)
  • ルータと同じネットワーク層(第 3 層)の通信機器
  • 特徴
    • ルータ:ソフトウェアで転送処理
    • レイヤ 3 スイッチ:専用ハードウェアで転送処理
  • 高速処理できる:大容量のファイルを扱うファイルサーバへのアクセスなど
P.378 トランスポート層以上の層の接続
P.378 ゲートウェイ
  • トランスポート層(第 4 層)-アプリケーション層(第7層)でネットワーク接続するための装置
  • 第 3 層のネットワーク層まででエンドツーエンド(E2E)の通信は完成する
    • E2E = 通信を行う二者、あるいは、二者間を結ぶ経路全体
    • エンドツーエンド原理:高度な通信制御や複雑な機能は末端のシステムが担い、経路上のシステムは単純に信号やデータの中継・転送だけすべし
    • TCP/IP ネットワークの原理
    • 誤り訂正・フロー制御・再送:TCP 層(第4層、トランスポート層)など上位側の機器やソフトウェア・プロトコル
    • 単純な送受信・転送処理:IP 層(第3層、ネットワーク層)
  • ゲートウェイ:第 4 層のトランスポート層以上が違う LAN システム相互間のプロトコル・データ形式の変換を担う
  • ゲートウェイはアプリケーションプロトコルの内容を 解釈できる
    • アプリケーションヘッダの不正な情報混入を検出可能
    • ファイアウォール・プロキシサーバもゲートウェイの一種
P.378 L4スイッチ・L7スイッチ
  • L4スイッチ(レイヤ4スイッチ)はトランスポート層(第4層)の装置
    • 定義としてはゲートウェイ
    • 機能的にはレイヤ2スイッチ・レイヤ3スイッチの延長上
    • ルータやレイヤ3スイッチはIPアドレスを参照して経路制御する
    • L4スイッチではTCPポート番号やUDPポート番号も経路制御判断に使える:第4層の機器だから
  • L7スイッチ:アプリケーション層(第7層)までの情報を使って通信制御する
P.379 7.2.5 VLAN
  • VLAN(Virtual LAN:仮想LAN)
  • スイッチ(レイヤ2スイッチ,レイヤ3スイッチ)で物理的な接続形態とは独立に仮想的なLANグループを構成する仕組み,あるいはそう構成されたLAN
  • 複雑な形態のネットワークを楽に構築できる
  • サブネット構成も柔軟に変えられる
P.380 データリンク層の制御とプロトコル
  • データリンク層:第2層
P.380 7.3.1 メディアアクセス制御
  • 複数のデータを1つのケーブルを通して送受する場合,データの衝突(コリジョン)を回避するための制御が必要
    • これがメディアアクセス制御(Media Access Control:MAC)
コリジョン(衝突)

イーサネットや無線LANで複数の端末が送信し、データが衝突する現象を指す。旧式のイーサネット規格では、端末同士を接続するときに1組の通信路で双方向の通信を行う半二重通信のため、送信と受信を同時に行うことができない。送信と受信をその都度切り替えて行うので、端末がお互いデータを送信してしまうと衝突する可能性が高くなる。

P.380 CSMA/CD
  • CSMA/CD:Carrier Sense Multiple Access with Collision Detection:搬送波感知多重アクセ ス/衝突検出)の略。
  • イーサネットで採用されている方式
    • 衝突検知方式を採用
    • イーサネット:IEEE 802.3として標準化されている LAN規格
  • CSMA/CD
    • 各ノードは伝送媒体が使用中かどうかを調べて,使用中でなければデータを送りはじめる
    • 複数のノードが同時に通信しはじめるとデータの衝突が起こる
    • 衝突を検知し,一定時間(ランダム)待った後で,再送
    • 一定の距離以上のケーブルでは衝突が検知できない
  • CSMA/CD方式の限界
    • トラフィックが増加するにつれて衝突が多くなる
    • 再送が増え,さらにトラフィックが増加する悪循環に陥る可能性がある
    • 特に伝送路の使用率が30%を超えると実用的でなくなる
P.381トークンパッシング方式
  • トークンによる送信制御を行う方式で
    • トークンバス方式
    • トークンリング方式
P.381 トークンパッシング方式
  • ネットワーク上をフリートークンと呼ばれる送信権のためのパケットが巡回する
    • フリートークンを獲得したノードだけが送信できるので衝突を避けられる
    • ふつうはコンセントレータ(集線器)でネットワ ークとノードを結ぶ
  • トークンパッシング方式を採用したLAN規格
    • 例:FDDI:Fiber Distributed Data Interface
    • FDDIは物理媒体に光ファイバを利用し,最大100Mビ ッ ト/秒の通信
  • 特徴
    • 伝送媒体上では衝突しない
    • トラフィックが増えるにつれてトークンを獲得しにくくなり,少しずつ遅延時間が増える
    • 衝突による再送制御の必要がないため伝送路の使用率に対する遅延時間の増加率はCSMA/CD方式より緩やか
P.382 TDMA 方式
  • TDM(時分割多重)
    • ネットワーク上にデータを送信する時間を割 り当てる(タイムスロット)
    • タイムスロットごとに別のデータを送って多重化する
    • TDM によるアクセス制御が TDMA
  • TDMA(Time Division Multiple Access:時分割多重アクセス)
    • CSMA/CD・トークンパッシング方式と並ぶ主要なデー タリンク技術
    • TDMA ではネットワーク(伝送路)を使える時間を細かく区切る
    • 割り当てられた時間は各ノードが独占する方式
    • TDMAはコネクション型の通信
P.382 7.3.2 無線LANのアクセス制御方式
P.382 CSMA/CA方式
  • CSMA/CA:Carrier Sense Multiple Access with Collision Avoidance、搬送波感知多重アクセス/衝突回避
  • 無線 LAN の制御方式
  • CSMA/CD との違い:「衝突検出」が「衝突回避」になった
  • 無線 LAN:物理層媒体は電波で衝突の検出は不可能だから回避する
  • 特徴
    • 送信ノードは使いたい周波数帯の使えるか確認後、必ずランダムな時間だけ待ってから送信をはじめる
      • 待ち時間をバックオフ制御時間とよぶ
    • 衝突してフレームが壊れても検出できない
      • データを受け取ったノードは ACK を返す
P.328 RTS/CTS
  • 無線 LAN の話
  • 隠れ端末問題
    • 他のノードのデータ送信を感知できないことがある
    • 通信ノード間の距離が遠い
    • ノード間に障害物がある
  • 回避のための RTS/CTS 方式
  • 無線 LAN ノード
    • データ送信前にRTS(Request ToSend:送信リクエスト)をアクセスポイントに送信
    • これを受理したアクセスポイントがCTS(Clear to Send:送信OK)を返信
      • 他のノードは CTS を傍受して自分以外の別のノードに送信権があると解釈
      • データ送信を延期
    • 無線LANノードはアクセスポイントからCTSを受信したらデータ送信開始します
    • 衝突抑制:CTSに書かれた他のノードに対する送信抑制時間を使う
  • データ送信開始前にデータ送信のネゴシエーシ ョンとして RTS/CTS 方式を使った CSMA/CA を CSMA/CA with RTS/CTS とよぶ
P.383 無線LANの動作モード
  • 無線 LAN の動作モード:図7.3.4参照
  • 2 つのモードがある
  • インフラストラクチャモード:無線LANノードがアク セスポイントを通じて相互に通信
  • アドホックモード:アクセスポイントなしに無線LANノードどうしが直接通信
P.383 COLUMN FDMA,CDMA
  • 表7.3.1:多元接続する技術グループ
    • TDMA とセット
  • FDMA
    • ある周波数帯をさらに細かい周波数帯に分割
    • 接続できる端末数を増やす技術
  • CDMA
    • 周波数も時間も分割しない
    • 符号で各端末の通信を識別・分離
    • 接続できる端末数を増やす
P.383 7.3.3 データリンク層の主なプロトコル
  • 第 2 層
P.384 ARP
  • ARP(Address Resolution Protocol):通信相手のIPアドレスからMACアドレスを取るためのプロトコル
  • ARPの動作
    • ブロードキャストで目的IPアドレスを指定したARP要求パケットをLAN全体に流す
      • ブロードキャスト:ネットワークに参加するすべての機器に同時に信号やデータを送ること
    • 各ノードは自分のIPアドレスと比較
    • 一致したノードだけARP応答パケットに自分のMACアドレスを入れて返す(ユニキャスト)
  • 参考:GARP(Gratuitous ARP)
    • 主な目的:自身に設定するIPアドレスの重複確認・ARPテ ーブルの更新
    • 目的IPアドレスに自身が使うIPアドレスを指定し,MACアドレスを問い合わせる
P.384 RARP
  • Reverse-ARP:逆アドレス解決プロトコル
    • MACアドレスからIPアドレスを取る
  • 電源オフ時にIPアドレスを保持できない(IPアドレスを保持するハードディスクをもたない)機器が電源オン時に自分のMACアドレスから自身に割り当てられているIPアドレスを知るために使う
  • RARP サーバー
    • MACアドレスとIPアドレスの対応表を持ったサーバー(RARPサーバー)が必要
P.384 PPP
  • PPP:Point to Point Protocol
    • 2 点間をポイントツーポイントでつなぐためのデータリンクプロトコル
    • WANを介して2つのノードをダイヤルアップ接続するときに使う
  • ネットワーク層(第3層)とネゴシエーションする NCP(ネットワーク制御プロトコル)とリンクネゴシエーションするLCP(リンク制御プロトコル)からなる
    • NCP:Network Control Protocol
    • LCP:Link Control Protocol
  • リンク制御やエラー処理機能を持つ
P.384 PPPoE
  • PPPoE:PPP over Ethernet
  • PPPと同等な機能をイーサネット(LAN)上で実現するプロトコル
  • PPPフレームをイーサネットフレームでカプセル化して実現
P.384 7.3.4 IEEE 802.3規格
  • メディアアクセス制御に CSMA/CD 方式を使う LAN についての標準
  • OSI基本参照モデルにおけるデータリンク層(第 2 層)と物理層(第 1 層)のプロトコルおよびサービスを規定
    • OSI 基本参照モデルでのデータリンク層を LLC 副層と MAC 副層の2つに分割
    • 物理層での LAN で使う伝送媒体や MAC 副層でのフレーム構成や衝突検出の仕組みを規定
  • ツイストケーブルの企画が表 7.3.2 にまとまっている
P.386 7.4 ネットワーク層のプロトコルと技術
  • もうやった
P.295 定義域(ドメイン)
  • テーブル全体を $\mathcal{T} = A \times B \times \cdots \times Z$ と書いたときの各 $A,B,\dots,Z$ をドメイン(定義域、domain)と呼ぶ
  • 数学の集合と違って $\mathcal{T}$ の中に同じ集合を含まない:つまり $\mathcal{T} = \mathbb{R}^n$ といったテーブルは考えない
  • ドメインは「属性が取り得る値の集合」
    • RDB では適当なデータ型を対応させる:日付,金額,数量,量
  • ドメインを新たなデータ型として定義すると違うデー タ項目でも同じ入力チェックや同じ出力編集ができる
P.296 6.2.2 関係データベースのキー
  • 表中の行を一意に識別するためのキー(スーパキー,候補キー,主キー)
  • 別の表を参照し関連づけるための外部キー
P.296 スーパキー
  • 表中の行を一意に特定できる属性,あるいは属性の組
    • 組について:購入履歴を知るためにはユーザーID・商品ID・購入日がわからないといけない、という程度の意味
    • かなり広い意味のようなのでたぶんそんなに使わない
  • 補足:なぜスーパ「ー」キーではないのか
P.296 候補キー
  • 行を一意に決めるための必要最小限の属性で構成されるスーパーキー
    • 一意性制約が必要
  • 何かの履歴のように複数のIDの組になることもある
    • 外部キーが入るテーブルでよくある
P.296 主キー
  • 複数存在する候補キーの中から任意に選んだ1つの候補キーを主キー(primary key)
  • 主キーに選ばれなかった残りの候補キーを代理キー(alternate key)
  • 主キー制約
    • 一意性制約
    • 実体を保証するため空値(NULL)は許さないという NOT NULL制約
P.296 外部キー
  • 関連する他の表を参照する属性あるいは属性の組
  • 2 つの表の間に「1対多」の関係がある場合
    • 「多」側の表に「1」側の表の主キーあるいは主キー以外の候補キーを参照する属性をもたせて外部キーにする
  • 参照制約:外部キーの値が外部キーで参照される表に存在することを保証
    • 参照制約があると「親テーブル」のカラムを勝手に消せなくなる
  • 複数の表を参照するなら表内に複数の外部キーを持つ
    • 外部キーの値に NOT NULL 制約がなければ NULL が許される
  • 一般に外部キーは被参照表の主キーを参照
    • UNIQUE 指 定 さ れ た候補キーを参照する場合もある
  • cf. 参照制約:P.320
P.297 COLUMN 代用のキー設定
  • 主キーが複数の属性から構成される複合キー(連結キー)でその構成属性数が多すぎると運用が面倒
  • 連番のような必ずしも積極的な意味がない属性を追加してそれを代用のキー(surrogate key)にする
    • 複合キーを構成している属性はすべて非キー属性にして代理キーにする
P.298 6.3 正規化
P.298 6.3.1 関数従属
  • 関数従属:ある属性xの値が決まると他の属性yの値が一意的に決まる関係で、$x \mapsto y$ と書く
    • 属性 $x$:独立属性(決定項)
    • 属性 $y$:従属属性(従属項)
  • 正規化:1 つの表の中の属性間にある関数従属性に着目して整理する
    • 整合性を維持しやすいデータベースが設計できる

テーブル1:あるユーザーが何を買ったか - ユーザーID - 商品 ID - 商品名 - 商品の値段 - 購入点数 - 支払金額

→ユーザーのテーブル、商品のテーブル、購入詳細のテーブル

  • ユーザーID
  • 商品ID
  • 購入点数

これがあれば商品名、商品の値段、支払金額がいらない

P.298 部分関数従属
  • 関係 $x \mapsto y$ で $y$ が $x$ の真部分集合に関数従属するとき、$y$ は $x$ に部分関数従属するという
    • どこの業界の用語なのかよくわからない。情報系?
  • 部分関数従属は独立属性 $x$ が複数の属性からなるときに起こりうる関数従属
    • あまりピンとこない:P.299 に商品マスタ的な例が載っていた
  • 本の例:独立属性 $x$ が $x_1$ と $x_2$ の 2 つの属性からなるとき
    • ${x_1, x_2} \mapsto y$ が成り立ち、かつ $x_1 \mapsto y$ または $x_2 \mapsto y$ のどちらかが成り立つ
    • このとき ${x_1, x_2 }$ と $y$ の間に部分関数従属がある
  • 例:社員所属部門テーブル
    • 社員番号・部門コード・部門名があるテーブル
    • 主キー:社員番号と部門コード
    • 部門コードに対して部門名は一意に紐づく
    • このとき部門名は主キーに部分関数従属する
P.298 完全関数従属
  • 完全関数従属:関係 $x \mapsto y$ で $y$ が $x$ のどの真部分集合にも関数従属しない
  • 独立属性 $x$ が 1 つの属性かなるときは常に完全関数従属
P.299 推移的関数従属
  • 直接ではなく間接的に関数従属している関係
  • 例:社員マスタ
    • 社員番号・社員名・住所・郵便番号からなるテーブル
    • 社員番号から住所が一意に紐づく
    • 住所から郵便番号が一意に紐づく
    • 郵便番号は社員番号に推移的関数従属している
    • 念のため:住所は住所マスタなどに外出し(正規化)するべきで、こういうテーブルを作ってはいけない
    • 詳しくは次の 6.3.2 で議論される
P.300 6.3.2 正規化の手順
P.300 第 1 正規化
  • 非正規:くり返し部分をもつテーブルのこと
    • まずもってくり返しという言葉の理解自体がたぶん面倒
    • いろいろな例に触れてみよう
  • RDB は平坦な 2 次元の表(テーブル)
    • くり返し部分をもつ表から繰り返しを排除してスリム化したい
  • 第 1 正規化:くり返しを排除する操作
    • 第 1 正規形:第 1 正規化して得られた表のこと
    • cf. P.300 図6.3.4 の売上表
  • P.300 図 6.3.5
    • 売り上げ明細表:主キーの売上番号とくり返し部分を一意に決める商品番号が複合キー
    • 別の表に分解する
    • 外部キー:他のテーブルの主キーである売上番号を参照している
  • 分解・独立させた表に元の表の主キーをもたせる理由:結合で元の表を再現するため
P.301 第1正規形におけるデータ操作での不具合
  • 第1正規形になった表は RDB 上で定義できる
  • データの冗長性のためにデータ操作時に不整合を起こさないように注意が必要:更新時異常の概念
  • 種類は以下の通り
  • 例は本 P.300 の売り上げ表・売上明細表から
  • 第 1 正規形では以下のような更新時異常が起きる可能性がある
    • 防止策が第 2 正規化・第 3 正規化
    • どこまでどうやるかは状況次第
P.301 修正時異常
  • 商品名「オレンジ」を「清見オレンジ」に変更したい
    • 該当する行をすべて同時に変更しなければならない
    • 1行でも変更し忘れるとデータ不整合が起きる
  • 先に対策を書いておく
    • 売上明細には商品番号だけ持たせて、商品名を削る
    • 削った代わりに商品テーブルを作る
    • (ふつう商品テーブルには単価も切り出す)
    • (単価に消費税を載せるかどうかといった問題もある)
P.301 挿入時異常
  • 売上明細表の主キーは売上番号と商品番号の複合キ ー
  • 売上のない("売上番号"が空値)商品は登録できない
    • どうやらこの本の「売上表」は商品テーブルも兼ねているらしい
  • 先に対策
    • 商品テーブルを別に作って、そこからの参照という形にする
P.301 削除時異常
  • (先程と同じくこの本の売り上げ表は商品テーブルも兼ねている模様)
  • 売上実績が 1 つしかない商品のの売上データを削除す ると商品データも削除される
  • 逆に商品データを残そうとすれば売上データは削除できない
  • 先に対策:商品テーブルを切り出す
P.301 第2正規化
  • 第2正規化:すべての非キー属性が各候補キーに完全関数従属である状態にする操作
    • 第1正規形の表に対して行われる操作
    • 候補キーの一部に部分関数従属する非キー属性を別の表に分解する
    • 第2正規化して得られた表を第2正規形という
  • 例:図6.3.7の売上明細表
    • 候補キーは主キーの{売上番号,商品番号}の1
    • 非キー属性である商品名と単価は主キーの一部である商品番号に部分関数従属している
      • 商品表として独立させる
  • 分解の仕方
    • 商品表の主キーを商品番号
    • 図6.3.7の上の表を再現できるようにする
      • 売上明細表(図6.3.7の下の表)には商品表の主キーを参照する外部キーとして"商品番号"を残す
P.302 メモ
  • 第2正規化するのは候補キーが複数の属性で構成されている場合。
    • 1つの属性で構成されているのであれば部分関数従属は存在しない
    • 既に第2正規形
  • 非キー属性:どの候補キーにも属さない属性
  • 第2正規形:どの非キー属性も候補キーの真部分集合に対して関数従属しない
    • どの非キー属性も候補キーに完全関数従属
P.302 第3正規化
  • 第3正規化:非キー属性間の関数従属をなくしてどの非キー属性も候補キーに直接に関数従属している状態にする
    • 第2正規形の表に対して行われる操作
    • 候補キーに推移的関数従属している非キー属性を別の表に分解
    • 第3正規化して得られた表を第3正規形
  • 例:図6.3.8の売上表
    • これは第2正規形
    • 顧客番号→顧客名いう非キー属性間の関数従属がある
    • 顧客番号を主キーとした顧客表として独立させる
    • 売上表には顧客表の主キーを参照する外部キーとして顧客番号を残す
P.303 メモ
  • 第3正規形:どの非キー属性も候補キーに推移的関数従属しない
    • どの非キー属性も候補キーに直接に関数従属している
  • ボイス・コッド正規形
    • 第3正規形では次の関数従属が存在する可能性がある
      • 候補キーの真部分集合から他の候補キーの真部分集合への関数従属
      • 候補キー以外の属性から候補キーの真部分集合への関数従属
    • この関係を分解したのがボイス・コッド正規形
P.303 正規化と非正規化
  • 正規形には第1正規形から第5正規形まである
    • たいていの用途ではデータベースの場合、第3正規形まで正規化されていれば十分といわれている
  • 正規化の目的はデータ操作にともなう更新時異常の発生を防ぐこと
    • 属性間の関数従属を少なくする
    • データの重複を排除する
  • 正規化のデメリット
    • 表がいくつにも分割される
    • 必要なデータを取り出すために表を結合しないといけない
    • 処理時間がかかる
  • 処理速度が必要な時や更新時異常の発生が低い場合はあえて正規化しない・正規化を解く
    • たとえば更新が少ない表は正規化しない
  • ここでの「非正規化」:アクセスパターンを考えたうえでどの表を統合するか、どの属性を表間に重複させるか考える
P.304 6.4 関係データベースの演算
P.304 6.4.1 集合演算
  • 関係データベースでの集合演算
    • 同じ型の表間での和、共通部分(積)、差
    • 直積:同じ型の表でなくてもいい
P.304 和、共通(積)、差
  • 図6.4.1の表AとBに対するそれぞれの演算結果を見る
  • 本参照
P.305 直積演算(Cartesian Product:×)
  • 社員表と部門表の直積は社員表の各行に対して部門表の行を1つずつつなぎ合わせた表
  • 直積の結果として得られる新しい表を直積表と呼ぶ
    • 次数(属性の数)は両方の表の次数を足した数
    • 位数(タプルの数)は両方の位数を掛けた数
  • 直積が役に立つイメージがない:実際には結合 (JOIN) を本当によく使う
P.305 6.4.2 関係演算
  • 関係演算:関係データベース特有の演算
    • 射影,選択,結合,商
  • 関係代数:関係演算と集合演算を合わせた代数
    • 導出表:これらの演算によって得られた表
P.306 SQL の例
  • 先に持ってきてみた

SELECT 社員コード, 社員名, 部門表.部門コード, 部門名

FROM 社員表, 部門表

WHERE 社員表.部門コード = 部門表.部門コード

P.305 選択と射影
  • 選択演算:表から指定した行を取り出す関係演算
    • SQL でいう WHERE
  • 射影演算:表から指定した列を取り出す関係演算
    • SQL でいう SELECT column_name
P.306 結合
  • 参考:P.306 の下の表
  • 結合演算:2つの表が共通にもつ項目(結合列)で結合して新しい表をつくり出す関係演算
    • まさに正規化でわけたテーブルを結合させる演算
  • SQL:SELECT文のFROM句で複数の表名をカンマで区切って指定
    • WHERE句で結合条件を指定
  • 結合条件
    • 結合列の値を>,≧,=,≠,≦,<のいずれかの比較演算子で比較して結びつける
  • 等結合:比較演算子が「=(等号)」である結合
    • 2つの表から作成される直積表から結合列の値が等 しいものだけを取り出す
    • 得られた新たな表には結合列が重複して含まれる
    • SELECT句でどちらか一方の結合列を指定して見かけ上の重複を除く
  • 自然結合(natural join):重複する結合列を取り除く(一方のみ残す)ようにした結合
    • 結合列の列名が2つの表で同じ場合に使える
    • 参考
      • (意識的に使ったことがない)
P.307 内結合と外結合
  • 参考:P.307 の図 6.4.8
  • 内結合(INNER JOIN)
    • 結合列の値が等しい行だけを取り出す結合演算
    • 片方の表にしか存在しない行は取り出せない
    • データベース言語仕様(JIS X 3005)
  • 外結合(OUTER JOIN)
    • 片方の表にしか存在しない行も取り出せる結合
    • 結合相手の表に該当するデータが存在しない場合はNULL(空)値で結合
    • 左外結合・右外結合・完全外結合
  • 等結合
    • 結合する表をFROM句で指定、結合条件はWHERE句 で指定
  • 内結合・外結合
    • 結合する表をFROM句の中でJOINを使って指定
    • 結合条件は JOIN に続くON句で指定する
    • 参考:p309のコラム「内結合と外結合のSQL文」
P.307 左外結合(LEFT OUTER JOIN)
  • 参考:P307 図 6.4.9、P309 の SQL 文
  • 結合する左の表(社員表)が基準
  • 右の表(部門表)に存在しない行を空値(NULL)として結合
P.308 右外結合(RIGHT OUTER JOIN)
  • 参考:P.308 図 6.4.10
  • 結合する右の表(部門表)が基準
  • 左の表(社員表)に存在しない行をNULLとして結合
P.308 完全外結合(FULL OUTER JOIN)
  • 参考:P.308 図 6.4.11
  • 片方だけに存在する場合もう片方をNULLとして結合
P.308 商
  • (これ何だろうか?where の in?)
    • 普通に in または =`= でよさそう?
    • select も含んでいる?
  • 参考:P.308 図 6.4.12
  • 関係R(X,Y1,Y2)とS(Y3,Y4)がある
  • S(Y3,Y4)のすべての行がR(Y1,Y2)に含まれる場合に対応するR(X)を求める演算
    • 商(R÷S)は関係Rの中から関係Sのすべての行を含む行を取り出し、そこから関係Sの項目を除く
    • 重複行も除く
  • 参考:P.309、図6.4.13
    • 社員表から東京に住み営業2課(E02)に勤務する社員を探す場合に商演算を使う
P.309 COLUMN ない結合と外結合の SQL
  • 本を読もう
P.310 6.5 SQL
P. 310 6.5.1 データベース言語SQLとは
  • SQL(Structured Query Language)
  • RDB の標準的な操作言語
  • ほとんどの RDBMS が SQL を使っている
    • Relational DataBase Management System
P.310 SQLの分類
  • RDB のデータを検索(参照)、操作
  • データ定義
  • トランザクション制御
  • 参照:表 6.5.1 に SQL 文が書いてある
P.310 表 6.5.1 重要な SQL
  • DDL (Data Definition Language)
    • CREATE, DROP, GRANT, REVOKE
  • DML (Data Manipulate Language)
    • SELECT, INSERT, UPDATE, DELETE, COMMIT, ROLLBACK, DECLARE CURSOR, OPEN, FETCH, CLOSE
  • DECLARE CURSOR以降は親言語方式などで使用されるSQL
  • 親言語方式
    • CやCOBOLなどのプログラム中にSQL文を組み込んでデータベースにアクセスする方式。
    • 埋込みSQL:p328参照
P.311 6.5.2 SELECT文
  • データ操作言語(DML)
    • 問合せ(SELECT)文
    • 挿入(INSERT)文
    • 更新(UPDATE)文
    • 削除(DELETE)文
    • などなど
  • SELECT文以外のDMLは「6.5.3 その他のDML文」(p319)参照
P.311 SELECT文の構文
  • SELECT文の基本構文
    • [ ]内は省略可能

SELECT

[DISTINCT]

列名のリスト

FROM 表名のリスト

[WHERE 選択条件や結合条件]

[GROUP BY 列名のリスト]

[HAVING グループ選択条件]

[ORDER BY 列名のリスト]

  • リスト:列名および表名をカンマ(,)で区切って列挙したもの。
P.311 行、列の取り出し
  • 選択:WHERE句に選択条件を指定すると特定の行を取り出せる
    • in とリストを使うと複数行に対する
    • 具体例を考えないと使い分けや気分はわからなそう
  • 射影:SELECT句に列名を指定すると特定の列を取り出せる
  • SELECT句への *:全部の列を取りだす
  • 選択条件と論理演算子(AND・OR・NOT):複数の条件を組み合わせる
  • 表 6.5.2:選択条件に使う比較演算子の表
  • 参考:列の値が「空値(NULL)であるか」という検索条件
    • WHERE 列 IS NULL
    • WHERE 列 = NULLではない
    • NULL は他にもいろいろ邪悪な面がある
    • 空文字列などとは違う概念でよくはまる
SQL 例
  • P.312、図 6.5.1
  • 社員表から年齢が24以上28以下の社員コード・社員名を表示するサンプル

SELECT 社員コード, 社員名 FROM 社員表 WHERE 年齢 >= 24 AND 年齢 <= 28

P.312 BETWEEN述語
  • 先のSELECT文はBETWEEN述語やIN述語を使って同じ内容を表せる
  • BETWEEN述語は「値1~値2」の範囲(値1,値2を含む)に列の値が含まれるかを選択条件にする

SELECT 社員コード, 社員名 FROM 社員表 WHERE 年齢 BETWEEN 24 AND 28

P.312 IN述語
  • IN述語は列の値が指定された値のいずれかと等しいかを選ぶ条件にする場合に使う
  • INの前にNOTをつけると指定された値のいずれでもないという選択条件になる
  • IN述語の使用例については副問合せ(p317)も参照
P.313 重複行の排除
  • 取り出された行の中から重複するものを除きたい場合
  • SELECT句の列名指定にDISTINCT述語を使う
P.314 出力順の指定
  • ORDER BY 句:特定の列の値で昇順・降順に並べ替えて表示する
    • ORDER BY のあとに続けて並べ替えのキー(列名)を指定
    • 降順の場合はDESC、昇順の場合はASC
    • ふつう ASC がデフォルトで省略できる

SELECT 社員名, 年齢 FROM 社員表 ORDER BY 年齢 DESC

P.314 グループ化
  • GROUP BY 句:取り出した行を指定した列の値でグループ化
    • グループごとの合計や最大値などを求める
  • HAVING 句:条件に合ったグループだけを取り出す

SELECT 所属, COUNT(), AVG(年齢) FROM 社員表 GROUP BY 所属 HAVING COUNT() >= 2

  • SQL の簡単な解説
    • 社員表のデータをGROUP BY句を使って所属でグループ化
    • HAVING 句で「グループに所属する人数が2人以上」のグループだけを取り出す
    • 取り出したグループごとにその所属・人数・平均年齢を求める
P.315 表の結合
  • 2 つの結合
    • SELECT A FROM B WHEREによる等結合
    • FROM 句の中での JOIN ... ON による内結合や外結合
  • どちらであっても結合表には結合条件で指定した結合列が重複して含まれる
    • 列名を指定するときは「表名.列名」という形式で表す
P.316 表に別名をつける
  • FROM句で「表名 AS 別名」あるいは「表名 別名」と指定すると表名に対して別名(相関名)を設定できる
  • 自己結合:表に別名を与えると同じ表どうしを結合できる
  • 自己結合については P.317 の例を参照
    • 上司コードを使ってある社員とその上司の氏名や関連情報を見たい場合に使う
P.317 副問い合わせ
  • サブクエリともいう
  • SELECT文のFROM句やWHERE句・HAVING句などに指定されている入れ子になったSELECT文

SELECT 社員コード, 社員名, 年齢 FROM 社員表 WHERE 年齢 IN (SELECT 指定年齢 FROM 調査対象)

  • サブクエリにはいろいろ面倒な話がある
  • 参考:MySQL のサブクエリって、ほんとに遅いの?
    • これは 2017 年の記事:この辺はお金になるので割と日進月歩で、3 年程度の昔の情報でも既に参考にならないことも多い。
    • 簡単なまとめ
      • 遅いのは2番目、DEPENDENT SUBQUERYである
      • MySQL 5.5 までサブクエリはやっぱり遅い
      • MySQL 5.6 からはそんなに遅くなくなった
      • MySQL とはいってもバージョンによって全然違う:オプティマイザは進化している
    • 現状についてはきちんと最新の話を追う、または自分が必要なケースについて実測する
P.318 EXISTS述語
  • サブクエリはEXISTS述語でも表せる
  • 参照:P.318 の例
    • EXISTS は相関副問合せが何らかの結果を返した場合にTRUE(真),何も返さなかった場合にFALSE(偽)を返す
    • 主問合せの結果1行に対して相関副問合せから何らかの結果が戻されれば、主問合せの選択条件は成り立ち、何も返されなければ選択条件は成り立たない
  • EXISTS 述語でほかの表にも存在するものを調べられる
  • ANY でも同じ操作を表せる
    • 参考:P.318 の例
    • 副問合せの結果のいずれか(ANY)と等しい
  • どれがいいかは最終的にはテーブルの実装や使っている RDBMS とバージョンに依存する
    • 実測してチューニングしよう
P.319 6.5.3 その他の DML 文
P.319 INSERT文
  • 表に行を挿入する:2つ方法がある
    • 参考:本の P.319
    • 挿入する値をVALUES句で指定する
    • 問合せの結果をすべて挿入する
    • (DBMS によるかもしれないが)個別INSERTと一括INSERTもある:パフォーマンスでよく問題になる
  • 一部の列に対して INSERT
    • どの列に対して挿入するのか列名リストで指定
    • 省略された列の値はDEFAULT制約があればその既定値、そうでなければNULL値
    • NULL はなるべく使うのをやめよう
    • DEFAULT は P.322 表 6.6.1
P.319 UPDATE文
  • 表中のデータを変更
    • 列の変更値を直接指定する
    • 変更値をCASE式で決める
    • 副問合せの結果を変更値にする
  • SET句には変更したい列の値を「列名 = 変更値」の形で指定
  • 1 つのUPDATE文で複数の列の値を変えるときはカンマ(,)で区切って指定
  • WHERE句を省略すると表中のすべての行が変わる
    • ふつうはやらない
    • WHERE句を指定すれば条件に合った行だけ変わる
P.320 DELETE文
  • 表中の行を削除する
    • 表中の全行を削除しても表自体は残る
    • 表を削除するのはDROP文
  • WHERE句を省略すると表中のすべての行が削除される
  • WHERE句を指定するとその条件に一致した行だけを削除できる
P.320 参照関係をもつ表の更新
  • 関連する2つの表の間に参照制約が設定できる
    • 被参照表の主キー(候補キー)にない値を参照表の外部キーに追加できない
  • 被参照表の行の削除・変更時に制約が出る:図6.5.10参照
  • 参照動作指定:削除・変更時の制約は明示的に指定できる
    • 次節のCREATE TABLE文を参照
    • REFERENCES句(参照指定)の後に次の構文で指定

参照動作指定 REFERENCES 被参照表(参照する列リスト) ON DELETE 参照動作] [ON UPDATE 参照動作] (*[ ]内は省略可能)

  • 指摘できる参照動作:表 6.5.5 の 5つ
    • デフォルトは NO ACTION
P.320 補足
  • 参照制約
    • 外部キーの値が被参照表の主キーあるいは主キー以外の候補キーに存在することを保証する制約。
    • 関連する2つの表の間に参照制約を設定する目的:データ矛盾を起こすような行の追加や削除・変更を排除するため
  • REFERENCES指定:p322-324を参照
  • データの整合性を保つための制約
    • 一意性制約
    • 参照制約
    • データ項目のデータ型や桁数に関する形式制約
    • データ項目が取り得る値の範囲に関するドメイン制約がある。
P.322 6.6 データ定義言語(DDL)
P.322 6.6.1 実表の定義
P.322 CREATE TABLE文
  • 表の定義はには CREATE TABLE 文
  • 基本構文は P.322 参照
P.322 列制約
  • 表を構成する列に対する制約
  • 参考:表6.6.1
  • 一意性制約:同一表内に同じ値が複数存在しないことを保証する制約
    • 主キーとなる列には一意性制約にとNOT NULL制約を加えたPRIMARY KEY指定
    • 主キー以外の候補キーにも一意性制約がある
    • 一般にNULL(ナル)値は重複値とは扱われない
    • 候補キーにはNULL値を許すUNIQUE指定
  • 参照制約:外部キーの値が被参照表に存在することを保証する制約
  • 外部キー:REFERENCES指定(参照指定)す。
P.323 表制約
  • 一意性制約・参照制約・検査制約は表制約(表定義の要素として定義される制約)にもできる
  • 列制約:1つの列に対する制約
  • 主キーや外部キーが複数列から構成される場合、これを列制約として定義できない
    • このときは表制約を使う
P.323 主なデータ型
  • 一般的な文字型,数値型は覚えておくといい
P.324 実表の定義例
  • P.324 の社員表と部門表を定義を見てみよう
P.325 6.6.2 ビューの定義
P.325 ビューとは
  • 実表:ディスク装置上にあり実際にデータが格納される表
  • ビュー:実表の一部または複数の表から必要な行や属性(列)を取り出してあたかも1つの表 であるかのように見せかけた仮想表
    • 利用者から見れば実表と同じ
    • データを検索するだけなら制約はあっても同じように操作できる
  • ビューのメリット
    • あくまでも仮想の表:対象となった元の表(基底表)の列名と別の名前で定義できる
    • ビューに定義することで情報を公開
    • ビューに定義しないことで情報を非公開にできる
    • 元の表に新たな列が追加されても既存のビューには影響がなく再定義する必要がない
  • ビューは仮想的な表
    • 一般には実体化されずデータ格納領域をとら ない。
    • 実表のように実体化されるビューもある:体現ビュー(materialized view)
P.325 CREATE VIEW文
  • ビューの定義:CREATE VIEW文による:詳細は本の P.325
  • ビュー:対象となる実表(あるいは他のビュー)からSELECT文で必要データを導出する方法で定義される定義するビューの列名に命名規則はない
    • 列数はAS句に続くSELECTで問い合わせた結果の列数と同じでなければならない
    • 列名は省略可能:省略した場合はSELECTで問い合わせた結果の列名がそのまま定義される
  • ビューに対する参照や更新処理
    • ビューの対象となった表(基底表)に対す る参照あるいは更新処理に変換されて実行される
P.326 ビューの定義例
  • 本の P.326 参照
  • 社員表と部門表から社員コードと社員名、その社員が所属する部門名からなる表をビュー「社員表2」
    • JOIN して必要なカラムだけ取り出す
P.326 ビューの更新
  • ビューへの更新処理 ビュー定義を基にビューが参照している表(基底表)への対応する処理に変換されて実行
  • 更新のための条件
    • 更新にかかる実際の表が更新可能
    • 更新される表の列や行が一意に決まる
  • 更新できないビューの例
    • SELECT句で式、集合関数、DISTINCT を使ったSELECT文で定義されている
    • ・GROUP BY句やHAVING句を使ったSELECT文で定義されている
P.327 6.6.3 オブジェクト(表)の処理権限
  • スキーマに定義された実表やビューはそのスキーマ所有者(作成者)にしか処理権限が与えられない
  • 複数の利用者がデータベースを利用できるようにしたければ、スキーマ所有者以外にも処理権限を付与する必要がある
    • データベース管理ユーザーは全権を持っていて危険な処理もできてしまう
    • できることを制限したユーザーで操作したい
  • オブジェクト(表)の処理権限
    • 読取(SELECT)権限
    • 削除(DELETE)権限
    • 挿入(INSERT)権限
    • 更新(UPDATE)権限
  • cf. スキーマ
    • 1つのデータベースの枠組み
    • スキーマ内に複数の表やビューを定義できる
P.327 処理権限の付与
  • 権限の付与:GRANT文による
  • GRANTの基本構文は次の通り
1
GRANT 権限 ON 表名 TO 許可識別子
  • 権限指定
    • 4 つの処理権限(SELECT,INSERT,UPDATE,DELETE)
    • ALL PRIVILEGES(すべて)を指定できる
  • 権限を複数付与する場合はカンマ(,)で区切って指定
P.327 処理権限の取消し(変更)
  • 一度付与された権限を取消し(変更)できる
  • 権限の取消しはREVOKE文
  • REVOKEの基本構文
1
REVOKE 権限 ON 表名 FROM 許可識別子
P.328 6.7 埋込み方式
P.328 6.7.1 埋込みSQLの基本事項
P.328 静的SQLと動的SQL
  • 静的 SQL:あらかじめ決められたSQL文をプログラム中に埋込んで実行する方式
    • 実際のアプリケーションではあまり見かけない
  • 非カーソル処理:データベースの表から1行を取り出すこと
    • 次のような SELECT 文
    • この INTO を見たことがない

SELECT 社員名, 年齢 INTO :name, :age FROM 社員表 WHERE 社員コード = '100';

  • 動的 SQL:実行する SQL 文がプログラム実行中でな ければ決まらない場合に SQL 文を動的に作成し実行する方式
  • 上の社員コードがふつう変わる:それが「動的」。
  • この動的な部分に変なコードを埋め込むとまずいというのがセキュリティ問題で、例えば SQL インジェクションの問題。
P.328 ホスト変数
  • ホスト変数:データベースとプログラムのインタフェースとなる変数
  • 埋め込み SQL では SQL を実行すると取り出されたデータをINTO句で指定したホスト変数に格納する
  • ホスト変数は通常の変数としてもアクセスできる
    • 出力関数で表示
    • 入力関数で値を入力してそれをSELECT文の条件としても使える
P.329 6.7.2 カーソル処理とFETCH
P.329 カーソル処理
  • 「SELECT・・・・INTO・・・」形式では,1行のデータしか取り出せない
    • (見たことがないのでイメージがつかない)
  • 検索結果が複数行の場合は1行ずつ取り出せるカーソル処理を使う
  • カーソル処理は SQL 文で問い合わせた結果をあたかも1つのファイルであるかのようにとらえる
  • FETCH文でそこから1行ずつ取り出す方式
    • 1つのSELECT文に対してカーソルを宣言(定義)
    • カーソルのオープンでSELECT文が実行
    • カーソルで1行ずつ取り出せる
    • FETCH文で繰返し行を取り出して処理
    • 終了したらカーソルを閉じる
P.330 FETCHで取り出した行の更新
  • 参考:図 6.7.2:FETCHで取り出した行の更新処理
  • FETCH文で取り出した行を更新あるいは削除する場合,FETCH文のあとに続くUPDATE文やDELETE文のWHERE句 に「WHERE CURRENT OF カーソル名」と指定する。
  • (FETCH 文を見たことがないのでイメージつかない)
P.330 処理の確定と取消し
  • 一連のデータを更新している途中でエラーが出た場合
  • それまでの更新処理を取り消して元に戻す必要がある
  • 整合性を取らないといけない:いわゆるロールバックが必要
  • トランザクションが正常終了したときは「コミット」する:更新処理の確定
P.331 6.8 データベース管理システム
P.331 6.8.1 トランザクション管理
P.331 トランザクションとは
  • 複数の利用者が同時にデータベースにアクセスしてもデータが矛盾してはいけない
  • この仕組みがトランザクション管理
  • トランザクション:データの整合性を取るための SQL 処理の最小単位
    • 「回復の単位(Unit of Re-covery)」とも呼ぶ
P.331 ACID 特性
  • トランザクション処理は原子性・一貫性・隔離性・耐久性の 4 特性が必要
  • 厳密な一貫性(完全一貫性)が必要
    • トランザクションではそのすべての処理が完了するか(All)、あるいはまったく実行されていない状態か(Nothing)のどちらか一方で終了しなければならない
    • これは,COMMIT(正常終了),、ROLLBACK(異常終了)で実現できる
    • COMMIT(コミット):更新処理を確定し、データベ ースへの反映を保証する
    • ROLLBACK(ロールバック):更新処理をすべて取 消し,トランザクション開始時点の状態へ戻す
  • 参考:結果整合性
    • 完全一貫性に対する概念
    • 分散トランザクションやいわゆる NoSQL で使われる
    • 参考:分散トランザクション
      • トランザクション管理するべきテーブルが複数のデータベースにまたがっているとき
      • すべてのデータベースをロールバックしなければいけない
P.331 表 6.8.1 ACID 特性
  • 原子性(Atomicity)
    • 更新処理トランザクションが正常終了した場合だけデータベースへの反映を保証する
    • 異常終了時は処理が何もなかった状態に戻す
  • 一貫性(Consistency)
    • トランザクションの処理によってデータベース内のデ ータに矛盾が生じないこと
    • 常に整合性のある状態が保たれていること
  • 隔離性(Isolation)
    • 複数のトランザクションを同時(並行)に実行した場合 と,順(直列)に実行した場合の処理結果が一致するこ と
    • 独立性ともいう
    • トランザクションのスケーリング:複数のトランザクションを同時実行してもそれが正しい順で実行されるように順序づけること
      • 基本は並行実行の結果と直列実行の結果が等しくなるように調整する
    • ロック:直列可能性を保証する方法
  • 耐久性(Durability)
    • いったん正常終了したトランザクションの結果はそ の後に障害が発生してもデータベースから消失しないこと
    • トランザクションの再実行を必要としないこと
P.332 6.8.2 同時実行制御

2020-12-20 課題

  • 先に進む前に録画してあるか確認しよう

進捗

  • 前回の進捗
    • 基礎知識編:6.3.2 正規化の手順まで
    • 本編:「04-01 以下、高校数学水準で」
  • 今回の進捗
    • 基礎知識編:P.319 6.5.3 その他の DML 文
    • 本編:「期待値をコードで表す」まで

課題

TODO

自分用メモ

Matplotlib

  • 本当に簡単な図を描く
  • これを参考に scipy お絵描き
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import sph_harm

m,l = 2,3
theta = np.linspace(0, np.pi, 1001)
phi = np.linspace(0, 2 * np.pi, 1501)
theta, phi = np.meshgrid(theta, phi)

r = sph_harm(m, l, phi, theta).real
x = np.abs(r) * np.sin(theta) * np.cos(phi)
y = np.abs(r) * np.sin(theta) * np.sin(phi)
z = np.abs(r) * np.cos(theta)

fig = plt.figure(figsize=(8, 8))
ax = fig.gca(projection="3d")
ax.plot_surface(x, y, z, color="aqua", edgecolor="k")
plt.axis("off")
plt.show()

TeX の記録

  • TODO

\begin{align} a \end{align}

日々の勉強

Julia

IT 基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。
  • ネットワークの話もいい加減飽きたので、しばらく DB の話

復習

  • 3 つのスキーマ
    • ユーザーが見るレベル
    • 正規化などをかけておいたデータベースにもっていけるレベル
    • 個々のデータベースに合わせた具体的なレベル
  • インメモリの DB:コンピューターの基本的なハードウェア構成と意味を復習しよう

本の記述を追いかける

P.408 7.8 交換方式
P.408 パケット交換方式
  • 回線交換方式と対になる概念
    • 回線交換方式:通信を行うノード間で物理的な通信路を確保してから通信する
    • 例:電話
  • パケット交換方式について
    • データ送信するノードはデータをパケットに区切る。
    • ひとつひとつのパケットにヘッダを付けて送信。
    • ネットワーク内ではパケット交換機にパケットがたまる
    • ネットワークの状況に応じて順次送られる
パケット通信のメリット・デメリット
メリット

耐障害性 - 通信路を固定しないため,迂回経路が取れる。 - パケット交換機にデータが蓄積されているため,復旧まで待てる。 - パケット多重 - 1 対 1 の通信で回線を占有する必要がないため,1つの回線を多くのノードで共有でき,回線を効率的につかえる - 異機種間接続性 - パケット交換機で中継するときにプロトコル変換・速度変換でエンドノードどうしが同じプロトコルをサポートしていなくても通信できる

デメリット
  • ネットワーク内の蓄積交換処理による遅延
    • 蓄積交換処理による遅延解消のために主に回線の帯域を広げることで対応してきた
    • 構造上,完全には遅延をなくせない
  • パケット到着順序の不整合
P.408 ATM 交換方式
  • ATM(Asynchronous Transfer Mode:非同期転送モード)
  • 遅延のない回線交換方式とパケット交換方式の利点を得たい
  • パケット交換方式の発展
  • 遅延の原因をつぶす:特にパケットの多様性
    • 多種多様なパケットに対応するために,パケット交換機はソフトウェア処理が必要 ^ ATM での工夫の一例:最も特徴的なのは,パケット(ATMではセルという)の長さをヘッダ部 5 バイト,ペイロード 48 バイトの53バイトに統一
    • パケット解析がハードウェアだけでできる。
    • ソフトウェアは不要になった。
  • Wikipedia から
    • 当初の意図に反して非常に複雑な技術になってしまった
    • ATM は次世代の主流にならず限定的な使用にとどまった
    • ATM の設計思想は MPLS へと引き継がれた
    • 汎用のレイヤ 2 のパケットスイッチングのプロトコルとして、ルーターを介したIPの通信網で利用されている。
P.408 ペイロード(payload)
  • データ通信で本来転送したいデータ本体の部分、ボディを指す。
  • ATM ではペイロードのサイズを固定して処理を簡素化
  • 難点:パケット全体に占めるペイロードのサイズが相対的に小さくオーバヘッドが大きい
P.410 輻輳
  • フレームリレー:パケット交換方式の一種
    • 1 つの回線を多数のユーザで共有。
    • 回線がもつ潜在的な伝送能力(ワイヤスピード)を十分に引き出すうえで効果がある
  • 輻輳:ユーザの利用が一時期に集中すると,ワイヤスピードを超えるパケットがネットワーク上に流れる
    • ネットワークが輻輳状態になるとスループットが落ちる
  • フレームリレーサービスを提供する事業者は,ネットワークが輻輳状態に陥ってスループットが低下しても最低限保証する通信速度を決めている
    • CIR(Committed Information Rate:認定情 報速度)
P.370 7 ネットワーク
  • 確か 7.4 から始めた気がするので 7 章はじめから
P.370 7.1.1 OSI基本参照モデル
  • 改めて復習
  • OSI(Open System Interconnection)基本参照モデル- 異なる設計思想・世代のシステムと円滑に通信するのが目的に標準化
  • プロトコルの単機能化,交換の容易さが目的
    • 階層化のおかげで一部の階層の技術体系が変わっても、その階層だけ取り替えればいい
    • コスト・リスクを小さくする
P.370 プロトコルとサービス
  • N 層:それぞれの階層のこと
  • エンティティ:N 層に存在する通信機器などの実体
    • この言葉はいろいろなところで出てきていろいろな意味で使われる
    • もちろん気分的には適当な実体を指すことが多い
  • プロトコル:N 層に属するエンティティが通信するための取り決め
  • 上位の層が下位の層を利用しながら通信する
    • 別の階層間のエンティティどうしが通信する窓口が必要
    • これを提供するのが下位層:この機能をサービスと呼ぶ
  • プロトコルに沿った仕様で製品を開発すれば別のベンダの機器でも通信できる
  • 参考:ベンダーロックイン

特定ベンダー(メーカー)の独自技術に大きく依存した製品、サービス、システム等を採用した際に、他ベンダーの提供する同種の製品、サービス、システム等への乗り換えが困難になる現象のこと。

出来上がった情報システムの正確な仕様が、システムを開発・構築したベンダーにしか解らなくなる場合がある。結果、システムの保守・拡張・改修等の際、現存システムを開発・構築したベンダーに引き続き発注せざるを得なくなる。

  • 「Excel で行政に提出する書類を作れ」事案もそれ。
  • Apple 製品で身の回りを固めるのも同じ。
  • 「多様性が大事」事案でもある。
7.1.2 TCP/IPプロトコルスイート
  • プロトコル同士には相性がある
    • 「ネットワーク層がこのプロトコルならトランスポート層はこのプロトコルにしておくとトラブルが少ない」
  • 一般に同じ団体が作ったプロトコルはセットで使われることが多い
    • このセットがプロトコルスイート ^ 最も代表的なのは IP を中心に組まれた TCP/IP プロトコルスイート
    • 独自の階層モデルをもつ
P.372 TCP/IPの通信
  • データをパケットに区切る
    • 各パケットにヘッダを付けて送信
    • ヘッダは各階層ごとに付加されて次の階層へと渡される
    • 各ヘッダにはその階層で必要となる送信元や送信先,大きさ,順番などパケット自体に関する情報を含む
    • TCPヘッダを付加したパケット:TCP セグメント
    • IP ヘッダを付加したパケット:IP パケット
    • MACヘッダを付加したパケット:MAC フレームあるいはイーサネットフレーム
P.372 MAC(Media Access Control)アドレス
  • イーサネットや FDDI で使用される物理アドレス
    • イーサネット (Ethernet):コンピューターネットワークの規格の1つ。オフィスや家庭で一般的に使用されている有線LAN (Local Area Network) の技術規格
    • FDDI:LAN でデータ転送を行うための標準の一つ
      • Fiber distributed data interface
  • データリンク層
  • 同じネットワークに接続された隣接ノード間の通信で相手を識別するために使う
  • MACアドレスの長さ:6バイト
    • 先頭24ビットの OUI(ベンダID)
    • 後続24ビットの固有製造番号(製品に割り当てた番号)
  • MAC アドレスは機器が固有にもつ番号
    • 必ず一意に定まるように IEEE が管理
P372 ポート番号
  • トランスポート層にでノード内のアプリケーションの識別に使う識別子番号
    • 0-65535の範囲
  • TCP/IPではパケット交換方式でデータをやり取りする
  • よく使われるアプリケーションについてのポート番号は Well-Known ポートとして標準化
    • TCP・UDPそれぞれで 0-1023 番までの番号を割り当てている
    • SSH:TCP22番
    • Telnet:TCP23番
    • SMTP:TCP25番
    • HTTP:TCP80番
    • POP3:TCP110番
    • IMAP4:TCP143番
    • HTTPS :TCP443番
    • NTP:UDP123番
    • SNMP:UDP161番
    • SNMP Trap :UDP162番
  • セキュリティ対策のために標準とはポート番号を変えることもある
  • Web 開発の本を読んでいると、いろいろな都合から http のポートを 80 以外にしていることもよくある。
    • 80 の場合はポートを指定しなくてもいい
      • 例:http://localhost/hoge/fuga
      • 例:http://localhost:5000/hoge/fuga
P.373 ネットワーク間の通信
  • 同じネットワークに接続されたノード間はデータリンク層(第 2 層)の通信
  • ネットワークを超えたノード間はネットワーク層(第 3 層)の通信 -実際に図 7.1.4 を見よう
    • どこが IP アドレスでのやりとりか?
    • どこが MAC アドレスでのやり取りか?
P.374 7.2 ネットワーク接続装置と関連技術
P.374 7.2.1 物理層の接続
P.374 リピータ
  • ネットワーク上を流れる電流の増幅装置・整流装置
  • 物理層:第 1 層
  • データ通信はネットワーク上を流れる電流
    • ケーブルが長いと電流が減衰・波形が乱れが起きる
    • データが読み取れなくなる
    • これを増幅するのがリピータ
  • 大昔の電話は距離が遠いと音が小さく聞こえにくかった
    • まさにこの減衰が問題
  • リピータは 1:1 で繋ぐ
    • 現在では複数のノードを接続できるマルチポートリピータ(ハブ)が使われるのが一般的
P.374 7.2.2 データリンク層の接続
  • 第2層
P374 ブリッジ
  • データリンク層に位置
  • ネットワーク上を流れているフレーム(情報の単位)の MAC アドレスを認識して通信を中継する
    • 接続されているノードをコリジョンドメイン(セグメント)という単位に分割
    • MAC アドレスで判定したフレームのあて先のあるセグメントだけにフレームを送信
    • 無駄なトラフィックの回避
  • ポートの記憶
    • 通信のたびにある MAC アドレスをもつノードがどのポート に接続されているか学習
    • 次回の通信時には余分なポートには通信を中継しない。
  • ブリッジの動作
    • あて先MACアドレスをもとにMACアドレステーブルを参照する
    • あて先MACアドレスの接続ポートがフレームを受信したポー トと別ポートであれば,そのポートにフレームを送信し
      • 同一ポートであればフレームを破棄する
    • あて先MACアドレスが記憶されていない場合やブロードキャス トアドレス(FF-FF-FF-FF-FF-FF)の場合は,受信ポート以外のすべてのポートにフレームを送信する
P.375 スイッチングハブ
  • レイヤ2スイッチ(L2スイッチ)とも呼ばれる
  • データリンク層に位置
  • ブリッジと同じ働きをする
    • MAC アドレスを認識してフレームのあて先を決めて通信を行います。
  • 試験での問われ方
    • スイッチングハブはフレームの蓄積機能、速度変換機能や交換機 能をもっている。
    • このようなスイッチングハブと同等の機能をもち,同じプロトコル階層で動作する装置はどれか
    • 答えは「ブリッジ」
P.375 ブロードキャストストリーム
  • データリンク層で動作するブリッジやスイッチングハブなどの LANスイッチはブロードキャストフレームを受信ポート以外 のすべてのポートに転送
  • これらの機器をループ状に接続し冗長化させると信頼性はあがる
    • ブロードキャストフレームは永遠に回り続けながら増える
    • 最終的にはネットワークダウンを招く
    • この現象をブロードキャストストームという
  • ブロードキャストストームを防ぐプロトコル:スパニングツリープロトコル(Spanning Tree Protocol:STP)
    • ループを構成している一部のポートを通常運用時にはブロック(論理的に切断)する
    • ネットワーク全体をループをもたない論理的なツリー構造にする
P.376 ネットワーク層の接続
  • 第 3 層(レイヤ 3)
P.376 ルータ
  • ルータはネットワーク層(第 3 層)に位置する
    • あて先IPアドレスを見てパケットの送り先を決め通信を制御する
  • IP のローカルネットワークの境界線に設置して利用され,ネットワークの基本単位として機能
  • 世界中に散在しているローカルネットワークどうしをルータが結ぶ
    • 全体としてインターネットというインフラが機能
  • ルータで分けられたネットワークの単位をブロードキャストドメインという
  • ルータがパケットを受け取ったあと
    • あて先IPアドレスを見る
    • 自分のネットワークあてであれば,破棄
    • 他のネットワークあてであれば転送
      • どのルータへ送ればあて先のネットワークへの通信が速く行えるかを判断することを経路制御(ルーティング)
      • ルータはそのための経路表(ルーティングテーブル)を備えている
P.376 デフォルトゲートウェイ
  • 会社Aのネットワークに属するPCは会社BのPCと直接通信できない
  • 会社AのPCは他ネットワークへの接点であるルータAに転送を依頼
  • デフォルトゲートウェイ:会社AのPCから見て直近のルータA
  • 自分と直接接続していない相手と通信するときはすべてデフォルト ゲートウェイを中継する
P.376 ルーティング
  • 経路表(ルーティングテーブル)の作成方法
    • 手作業で作る:スタティックルーティング
    • ルーティングプロトコル利用:ルータ同士が経路情報を交換し、自立的に経路表を作るダイナミックルーティング
  • ダイナミックルーティングのための代表的なルーティングプロトコル:RIP、OSPF
  • RIP:ディスタンスベクタ型(距離ベクトル型)
    • ルーティングテーブルの情報(経路情報)を一定時間間隔で交換しあう
    • あて先ネットワークにいたるまでに経由するルータの数(ホップ数)最小経路を選ぶ
    • あて先に到達可能な最大ホップ数は 15
      • これを超えた経路は採用されない
  • OSPF:リンクステート型
    • コストを経路選択の要素に取り入れ、コスト最小経路を選ぶ
    • コスト値は,回線速度を基に自動的に算出されるが手動設定もできる
    • コスト算出式「コスト=100Mbps/経路の通信帯域(bps)」
  • コスト計算例は P.377 の図を見ること
P.377 ルータの冗長構成
  • ルータを冗長構成のために使うプロトコル:VRRP(Virtual Router Redundancy Protocol )
  • 同じ LAN に接続された複数のルータを仮想的に 1 台のルータ として見えるようにして冗長構成を実現する
  • 複数のルータでグループ(VRRP グループ)を作る
  • VRRP グループごとに仮想 IP アドレスと仮想 MAC アドレスを割り当て
  • PC などのノードは仮想ルータの IP アドレスに対して通信
  • 通常時はグループのマスタルータが仮想ルータの IP アドレス(仮想 IP アドレス)を保持
  • マスタルータに障害が発生すると他のバックアップルータがこれを継承
P.377 レイヤ3スイッチ(L3スイッチ)
  • ルータと同じネットワーク層(第 3 層)の通信機器
  • 特徴
    • ルータ:ソフトウェアで転送処理
    • レイヤ 3 スイッチ:専用ハードウェアで転送処理
  • 高速処理できる:大容量のファイルを扱うファイルサーバへのアクセスなど
P.378 トランスポート層以上の層の接続
P.378 ゲートウェイ
  • トランスポート層(第 4 層)-アプリケーション層(第7層)でネットワーク接続するための装置
  • 第 3 層のネットワーク層まででエンドツーエンド(E2E)の通信は完成する
    • E2E = 通信を行う二者、あるいは、二者間を結ぶ経路全体
    • エンドツーエンド原理:高度な通信制御や複雑な機能は末端のシステムが担い、経路上のシステムは単純に信号やデータの中継・転送だけすべし
    • TCP/IP ネットワークの原理
    • 誤り訂正・フロー制御・再送:TCP 層(第4層、トランスポート層)など上位側の機器やソフトウェア・プロトコル
    • 単純な送受信・転送処理:IP 層(第3層、ネットワーク層)
  • ゲートウェイ:第 4 層のトランスポート層以上が違う LAN システム相互間のプロトコル・データ形式の変換を担う
  • ゲートウェイはアプリケーションプロトコルの内容を 解釈できる
    • アプリケーションヘッダの不正な情報混入を検出可能
    • ファイアウォール・プロキシサーバもゲートウェイの一種
P.378 L4スイッチ・L7スイッチ
  • L4スイッチ(レイヤ4スイッチ)はトランスポート層(第4層)の装置
    • 定義としてはゲートウェイ
    • 機能的にはレイヤ2スイッチ・レイヤ3スイッチの延長上
    • ルータやレイヤ3スイッチはIPアドレスを参照して経路制御する
    • L4スイッチではTCPポート番号やUDPポート番号も経路制御判断に使える:第4層の機器だから
  • L7スイッチ:アプリケーション層(第7層)までの情報を使って通信制御する
P.379 7.2.5 VLAN
  • VLAN(Virtual LAN:仮想LAN)
  • スイッチ(レイヤ2スイッチ,レイヤ3スイッチ)で物理的な接続形態とは独立に仮想的なLANグループを構成する仕組み,あるいはそう構成されたLAN
  • 複雑な形態のネットワークを楽に構築できる
  • サブネット構成も柔軟に変えられる
P.380 データリンク層の制御とプロトコル
  • データリンク層:第2層
P.380 7.3.1 メディアアクセス制御
  • 複数のデータを1つのケーブルを通して送受する場合,データの衝突(コリジョン)を回避するための制御が必要
    • これがメディアアクセス制御(Media Access Control:MAC)
コリジョン(衝突)

イーサネットや無線LANで複数の端末が送信し、データが衝突する現象を指す。旧式のイーサネット規格では、端末同士を接続するときに1組の通信路で双方向の通信を行う半二重通信のため、送信と受信を同時に行うことができない。送信と受信をその都度切り替えて行うので、端末がお互いデータを送信してしまうと衝突する可能性が高くなる。

P.380 CSMA/CD
  • CSMA/CD:Carrier Sense Multiple Access with Collision Detection:搬送波感知多重アクセ ス/衝突検出)の略。
  • イーサネットで採用されている方式
    • 衝突検知方式を採用
    • イーサネット:IEEE 802.3として標準化されている LAN規格
  • CSMA/CD
    • 各ノードは伝送媒体が使用中かどうかを調べて,使用中でなければデータを送りはじめる
    • 複数のノードが同時に通信しはじめるとデータの衝突が起こる
    • 衝突を検知し,一定時間(ランダム)待った後で,再送
    • 一定の距離以上のケーブルでは衝突が検知できない
  • CSMA/CD方式の限界
    • トラフィックが増加するにつれて衝突が多くなる
    • 再送が増え,さらにトラフィックが増加する悪循環に陥る可能性がある
    • 特に伝送路の使用率が30%を超えると実用的でなくなる
P.381トークンパッシング方式
  • トークンによる送信制御を行う方式で
    • トークンバス方式
    • トークンリング方式
P.381 トークンパッシング方式
  • ネットワーク上をフリートークンと呼ばれる送信権のためのパケットが巡回する
    • フリートークンを獲得したノードだけが送信できるので衝突を避けられる
    • ふつうはコンセントレータ(集線器)でネットワ ークとノードを結ぶ
  • トークンパッシング方式を採用したLAN規格
    • 例:FDDI:Fiber Distributed Data Interface
    • FDDIは物理媒体に光ファイバを利用し,最大100Mビ ッ ト/秒の通信
  • 特徴
    • 伝送媒体上では衝突しない
    • トラフィックが増えるにつれてトークンを獲得しにくくなり,少しずつ遅延時間が増える
    • 衝突による再送制御の必要がないため伝送路の使用率に対する遅延時間の増加率はCSMA/CD方式より緩やか
P.382 TDMA 方式
  • TDM(時分割多重)
    • ネットワーク上にデータを送信する時間を割 り当てる(タイムスロット)
    • タイムスロットごとに別のデータを送って多重化する
    • TDM によるアクセス制御が TDMA
  • TDMA(Time Division Multiple Access:時分割多重アクセス)
    • CSMA/CD・トークンパッシング方式と並ぶ主要なデー タリンク技術
    • TDMA ではネットワーク(伝送路)を使える時間を細かく区切る
    • 割り当てられた時間は各ノードが独占する方式
    • TDMAはコネクション型の通信
P.382 7.3.2 無線LANのアクセス制御方式
P.382 CSMA/CA方式
  • CSMA/CA:Carrier Sense Multiple Access with Collision Avoidance、搬送波感知多重アクセス/衝突回避
  • 無線 LAN の制御方式
  • CSMA/CD との違い:「衝突検出」が「衝突回避」になった
  • 無線 LAN:物理層媒体は電波で衝突の検出は不可能だから回避する
  • 特徴
    • 送信ノードは使いたい周波数帯の使えるか確認後、必ずランダムな時間だけ待ってから送信をはじめる
      • 待ち時間をバックオフ制御時間とよぶ
    • 衝突してフレームが壊れても検出できない
      • データを受け取ったノードは ACK を返す
P.328 RTS/CTS
  • 無線 LAN の話
  • 隠れ端末問題
    • 他のノードのデータ送信を感知できないことがある
    • 通信ノード間の距離が遠い
    • ノード間に障害物がある
  • 回避のための RTS/CTS 方式
  • 無線 LAN ノード
    • データ送信前にRTS(Request ToSend:送信リクエスト)をアクセスポイントに送信
    • これを受理したアクセスポイントがCTS(Clear to Send:送信OK)を返信
      • 他のノードは CTS を傍受して自分以外の別のノードに送信権があると解釈
      • データ送信を延期
    • 無線LANノードはアクセスポイントからCTSを受信したらデータ送信開始します
    • 衝突抑制:CTSに書かれた他のノードに対する送信抑制時間を使う
  • データ送信開始前にデータ送信のネゴシエーシ ョンとして RTS/CTS 方式を使った CSMA/CA を CSMA/CA with RTS/CTS とよぶ
P.383 無線LANの動作モード
  • 無線 LAN の動作モード:図7.3.4参照
  • 2 つのモードがある
  • インフラストラクチャモード:無線LANノードがアク セスポイントを通じて相互に通信
  • アドホックモード:アクセスポイントなしに無線LANノードどうしが直接通信
P.383 COLUMN FDMA,CDMA
  • 表7.3.1:多元接続する技術グループ
    • TDMA とセット
  • FDMA
    • ある周波数帯をさらに細かい周波数帯に分割
    • 接続できる端末数を増やす技術
  • CDMA
    • 周波数も時間も分割しない
    • 符号で各端末の通信を識別・分離
    • 接続できる端末数を増やす
P.383 7.3.3 データリンク層の主なプロトコル
  • 第 2 層
P.384 ARP
  • ARP(Address Resolution Protocol):通信相手のIPアドレスからMACアドレスを取るためのプロトコル
  • ARPの動作
    • ブロードキャストで目的IPアドレスを指定したARP要求パケットをLAN全体に流す
      • ブロードキャスト:ネットワークに参加するすべての機器に同時に信号やデータを送ること
    • 各ノードは自分のIPアドレスと比較
    • 一致したノードだけARP応答パケットに自分のMACアドレスを入れて返す(ユニキャスト)
  • 参考:GARP(Gratuitous ARP)
    • 主な目的:自身に設定するIPアドレスの重複確認・ARPテ ーブルの更新
    • 目的IPアドレスに自身が使うIPアドレスを指定し,MACアドレスを問い合わせる
P.384 RARP
  • Reverse-ARP:逆アドレス解決プロトコル
    • MACアドレスからIPアドレスを取る
  • 電源オフ時にIPアドレスを保持できない(IPアドレスを保持するハードディスクをもたない)機器が電源オン時に自分のMACアドレスから自身に割り当てられているIPアドレスを知るために使う
  • RARP サーバー
    • MACアドレスとIPアドレスの対応表を持ったサーバー(RARPサーバー)が必要
P.384 PPP
  • PPP:Point to Point Protocol
    • 2 点間をポイントツーポイントでつなぐためのデータリンクプロトコル
    • WANを介して2つのノードをダイヤルアップ接続するときに使う
  • ネットワーク層(第3層)とネゴシエーションする NCP(ネットワーク制御プロトコル)とリンクネゴシエーションするLCP(リンク制御プロトコル)からなる
    • NCP:Network Control Protocol
    • LCP:Link Control Protocol
  • リンク制御やエラー処理機能を持つ
P.384 PPPoE
  • PPPoE:PPP over Ethernet
  • PPPと同等な機能をイーサネット(LAN)上で実現するプロトコル
  • PPPフレームをイーサネットフレームでカプセル化して実現
P.384 7.3.4 IEEE 802.3規格
  • メディアアクセス制御に CSMA/CD 方式を使う LAN についての標準
  • OSI基本参照モデルにおけるデータリンク層(第 2 層)と物理層(第 1 層)のプロトコルおよびサービスを規定
    • OSI 基本参照モデルでのデータリンク層を LLC 副層と MAC 副層の2つに分割
    • 物理層での LAN で使う伝送媒体や MAC 副層でのフレーム構成や衝突検出の仕組みを規定
  • ツイストケーブルの企画が表 7.3.2 にまとまっている
P.386 7.4 ネットワーク層のプロトコルと技術
  • もうやった
P.300 6.3.2 正規化の手順
P.300 第 1 正規化
  • 非正規:くり返し部分をもつテーブルのこと
    • まずもってくり返しという言葉の理解自体がたぶん面倒
    • いろいろな例に触れてみよう
  • RDB は平坦な 2 次元の表(テーブル)
    • くり返し部分をもつ表から繰り返しを排除してスリム化したい
  • 第 1 正規化:くり返しを排除する操作
    • 第 1 正規形:第 1 正規化して得られた表のこと
    • cf. P.300 図6.3.4 の売上表
  • P.300 図 6.3.5
    • 売り上げ明細表:主キーの売上番号とくり返し部分を一意に決める商品番号が複合キー
    • 別の表に分解する
    • 外部キー:他のテーブルの主キーである売上番号を参照している
  • 分解・独立させた表に元の表の主キーをもたせる理由:結合で元の表を再現するため
P.301 第1正規形におけるデータ操作での不具合
  • 第1正規形になった表は RDB 上で定義できる
  • データの冗長性のためにデータ操作時に不整合を起こさないように注意が必要:更新時異常の概念
  • 種類は以下の通り
  • 例は本 P.300 の売り上げ表・売上明細表から
  • 第 1 正規形では以下のような更新時異常が起きる可能性がある
    • 防止策が第 2 正規化・第 3 正規化
    • どこまでどうやるかは状況次第
P.301 修正時異常
  • 商品名「オレンジ」を「清見オレンジ」に変更したい
    • 該当する行をすべて同時に変更しなければならない
    • 1行でも変更し忘れるとデータ不整合が起きる
  • 先に対策を書いておく
    • 売上明細には商品番号だけ持たせて、商品名を削る
    • 削った代わりに商品テーブルを作る
    • (ふつう商品テーブルには単価も切り出す)
    • (単価に消費税を載せるかどうかといった問題もある)
P.301 挿入時異常
  • 売上明細表の主キーは売上番号と商品番号の複合キ ー
  • 売上のない("売上番号"が空値)商品は登録できない
    • どうやらこの本の「売上表」は商品テーブルも兼ねているらしい
  • 先に対策
    • 商品テーブルを別に作って、そこからの参照という形にする
P.301 削除時異常
  • (先程と同じくこの本の売り上げ表は商品テーブルも兼ねている模様)
  • 売上実績が 1 つしかない商品のの売上データを削除す ると商品データも削除される
  • 逆に商品データを残そうとすれば売上データは削除できない
  • 先に対策:商品テーブルを切り出す
P.301 第2正規化
  • 第2正規化:すべての非キー属性が各候補キーに完全関数従属である状態にする操作
    • 第1正規形の表に対して行われる操作
    • 候補キーの一部に部分関数従属する非キー属性を別の表に分解する
    • 第2正規化して得られた表を第2正規形という
  • 例:図6.3.7の売上明細表
    • 候補キーは主キーの{売上番号,商品番号}の1
    • 非キー属性である商品名と単価は主キーの一部である商品番号に部分関数従属している
      • 商品表として独立させる
  • 分解の仕方
    • 商品表の主キーを商品番号
    • 図6.3.7の上の表を再現できるようにする
      • 売上明細表(図6.3.7の下の表)には商品表の主キーを参照する外部キーとして"商品番号"を残す
P.302 メモ
  • 第2正規化するのは候補キーが複数の属性で構成されている場合。
    • 1つの属性で構成されているのであれば部分関数従属は存在しない
    • 既に第2正規形
  • 非キー属性:どの候補キーにも属さない属性
  • 第2正規形:どの非キー属性も候補キーの真部分集合に対して関数従属しない
    • どの非キー属性も候補キーに完全関数従属
P.302 第3正規化
  • 第3正規化:非キー属性間の関数従属をなくしてどの非キー属性も候補キーに直接に関数従属している状態にする
    • 第2正規形の表に対して行われる操作
    • 候補キーに推移的関数従属している非キー属性を別の表に分解
    • 第3正規化して得られた表を第3正規形
  • 例:図6.3.8の売上表
    • これは第2正規形
    • 顧客番号→顧客名いう非キー属性間の関数従属がある
    • 顧客番号を主キーとした顧客表として独立させる
    • 売上表には顧客表の主キーを参照する外部キーとして顧客番号を残す
P.303 メモ
  • 第3正規形:どの非キー属性も候補キーに推移的関数従属しない
    • どの非キー属性も候補キーに直接に関数従属している
  • ボイス・コッド正規形
    • 第3正規形では次の関数従属が存在する可能性がある
      • 候補キーの真部分集合から他の候補キーの真部分集合への関数従属
      • 候補キー以外の属性から候補キーの真部分集合への関数従属
    • この関係を分解したのがボイス・コッド正規形
P.303 正規化と非正規化
  • 正規形には第1正規形から第5正規形まである
    • たいていの用途ではデータベースの場合、第3正規形まで正規化されていれば十分といわれている
  • 正規化の目的はデータ操作にともなう更新時異常の発生を防ぐこと
    • 属性間の関数従属を少なくする
    • データの重複を排除する
  • 正規化のデメリット
    • 表がいくつにも分割される
    • 必要なデータを取り出すために表を結合しないといけない
    • 処理時間がかかる
  • 処理速度が必要な時や更新時異常の発生が低い場合はあえて正規化しない・正規化を解く
    • たとえば更新が少ない表は正規化しない
  • ここでの「非正規化」:アクセスパターンを考えたうえでどの表を統合するか、どの属性を表間に重複させるか考える
P.304 6.4 関係データベースの演算
P.304 6.4.1 集合演算
  • 関係データベースでの集合演算
    • 同じ型の表間での和、共通部分(積)、差
    • 直積:同じ型の表でなくてもいい
P.304 和、共通(積)、差
  • 図6.4.1の表AとBに対するそれぞれの演算結果を見る
  • 本参照
P.305 直積演算(Cartesian Product:×)
  • 社員表と部門表の直積は社員表の各行に対して部門表の行を1つずつつなぎ合わせた表
  • 直積の結果として得られる新しい表を直積表と呼ぶ
    • 次数(属性の数)は両方の表の次数を足した数
    • 位数(タプルの数)は両方の位数を掛けた数
  • 直積が役に立つイメージがない:実際には結合 (JOIN) を本当によく使う
P.305 6.4.2 関係演算
  • 関係演算:関係データベース特有の演算
    • 射影,選択,結合,商
  • 関係代数:関係演算と集合演算を合わせた代数
    • 導出表:これらの演算によって得られた表
P.306 SQL の例
  • 先に持ってきてみた

SELECT 社員コード, 社員名, 部門表.部門コード, 部門名

FROM 社員表, 部門表

WHERE 社員表.部門コード = 部門表.部門コード

P.305 選択と射影
  • 選択演算:表から指定した行を取り出す関係演算
    • SQL でいう WHERE
  • 射影演算:表から指定した列を取り出す関係演算
    • SQL でいう SELECT column_name
P.306 結合
  • 参考:P.306 の下の表
  • 結合演算:2つの表が共通にもつ項目(結合列)で結合して新しい表をつくり出す関係演算
    • まさに正規化でわけたテーブルを結合させる演算
  • SQL:SELECT文のFROM句で複数の表名をカンマで区切って指定
    • WHERE句で結合条件を指定
  • 結合条件
    • 結合列の値を>,≧,=,≠,≦,<のいずれかの比較演算子で比較して結びつける
  • 等結合:比較演算子が「=(等号)」である結合
    • 2つの表から作成される直積表から結合列の値が等 しいものだけを取り出す
    • 得られた新たな表には結合列が重複して含まれる
    • SELECT句でどちらか一方の結合列を指定して見かけ上の重複を除く
  • 自然結合(natural join):重複する結合列を取り除く(一方のみ残す)ようにした結合
    • 結合列の列名が2つの表で同じ場合に使える
    • 参考
      • (意識的に使ったことがない)
P.307 内結合と外結合
  • 参考:P.307 の図 6.4.8
  • 内結合(INNER JOIN)
    • 結合列の値が等しい行だけを取り出す結合演算
    • 片方の表にしか存在しない行は取り出せない
    • データベース言語仕様(JIS X 3005)
  • 外結合(OUTER JOIN)
    • 片方の表にしか存在しない行も取り出せる結合
    • 結合相手の表に該当するデータが存在しない場合はNULL(空)値で結合
    • 左外結合・右外結合・完全外結合
  • 等結合
    • 結合する表をFROM句で指定、結合条件はWHERE句 で指定
  • 内結合・外結合
    • 結合する表をFROM句の中でJOINを使って指定
    • 結合条件は JOIN に続くON句で指定する
    • 参考:p309のコラム「内結合と外結合のSQL文」
P.307 左外結合(LEFT OUTER JOIN)
  • 参考:P307 図 6.4.9、P309 の SQL 文
  • 結合する左の表(社員表)が基準
  • 右の表(部門表)に存在しない行を空値(NULL)として結合
P.308 右外結合(RIGHT OUTER JOIN)
  • 参考:P.308 図 6.4.10
  • 結合する右の表(部門表)が基準
  • 左の表(社員表)に存在しない行をNULLとして結合
P.308 完全外結合(FULL OUTER JOIN)
  • 参考:P.308 図 6.4.11
  • 片方だけに存在する場合もう片方をNULLとして結合
P.308 商
  • (これ何だろうか?where の in?)
    • 普通に in または =`= でよさそう?
    • select も含んでいる?
  • 参考:P.308 図 6.4.12
  • 関係R(X,Y1,Y2)とS(Y3,Y4)がある
  • S(Y3,Y4)のすべての行がR(Y1,Y2)に含まれる場合に対応するR(X)を求める演算
    • 商(R÷S)は関係Rの中から関係Sのすべての行を含む行を取り出し、そこから関係Sの項目を除く
    • 重複行も除く
  • 参考:P.309、図6.4.13
    • 社員表から東京に住み営業2課(E02)に勤務する社員を探す場合に商演算を使う
P.309 COLUMN 内結合と外結合の SQL
  • 本を読もう
P.310 6.5 SQL
P. 310 6.5.1 データベース言語SQLとは
  • SQL(Structured Query Language)
  • RDB の標準的な操作言語
  • ほとんどの RDBMS が SQL を使っている
    • Relational DataBase Management System
P.310 SQLの分類
  • RDB のデータを検索(参照)、操作
  • データ定義
  • トランザクション制御
  • 参照:表 6.5.1 に SQL 文が書いてある
P.310 表 6.5.1 重要な SQL
  • DDL (Data Definition Language)
    • CREATE, DROP, GRANT, REVOKE
  • DML (Data Manipulate Language)
    • SELECT, INSERT, UPDATE, DELETE, COMMIT, ROLLBACK, DECLARE CURSOR, OPEN, FETCH, CLOSE
  • DECLARE CURSOR以降は親言語方式などで使用されるSQL
  • 親言語方式
    • CやCOBOLなどのプログラム中にSQL文を組み込んでデータベースにアクセスする方式。
    • 埋込みSQL:p328参照
P.311 6.5.2 SELECT文
  • データ操作言語(DML)
    • 問合せ(SELECT)文
    • 挿入(INSERT)文
    • 更新(UPDATE)文
    • 削除(DELETE)文
    • などなど
  • SELECT文以外のDMLは「6.5.3 その他のDML文」(p319)参照
P.311 SELECT文の構文
  • SELECT文の基本構文
    • [ ]内は省略可能

SELECT

[DISTINCT]

列名のリスト

FROM 表名のリスト

[WHERE 選択条件や結合条件]

[GROUP BY 列名のリスト]

[HAVING グループ選択条件]

[ORDER BY 列名のリスト]

  • リスト:列名および表名をカンマ(,)で区切って列挙したもの。
P.311 行、列の取り出し
  • 選択:WHERE句に選択条件を指定すると特定の行を取り出せる
    • in とリストを使うと複数行に対する
    • 具体例を考えないと使い分けや気分はわからなそう
  • 射影:SELECT句に列名を指定すると特定の列を取り出せる
  • SELECT句への *:全部の列を取りだす
  • 選択条件と論理演算子(AND・OR・NOT):複数の条件を組み合わせる
  • 表 6.5.2:選択条件に使う比較演算子の表
  • 参考:列の値が「空値(NULL)であるか」という検索条件
    • WHERE 列 IS NULL
    • WHERE 列 = NULLではない
    • NULL は他にもいろいろ邪悪な面がある
    • 空文字列などとは違う概念でよくはまる
SQL 例
  • P.312、図 6.5.1
  • 社員表から年齢が24以上28以下の社員コード・社員名を表示するサンプル

SELECT 社員コード, 社員名 FROM 社員表 WHERE 年齢 >= 24 AND 年齢 <= 28

P.312 BETWEEN述語
  • 先のSELECT文はBETWEEN述語やIN述語を使って同じ内容を表せる
  • BETWEEN述語は「値1~値2」の範囲(値1,値2を含む)に列の値が含まれるかを選択条件にする

SELECT 社員コード, 社員名 FROM 社員表 WHERE 年齢 BETWEEN 24 AND 28

P.312 IN述語
  • IN述語は列の値が指定された値のいずれかと等しいかを選ぶ条件にする場合に使う
  • INの前にNOTをつけると指定された値のいずれでもないという選択条件になる
  • IN述語の使用例については副問合せ(p317)も参照
P.313 重複行の排除
  • 取り出された行の中から重複するものを除きたい場合
  • SELECT句の列名指定にDISTINCT述語を使う
P.314 出力順の指定
  • ORDER BY 句:特定の列の値で昇順・降順に並べ替えて表示する
    • ORDER BY のあとに続けて並べ替えのキー(列名)を指定
    • 降順の場合はDESC、昇順の場合はASC
    • ふつう ASC がデフォルトで省略できる

SELECT 社員名, 年齢 FROM 社員表 ORDER BY 年齢 DESC

P.314 グループ化
  • GROUP BY 句:取り出した行を指定した列の値でグループ化
    • グループごとの合計や最大値などを求める
  • HAVING 句:条件に合ったグループだけを取り出す

SELECT 所属, COUNT(), AVG(年齢) FROM 社員表 GROUP BY 所属 HAVING COUNT() >= 2

  • SQL の簡単な解説
    • 社員表のデータをGROUP BY句を使って所属でグループ化
    • HAVING 句で「グループに所属する人数が2人以上」のグループだけを取り出す
    • 取り出したグループごとにその所属・人数・平均年齢を求める
P.315 表の結合
  • 2 つの結合
    • SELECT A FROM B WHEREによる等結合
    • FROM 句の中での JOIN ... ON による内結合や外結合
  • どちらであっても結合表には結合条件で指定した結合列が重複して含まれる
    • 列名を指定するときは「表名.列名」という形式で表す
P.316 表に別名をつける
  • FROM句で「表名 AS 別名」あるいは「表名 別名」と指定すると表名に対して別名(相関名)を設定できる
  • 自己結合:表に別名を与えると同じ表どうしを結合できる
  • 自己結合については P.317 の例を参照
    • 上司コードを使ってある社員とその上司の氏名や関連情報を見たい場合に使う
P.317 副問い合わせ
  • サブクエリともいう
  • SELECT文のFROM句やWHERE句・HAVING句などに指定されている入れ子になったSELECT文

SELECT 社員コード, 社員名, 年齢 FROM 社員表 WHERE 年齢 IN (SELECT 指定年齢 FROM 調査対象)

  • サブクエリにはいろいろ面倒な話がある
  • 参考:MySQL のサブクエリって、ほんとに遅いの?
    • これは 2017 年の記事:この辺はお金になるので割と日進月歩で、3 年程度の昔の情報でも既に参考にならないことも多い。
    • 簡単なまとめ
      • 遅いのは2番目、DEPENDENT SUBQUERYである
      • MySQL 5.5 までサブクエリはやっぱり遅い
      • MySQL 5.6 からはそんなに遅くなくなった
      • MySQL とはいってもバージョンによって全然違う:オプティマイザは進化している
    • 現状についてはきちんと最新の話を追う、または自分が必要なケースについて実測する
P.318 EXISTS述語
  • サブクエリはEXISTS述語でも表せる
  • 参照:P.318 の例
    • EXISTS は相関副問合せが何らかの結果を返した場合にTRUE(真),何も返さなかった場合にFALSE(偽)を返す
    • 主問合せの結果1行に対して相関副問合せから何らかの結果が戻されれば、主問合せの選択条件は成り立ち、何も返されなければ選択条件は成り立たない
  • EXISTS 述語でほかの表にも存在するものを調べられる
  • ANY でも同じ操作を表せる
    • 参考:P.318 の例
    • 副問合せの結果のいずれか(ANY)と等しい
  • どれがいいかは最終的にはテーブルの実装や使っている RDBMS とバージョンに依存する
    • 実測してチューニングしよう
P.319 6.5.3 その他の DML 文
P.319 INSERT文
  • 表に行を挿入する:2つ方法がある
    • 参考:本の P.319
    • 挿入する値をVALUES句で指定する
    • 問合せの結果をすべて挿入する
    • (DBMS によるかもしれないが)個別INSERTと一括INSERTもある:パフォーマンスでよく問題になる
  • 一部の列に対して INSERT
    • どの列に対して挿入するのか列名リストで指定
    • 省略された列の値はDEFAULT制約があればその既定値、そうでなければNULL値
    • NULL はなるべく使うのをやめよう
    • DEFAULT は P.322 表 6.6.1
P.319 UPDATE文
  • 表中のデータを変更
    • 列の変更値を直接指定する
    • 変更値をCASE式で決める
    • 副問合せの結果を変更値にする
  • SET句には変更したい列の値を「列名 = 変更値」の形で指定
  • 1 つのUPDATE文で複数の列の値を変えるときはカンマ(,)で区切って指定
  • WHERE句を省略すると表中のすべての行が変わる
    • ふつうはやらない
    • WHERE句を指定すれば条件に合った行だけ変わる
P.320 DELETE文
  • 表中の行を削除する
    • 表中の全行を削除しても表自体は残る
    • 表を削除するのはDROP文
  • WHERE句を省略すると表中のすべての行が削除される
  • WHERE句を指定するとその条件に一致した行だけを削除できる
P.320 参照関係をもつ表の更新
  • 関連する2つの表の間に参照制約が設定できる
    • 被参照表の主キー(候補キー)にない値を参照表の外部キーに追加できない
  • 被参照表の行の削除・変更時に制約が出る:図6.5.10参照
  • 参照動作指定:削除・変更時の制約は明示的に指定できる
    • 次節のCREATE TABLE文を参照
    • REFERENCES句(参照指定)の後に次の構文で指定

参照動作指定 REFERENCES 被参照表(参照する列リスト) ON DELETE 参照動作] [ON UPDATE 参照動作] (*[ ]内は省略可能)

  • 指摘できる参照動作:表 6.5.5 の 5つ
    • デフォルトは NO ACTION
P.320 補足
  • 参照制約
    • 外部キーの値が被参照表の主キーあるいは主キー以外の候補キーに存在することを保証する制約。
    • 関連する2つの表の間に参照制約を設定する目的:データ矛盾を起こすような行の追加や削除・変更を排除するため
  • REFERENCES指定:p322-324を参照
  • データの整合性を保つための制約
    • 一意性制約
    • 参照制約
    • データ項目のデータ型や桁数に関する形式制約
    • データ項目が取り得る値の範囲に関するドメイン制約がある。
P.322 6.6 データ定義言語(DDL)
P.322 6.6.1 実表の定義
P.322 CREATE TABLE文
  • 表の定義はには CREATE TABLE 文
  • 基本構文は P.322 参照
P.322 列制約
  • 表を構成する列に対する制約
  • 参考:表6.6.1
  • 一意性制約:同一表内に同じ値が複数存在しないことを保証する制約
    • 主キーとなる列には一意性制約にとNOT NULL制約を加えたPRIMARY KEY指定
    • 主キー以外の候補キーにも一意性制約がある
    • 一般にNULL(ナル)値は重複値とは扱われない
    • 候補キーにはNULL値を許すUNIQUE指定
  • 参照制約:外部キーの値が被参照表に存在することを保証する制約
  • 外部キー:REFERENCES指定(参照指定)す。
P.323 表制約
  • 一意性制約・参照制約・検査制約は表制約(表定義の要素として定義される制約)にもできる
  • 列制約:1つの列に対する制約
  • 主キーや外部キーが複数列から構成される場合、これを列制約として定義できない
    • このときは表制約を使う
P.323 主なデータ型
  • 一般的な文字型,数値型は覚えておくといい
P.324 実表の定義例
  • P.324 の社員表と部門表を定義を見てみよう
P.325 6.6.2 ビューの定義
P.325 ビューとは
  • 実表:ディスク装置上にあり実際にデータが格納される表
  • ビュー:実表の一部または複数の表から必要な行や属性(列)を取り出してあたかも1つの表 であるかのように見せかけた仮想表
    • 利用者から見れば実表と同じ
    • データを検索するだけなら制約はあっても同じように操作できる
  • ビューのメリット
    • あくまでも仮想の表:対象となった元の表(基底表)の列名と別の名前で定義できる
    • ビューに定義することで情報を公開
    • ビューに定義しないことで情報を非公開にできる
    • 元の表に新たな列が追加されても既存のビューには影響がなく再定義する必要がない
  • ビューは仮想的な表
    • 一般には実体化されずデータ格納領域をとら ない。
    • 実表のように実体化されるビューもある:体現ビュー(materialized view)
P.325 CREATE VIEW文
  • ビューの定義:CREATE VIEW文による:詳細は本の P.325
  • ビュー:対象となる実表(あるいは他のビュー)からSELECT文で必要データを導出する方法で定義される定義するビューの列名に命名規則はない
    • 列数はAS句に続くSELECTで問い合わせた結果の列数と同じでなければならない
    • 列名は省略可能:省略した場合はSELECTで問い合わせた結果の列名がそのまま定義される
  • ビューに対する参照や更新処理
    • ビューの対象となった表(基底表)に対す る参照あるいは更新処理に変換されて実行される
P.326 ビューの定義例
  • 本の P.326 参照
  • 社員表と部門表から社員コードと社員名、その社員が所属する部門名からなる表をビュー「社員表2」
    • JOIN して必要なカラムだけ取り出す
P.326 ビューの更新
  • ビューへの更新処理 ビュー定義を基にビューが参照している表(基底表)への対応する処理に変換されて実行
  • 更新のための条件
    • 更新にかかる実際の表が更新可能
    • 更新される表の列や行が一意に決まる
  • 更新できないビューの例
    • SELECT句で式、集合関数、DISTINCT を使ったSELECT文で定義されている
    • ・GROUP BY句やHAVING句を使ったSELECT文で定義されている
P.327 6.6.3 オブジェクト(表)の処理権限
  • スキーマに定義された実表やビューはそのスキーマ所有者(作成者)にしか処理権限が与えられない
  • 複数の利用者がデータベースを利用できるようにしたければ、スキーマ所有者以外にも処理権限を付与する必要がある
    • データベース管理ユーザーは全権を持っていて危険な処理もできてしまう
    • できることを制限したユーザーで操作したい
  • オブジェクト(表)の処理権限
    • 読取(SELECT)権限
    • 削除(DELETE)権限
    • 挿入(INSERT)権限
    • 更新(UPDATE)権限
  • cf. スキーマ
    • 1つのデータベースの枠組み
    • スキーマ内に複数の表やビューを定義できる
P.327 処理権限の付与
  • 権限の付与:GRANT文による
  • GRANTの基本構文は次の通り
1
GRANT 権限 ON 表名 TO 許可識別子
  • 権限指定
    • 4 つの処理権限(SELECT,INSERT,UPDATE,DELETE)
    • ALL PRIVILEGES(すべて)を指定できる
  • 権限を複数付与する場合はカンマ(,)で区切って指定
P.327 処理権限の取消し(変更)
  • 一度付与された権限を取消し(変更)できる
  • 権限の取消しはREVOKE文
  • REVOKEの基本構文
1
REVOKE 権限 ON 表名 FROM 許可識別子
P.328 6.7 埋込み方式
P.328 6.7.1 埋込みSQLの基本事項
P.328 静的SQLと動的SQL
  • 静的 SQL:あらかじめ決められたSQL文をプログラム中に埋込んで実行する方式
    • 実際のアプリケーションではあまり見かけない
  • 非カーソル処理:データベースの表から1行を取り出すこと
    • 次のような SELECT 文
    • この INTO を見たことがない

SELECT 社員名, 年齢 INTO :name, :age FROM 社員表 WHERE 社員コード = '100';

  • 動的 SQL:実行する SQL 文がプログラム実行中でな ければ決まらない場合に SQL 文を動的に作成し実行する方式
  • 上の社員コードがふつう変わる:それが「動的」。
  • この動的な部分に変なコードを埋め込むとまずいというのがセキュリティ問題で、例えば SQL インジェクションの問題。
P.328 ホスト変数
  • ホスト変数:データベースとプログラムのインタフェースとなる変数
  • 埋め込み SQL では SQL を実行すると取り出されたデータをINTO句で指定したホスト変数に格納する
  • ホスト変数は通常の変数としてもアクセスできる
    • 出力関数で表示
    • 入力関数で値を入力してそれをSELECT文の条件としても使える
P.329 6.7.2 カーソル処理とFETCH
P.329 カーソル処理
  • 「SELECT・・・・INTO・・・」形式では,1行のデータしか取り出せない
    • (見たことがないのでイメージがつかない)
  • 検索結果が複数行の場合は1行ずつ取り出せるカーソル処理を使う
  • カーソル処理は SQL 文で問い合わせた結果をあたかも1つのファイルであるかのようにとらえる
  • FETCH文でそこから1行ずつ取り出す方式
    • 1つのSELECT文に対してカーソルを宣言(定義)
    • カーソルのオープンでSELECT文が実行
    • カーソルで1行ずつ取り出せる
    • FETCH文で繰返し行を取り出して処理
    • 終了したらカーソルを閉じる
P.330 FETCHで取り出した行の更新
  • 参考:図 6.7.2:FETCHで取り出した行の更新処理
  • FETCH文で取り出した行を更新あるいは削除する場合,FETCH文のあとに続くUPDATE文やDELETE文のWHERE句 に「WHERE CURRENT OF カーソル名」と指定する。
  • (FETCH 文を見たことがないのでイメージつかない)
P.330 処理の確定と取消し
  • 一連のデータを更新している途中でエラーが出た場合
  • それまでの更新処理を取り消して元に戻す必要がある
  • 整合性を取らないといけない:いわゆるロールバックが必要
  • トランザクションが正常終了したときは「コミット」する:更新処理の確定
P.331 6.8 データベース管理システム
P.331 6.8.1 トランザクション管理
P.331 トランザクションとは
  • 複数の利用者が同時にデータベースにアクセスしてもデータが矛盾してはいけない
  • この仕組みがトランザクション管理
  • トランザクション:データの整合性を取るための SQL 処理の最小単位
    • 「回復の単位(Unit of Re-covery)」とも呼ぶ
P.331 ACID 特性
  • トランザクション処理は原子性・一貫性・隔離性・耐久性の 4 特性が必要
  • 厳密な一貫性(完全一貫性)が必要
    • トランザクションではそのすべての処理が完了するか(All)、あるいはまったく実行されていない状態か(Nothing)のどちらか一方で終了しなければならない
    • これは,COMMIT(正常終了),、ROLLBACK(異常終了)で実現できる
    • COMMIT(コミット):更新処理を確定し、データベ ースへの反映を保証する
    • ROLLBACK(ロールバック):更新処理をすべて取 消し,トランザクション開始時点の状態へ戻す
  • 参考:結果整合性
    • 完全一貫性に対する概念
    • 分散トランザクションやいわゆる NoSQL で使われる
    • 参考:分散トランザクション
      • トランザクション管理するべきテーブルが複数のデータベースにまたがっているとき
      • すべてのデータベースをロールバックしなければいけない
P.331 表 6.8.1 ACID 特性
  • 原子性(Atomicity)
    • 更新処理トランザクションが正常終了した場合だけデータベースへの反映を保証する
    • 異常終了時は処理が何もなかった状態に戻す
  • 一貫性(Consistency)
    • トランザクションの処理によってデータベース内のデ ータに矛盾が生じないこと
    • 常に整合性のある状態が保たれていること
  • 隔離性(Isolation)
    • 複数のトランザクションを同時(並行)に実行した場合 と,順(直列)に実行した場合の処理結果が一致するこ と
    • 独立性ともいう
    • トランザクションのスケーリング:複数のトランザクションを同時実行してもそれが正しい順で実行されるように順序づけること
      • 基本は並行実行の結果と直列実行の結果が等しくなるように調整する
    • ロック:直列可能性を保証する方法
  • 耐久性(Durability)
    • いったん正常終了したトランザクションの結果はそ の後に障害が発生してもデータベースから消失しないこと
    • トランザクションの再実行を必要としないこと
P.332 6.8.2 同時実行制御
  • 同時実行制御(並行性制御):複数のトランザクションを同時に実行しても矛盾を起こすことなく処理を実行するメカニズム
  • 実現する方法:ロック・多版同時実行制御・時刻印アルゴリズム
    • 多版同時実行制御に対してロックによる通常の同時実行制御を単版同時実行制御という
P.331 ロック
  • 複数のトランザクションを同時実行してもその結果はトランザクションを直列実行した結果と同じでなければならない(ACID 特性の隔離性)
  • 同時実行制御が行われない環境では結果が変わる場合もある
  • 例:図 6.8.1 を見ること
    • トランザクションTR1とトランザクションTR2が同じデータaを①→②の順に読み込む
    • それぞれのトランザクションでデータaを③→④の順に更
    • COMMITした場合トランザクションTR1がデータaを「a+5→10」に更新してもトランザクションTR2が aの値を「a+10→15」に更新してしまう
    • トランザクションTR1における更新内容が失われる
    • これを変更消失(ロストアップデート)という
  • こうした問題を防ぐための対処法
    • データベース管理システムではデータaにロック(鍵)をかける
    • 咲にデータaをアクセスしたトランザクションの処理が終了するか、あるいはロックが解除されるまでほかのトランザクションを待たせる制御をする
  • 参考 ダーティリード:他のトランザクションが更新中のコミットされていないデータを読み込むこと
P.333 デッドロック
  • P.250 5.2.5 も参考にすること
  • デッドロック:複数のデータに対してロックしようとして互いにロックの解除を待ち続けてしまう
  • 例:図 6.8.2
    • データA、B、Cを専有して処理するトランザクションTR1,TR2,TR3がある
    • 各トランザクションは処理の進行に合わせて表に示される順(①→②→③)にデータを専有
    • トランザクション終了時に3つの資源を一括して解放
    • トランザクションTR1とトランザクションTR2はデッドロックを起こす可能性がある
  • 再び図 6.8.2 を見る
    • データを専有する順序が等しいトランザションTR1とTR3の間ではデッドロックは起こらない
    • 異なる順や逆順でデータを専有するトランザクション間ではデッドロックが起きうる
  • デッドロックが起きたときロールバックなどで 1 つのトランザクションを強制的に終了させてデッドロックを解除する
P.334 ロック方式
  • 2相ロック方式・木規約
  • ロック方式
    • 第1相:使用するデータすべてにロックをかける
    • 第2相:処理後にロックを解除する
    • トランザクション内でのロック・解除はそれぞれ1回だけ
    • 直列可能性は保証されるがデッドロック発生の可能性は 残る
  • 木規約
    • データに順番をつけてその順番どおりにロックをかける
    • デッドロックが起きず、直列可能性を保証する
    • データへの順番づけには木(有向木)を使う
    • トランザクションの同時実行性が低くなるため特殊な用途で使う(どんなところで使うのだろう?)
  • 参考:有向木
    • 方向をもった有向グラフ(の 1 つ)
    • データ構造とアルゴリズムを勉強しよう
    • データベースは検索の便宜もあってデータ構造とアルゴリズムが大事
P.334 ロックの種類
  • 占有ロック・共有ロックの 2 モード
    • DBMS でトランザクションの同時実行性を高めるため
  • 専有ロック
    • データ更新するときに使うロック
    • データに対するほかのトランザクションからのアクセスは一切禁止
  • 共有ロックは
    • ふつうデータの読取りの際に使用されるロックで
    • 参照だけを許可
  • 表 6.8.2 参照:2 つのロックモードの組み合わせによる同時実行の可否
  • 専有:占有または排他ともいう
  • 共有:共用ともいう
  • 共有ロックで同時実行性を高める
    • 先行トランザクションがロックしたデータを後続トランザクションが参照できる
    • 待ちがなくなり同時実行性が高まる
    • たいていのシステムでは書き込みよりも読み込みの方が多い

2021-01-17 課題

  • 先に進む前に録画してあるか確認しよう

進捗

  • 前回の進捗
    • 基礎知識編:P.319 6.5.3 その他の DML 文
    • 本編:04-01「期待値をコードで表す」まで
  • 今回の進捗
    • 基礎知識編:P.326 ビューの更新
    • 本編:04-02「よくある条件付き確率密度関数(確率分布)」まで

課題

TODO

自分用メモ

Matplotlib

  • 本当に簡単な図を描く
  • これを参考に scipy お絵描き
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import sph_harm

m,l = 2,5
theta = np.linspace(0, np.pi, 1001)
phi = np.linspace(0, 2 * np.pi, 1501)
theta, phi = np.meshgrid(theta, phi)

r = sph_harm(m, l, phi, theta).real
x = np.abs(r) * np.sin(theta) * np.cos(phi)
y = np.abs(r) * np.sin(theta) * np.sin(phi)
z = np.abs(r) * np.cos(theta)

fig = plt.figure(figsize=(8, 8))
ax = fig.gca(projection="3d")
ax.plot_surface(x, y, z, color="aqua", edgecolor="k")
plt.axis("off")
plt.show()

日々の勉強

Julia

IT 基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。
  • ネットワークの話もいい加減飽きたので、しばらく DB の話

復習

  • 3 つのスキーマ
    • ユーザーが見るレベル
    • 正規化などをかけておいたデータベースにもっていけるレベル
    • 個々のデータベースに合わせた具体的なレベル
  • インメモリの DB:コンピューターの基本的なハードウェア構成と意味を復習しよう

本の記述を追いかける

P.408 7.8 交換方式
P.408 パケット交換方式
  • 回線交換方式と対になる概念
    • 回線交換方式:通信を行うノード間で物理的な通信路を確保してから通信する
    • 例:電話
  • パケット交換方式について
    • データ送信するノードはデータをパケットに区切る。
    • ひとつひとつのパケットにヘッダを付けて送信。
    • ネットワーク内ではパケット交換機にパケットがたまる
    • ネットワークの状況に応じて順次送られる
パケット通信のメリット・デメリット
メリット

耐障害性 - 通信路を固定しないため,迂回経路が取れる。 - パケット交換機にデータが蓄積されているため,復旧まで待てる。 - パケット多重 - 1 対 1 の通信で回線を占有する必要がないため,1つの回線を多くのノードで共有でき,回線を効率的につかえる - 異機種間接続性 - パケット交換機で中継するときにプロトコル変換・速度変換でエンドノードどうしが同じプロトコルをサポートしていなくても通信できる

デメリット
  • ネットワーク内の蓄積交換処理による遅延
    • 蓄積交換処理による遅延解消のために主に回線の帯域を広げることで対応してきた
    • 構造上,完全には遅延をなくせない
  • パケット到着順序の不整合
P.408 ATM 交換方式
  • ATM(Asynchronous Transfer Mode:非同期転送モード)
  • 遅延のない回線交換方式とパケット交換方式の利点を得たい
  • パケット交換方式の発展
  • 遅延の原因をつぶす:特にパケットの多様性
    • 多種多様なパケットに対応するために,パケット交換機はソフトウェア処理が必要 ^ ATM での工夫の一例:最も特徴的なのは,パケット(ATMではセルという)の長さをヘッダ部 5 バイト,ペイロード 48 バイトの53バイトに統一
    • パケット解析がハードウェアだけでできる。
    • ソフトウェアは不要になった。
  • Wikipedia から
    • 当初の意図に反して非常に複雑な技術になってしまった
    • ATM は次世代の主流にならず限定的な使用にとどまった
    • ATM の設計思想は MPLS へと引き継がれた
    • 汎用のレイヤ 2 のパケットスイッチングのプロトコルとして、ルーターを介したIPの通信網で利用されている。
P.408 ペイロード(payload)
  • データ通信で本来転送したいデータ本体の部分、ボディを指す。
  • ATM ではペイロードのサイズを固定して処理を簡素化
  • 難点:パケット全体に占めるペイロードのサイズが相対的に小さくオーバヘッドが大きい
P.410 輻輳
  • フレームリレー:パケット交換方式の一種
    • 1 つの回線を多数のユーザで共有。
    • 回線がもつ潜在的な伝送能力(ワイヤスピード)を十分に引き出すうえで効果がある
  • 輻輳:ユーザの利用が一時期に集中すると,ワイヤスピードを超えるパケットがネットワーク上に流れる
    • ネットワークが輻輳状態になるとスループットが落ちる
  • フレームリレーサービスを提供する事業者は,ネットワークが輻輳状態に陥ってスループットが低下しても最低限保証する通信速度を決めている
    • CIR(Committed Information Rate:認定情 報速度)
P.370 7 ネットワーク
  • 確か 7.4 から始めた気がするので 7 章はじめから
P.370 7.1.1 OSI基本参照モデル
  • 改めて復習
  • OSI(Open System Interconnection)基本参照モデル- 異なる設計思想・世代のシステムと円滑に通信するのが目的に標準化
  • プロトコルの単機能化,交換の容易さが目的
    • 階層化のおかげで一部の階層の技術体系が変わっても、その階層だけ取り替えればいい
    • コスト・リスクを小さくする
P.370 プロトコルとサービス
  • N 層:それぞれの階層のこと
  • エンティティ:N 層に存在する通信機器などの実体
    • この言葉はいろいろなところで出てきていろいろな意味で使われる
    • もちろん気分的には適当な実体を指すことが多い
  • プロトコル:N 層に属するエンティティが通信するための取り決め
  • 上位の層が下位の層を利用しながら通信する
    • 別の階層間のエンティティどうしが通信する窓口が必要
    • これを提供するのが下位層:この機能をサービスと呼ぶ
  • プロトコルに沿った仕様で製品を開発すれば別のベンダの機器でも通信できる
  • 参考:ベンダーロックイン

特定ベンダー(メーカー)の独自技術に大きく依存した製品、サービス、システム等を採用した際に、他ベンダーの提供する同種の製品、サービス、システム等への乗り換えが困難になる現象のこと。

出来上がった情報システムの正確な仕様が、システムを開発・構築したベンダーにしか解らなくなる場合がある。結果、システムの保守・拡張・改修等の際、現存システムを開発・構築したベンダーに引き続き発注せざるを得なくなる。

  • 「Excel で行政に提出する書類を作れ」事案もそれ。
  • Apple 製品で身の回りを固めるのも同じ。
  • 「多様性が大事」事案でもある。
7.1.2 TCP/IPプロトコルスイート
  • プロトコル同士には相性がある
    • 「ネットワーク層がこのプロトコルならトランスポート層はこのプロトコルにしておくとトラブルが少ない」
  • 一般に同じ団体が作ったプロトコルはセットで使われることが多い
    • このセットがプロトコルスイート ^ 最も代表的なのは IP を中心に組まれた TCP/IP プロトコルスイート
    • 独自の階層モデルをもつ
P.372 TCP/IPの通信
  • データをパケットに区切る
    • 各パケットにヘッダを付けて送信
    • ヘッダは各階層ごとに付加されて次の階層へと渡される
    • 各ヘッダにはその階層で必要となる送信元や送信先,大きさ,順番などパケット自体に関する情報を含む
    • TCPヘッダを付加したパケット:TCP セグメント
    • IP ヘッダを付加したパケット:IP パケット
    • MACヘッダを付加したパケット:MAC フレームあるいはイーサネットフレーム
P.372 MAC(Media Access Control)アドレス
  • イーサネットや FDDI で使用される物理アドレス
    • イーサネット (Ethernet):コンピューターネットワークの規格の1つ。オフィスや家庭で一般的に使用されている有線LAN (Local Area Network) の技術規格
    • FDDI:LAN でデータ転送を行うための標準の一つ
      • Fiber distributed data interface
  • データリンク層
  • 同じネットワークに接続された隣接ノード間の通信で相手を識別するために使う
  • MACアドレスの長さ:6バイト
    • 先頭24ビットの OUI(ベンダID)
    • 後続24ビットの固有製造番号(製品に割り当てた番号)
  • MAC アドレスは機器が固有にもつ番号
    • 必ず一意に定まるように IEEE が管理
P372 ポート番号
  • トランスポート層にでノード内のアプリケーションの識別に使う識別子番号
    • 0-65535の範囲
  • TCP/IPではパケット交換方式でデータをやり取りする
  • よく使われるアプリケーションについてのポート番号は Well-Known ポートとして標準化
    • TCP・UDPそれぞれで 0-1023 番までの番号を割り当てている
    • SSH:TCP22番
    • Telnet:TCP23番
    • SMTP:TCP25番
    • HTTP:TCP80番
    • POP3:TCP110番
    • IMAP4:TCP143番
    • HTTPS :TCP443番
    • NTP:UDP123番
    • SNMP:UDP161番
    • SNMP Trap :UDP162番
  • セキュリティ対策のために標準とはポート番号を変えることもある
  • Web 開発の本を読んでいると、いろいろな都合から http のポートを 80 以外にしていることもよくある。
    • 80 の場合はポートを指定しなくてもいい
      • 例:http://localhost/hoge/fuga
      • 例:http://localhost:5000/hoge/fuga
P.373 ネットワーク間の通信
  • 同じネットワークに接続されたノード間はデータリンク層(第 2 層)の通信
  • ネットワークを超えたノード間はネットワーク層(第 3 層)の通信 -実際に図 7.1.4 を見よう
    • どこが IP アドレスでのやりとりか?
    • どこが MAC アドレスでのやり取りか?
P.374 7.2 ネットワーク接続装置と関連技術
P.374 7.2.1 物理層の接続
P.374 リピータ
  • ネットワーク上を流れる電流の増幅装置・整流装置
  • 物理層:第 1 層
  • データ通信はネットワーク上を流れる電流
    • ケーブルが長いと電流が減衰・波形が乱れが起きる
    • データが読み取れなくなる
    • これを増幅するのがリピータ
  • 大昔の電話は距離が遠いと音が小さく聞こえにくかった
    • まさにこの減衰が問題
  • リピータは 1:1 で繋ぐ
    • 現在では複数のノードを接続できるマルチポートリピータ(ハブ)が使われるのが一般的
P.374 7.2.2 データリンク層の接続
  • 第2層
P374 ブリッジ
  • データリンク層に位置
  • ネットワーク上を流れているフレーム(情報の単位)の MAC アドレスを認識して通信を中継する
    • 接続されているノードをコリジョンドメイン(セグメント)という単位に分割
    • MAC アドレスで判定したフレームのあて先のあるセグメントだけにフレームを送信
    • 無駄なトラフィックの回避
  • ポートの記憶
    • 通信のたびにある MAC アドレスをもつノードがどのポート に接続されているか学習
    • 次回の通信時には余分なポートには通信を中継しない。
  • ブリッジの動作
    • あて先MACアドレスをもとにMACアドレステーブルを参照する
    • あて先MACアドレスの接続ポートがフレームを受信したポー トと別ポートであれば,そのポートにフレームを送信し
      • 同一ポートであればフレームを破棄する
    • あて先MACアドレスが記憶されていない場合やブロードキャス トアドレス(FF-FF-FF-FF-FF-FF)の場合は,受信ポート以外のすべてのポートにフレームを送信する
P.375 スイッチングハブ
  • レイヤ2スイッチ(L2スイッチ)とも呼ばれる
  • データリンク層に位置
  • ブリッジと同じ働きをする
    • MAC アドレスを認識してフレームのあて先を決めて通信を行います。
  • 試験での問われ方
    • スイッチングハブはフレームの蓄積機能、速度変換機能や交換機 能をもっている。
    • このようなスイッチングハブと同等の機能をもち,同じプロトコル階層で動作する装置はどれか
    • 答えは「ブリッジ」
P.375 ブロードキャストストリーム
  • データリンク層で動作するブリッジやスイッチングハブなどの LANスイッチはブロードキャストフレームを受信ポート以外 のすべてのポートに転送
  • これらの機器をループ状に接続し冗長化させると信頼性はあがる
    • ブロードキャストフレームは永遠に回り続けながら増える
    • 最終的にはネットワークダウンを招く
    • この現象をブロードキャストストームという
  • ブロードキャストストームを防ぐプロトコル:スパニングツリープロトコル(Spanning Tree Protocol:STP)
    • ループを構成している一部のポートを通常運用時にはブロック(論理的に切断)する
    • ネットワーク全体をループをもたない論理的なツリー構造にする
P.376 ネットワーク層の接続
  • 第 3 層(レイヤ 3)
P.376 ルータ
  • ルータはネットワーク層(第 3 層)に位置する
    • あて先IPアドレスを見てパケットの送り先を決め通信を制御する
  • IP のローカルネットワークの境界線に設置して利用され,ネットワークの基本単位として機能
  • 世界中に散在しているローカルネットワークどうしをルータが結ぶ
    • 全体としてインターネットというインフラが機能
  • ルータで分けられたネットワークの単位をブロードキャストドメインという
  • ルータがパケットを受け取ったあと
    • あて先IPアドレスを見る
    • 自分のネットワークあてであれば,破棄
    • 他のネットワークあてであれば転送
      • どのルータへ送ればあて先のネットワークへの通信が速く行えるかを判断することを経路制御(ルーティング)
      • ルータはそのための経路表(ルーティングテーブル)を備えている
P.376 デフォルトゲートウェイ
  • 会社Aのネットワークに属するPCは会社BのPCと直接通信できない
  • 会社AのPCは他ネットワークへの接点であるルータAに転送を依頼
  • デフォルトゲートウェイ:会社AのPCから見て直近のルータA
  • 自分と直接接続していない相手と通信するときはすべてデフォルト ゲートウェイを中継する
P.376 ルーティング
  • 経路表(ルーティングテーブル)の作成方法
    • 手作業で作る:スタティックルーティング
    • ルーティングプロトコル利用:ルータ同士が経路情報を交換し、自立的に経路表を作るダイナミックルーティング
  • ダイナミックルーティングのための代表的なルーティングプロトコル:RIP、OSPF
  • RIP:ディスタンスベクタ型(距離ベクトル型)
    • ルーティングテーブルの情報(経路情報)を一定時間間隔で交換しあう
    • あて先ネットワークにいたるまでに経由するルータの数(ホップ数)最小経路を選ぶ
    • あて先に到達可能な最大ホップ数は 15
      • これを超えた経路は採用されない
  • OSPF:リンクステート型
    • コストを経路選択の要素に取り入れ、コスト最小経路を選ぶ
    • コスト値は,回線速度を基に自動的に算出されるが手動設定もできる
    • コスト算出式「コスト=100Mbps/経路の通信帯域(bps)」
  • コスト計算例は P.377 の図を見ること
P.377 ルータの冗長構成
  • ルータを冗長構成のために使うプロトコル:VRRP(Virtual Router Redundancy Protocol )
  • 同じ LAN に接続された複数のルータを仮想的に 1 台のルータ として見えるようにして冗長構成を実現する
  • 複数のルータでグループ(VRRP グループ)を作る
  • VRRP グループごとに仮想 IP アドレスと仮想 MAC アドレスを割り当て
  • PC などのノードは仮想ルータの IP アドレスに対して通信
  • 通常時はグループのマスタルータが仮想ルータの IP アドレス(仮想 IP アドレス)を保持
  • マスタルータに障害が発生すると他のバックアップルータがこれを継承
P.377 レイヤ3スイッチ(L3スイッチ)
  • ルータと同じネットワーク層(第 3 層)の通信機器
  • 特徴
    • ルータ:ソフトウェアで転送処理
    • レイヤ 3 スイッチ:専用ハードウェアで転送処理
  • 高速処理できる:大容量のファイルを扱うファイルサーバへのアクセスなど
P.378 トランスポート層以上の層の接続
P.378 ゲートウェイ
  • トランスポート層(第 4 層)-アプリケーション層(第7層)でネットワーク接続するための装置
  • 第 3 層のネットワーク層まででエンドツーエンド(E2E)の通信は完成する
    • E2E = 通信を行う二者、あるいは、二者間を結ぶ経路全体
    • エンドツーエンド原理:高度な通信制御や複雑な機能は末端のシステムが担い、経路上のシステムは単純に信号やデータの中継・転送だけすべし
    • TCP/IP ネットワークの原理
    • 誤り訂正・フロー制御・再送:TCP 層(第4層、トランスポート層)など上位側の機器やソフトウェア・プロトコル
    • 単純な送受信・転送処理:IP 層(第3層、ネットワーク層)
  • ゲートウェイ:第 4 層のトランスポート層以上が違う LAN システム相互間のプロトコル・データ形式の変換を担う
  • ゲートウェイはアプリケーションプロトコルの内容を 解釈できる
    • アプリケーションヘッダの不正な情報混入を検出可能
    • ファイアウォール・プロキシサーバもゲートウェイの一種
P.378 L4スイッチ・L7スイッチ
  • L4スイッチ(レイヤ4スイッチ)はトランスポート層(第4層)の装置
    • 定義としてはゲートウェイ
    • 機能的にはレイヤ2スイッチ・レイヤ3スイッチの延長上
    • ルータやレイヤ3スイッチはIPアドレスを参照して経路制御する
    • L4スイッチではTCPポート番号やUDPポート番号も経路制御判断に使える:第4層の機器だから
  • L7スイッチ:アプリケーション層(第7層)までの情報を使って通信制御する
P.379 7.2.5 VLAN
  • VLAN(Virtual LAN:仮想LAN)
  • スイッチ(レイヤ2スイッチ,レイヤ3スイッチ)で物理的な接続形態とは独立に仮想的なLANグループを構成する仕組み,あるいはそう構成されたLAN
  • 複雑な形態のネットワークを楽に構築できる
  • サブネット構成も柔軟に変えられる
P.380 データリンク層の制御とプロトコル
  • データリンク層:第2層
P.380 7.3.1 メディアアクセス制御
  • 複数のデータを1つのケーブルを通して送受する場合,データの衝突(コリジョン)を回避するための制御が必要
    • これがメディアアクセス制御(Media Access Control:MAC)
コリジョン(衝突)

イーサネットや無線LANで複数の端末が送信し、データが衝突する現象を指す。旧式のイーサネット規格では、端末同士を接続するときに1組の通信路で双方向の通信を行う半二重通信のため、送信と受信を同時に行うことができない。送信と受信をその都度切り替えて行うので、端末がお互いデータを送信してしまうと衝突する可能性が高くなる。

P.380 CSMA/CD
  • CSMA/CD:Carrier Sense Multiple Access with Collision Detection:搬送波感知多重アクセ ス/衝突検出)の略。
  • イーサネットで採用されている方式
    • 衝突検知方式を採用
    • イーサネット:IEEE 802.3として標準化されている LAN規格
  • CSMA/CD
    • 各ノードは伝送媒体が使用中かどうかを調べて,使用中でなければデータを送りはじめる
    • 複数のノードが同時に通信しはじめるとデータの衝突が起こる
    • 衝突を検知し,一定時間(ランダム)待った後で,再送
    • 一定の距離以上のケーブルでは衝突が検知できない
  • CSMA/CD方式の限界
    • トラフィックが増加するにつれて衝突が多くなる
    • 再送が増え,さらにトラフィックが増加する悪循環に陥る可能性がある
    • 特に伝送路の使用率が30%を超えると実用的でなくなる
P.381トークンパッシング方式
  • トークンによる送信制御を行う方式で
    • トークンバス方式
    • トークンリング方式
P.381 トークンパッシング方式
  • ネットワーク上をフリートークンと呼ばれる送信権のためのパケットが巡回する
    • フリートークンを獲得したノードだけが送信できるので衝突を避けられる
    • ふつうはコンセントレータ(集線器)でネットワ ークとノードを結ぶ
  • トークンパッシング方式を採用したLAN規格
    • 例:FDDI:Fiber Distributed Data Interface
    • FDDIは物理媒体に光ファイバを利用し,最大100Mビ ッ ト/秒の通信
  • 特徴
    • 伝送媒体上では衝突しない
    • トラフィックが増えるにつれてトークンを獲得しにくくなり,少しずつ遅延時間が増える
    • 衝突による再送制御の必要がないため伝送路の使用率に対する遅延時間の増加率はCSMA/CD方式より緩やか
P.382 TDMA 方式
  • TDM(時分割多重)
    • ネットワーク上にデータを送信する時間を割 り当てる(タイムスロット)
    • タイムスロットごとに別のデータを送って多重化する
    • TDM によるアクセス制御が TDMA
  • TDMA(Time Division Multiple Access:時分割多重アクセス)
    • CSMA/CD・トークンパッシング方式と並ぶ主要なデー タリンク技術
    • TDMA ではネットワーク(伝送路)を使える時間を細かく区切る
    • 割り当てられた時間は各ノードが独占する方式
    • TDMAはコネクション型の通信
P.382 7.3.2 無線LANのアクセス制御方式
P.382 CSMA/CA方式
  • CSMA/CA:Carrier Sense Multiple Access with Collision Avoidance、搬送波感知多重アクセス/衝突回避
  • 無線 LAN の制御方式
  • CSMA/CD との違い:「衝突検出」が「衝突回避」になった
  • 無線 LAN:物理層媒体は電波で衝突の検出は不可能だから回避する
  • 特徴
    • 送信ノードは使いたい周波数帯の使えるか確認後、必ずランダムな時間だけ待ってから送信をはじめる
      • 待ち時間をバックオフ制御時間とよぶ
    • 衝突してフレームが壊れても検出できない
      • データを受け取ったノードは ACK を返す
P.328 RTS/CTS
  • 無線 LAN の話
  • 隠れ端末問題
    • 他のノードのデータ送信を感知できないことがある
    • 通信ノード間の距離が遠い
    • ノード間に障害物がある
  • 回避のための RTS/CTS 方式
  • 無線 LAN ノード
    • データ送信前にRTS(Request ToSend:送信リクエスト)をアクセスポイントに送信
    • これを受理したアクセスポイントがCTS(Clear to Send:送信OK)を返信
      • 他のノードは CTS を傍受して自分以外の別のノードに送信権があると解釈
      • データ送信を延期
    • 無線LANノードはアクセスポイントからCTSを受信したらデータ送信開始します
    • 衝突抑制:CTSに書かれた他のノードに対する送信抑制時間を使う
  • データ送信開始前にデータ送信のネゴシエーシ ョンとして RTS/CTS 方式を使った CSMA/CA を CSMA/CA with RTS/CTS とよぶ
P.383 無線LANの動作モード
  • 無線 LAN の動作モード:図7.3.4参照
  • 2 つのモードがある
  • インフラストラクチャモード:無線LANノードがアク セスポイントを通じて相互に通信
  • アドホックモード:アクセスポイントなしに無線LANノードどうしが直接通信
P.383 COLUMN FDMA,CDMA
  • 表7.3.1:多元接続する技術グループ
    • TDMA とセット
  • FDMA
    • ある周波数帯をさらに細かい周波数帯に分割
    • 接続できる端末数を増やす技術
  • CDMA
    • 周波数も時間も分割しない
    • 符号で各端末の通信を識別・分離
    • 接続できる端末数を増やす
P.383 7.3.3 データリンク層の主なプロトコル
  • 第 2 層
P.384 ARP
  • ARP(Address Resolution Protocol):通信相手のIPアドレスからMACアドレスを取るためのプロトコル
  • ARPの動作
    • ブロードキャストで目的IPアドレスを指定したARP要求パケットをLAN全体に流す
      • ブロードキャスト:ネットワークに参加するすべての機器に同時に信号やデータを送ること
    • 各ノードは自分のIPアドレスと比較
    • 一致したノードだけARP応答パケットに自分のMACアドレスを入れて返す(ユニキャスト)
  • 参考:GARP(Gratuitous ARP)
    • 主な目的:自身に設定するIPアドレスの重複確認・ARPテ ーブルの更新
    • 目的IPアドレスに自身が使うIPアドレスを指定し,MACアドレスを問い合わせる
P.384 RARP
  • Reverse-ARP:逆アドレス解決プロトコル
    • MACアドレスからIPアドレスを取る
  • 電源オフ時にIPアドレスを保持できない(IPアドレスを保持するハードディスクをもたない)機器が電源オン時に自分のMACアドレスから自身に割り当てられているIPアドレスを知るために使う
  • RARP サーバー
    • MACアドレスとIPアドレスの対応表を持ったサーバー(RARPサーバー)が必要
P.384 PPP
  • PPP:Point to Point Protocol
    • 2 点間をポイントツーポイントでつなぐためのデータリンクプロトコル
    • WANを介して2つのノードをダイヤルアップ接続するときに使う
  • ネットワーク層(第3層)とネゴシエーションする NCP(ネットワーク制御プロトコル)とリンクネゴシエーションするLCP(リンク制御プロトコル)からなる
    • NCP:Network Control Protocol
    • LCP:Link Control Protocol
  • リンク制御やエラー処理機能を持つ
P.384 PPPoE
  • PPPoE:PPP over Ethernet
  • PPPと同等な機能をイーサネット(LAN)上で実現するプロトコル
  • PPPフレームをイーサネットフレームでカプセル化して実現
P.384 7.3.4 IEEE 802.3規格
  • メディアアクセス制御に CSMA/CD 方式を使う LAN についての標準
  • OSI基本参照モデルにおけるデータリンク層(第 2 層)と物理層(第 1 層)のプロトコルおよびサービスを規定
    • OSI 基本参照モデルでのデータリンク層を LLC 副層と MAC 副層の2つに分割
    • 物理層での LAN で使う伝送媒体や MAC 副層でのフレーム構成や衝突検出の仕組みを規定
  • ツイストケーブルの企画が表 7.3.2 にまとまっている
P.386 7.4 ネットワーク層のプロトコルと技術
  • もうやった
P.319 6.5.3 その他の DML 文
P.319 INSERT文
  • 表に行を挿入する:2つ方法がある
    • 参考:本の P.319
    • 挿入する値をVALUES句で指定する
    • 問合せの結果をすべて挿入する
    • (DBMS によるかもしれないが)個別INSERTと一括INSERTもある:パフォーマンスでよく問題になる
  • 一部の列に対して INSERT
    • どの列に対して挿入するのか列名リストで指定
    • 省略された列の値はDEFAULT制約があればその既定値、そうでなければNULL値
    • NULL はなるべく使うのをやめよう
    • DEFAULT は P.322 表 6.6.1
1
2
INSERT INTO table1 (hoge) VALUES ("a");
INSERT INTO table1 (hoge) VALUES ("b");
1
INSERT INTO table1 (hoge) VALUES ("a"), ("b"), ("c");
P.319 UPDATE文
  • 表中のデータを変更
    • 列の変更値を直接指定する
    • 変更値をCASE式で決める
    • 副問合せの結果を変更値にする
  • SET句には変更したい列の値を「列名 = 変更値」の形で指定
  • 1 つのUPDATE文で複数の列の値を変えるときはカンマ(,)で区切って指定
  • WHERE句を省略すると表中のすべての行が変わる
    • ふつうはやらない
    • WHERE句を指定すれば条件に合った行だけ変わる
1
2
3
4
UPDATE dept
SET    dname = '技術部',
       loc   = '福岡'
WHERE  deptno = 80;
P.320 DELETE文
  • 表中の行を削除する
    • 表中の全行を削除しても表自体は残る
    • 表を削除するのはDROP文
  • WHERE句を省略すると表中のすべての行が削除される
  • WHERE句を指定するとその条件に一致した行だけを削除できる
P.320 参照関係をもつ表の更新
  • 関連する2つの表の間に参照制約が設定できる
    • 被参照表の主キー(候補キー)にない値を参照表の外部キーに追加できない
  • 被参照表の行の削除・変更時に制約が出る:図6.5.10参照
  • 参照動作指定:削除・変更時の制約は明示的に指定できる
    • 次節のCREATE TABLE文を参照
    • REFERENCES句(参照指定)の後に次の構文で指定

参照動作指定 REFERENCES 被参照表(参照する列リスト) ON DELETE 参照動作] [ON UPDATE 参照動作] (*[ ]内は省略可能)

  • 指摘できる参照動作:表 6.5.5 の 5つ
    • デフォルトは NO ACTION
P.320 補足
  • 参照制約
    • 外部キーの値が被参照表の主キーあるいは主キー以外の候補キーに存在することを保証する制約。
    • 関連する2つの表の間に参照制約を設定する目的:データ矛盾を起こすような行の追加や削除・変更を排除するため
  • REFERENCES指定:p322-324を参照
  • データの整合性を保つための制約
    • 一意性制約
    • 参照制約
    • データ項目のデータ型や桁数に関する形式制約
    • データ項目が取り得る値の範囲に関するドメイン制約がある。
P.322 6.6 データ定義言語(DDL)
P.322 6.6.1 実表の定義
P.322 CREATE TABLE文
  • 表の定義は CREATE TABLE 文
  • 基本構文は P.322 参照
P.322 列制約
  • 表を構成する列に対する制約
  • 参考:表6.6.1
  • 一意性制約:同一表内に同じ値が複数存在しないことを保証する制約
    • 主キーとなる列には一意性制約とNOT NULL制約を加えたPRIMARY KEY指定
    • 主キー以外の候補キーにも一意性制約がある
    • 一般にNULL(ナル)値は重複値とは扱われない
    • 候補キーにはNULL値を許すUNIQUE指定
  • 参照制約:外部キーの値が被参照表に存在することを保証する制約
  • 外部キー:REFERENCES指定(参照指定)す。
P.323 表制約
  • 一意性制約・参照制約・検査制約は表制約(表定義の要素として定義される制約)にもできる
  • 列制約:1つの列に対する制約
  • 主キーや外部キーが複数列から構成される場合、これを列制約として定義できない
    • このときは表制約を使う
P.323 主なデータ型
  • 一般的な文字型,数値型は覚えておくといい
P.324 実表の定義例
  • P.324 の社員表と部門表を定義を見てみよう
P.325 6.6.2 ビューの定義
P.325 ビューとは
  • 実表:ディスク装置上にあり実際にデータが格納される表
  • ビュー:実表の一部または複数の表から必要な行や属性(列)を取り出してあたかも1つの表 であるかのように見せかけた仮想表
    • 利用者から見れば実表と同じ
    • データを検索するだけなら制約はあっても同じように操作できる
  • ビューのメリット
    • あくまでも仮想の表:対象となった元の表(基底表)の列名と別の名前で定義できる
    • ビューに定義することで情報を公開
    • ビューに定義しないことで情報を非公開にできる
    • 元の表に新たな列が追加されても既存のビューには影響がなく再定義する必要がない
  • ビューは仮想的な表
    • 一般には実体化されずデータ格納領域をとら ない。
    • 実表のように実体化されるビューもある:体現ビュー(materialized view)
    • 参考
P.325 CREATE VIEW文
  • ビューの定義:CREATE VIEW文による:詳細は本の P.325
  • ビュー:対象となる実表(あるいは他のビュー)からSELECT文で必要データを導出する方法で定義される定義するビューの列名に命名規則はない
    • 列数はAS句に続くSELECTで問い合わせた結果の列数と同じでなければならない
    • 列名は省略可能:省略した場合はSELECTで問い合わせた結果の列名がそのまま定義される
  • ビューに対する参照や更新処理
    • ビューの対象となった表(基底表)に対す る参照あるいは更新処理に変換されて実行される
P.326 ビューの定義例
  • 本の P.326 参照
  • 社員表と部門表から社員コードと社員名、その社員が所属する部門名からなる表をビュー「社員表2」
    • JOIN して必要なカラムだけ取り出す
P.326 ビューの更新
  • ビューへの更新処理 ビュー定義を基にビューが参照している表(基底表)への対応する処理に変換されて実行
  • 更新のための条件
    • 更新にかかる実際の表が更新可能
    • 更新される表の列や行が一意に決まる
  • 更新できないビューの例
    • SELECT句で式、集合関数、DISTINCT を使ったSELECT文で定義されている
    • ・GROUP BY句やHAVING句を使ったSELECT文で定義されている
P.327 6.6.3 オブジェクト(表)の処理権限
  • スキーマに定義された実表やビューはそのスキーマ所有者(作成者)にしか処理権限が与えられない
  • 複数の利用者がデータベースを利用できるようにしたければ、スキーマ所有者以外にも処理権限を付与する必要がある
    • データベース管理ユーザーは全権を持っていて危険な処理もできてしまう
    • できることを制限したユーザーで操作したい
  • オブジェクト(表)の処理権限
    • 読取(SELECT)権限
    • 削除(DELETE)権限
    • 挿入(INSERT)権限
    • 更新(UPDATE)権限
  • cf. スキーマ
    • 1つのデータベースの枠組み
    • スキーマ内に複数の表やビューを定義できる
P.327 処理権限の付与
  • 権限の付与:GRANT文による
  • GRANTの基本構文は次の通り
1
GRANT 権限 ON 表名 TO 許可識別子
  • 権限指定
    • 4 つの処理権限(SELECT,INSERT,UPDATE,DELETE)
    • ALL PRIVILEGES(すべて)を指定できる
  • 権限を複数付与する場合はカンマ(,)で区切って指定
P.327 処理権限の取消し(変更)
  • 一度付与された権限を取消し(変更)できる
  • 権限の取消しはREVOKE文
  • REVOKEの基本構文
1
REVOKE 権限 ON 表名 FROM 許可識別子
P.328 6.7 埋込み方式
P.328 6.7.1 埋込みSQLの基本事項
P.328 静的SQLと動的SQL
  • 静的 SQL:あらかじめ決められたSQL文をプログラム中に埋込んで実行する方式
    • 実際のアプリケーションではあまり見かけない
  • 非カーソル処理:データベースの表から1行を取り出すこと
    • 次のような SELECT 文
    • この INTO を見たことがない

SELECT 社員名, 年齢 INTO :name, :age FROM 社員表 WHERE 社員コード = '100';

  • 動的 SQL:実行する SQL 文がプログラム実行中でな ければ決まらない場合に SQL 文を動的に作成し実行する方式
  • 上の社員コードがふつう変わる:それが「動的」。
  • この動的な部分に変なコードを埋め込むとまずいというのがセキュリティ問題で、例えば SQL インジェクションの問題。
P.328 ホスト変数
  • ホスト変数:データベースとプログラムのインタフェースとなる変数
  • 埋め込み SQL では SQL を実行すると取り出されたデータをINTO句で指定したホスト変数に格納する
  • ホスト変数は通常の変数としてもアクセスできる
    • 出力関数で表示
    • 入力関数で値を入力してそれをSELECT文の条件としても使える
P.329 6.7.2 カーソル処理とFETCH
P.329 カーソル処理
  • 「SELECT・・・・INTO・・・」形式では,1行のデータしか取り出せない
    • (見たことがないのでイメージがつかない)
  • 検索結果が複数行の場合は1行ずつ取り出せるカーソル処理を使う
  • カーソル処理は SQL 文で問い合わせた結果をあたかも1つのファイルであるかのようにとらえる
  • FETCH文でそこから1行ずつ取り出す方式
    • 1つのSELECT文に対してカーソルを宣言(定義)
    • カーソルのオープンでSELECT文が実行
    • カーソルで1行ずつ取り出せる
    • FETCH文で繰返し行を取り出して処理
    • 終了したらカーソルを閉じる
P.330 FETCHで取り出した行の更新
  • 参考:図 6.7.2:FETCHで取り出した行の更新処理
  • FETCH文で取り出した行を更新あるいは削除する場合,FETCH文のあとに続くUPDATE文やDELETE文のWHERE句 に「WHERE CURRENT OF カーソル名」と指定する。
  • (FETCH 文を見たことがないのでイメージつかない)
P.330 処理の確定と取消し
  • 一連のデータを更新している途中でエラーが出た場合
  • それまでの更新処理を取り消して元に戻す必要がある
  • 整合性を取らないといけない:いわゆるロールバックが必要
  • トランザクションが正常終了したときは「コミット」する:更新処理の確定
P.331 6.8 データベース管理システム
P.331 6.8.1 トランザクション管理
P.331 トランザクションとは
  • 複数の利用者が同時にデータベースにアクセスしてもデータが矛盾してはいけない
  • この仕組みがトランザクション管理
  • トランザクション:データの整合性を取るための SQL 処理の最小単位
    • 「回復の単位(Unit of Re-covery)」とも呼ぶ
P.331 ACID 特性
  • トランザクション処理は原子性・一貫性・隔離性・耐久性の 4 特性が必要
  • 厳密な一貫性(完全一貫性)が必要
    • トランザクションではそのすべての処理が完了するか(All)、あるいはまったく実行されていない状態か(Nothing)のどちらか一方で終了しなければならない
    • これは,COMMIT(正常終了),、ROLLBACK(異常終了)で実現できる
    • COMMIT(コミット):更新処理を確定し、データベ ースへの反映を保証する
    • ROLLBACK(ロールバック):更新処理をすべて取 消し,トランザクション開始時点の状態へ戻す
  • 参考:結果整合性
    • 完全一貫性に対する概念
    • 分散トランザクションやいわゆる NoSQL で使われる
    • 参考:分散トランザクション
      • トランザクション管理するべきテーブルが複数のデータベースにまたがっているとき
      • すべてのデータベースをロールバックしなければいけない
P.331 表 6.8.1 ACID 特性
  • 原子性(Atomicity)
    • 更新処理トランザクションが正常終了した場合だけデータベースへの反映を保証する
    • 異常終了時は処理が何もなかった状態に戻す
  • 一貫性(Consistency)
    • トランザクションの処理によってデータベース内のデ ータに矛盾が生じないこと
    • 常に整合性のある状態が保たれていること
  • 隔離性(Isolation)
    • 複数のトランザクションを同時(並行)に実行した場合 と,順(直列)に実行した場合の処理結果が一致するこ と
    • 独立性ともいう
    • トランザクションのスケーリング:複数のトランザクションを同時実行してもそれが正しい順で実行されるように順序づけること
      • 基本は並行実行の結果と直列実行の結果が等しくなるように調整する
    • ロック:直列可能性を保証する方法
  • 耐久性(Durability)
    • いったん正常終了したトランザクションの結果はそ の後に障害が発生してもデータベースから消失しないこと
    • トランザクションの再実行を必要としないこと
P.332 6.8.2 同時実行制御
  • 同時実行制御(並行性制御):複数のトランザクションを同時に実行しても矛盾を起こすことなく処理を実行するメカニズム
  • 実現する方法:ロック・多版同時実行制御・時刻印アルゴリズム
    • 多版同時実行制御に対してロックによる通常の同時実行制御を単版同時実行制御という
P.331 ロック
  • 複数のトランザクションを同時実行してもその結果はトランザクションを直列実行した結果と同じでなければならない(ACID 特性の隔離性)
  • 同時実行制御が行われない環境では結果が変わる場合もある
  • 例:図 6.8.1 を見ること
    • トランザクションTR1とトランザクションTR2が同じデータaを①→②の順に読み込む
    • それぞれのトランザクションでデータaを③→④の順に更
    • COMMITした場合トランザクションTR1がデータaを「a+5→10」に更新してもトランザクションTR2が aの値を「a+10→15」に更新してしまう
    • トランザクションTR1における更新内容が失われる
    • これを変更消失(ロストアップデート)という
  • こうした問題を防ぐための対処法
    • データベース管理システムではデータaにロック(鍵)をかける
    • 咲にデータaをアクセスしたトランザクションの処理が終了するか、あるいはロックが解除されるまでほかのトランザクションを待たせる制御をする
  • 参考 ダーティリード:他のトランザクションが更新中のコミットされていないデータを読み込むこと
P.333 デッドロック
  • P.250 5.2.5 も参考にすること
  • デッドロック:複数のデータに対してロックしようとして互いにロックの解除を待ち続けてしまう
  • 例:図 6.8.2
    • データA、B、Cを専有して処理するトランザクションTR1,TR2,TR3がある
    • 各トランザクションは処理の進行に合わせて表に示される順(①→②→③)にデータを専有
    • トランザクション終了時に3つの資源を一括して解放
    • トランザクションTR1とトランザクションTR2はデッドロックを起こす可能性がある
  • 再び図 6.8.2 を見る
    • データを専有する順序が等しいトランザションTR1とTR3の間ではデッドロックは起こらない
    • 異なる順や逆順でデータを専有するトランザクション間ではデッドロックが起きうる
  • デッドロックが起きたときロールバックなどで 1 つのトランザクションを強制的に終了させてデッドロックを解除する
P.334 ロック方式
  • 2相ロック方式・木規約
  • ロック方式
    • 第1相:使用するデータすべてにロックをかける
    • 第2相:処理後にロックを解除する
    • トランザクション内でのロック・解除はそれぞれ1回だけ
    • 直列可能性は保証されるがデッドロック発生の可能性は 残る
  • 木規約
    • データに順番をつけてその順番どおりにロックをかける
    • デッドロックが起きず、直列可能性を保証する
    • データへの順番づけには木(有向木)を使う
    • トランザクションの同時実行性が低くなるため特殊な用途で使う(どんなところで使うのだろう?)
  • 参考:有向木
    • 方向をもった有向グラフ(の 1 つ)
    • データ構造とアルゴリズムを勉強しよう
    • データベースは検索の便宜もあってデータ構造とアルゴリズムが大事
P.334 ロックの種類
  • 占有ロック・共有ロックの 2 モード
    • DBMS でトランザクションの同時実行性を高めるため
  • 専有ロック
    • データ更新するときに使うロック
    • データに対するほかのトランザクションからのアクセスは一切禁止
  • 共有ロック
    • ふつうデータの読取りの際に使用されるロックで
    • 参照だけを許可
  • 表 6.8.2 参照:2 つのロックモードの組み合わせによる同時実行の可否
  • 専有:占有または排他ともいう
  • 共有:共用ともいう
  • 共有ロックで同時実行性を高める
    • 先行トランザクションがロックしたデータを後続トランザクションが参照できる
    • 待ちがなくなり同時実行性が高まる
    • たいていのシステムでは書き込みよりも読み込みの方が多い
P.335 ロックの粒度
  • ロックをかける単位:表・ブロック・行
    • ブロック:物理的なIOの単位
  • ロックの単位をロックの粒度という。
    • 粒度が小さければ小さいほど同時実行性があがる代わりにロックの回数が多くなり、ロック制御のためのオーバーヘッドが増える
    • 粒度が大きいほどロックの解除待ちが長くなり、同時実行性が下がる
P.336 多版同時実行制御(MVCC:MultiVersion Concurrency Control)
  • 同時実行性を高めつつ一貫性のあるトランザクシ ョン処理を実現する仕組み
  • ふつう専有ロック中(更新中)のデータは参照できない
  • 後続トランザクションはロックの解除を待つ
  • 多版同時実行制御での対処
    • 更新中のデータに対する参照要求に更新前(トランザクション開始前)の内容を返す
    • 後続トランザクションを待たずに処理できる
  • 専有ロックと共有ロックの同時確保で同時実行性を高める一方で、後続トランザクションには現在からさかのぼったある時点における一貫性のあるデータを提供する
  • 整合性を欠いたデータの参照を防げる
参考:整合性を欠いたデータの参照
  • ダーティリード
  • アンリピータブルリード
    • 再度読み込んだデータが他のトランザクションで更新されている
    • 前回読み込んだ値と一致しない
  • フ ァ ン ト ム リ ー ド
    • 再度読み込んだデータの中に他のトランザ クションによって追加・削除されたデータがある
    • 前回と検索結果が変わる
P.335 時刻印アルゴリズム
  • ロック制御をせずに同時実行制御を行う方法としての時刻印(タイムスタンプ)アルゴリズム
  • トランザクションが発生した時刻 T とデータのもつ読込み時刻 Tr、あるいは書込み時刻 Tw を比較して読み書きを判断する
  • 読み込みの場合
    • Tw≦T のときだけ読み込む
    • 読み取ったあとは読み込み時刻 Tr にトランザクション発生時刻 T を設定
  • 書き込みの場合
    • Tw≦T かつ Tr≦T のときだけ書き込む
    • 書き込み後、書込み時刻 Tw にトランザクション発生時刻Tを設定
  • 参考:P.336 図 6.8.4
参考:楽観ロック
  • 楽観的方式:ロック制御をしない他の方法
  • 仮定:同じデータへのアクセス(更新要求)はめったに発生しない
    • 処理を進めて更新直前にほかのトランザクションでそのデータが更新されたかどうかを確認する
    • 更新された場合はロールバックする
  • 実装例
    • データベースに「更新回数」のようなカラムを持たせる
    • データ取得時に更新回数も送る
    • データ更新するときは更新回数つきでサーバーにリクエストを出す
    • 更新回数が同じなら更新する
    • 更新回数が違うなら更新要求を却下する
    • ほぼ同じタイミングで複数の更新要求が出ることはあり、このときは更新が重複して異常が出る
      • これが起きない(起きにくい)というのが最初に書いた「同じデータへの更新要求はめったに発生内」という仮定
P.336 障害回復管理
P.336 障害の種類
  • データベースに発生する障害の三大分類
  • 媒体障害:記憶媒体の故障でデータが消失
  • システム障害:DBMSやOSのバグ・オペレータの誤操作によるシステムダウン
  • トランザクション障害:プログラムのバグ・デッドロック発生でのトランザクションの強制終了など、実行中のトランザクションが異常終了
P.336 目標復旧時点
  • RPO:Recovery Point Objective
  • システム再稼働時に障害発生前のどの時点の状態に復旧させるかを示す概念で、データ損失の最大許容範囲
  • 目標復旧時間(RTO、Recovery Time Objective)
    • 災害による業務の停止が深刻な被害とならないために許容される時間
P.336 事前対策
  • 障害回復:障害からデータベースを復旧して一貫性が保たれた元の状態に戻すこと
  • 障害回復には次のファイルを事前に取得しておく必要がある
  • ログファイル
    • 障害やバグ対策の基本
    • トランザクション処理でデータベースが更新されるとき,更新前ログ、更新後ログなどの更新履歴(変更情報)を取り、時系列に記録する
    • ジャーナルファイル、ジャーナルログともいう
    • 大量に出るので復旧や原因追及に必要十分な要素をピックアップする必要がある
    • ログファイル容量などを見て自動でファイルが切り替わる(ローテーション)
  • バックアップファイル
    • 媒体障害に備えてデータベースとログファイルを定期的に別の媒体にバックアップ(退避)する
    • データベースのバックアップは定期的に取る
    • ログファイル切り替え時にログファイルのバックアップも取る
      • ふつうn個のログファイルに対してログデータをログファイル1から順に書き込む
      • ログファイル1が一杯になるとログファイル2へと切り替える(ローテーション)
      • このタイミングでバックアップ
P.337 参考 バックアップの種類
  • フルバックアップ:すべてのデータをバックアップする
  • 差分バックアップ:直前のフルバックアップ からの変更分だけをバックアップする。
  • 増分バックアップ:直前のフルバックアップ または増分バックアップからの変更分だけをバックアップする。
  • メリット・デメリット
    • フルバックアップは何も考えずにドカンと復旧できるが容量を食う
    • 差分バックアップはバックアップに使う容量を減らせるが、復旧時に手間がかかる
P.337 媒体障害からの回復
  • 媒体障害発生時:バックアップファイルとログファイルの更新後ログを使ってロールフォワード処理でデータ ベースを回復させる
    • 参考:P.338 図6.8.6
    • T1:バックアップファイル取得
    • T2:媒体障害発生
      • バックアップファイルを別の媒体にリストア、T1時点に復帰
      • T1-T2間の更新データ回復:ログファイルの更新後ログによるデータベースの各レコードを順番に再現するロールフォワード処理
  • 参考:差分バックアップ方式採用時
    • フルバックアップファイルをリストア
    • 直近の差分バックアップファイルのデータを追加
    • 更新後ログでロールフォワード
P.338 トランザクション障害からの回復
  • アプリケーションプログラムのバグやデッドロックを解除するための強制終了などでアプリケーションが異常終了したとき
  • ログファイルの更新前ログを使ったロールバック処理でデータベースの内容をトランザクション開始時点の状態に戻す
  • 参考:P.338 図6.8.7
    • データxとyを更新しなければならないトランザクションがT1で開始
    • データyの更新を行う前にT2で異常終了
    • このままではデータxとyのつじつまが合わない
      • T1からT2の間に行われたxの更新を取り消す必要が出る
    • ログファイルの更新前ログによるロールバック処理 でトランザクション開始時点(T1)の状態に戻す
  • 参考:データとログをメモリ上にバッファリングしている場合
    • まだCOMMITされていないトランザクションはログ・バッファの内容で自動的にロールバック(ROLLBACK)される
P.339 システム障害からの回復
  • 現在のデータベース管理システムでのディスクの入出力効率向上のための工夫
    • データとログをメモリ上にバッファリング
    • まずデータベース・バッファに対してデータの更新
    • ある時間間隔でデータベース・バッファの内容をデータファイル(データベース)へ書き出す
    • 書き出し時点を行った時点:チェックポイント
    • チェックポイントの発生:トランザクションのCOMMITとは非同期で、トランザクションがCOMMITされてもデータベース・バッファの内容はデータファイルに書き出されない
      • チェックポイント発生時、稼働中のトランザクション情報もログファイルに書き出される
ログ・バッファの内容
  • トランザクションのCOMMITまたはチェックポイント発生でログファイルに書き出される
  • システム障害発生時の問題
    • データファイルに書き出されていないデータベース・バッファ上の更新データの消失
  • P.340 図6.8.9 の TR2
    • システム障害が発生した時点でCOMMITされていない
    • データベース・バッファの内容が消失しても問題ない:再処理で対応
    • 問題になるのはチェックポイント(T1)の前に開始されたTR1
    • TR1はシステム再立上げ後に更新前ログを用いたロールバック処理で
    • トランザクション開始時点の内容に戻す
図6.8.10の例
  • チェックポイント(T1)後
  • システム障害発生(T2)前にCOMMITされたトランザクションTR3,TR4による更新内容はまだデータファイルに書き出されていない
  • システム障害が発生した直前のチェックポイント(T1)まではデータベースの内容が保証されている
  • ここから更新後ログを用いてロールフォワード処理によって回復
  • システム障害における障害回復はシステム障害 発生時のトランザクションの状態に応じて変わる
  • チェックポイントを作ることでそれまで行われてきた更新内容はすべてデータベース・バッファからデータファイルに書き出される
  • システム障害が発生してもチェックポイント以降の更新後ログだけでロールフォワード処理で回復できる
    • 回復時間が短縮される
P341 6.8.4 問合せ処理の効率化
P.341 インデックス
  • インデックス():データベースへのアクセス効率を上げるために使う
    • 例えばデータ構造とアルゴリズムの意味で「木」を作っている
  • 一般に検索対象の項目にインデックスをつけるとアクセス(検索)速度はあがる
  • しかしシステム全体のパフォーマンスが遅くなることがある
    • インデックスをつけるとインデックスの更新が走る
    • この処理がどれだけパフォーマンスに影響するかが問題
  • インデックスのつけ方はきちんと考える必要がある
  • 参考
    • 各データに複数の索引語を付けて検索時に具体的な値を与えることで,その値を含むすべてのデータを高速かつ簡単に検索できるように編成
    • 蓄積された索引ファイルを転置ファイル(inverted file:インバ ーテッドファイル)という。
P.341 POINT インデックス設定時の留意点
  • アクセス頻度の高い列(検索でよく使う項目)に張る
    • いわゆる内部 ID 系(これは主キーとして勝手にインデックスがつく・つける)
  • 更新頻度の多い列に対してインデックスを張らない
    • 外部 ID としてのメールアドレス・ログイン ID に張ることは多い
  • 行数の少ない表に対してインデックスを張っても効果は低い
  • データのとり得る値の種類が少ない(データ値の重複が多い)列に対して張っても効果は低い
    • それでも張ることはある
    • 「推測するな。計測せよ。」
  • データ値の重複に大きな偏りがある場合は効果が低い
  • 初期のデータ挿入など多くの行を挿入するときはいったんインデックスを削除するといい
  • 参考
    • インデックスには重複を許さないユニークインデックスと重複を許 すデュプリケートインデックスがある
    • 主キー項目にはユニークインデックスが張られる
P.341 上記POINTの④,⑤について
  • P.342 表はインデックスを張ったある項目Xの値とその行数
  • [例1]と[例2]を比べる
    • データのとり得る種類は両方とも同じ
    • [例2]のほうが重複の程度が平準
    • [例1]のほうが大きく偏っている
    • インデックスで1項目当たりの平均の検索効率の向上が期待できるのは[例2]
  • ただしあくまで一般論
P.342 例1・例2の検索効率を確率的に考える
  • [例1]の場合
    • 検索条件が「項目X=A」である確率は(20/1200)
    • Aの検索はインデックスが使える
    • 目的のデータを検索するにはさらに20件を順次検索する必要が ある
    • このときの最大比較回数は20
    • 「項目X=B」の場合、1項目当たりの検索効率(期待値)は次の式で求められる
    • (20/1,200)×20+(40/1,200)×40+(80/1,200)×80 +(160/1,200)×160+(300/1,200)×300+(600/1,200)×600=403
  • [例2]の場合
    • 1項目当たりの検索効率(期待値)は(200/1,200)×200×6=200
  • 確率的意味からも[例2]のほうが検索効率がいい
  • 参考
    • 効率を下げる重複が多い値で検索する機会がほとんどない場合、実際の効率は例1の方が大きい可能性がある
    • いつでも実際のケースでどうかを考える必要がある
  • 参考
    • インデックスを張った項目を検索条件にして絞り込んだ選択率が10〜20%を大きく超える場合,インデックスの効果はあまり期待できない
P.343 連結インデックス

TODO

2021-01-31 課題

  • 先に進む前に録画してあるか確認しよう

進捗

  • 前回の進捗
    • 基礎知識編:P.326 ビューの更新
    • 本編:04-02「よくある条件付き確率密度関数(確率分布)」まで
  • 今回の進捗
    • 基礎知識編:「参考:楽観ロック」まで
    • 本編:04-02終了

課題

TODO

自分用メモ

Matplotlib

  • 本当に簡単な図を描く
  • これを参考に scipy お絵描き
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import sph_harm

m,l = 2,5
theta = np.linspace(0, np.pi, 1001)
phi = np.linspace(0, 2 * np.pi, 1501)
theta, phi = np.meshgrid(theta, phi)

r = sph_harm(m, l, phi, theta).real
x = np.abs(r) * np.sin(theta) * np.cos(phi)
y = np.abs(r) * np.sin(theta) * np.sin(phi)
z = np.abs(r) * np.cos(theta)

fig = plt.figure(figsize=(8, 8))
ax = fig.gca(projection="3d")
ax.plot_surface(x, y, z, color="aqua", edgecolor="k")
plt.axis("off")
plt.show()

日々の勉強

Julia

IT 基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。
  • ネットワークの話もいい加減飽きたので、しばらく DB の話

復習

  • 3 つのスキーマ
    • ユーザーが見るレベル
    • 正規化などをかけておいたデータベースにもっていけるレベル
    • 個々のデータベースに合わせた具体的なレベル
  • インメモリの DB:コンピューターの基本的なハードウェア構成と意味を復習しよう

本の記述を追いかける

P.408 7.8 交換方式
P.408 パケット交換方式
  • 回線交換方式と対になる概念
    • 回線交換方式:通信を行うノード間で物理的な通信路を確保してから通信する
    • 例:電話
  • パケット交換方式について
    • データ送信するノードはデータをパケットに区切る。
    • ひとつひとつのパケットにヘッダを付けて送信。
    • ネットワーク内ではパケット交換機にパケットがたまる
    • ネットワークの状況に応じて順次送られる
パケット通信のメリット・デメリット
メリット

耐障害性 - 通信路を固定しないため,迂回経路が取れる。 - パケット交換機にデータが蓄積されているため,復旧まで待てる。 - パケット多重 - 1 対 1 の通信で回線を占有する必要がないため,1つの回線を多くのノードで共有でき,回線を効率的につかえる - 異機種間接続性 - パケット交換機で中継するときにプロトコル変換・速度変換でエンドノードどうしが同じプロトコルをサポートしていなくても通信できる

デメリット
  • ネットワーク内の蓄積交換処理による遅延
    • 蓄積交換処理による遅延解消のために主に回線の帯域を広げることで対応してきた
    • 構造上,完全には遅延をなくせない
  • パケット到着順序の不整合
P.408 ATM 交換方式
  • ATM(Asynchronous Transfer Mode:非同期転送モード)
  • 遅延のない回線交換方式とパケット交換方式の利点を得たい
  • パケット交換方式の発展
  • 遅延の原因をつぶす:特にパケットの多様性
    • 多種多様なパケットに対応するために,パケット交換機はソフトウェア処理が必要 ^ ATM での工夫の一例:最も特徴的なのは,パケット(ATMではセルという)の長さをヘッダ部 5 バイト,ペイロード 48 バイトの53バイトに統一
    • パケット解析がハードウェアだけでできる。
    • ソフトウェアは不要になった。
  • Wikipedia から
    • 当初の意図に反して非常に複雑な技術になってしまった
    • ATM は次世代の主流にならず限定的な使用にとどまった
    • ATM の設計思想は MPLS へと引き継がれた
    • 汎用のレイヤ 2 のパケットスイッチングのプロトコルとして、ルーターを介したIPの通信網で利用されている。
P.408 ペイロード(payload)
  • データ通信で本来転送したいデータ本体の部分、ボディを指す。
  • ATM ではペイロードのサイズを固定して処理を簡素化
  • 難点:パケット全体に占めるペイロードのサイズが相対的に小さくオーバヘッドが大きい
P.410 輻輳
  • フレームリレー:パケット交換方式の一種
    • 1 つの回線を多数のユーザで共有。
    • 回線がもつ潜在的な伝送能力(ワイヤスピード)を十分に引き出すうえで効果がある
  • 輻輳:ユーザの利用が一時期に集中すると,ワイヤスピードを超えるパケットがネットワーク上に流れる
    • ネットワークが輻輳状態になるとスループットが落ちる
  • フレームリレーサービスを提供する事業者は,ネットワークが輻輳状態に陥ってスループットが低下しても最低限保証する通信速度を決めている
    • CIR(Committed Information Rate:認定情 報速度)
P.370 7 ネットワーク
  • 確か 7.4 から始めた気がするので 7 章はじめから
P.370 7.1.1 OSI基本参照モデル
  • 改めて復習
  • OSI(Open System Interconnection)基本参照モデル- 異なる設計思想・世代のシステムと円滑に通信するのが目的に標準化
  • プロトコルの単機能化,交換の容易さが目的
    • 階層化のおかげで一部の階層の技術体系が変わっても、その階層だけ取り替えればいい
    • コスト・リスクを小さくする
P.370 プロトコルとサービス
  • N 層:それぞれの階層のこと
  • エンティティ:N 層に存在する通信機器などの実体
    • この言葉はいろいろなところで出てきていろいろな意味で使われる
    • もちろん気分的には適当な実体を指すことが多い
  • プロトコル:N 層に属するエンティティが通信するための取り決め
  • 上位の層が下位の層を利用しながら通信する
    • 別の階層間のエンティティどうしが通信する窓口が必要
    • これを提供するのが下位層:この機能をサービスと呼ぶ
  • プロトコルに沿った仕様で製品を開発すれば別のベンダの機器でも通信できる
  • 参考:ベンダーロックイン

特定ベンダー(メーカー)の独自技術に大きく依存した製品、サービス、システム等を採用した際に、他ベンダーの提供する同種の製品、サービス、システム等への乗り換えが困難になる現象のこと。

出来上がった情報システムの正確な仕様が、システムを開発・構築したベンダーにしか解らなくなる場合がある。結果、システムの保守・拡張・改修等の際、現存システムを開発・構築したベンダーに引き続き発注せざるを得なくなる。

  • 「Excel で行政に提出する書類を作れ」事案もそれ。
  • Apple 製品で身の回りを固めるのも同じ。
  • 「多様性が大事」事案でもある。
7.1.2 TCP/IPプロトコルスイート
  • プロトコル同士には相性がある
    • 「ネットワーク層がこのプロトコルならトランスポート層はこのプロトコルにしておくとトラブルが少ない」
  • 一般に同じ団体が作ったプロトコルはセットで使われることが多い
    • このセットがプロトコルスイート ^ 最も代表的なのは IP を中心に組まれた TCP/IP プロトコルスイート
    • 独自の階層モデルをもつ
P.372 TCP/IPの通信
  • データをパケットに区切る
    • 各パケットにヘッダを付けて送信
    • ヘッダは各階層ごとに付加されて次の階層へと渡される
    • 各ヘッダにはその階層で必要となる送信元や送信先,大きさ,順番などパケット自体に関する情報を含む
    • TCPヘッダを付加したパケット:TCP セグメント
    • IP ヘッダを付加したパケット:IP パケット
    • MACヘッダを付加したパケット:MAC フレームあるいはイーサネットフレーム
P.372 MAC(Media Access Control)アドレス
  • イーサネットや FDDI で使用される物理アドレス
    • イーサネット (Ethernet):コンピューターネットワークの規格の1つ。オフィスや家庭で一般的に使用されている有線LAN (Local Area Network) の技術規格
    • FDDI:LAN でデータ転送を行うための標準の一つ
      • Fiber distributed data interface
  • データリンク層
  • 同じネットワークに接続された隣接ノード間の通信で相手を識別するために使う
  • MACアドレスの長さ:6バイト
    • 先頭24ビットの OUI(ベンダID)
    • 後続24ビットの固有製造番号(製品に割り当てた番号)
  • MAC アドレスは機器が固有にもつ番号
    • 必ず一意に定まるように IEEE が管理
P372 ポート番号
  • トランスポート層にでノード内のアプリケーションの識別に使う識別子番号
    • 0-65535の範囲
  • TCP/IPではパケット交換方式でデータをやり取りする
  • よく使われるアプリケーションについてのポート番号は Well-Known ポートとして標準化
    • TCP・UDPそれぞれで 0-1023 番までの番号を割り当てている
    • SSH:TCP22番
    • Telnet:TCP23番
    • SMTP:TCP25番
    • HTTP:TCP80番
    • POP3:TCP110番
    • IMAP4:TCP143番
    • HTTPS :TCP443番
    • NTP:UDP123番
    • SNMP:UDP161番
    • SNMP Trap :UDP162番
  • セキュリティ対策のために標準とはポート番号を変えることもある
  • Web 開発の本を読んでいると、いろいろな都合から http のポートを 80 以外にしていることもよくある。
    • 80 の場合はポートを指定しなくてもいい
      • 例:http://localhost/hoge/fuga
      • 例:http://localhost:5000/hoge/fuga
P.373 ネットワーク間の通信
  • 同じネットワークに接続されたノード間はデータリンク層(第 2 層)の通信
  • ネットワークを超えたノード間はネットワーク層(第 3 層)の通信 -実際に図 7.1.4 を見よう
    • どこが IP アドレスでのやりとりか?
    • どこが MAC アドレスでのやり取りか?
P.374 7.2 ネットワーク接続装置と関連技術
P.374 7.2.1 物理層の接続
P.374 リピータ
  • ネットワーク上を流れる電流の増幅装置・整流装置
  • 物理層:第 1 層
  • データ通信はネットワーク上を流れる電流
    • ケーブルが長いと電流が減衰・波形が乱れが起きる
    • データが読み取れなくなる
    • これを増幅するのがリピータ
  • 大昔の電話は距離が遠いと音が小さく聞こえにくかった
    • まさにこの減衰が問題
  • リピータは 1:1 で繋ぐ
    • 現在では複数のノードを接続できるマルチポートリピータ(ハブ)が使われるのが一般的
P.374 7.2.2 データリンク層の接続
  • 第2層
P374 ブリッジ
  • データリンク層に位置
  • ネットワーク上を流れているフレーム(情報の単位)の MAC アドレスを認識して通信を中継する
    • 接続されているノードをコリジョンドメイン(セグメント)という単位に分割
    • MAC アドレスで判定したフレームのあて先のあるセグメントだけにフレームを送信
    • 無駄なトラフィックの回避
  • ポートの記憶
    • 通信のたびにある MAC アドレスをもつノードがどのポート に接続されているか学習
    • 次回の通信時には余分なポートには通信を中継しない。
  • ブリッジの動作
    • あて先MACアドレスをもとにMACアドレステーブルを参照する
    • あて先MACアドレスの接続ポートがフレームを受信したポー トと別ポートであれば,そのポートにフレームを送信し
      • 同一ポートであればフレームを破棄する
    • あて先MACアドレスが記憶されていない場合やブロードキャス トアドレス(FF-FF-FF-FF-FF-FF)の場合は,受信ポート以外のすべてのポートにフレームを送信する
P.375 スイッチングハブ
  • レイヤ2スイッチ(L2スイッチ)とも呼ばれる
  • データリンク層に位置
  • ブリッジと同じ働きをする
    • MAC アドレスを認識してフレームのあて先を決めて通信を行います。
  • 試験での問われ方
    • スイッチングハブはフレームの蓄積機能、速度変換機能や交換機 能をもっている。
    • このようなスイッチングハブと同等の機能をもち,同じプロトコル階層で動作する装置はどれか
    • 答えは「ブリッジ」
P.375 ブロードキャストストリーム
  • データリンク層で動作するブリッジやスイッチングハブなどの LANスイッチはブロードキャストフレームを受信ポート以外 のすべてのポートに転送
  • これらの機器をループ状に接続し冗長化させると信頼性はあがる
    • ブロードキャストフレームは永遠に回り続けながら増える
    • 最終的にはネットワークダウンを招く
    • この現象をブロードキャストストームという
  • ブロードキャストストームを防ぐプロトコル:スパニングツリープロトコル(Spanning Tree Protocol:STP)
    • ループを構成している一部のポートを通常運用時にはブロック(論理的に切断)する
    • ネットワーク全体をループをもたない論理的なツリー構造にする
P.376 ネットワーク層の接続
  • 第 3 層(レイヤ 3)
P.376 ルータ
  • ルータはネットワーク層(第 3 層)に位置する
    • あて先IPアドレスを見てパケットの送り先を決め通信を制御する
  • IP のローカルネットワークの境界線に設置して利用され,ネットワークの基本単位として機能
  • 世界中に散在しているローカルネットワークどうしをルータが結ぶ
    • 全体としてインターネットというインフラが機能
  • ルータで分けられたネットワークの単位をブロードキャストドメインという
  • ルータがパケットを受け取ったあと
    • あて先IPアドレスを見る
    • 自分のネットワークあてであれば,破棄
    • 他のネットワークあてであれば転送
      • どのルータへ送ればあて先のネットワークへの通信が速く行えるかを判断することを経路制御(ルーティング)
      • ルータはそのための経路表(ルーティングテーブル)を備えている
P.376 デフォルトゲートウェイ
  • 会社Aのネットワークに属するPCは会社BのPCと直接通信できない
  • 会社AのPCは他ネットワークへの接点であるルータAに転送を依頼
  • デフォルトゲートウェイ:会社AのPCから見て直近のルータA
  • 自分と直接接続していない相手と通信するときはすべてデフォルト ゲートウェイを中継する
P.376 ルーティング
  • 経路表(ルーティングテーブル)の作成方法
    • 手作業で作る:スタティックルーティング
    • ルーティングプロトコル利用:ルータ同士が経路情報を交換し、自立的に経路表を作るダイナミックルーティング
  • ダイナミックルーティングのための代表的なルーティングプロトコル:RIP、OSPF
  • RIP:ディスタンスベクタ型(距離ベクトル型)
    • ルーティングテーブルの情報(経路情報)を一定時間間隔で交換しあう
    • あて先ネットワークにいたるまでに経由するルータの数(ホップ数)最小経路を選ぶ
    • あて先に到達可能な最大ホップ数は 15
      • これを超えた経路は採用されない
  • OSPF:リンクステート型
    • コストを経路選択の要素に取り入れ、コスト最小経路を選ぶ
    • コスト値は,回線速度を基に自動的に算出されるが手動設定もできる
    • コスト算出式「コスト=100Mbps/経路の通信帯域(bps)」
  • コスト計算例は P.377 の図を見ること
P.377 ルータの冗長構成
  • ルータを冗長構成のために使うプロトコル:VRRP(Virtual Router Redundancy Protocol )
  • 同じ LAN に接続された複数のルータを仮想的に 1 台のルータ として見えるようにして冗長構成を実現する
  • 複数のルータでグループ(VRRP グループ)を作る
  • VRRP グループごとに仮想 IP アドレスと仮想 MAC アドレスを割り当て
  • PC などのノードは仮想ルータの IP アドレスに対して通信
  • 通常時はグループのマスタルータが仮想ルータの IP アドレス(仮想 IP アドレス)を保持
  • マスタルータに障害が発生すると他のバックアップルータがこれを継承
P.377 レイヤ3スイッチ(L3スイッチ)
  • ルータと同じネットワーク層(第 3 層)の通信機器
  • 特徴
    • ルータ:ソフトウェアで転送処理
    • レイヤ 3 スイッチ:専用ハードウェアで転送処理
  • 高速処理できる:大容量のファイルを扱うファイルサーバへのアクセスなど
P.378 トランスポート層以上の層の接続
P.378 ゲートウェイ
  • トランスポート層(第 4 層)-アプリケーション層(第7層)でネットワーク接続するための装置
  • 第 3 層のネットワーク層まででエンドツーエンド(E2E)の通信は完成する
    • E2E = 通信を行う二者、あるいは、二者間を結ぶ経路全体
    • エンドツーエンド原理:高度な通信制御や複雑な機能は末端のシステムが担い、経路上のシステムは単純に信号やデータの中継・転送だけすべし
    • TCP/IP ネットワークの原理
    • 誤り訂正・フロー制御・再送:TCP 層(第4層、トランスポート層)など上位側の機器やソフトウェア・プロトコル
    • 単純な送受信・転送処理:IP 層(第3層、ネットワーク層)
  • ゲートウェイ:第 4 層のトランスポート層以上が違う LAN システム相互間のプロトコル・データ形式の変換を担う
  • ゲートウェイはアプリケーションプロトコルの内容を 解釈できる
    • アプリケーションヘッダの不正な情報混入を検出可能
    • ファイアウォール・プロキシサーバもゲートウェイの一種
P.378 L4スイッチ・L7スイッチ
  • L4スイッチ(レイヤ4スイッチ)はトランスポート層(第4層)の装置
    • 定義としてはゲートウェイ
    • 機能的にはレイヤ2スイッチ・レイヤ3スイッチの延長上
    • ルータやレイヤ3スイッチはIPアドレスを参照して経路制御する
    • L4スイッチではTCPポート番号やUDPポート番号も経路制御判断に使える:第4層の機器だから
  • L7スイッチ:アプリケーション層(第7層)までの情報を使って通信制御する
P.379 7.2.5 VLAN
  • VLAN(Virtual LAN:仮想LAN)
  • スイッチ(レイヤ2スイッチ,レイヤ3スイッチ)で物理的な接続形態とは独立に仮想的なLANグループを構成する仕組み,あるいはそう構成されたLAN
  • 複雑な形態のネットワークを楽に構築できる
  • サブネット構成も柔軟に変えられる
P.380 データリンク層の制御とプロトコル
  • データリンク層:第2層
P.380 7.3.1 メディアアクセス制御
  • 複数のデータを1つのケーブルを通して送受する場合,データの衝突(コリジョン)を回避するための制御が必要
    • これがメディアアクセス制御(Media Access Control:MAC)
コリジョン(衝突)

イーサネットや無線LANで複数の端末が送信し、データが衝突する現象を指す。旧式のイーサネット規格では、端末同士を接続するときに1組の通信路で双方向の通信を行う半二重通信のため、送信と受信を同時に行うことができない。送信と受信をその都度切り替えて行うので、端末がお互いデータを送信してしまうと衝突する可能性が高くなる。

P.380 CSMA/CD
  • CSMA/CD:Carrier Sense Multiple Access with Collision Detection:搬送波感知多重アクセ ス/衝突検出)の略。
  • イーサネットで採用されている方式
    • 衝突検知方式を採用
    • イーサネット:IEEE 802.3として標準化されている LAN規格
  • CSMA/CD
    • 各ノードは伝送媒体が使用中かどうかを調べて,使用中でなければデータを送りはじめる
    • 複数のノードが同時に通信しはじめるとデータの衝突が起こる
    • 衝突を検知し,一定時間(ランダム)待った後で,再送
    • 一定の距離以上のケーブルでは衝突が検知できない
  • CSMA/CD方式の限界
    • トラフィックが増加するにつれて衝突が多くなる
    • 再送が増え,さらにトラフィックが増加する悪循環に陥る可能性がある
    • 特に伝送路の使用率が30%を超えると実用的でなくなる
P.381トークンパッシング方式
  • トークンによる送信制御を行う方式で
    • トークンバス方式
    • トークンリング方式
P.381 トークンパッシング方式
  • ネットワーク上をフリートークンと呼ばれる送信権のためのパケットが巡回する
    • フリートークンを獲得したノードだけが送信できるので衝突を避けられる
    • ふつうはコンセントレータ(集線器)でネットワ ークとノードを結ぶ
  • トークンパッシング方式を採用したLAN規格
    • 例:FDDI:Fiber Distributed Data Interface
    • FDDIは物理媒体に光ファイバを利用し,最大100Mビ ッ ト/秒の通信
  • 特徴
    • 伝送媒体上では衝突しない
    • トラフィックが増えるにつれてトークンを獲得しにくくなり,少しずつ遅延時間が増える
    • 衝突による再送制御の必要がないため伝送路の使用率に対する遅延時間の増加率はCSMA/CD方式より緩やか
P.382 TDMA 方式
  • TDM(時分割多重)
    • ネットワーク上にデータを送信する時間を割 り当てる(タイムスロット)
    • タイムスロットごとに別のデータを送って多重化する
    • TDM によるアクセス制御が TDMA
  • TDMA(Time Division Multiple Access:時分割多重アクセス)
    • CSMA/CD・トークンパッシング方式と並ぶ主要なデー タリンク技術
    • TDMA ではネットワーク(伝送路)を使える時間を細かく区切る
    • 割り当てられた時間は各ノードが独占する方式
    • TDMAはコネクション型の通信
P.382 7.3.2 無線LANのアクセス制御方式
P.382 CSMA/CA方式
  • CSMA/CA:Carrier Sense Multiple Access with Collision Avoidance、搬送波感知多重アクセス/衝突回避
  • 無線 LAN の制御方式
  • CSMA/CD との違い:「衝突検出」が「衝突回避」になった
  • 無線 LAN:物理層媒体は電波で衝突の検出は不可能だから回避する
  • 特徴
    • 送信ノードは使いたい周波数帯の使えるか確認後、必ずランダムな時間だけ待ってから送信をはじめる
      • 待ち時間をバックオフ制御時間とよぶ
    • 衝突してフレームが壊れても検出できない
      • データを受け取ったノードは ACK を返す
P.328 RTS/CTS
  • 無線 LAN の話
  • 隠れ端末問題
    • 他のノードのデータ送信を感知できないことがある
    • 通信ノード間の距離が遠い
    • ノード間に障害物がある
  • 回避のための RTS/CTS 方式
  • 無線 LAN ノード
    • データ送信前にRTS(Request ToSend:送信リクエスト)をアクセスポイントに送信
    • これを受理したアクセスポイントがCTS(Clear to Send:送信OK)を返信
      • 他のノードは CTS を傍受して自分以外の別のノードに送信権があると解釈
      • データ送信を延期
    • 無線LANノードはアクセスポイントからCTSを受信したらデータ送信開始します
    • 衝突抑制:CTSに書かれた他のノードに対する送信抑制時間を使う
  • データ送信開始前にデータ送信のネゴシエーシ ョンとして RTS/CTS 方式を使った CSMA/CA を CSMA/CA with RTS/CTS とよぶ
P.383 無線LANの動作モード
  • 無線 LAN の動作モード:図7.3.4参照
  • 2 つのモードがある
  • インフラストラクチャモード:無線LANノードがアク セスポイントを通じて相互に通信
  • アドホックモード:アクセスポイントなしに無線LANノードどうしが直接通信
P.383 COLUMN FDMA,CDMA
  • 表7.3.1:多元接続する技術グループ
    • TDMA とセット
  • FDMA
    • ある周波数帯をさらに細かい周波数帯に分割
    • 接続できる端末数を増やす技術
  • CDMA
    • 周波数も時間も分割しない
    • 符号で各端末の通信を識別・分離
    • 接続できる端末数を増やす
P.383 7.3.3 データリンク層の主なプロトコル
  • 第 2 層
P.384 ARP
  • ARP(Address Resolution Protocol):通信相手のIPアドレスからMACアドレスを取るためのプロトコル
  • ARPの動作
    • ブロードキャストで目的IPアドレスを指定したARP要求パケットをLAN全体に流す
      • ブロードキャスト:ネットワークに参加するすべての機器に同時に信号やデータを送ること
    • 各ノードは自分のIPアドレスと比較
    • 一致したノードだけARP応答パケットに自分のMACアドレスを入れて返す(ユニキャスト)
  • 参考:GARP(Gratuitous ARP)
    • 主な目的:自身に設定するIPアドレスの重複確認・ARPテ ーブルの更新
    • 目的IPアドレスに自身が使うIPアドレスを指定し,MACアドレスを問い合わせる
P.384 RARP
  • Reverse-ARP:逆アドレス解決プロトコル
    • MACアドレスからIPアドレスを取る
  • 電源オフ時にIPアドレスを保持できない(IPアドレスを保持するハードディスクをもたない)機器が電源オン時に自分のMACアドレスから自身に割り当てられているIPアドレスを知るために使う
  • RARP サーバー
    • MACアドレスとIPアドレスの対応表を持ったサーバー(RARPサーバー)が必要
P.384 PPP
  • PPP:Point to Point Protocol
    • 2 点間をポイントツーポイントでつなぐためのデータリンクプロトコル
    • WANを介して2つのノードをダイヤルアップ接続するときに使う
  • ネットワーク層(第3層)とネゴシエーションする NCP(ネットワーク制御プロトコル)とリンクネゴシエーションするLCP(リンク制御プロトコル)からなる
    • NCP:Network Control Protocol
    • LCP:Link Control Protocol
  • リンク制御やエラー処理機能を持つ
P.384 PPPoE
  • PPPoE:PPP over Ethernet
  • PPPと同等な機能をイーサネット(LAN)上で実現するプロトコル
  • PPPフレームをイーサネットフレームでカプセル化して実現
P.384 7.3.4 IEEE 802.3規格
  • メディアアクセス制御に CSMA/CD 方式を使う LAN についての標準
  • OSI基本参照モデルにおけるデータリンク層(第 2 層)と物理層(第 1 層)のプロトコルおよびサービスを規定
    • OSI 基本参照モデルでのデータリンク層を LLC 副層と MAC 副層の2つに分割
    • 物理層での LAN で使う伝送媒体や MAC 副層でのフレーム構成や衝突検出の仕組みを規定
  • ツイストケーブルの企画が表 7.3.2 にまとまっている
P.386 7.4 ネットワーク層のプロトコルと技術
  • もうやった
P.327 6.6.3 オブジェクト(表)の処理権限
  • スキーマに定義された実表やビューはそのスキーマ所有者(作成者)にしか処理権限が与えられない
  • 複数の利用者がデータベースを利用できるようにしたければ、スキーマ所有者以外にも処理権限を付与する必要がある
    • データベース管理ユーザーは全権を持っていて危険な処理もできてしまう
    • できることを制限したユーザーで操作したい
  • オブジェクト(表)の処理権限
    • 読取(SELECT)権限
    • 削除(DELETE)権限
    • 挿入(INSERT)権限
    • 更新(UPDATE)権限
  • cf. スキーマ
    • 1つのデータベースの枠組み
    • スキーマ内に複数の表やビューを定義できる
P.327 処理権限の付与
  • 権限の付与:GRANT文による
  • GRANTの基本構文は次の通り
1
GRANT 権限 ON 表名 TO 許可識別子
  • 権限指定
    • 4 つの処理権限(SELECT,INSERT,UPDATE,DELETE)
    • ALL PRIVILEGES(すべて)を指定できる
  • 権限を複数付与する場合はカンマ(,)で区切って指定
P.327 処理権限の取消し(変更)
  • 一度付与された権限を取消し(変更)できる
  • 権限の取消しはREVOKE文
  • REVOKEの基本構文
1
REVOKE 権限 ON 表名 FROM 許可識別子
P.328 6.7 埋込み方式
P.328 6.7.1 埋込みSQLの基本事項
P.328 静的SQLと動的SQL
  • 静的 SQL:あらかじめ決められたSQL文をプログラム中に埋込んで実行する方式
    • 実際のアプリケーションではあまり見かけない
  • 非カーソル処理:データベースの表から1行を取り出すこと
    • 次のような SELECT 文
    • この INTO を見たことがない

SELECT 社員名, 年齢 INTO :name, :age FROM 社員表 WHERE 社員コード = '100';

  • 動的 SQL:実行する SQL 文がプログラム実行中でな ければ決まらない場合に SQL 文を動的に作成し実行する方式
  • 上の社員コードがふつう変わる:それが「動的」。
  • この動的な部分に変なコードを埋め込むとまずいというのがセキュリティ問題で、例えば SQL インジェクションの問題。
P.328 ホスト変数
  • ホスト変数:データベースとプログラムのインタフェースとなる変数
  • 埋め込み SQL では SQL を実行すると取り出されたデータをINTO句で指定したホスト変数に格納する
  • ホスト変数は通常の変数としてもアクセスできる
    • 出力関数で表示
    • 入力関数で値を入力してそれをSELECT文の条件としても使える
P.329 6.7.2 カーソル処理とFETCH
P.329 カーソル処理
  • 「SELECT・・・・INTO・・・」形式では,1行のデータしか取り出せない
    • (見たことがないのでイメージがつかない)
  • 検索結果が複数行の場合は1行ずつ取り出せるカーソル処理を使う
  • カーソル処理は SQL 文で問い合わせた結果をあたかも1つのファイルであるかのようにとらえる
  • FETCH文でそこから1行ずつ取り出す方式
    • 1つのSELECT文に対してカーソルを宣言(定義)
    • カーソルのオープンでSELECT文が実行
    • カーソルで1行ずつ取り出せる
    • FETCH文で繰返し行を取り出して処理
    • 終了したらカーソルを閉じる
P.330 FETCHで取り出した行の更新
  • 参考:図 6.7.2:FETCHで取り出した行の更新処理
  • FETCH文で取り出した行を更新あるいは削除する場合,FETCH文のあとに続くUPDATE文やDELETE文のWHERE句 に「WHERE CURRENT OF カーソル名」と指定する。
  • (FETCH 文を見たことがないのでイメージつかない)
P.330 処理の確定と取消し
  • 一連のデータを更新している途中でエラーが出た場合
  • それまでの更新処理を取り消して元に戻す必要がある
  • 整合性を取らないといけない:いわゆるロールバックが必要
  • トランザクションが正常終了したときは「コミット」する:更新処理の確定
P.331 6.8 データベース管理システム
P.331 6.8.1 トランザクション管理
P.331 トランザクションとは
  • 複数の利用者が同時にデータベースにアクセスしてもデータが矛盾してはいけない
  • この仕組みがトランザクション管理
  • トランザクション:データの整合性を取るための SQL 処理の最小単位
    • 「回復の単位(Unit of Re-covery)」とも呼ぶ
P.331 ACID 特性
  • トランザクション処理は原子性・一貫性・隔離性・耐久性の 4 特性が必要
  • 厳密な一貫性(完全一貫性)が必要
    • トランザクションではそのすべての処理が完了するか(All)、あるいはまったく実行されていない状態か(Nothing)のどちらか一方で終了しなければならない
    • これは,COMMIT(正常終了),、ROLLBACK(異常終了)で実現できる
    • COMMIT(コミット):更新処理を確定し、データベ ースへの反映を保証する
    • ROLLBACK(ロールバック):更新処理をすべて取 消し,トランザクション開始時点の状態へ戻す
  • 参考:結果整合性
    • 完全一貫性に対する概念
    • 分散トランザクションやいわゆる NoSQL で使われる
    • 参考:分散トランザクション
      • トランザクション管理するべきテーブルが複数のデータベースにまたがっているとき
      • すべてのデータベースをロールバックしなければいけない
P.331 表 6.8.1 ACID 特性
  • 原子性(Atomicity)
    • 更新処理トランザクションが正常終了した場合だけデータベースへの反映を保証する
    • 異常終了時は処理が何もなかった状態に戻す
  • 一貫性(Consistency)
    • トランザクションの処理によってデータベース内のデ ータに矛盾が生じないこと
    • 常に整合性のある状態が保たれていること
  • 隔離性(Isolation)
    • 複数のトランザクションを同時(並行)に実行した場合 と,順(直列)に実行した場合の処理結果が一致するこ と
    • 独立性ともいう
    • トランザクションのスケーリング:複数のトランザクションを同時実行してもそれが正しい順で実行されるように順序づけること
      • 基本は並行実行の結果と直列実行の結果が等しくなるように調整する
    • ロック:直列可能性を保証する方法
  • 耐久性(Durability)
    • いったん正常終了したトランザクションの結果はそ の後に障害が発生してもデータベースから消失しないこと
    • トランザクションの再実行を必要としないこと
P.332 6.8.2 同時実行制御
  • 同時実行制御(並行性制御):複数のトランザクションを同時に実行しても矛盾を起こすことなく処理を実行するメカニズム
  • 実現する方法:ロック・多版同時実行制御・時刻印アルゴリズム
    • 多版同時実行制御に対してロックによる通常の同時実行制御を単版同時実行制御という
P.331 ロック
  • 複数のトランザクションを同時実行してもその結果はトランザクションを直列実行した結果と同じでなければならない(ACID 特性の隔離性)
  • 同時実行制御が行われない環境では結果が変わる場合もある
  • 例:図 6.8.1 を見ること
    • トランザクションTR1とトランザクションTR2が同じデータaを①→②の順に読み込む
    • それぞれのトランザクションでデータaを③→④の順に更
    • COMMITした場合トランザクションTR1がデータaを「a+5→10」に更新してもトランザクションTR2が aの値を「a+10→15」に更新してしまう
    • トランザクションTR1における更新内容が失われる
    • これを変更消失(ロストアップデート)という
  • こうした問題を防ぐための対処法
    • データベース管理システムではデータaにロック(鍵)をかける
    • 咲にデータaをアクセスしたトランザクションの処理が終了するか、あるいはロックが解除されるまでほかのトランザクションを待たせる制御をする
  • 参考 ダーティリード:他のトランザクションが更新中のコミットされていないデータを読み込むこと

ロックが必要な状況

  • 事務員が二人
  • Aさんは給与振り込み、Bさんは書類提出チェック
  • 同じテーブルに書き込まれている
  • Aさんがいろいろやった
    • 給与振り込みはまだ、書類の提出もまだ
    • 給与の振り込み終了の情報を書き戻す
  • Bさんがいろいろやった
    • 給与振り込みがまだ、書類の提出もまだ
    • 書類の提出確認を書き戻す

社員マスタ

  • 社員ID、社員名、今月給与振り込みステータス、書類の提出ステータス
P.333 デッドロック
  • P.250 5.2.5 も参考にすること
  • デッドロック:複数のデータに対してロックしようとして互いにロックの解除を待ち続けてしまう
  • 例:図 6.8.2
    • データA、B、Cを専有して処理するトランザクションTR1,TR2,TR3がある
    • 各トランザクションは処理の進行に合わせて表に示される順(①→②→③)にデータを専有
    • トランザクション終了時に3つの資源を一括して解放
    • トランザクションTR1とトランザクションTR2はデッドロックを起こす可能性がある
  • 再び図 6.8.2 を見る
    • データを専有する順序が等しいトランザションTR1とTR3の間ではデッドロックは起こらない
    • 異なる順や逆順でデータを専有するトランザクション間ではデッドロックが起きうる
  • デッドロックが起きたときロールバックなどで 1 つのトランザクションを強制的に終了させてデッドロックを解除する
P.334 ロック方式
  • 2相ロック方式・木規約
  • ロック方式
    • 第1相:使用するデータすべてにロックをかける
    • 第2相:処理後にロックを解除する
    • トランザクション内でのロック・解除はそれぞれ1回だけ
    • 直列可能性は保証されるがデッドロック発生の可能性は 残る
  • 木規約
    • データに順番をつけてその順番どおりにロックをかける
    • デッドロックが起きず、直列可能性を保証する
    • データへの順番づけには木(有向木)を使う
    • トランザクションの同時実行性が低くなるため特殊な用途で使う(どんなところで使うのだろう?)
  • 参考:有向木
    • 方向をもった有向グラフ(の 1 つ)
    • データ構造とアルゴリズムを勉強しよう
    • データベースは検索の便宜もあってデータ構造とアルゴリズムが大事
P.334 ロックの種類
  • 占有ロック・共有ロックの 2 モード
    • DBMS でトランザクションの同時実行性を高めるため
  • 専有ロック
    • データ更新するときに使うロック
    • データに対するほかのトランザクションからのアクセスは一切禁止
  • 共有ロック
    • ふつうデータの読取りの際に使用されるロックで
    • 参照だけを許可
  • 表 6.8.2 参照:2 つのロックモードの組み合わせによる同時実行の可否
  • 専有:占有または排他ともいう
  • 共有:共用ともいう
  • 共有ロックで同時実行性を高める
    • 先行トランザクションがロックしたデータを後続トランザクションが参照できる
    • 待ちがなくなり同時実行性が高まる
    • たいていのシステムでは書き込みよりも読み込みの方が多い
P.335 ロックの粒度
  • ロックをかける単位:表・ブロック・行
    • ブロック:物理的なIOの単位
  • ロックの単位をロックの粒度という。
    • 粒度が小さければ小さいほど同時実行性があがる代わりにロックの回数が多くなり、ロック制御のためのオーバーヘッドが増える
    • 粒度が大きいほどロックの解除待ちが長くなり、同時実行性が下がる
P.336 多版同時実行制御(MVCC:MultiVersion Concurrency Control)
  • 同時実行性を高めつつ一貫性のあるトランザクシ ョン処理を実現する仕組み
  • ふつう専有ロック中(更新中)のデータは参照できない
  • 後続トランザクションはロックの解除を待つ
  • 多版同時実行制御での対処
    • 更新中のデータに対する参照要求に更新前(トランザクション開始前)の内容を返す
    • 後続トランザクションを待たずに処理できる
  • 専有ロックと共有ロックの同時確保で同時実行性を高める一方で、後続トランザクションには現在からさかのぼったある時点における一貫性のあるデータを提供する
  • 整合性を欠いたデータの参照を防げる
参考:整合性を欠いたデータの参照
  • ダーティリード
  • アンリピータブルリード
    • 再度読み込んだデータが他のトランザクションで更新されている
    • 前回読み込んだ値と一致しない
  • フ ァ ン ト ム リ ー ド
    • 再度読み込んだデータの中に他のトランザ クションによって追加・削除されたデータがある
    • 前回と検索結果が変わる
P.335 時刻印アルゴリズム
  • ロック制御をせずに同時実行制御を行う方法としての時刻印(タイムスタンプ)アルゴリズム
  • トランザクションが発生した時刻 T とデータのもつ読込み時刻 Tr、あるいは書込み時刻 Tw を比較して読み書きを判断する
  • 読み込みの場合
    • Tw≦T のときだけ読み込む
    • 読み取ったあとは読み込み時刻 Tr にトランザクション発生時刻 T を設定
  • 書き込みの場合
    • Tw≦T かつ Tr≦T のときだけ書き込む
    • 書き込み後、書込み時刻 Tw にトランザクション発生時刻Tを設定
  • 参考:P.336 図 6.8.4
参考:楽観ロック
  • 楽観的方式:ロック制御をしない他の方法
  • 仮定:同じデータへのアクセス(更新要求)はめったに発生しない
    • 処理を進めて更新直前にほかのトランザクションでそのデータが更新されたかどうかを確認する
    • 更新された場合はロールバックする
  • 実装例
    • データベースに「更新回数」のようなカラムを持たせる
    • データ取得時に更新回数も送る
    • データ更新するときは更新回数つきでサーバーにリクエストを出す
    • 更新回数が同じなら更新する
    • 更新回数が違うなら更新要求を却下する
    • ほぼ同じタイミングで複数の更新要求が出ることはあり、このときは更新が重複して異常が出る
      • これが起きない(起きにくい)というのが最初に書いた「同じデータへの更新要求はめったに発生内」という仮定
P.336 障害回復管理
P.336 障害の種類
  • データベースに発生する障害の三大分類
  • 媒体障害:記憶媒体の故障でデータが消失
  • システム障害:DBMSやOSのバグ・オペレータの誤操作によるシステムダウン
  • トランザクション障害:プログラムのバグ・デッドロック発生でのトランザクションの強制終了など、実行中のトランザクションが異常終了
P.336 目標復旧時点
  • RPO:Recovery Point Objective
  • システム再稼働時に障害発生前のどの時点の状態に復旧させるかを示す概念で、データ損失の最大許容範囲
  • 目標復旧時間(RTO、Recovery Time Objective)
    • 災害による業務の停止が深刻な被害とならないために許容される時間
P.336 事前対策
  • 障害回復:障害からデータベースを復旧して一貫性が保たれた元の状態に戻すこと
  • 障害回復には次のファイルを事前に取得しておく必要がある
  • ログファイル
    • 障害やバグ対策の基本
    • トランザクション処理でデータベースが更新されるとき,更新前ログ、更新後ログなどの更新履歴(変更情報)を取り、時系列に記録する
    • ジャーナルファイル、ジャーナルログともいう
    • 大量に出るので復旧や原因追及に必要十分な要素をピックアップする必要がある
    • ログファイル容量などを見て自動でファイルが切り替わる(ローテーション)
  • バックアップファイル
    • 媒体障害に備えてデータベースとログファイルを定期的に別の媒体にバックアップ(退避)する
    • データベースのバックアップは定期的に取る
    • ログファイル切り替え時にログファイルのバックアップも取る
      • ふつうn個のログファイルに対してログデータをログファイル1から順に書き込む
      • ログファイル1が一杯になるとログファイル2へと切り替える(ローテーション)
      • このタイミングでバックアップ
P.337 参考 バックアップの種類
  • フルバックアップ:すべてのデータをバックアップする
  • 差分バックアップ:直前のフルバックアップ からの変更分だけをバックアップする。
  • 増分バックアップ:直前のフルバックアップ または増分バックアップからの変更分だけをバックアップする。
  • メリット・デメリット
    • フルバックアップは何も考えずにドカンと復旧できるが容量を食う
    • 差分バックアップはバックアップに使う容量を減らせるが、復旧時に手間がかかる
P.337 媒体障害からの回復
  • 媒体障害発生時:バックアップファイルとログファイルの更新後ログを使ってロールフォワード処理でデータ ベースを回復させる
    • 参考:P.338 図6.8.6
    • T1:バックアップファイル取得
    • T2:媒体障害発生
      • バックアップファイルを別の媒体にリストア、T1時点に復帰
      • T1-T2間の更新データ回復:ログファイルの更新後ログによるデータベースの各レコードを順番に再現するロールフォワード処理
  • 参考:差分バックアップ方式採用時
    • フルバックアップファイルをリストア
    • 直近の差分バックアップファイルのデータを追加
    • 更新後ログでロールフォワード
P.338 トランザクション障害からの回復
  • アプリケーションプログラムのバグやデッドロックを解除するための強制終了などでアプリケーションが異常終了したとき
  • ログファイルの更新前ログを使ったロールバック処理でデータベースの内容をトランザクション開始時点の状態に戻す
  • 参考:P.338 図6.8.7
    • データxとyを更新しなければならないトランザクションがT1で開始
    • データyの更新を行う前にT2で異常終了
    • このままではデータxとyのつじつまが合わない
      • T1からT2の間に行われたxの更新を取り消す必要が出る
    • ログファイルの更新前ログによるロールバック処理 でトランザクション開始時点(T1)の状態に戻す
  • 参考:データとログをメモリ上にバッファリングしている場合
    • まだCOMMITされていないトランザクションはログ・バッファの内容で自動的にロールバック(ROLLBACK)される
P.339 システム障害からの回復
  • 現在のデータベース管理システムでのディスクの入出力効率向上のための工夫
    • データとログをメモリ上にバッファリング
    • まずデータベース・バッファに対してデータの更新
    • ある時間間隔でデータベース・バッファの内容をデータファイル(データベース)へ書き出す
    • 書き出し時点を行った時点:チェックポイント
    • チェックポイントの発生:トランザクションのCOMMITとは非同期で、トランザクションがCOMMITされてもデータベース・バッファの内容はデータファイルに書き出されない
      • チェックポイント発生時、稼働中のトランザクション情報もログファイルに書き出される
ログ・バッファの内容
  • トランザクションのCOMMITまたはチェックポイント発生でログファイルに書き出される
  • システム障害発生時の問題
    • データファイルに書き出されていないデータベース・バッファ上の更新データの消失
  • P.340 図6.8.9 の TR2
    • システム障害が発生した時点でCOMMITされていない
    • データベース・バッファの内容が消失しても問題ない:再処理で対応
    • 問題になるのはチェックポイント(T1)の前に開始されたTR1
    • TR1はシステム再立上げ後に更新前ログを用いたロールバック処理で
    • トランザクション開始時点の内容に戻す
図6.8.10の例
  • チェックポイント(T1)後
  • システム障害発生(T2)前にCOMMITされたトランザクションTR3,TR4による更新内容はまだデータファイルに書き出されていない
  • システム障害が発生した直前のチェックポイント(T1)まではデータベースの内容が保証されている
  • ここから更新後ログを用いてロールフォワード処理によって回復
  • システム障害における障害回復はシステム障害 発生時のトランザクションの状態に応じて変わる
  • チェックポイントを作ることでそれまで行われてきた更新内容はすべてデータベース・バッファからデータファイルに書き出される
  • システム障害が発生してもチェックポイント以降の更新後ログだけでロールフォワード処理で回復できる
    • 回復時間が短縮される
P341 6.8.4 問合せ処理の効率化
P.341 インデックス
  • インデックス():データベースへのアクセス効率を上げるために使う
    • 例えばデータ構造とアルゴリズムの意味で「木」を作っている
  • 一般に検索対象の項目にインデックスをつけるとアクセス(検索)速度はあがる
  • しかしシステム全体のパフォーマンスが遅くなることがある
    • インデックスをつけるとインデックスの更新が走る
    • この処理がどれだけパフォーマンスに影響するかが問題
  • インデックスのつけ方はきちんと考える必要がある
  • 参考
    • 各データに複数の索引語を付けて検索時に具体的な値を与えることで,その値を含むすべてのデータを高速かつ簡単に検索できるように編成
    • 蓄積された索引ファイルを転置ファイル(inverted file:インバ ーテッドファイル)という。
P.341 POINT インデックス設定時の留意点
  • アクセス頻度の高い列(検索でよく使う項目)に張る
    • いわゆる内部 ID 系(これは主キーとして勝手にインデックスがつく・つける)
  • 更新頻度の多い列に対してインデックスを張らない
    • 外部 ID としてのメールアドレス・ログイン ID に張ることは多い
  • 行数の少ない表に対してインデックスを張っても効果は低い
  • データのとり得る値の種類が少ない(データ値の重複が多い)列に対して張っても効果は低い
    • それでも張ることはある
    • 「推測するな。計測せよ。」
  • データ値の重複に大きな偏りがある場合は効果が低い
  • 初期のデータ挿入など多くの行を挿入するときはいったんインデックスを削除するといい
  • 参考
    • インデックスには重複を許さないユニークインデックスと重複を許 すデュプリケートインデックスがある
    • 主キー項目にはユニークインデックスが張られる
P.341 上記POINTの④,⑤について
  • P.342 表はインデックスを張ったある項目Xの値とその行数
  • [例1]と[例2]を比べる
    • データのとり得る種類は両方とも同じ
    • [例2]のほうが重複の程度が平準
    • [例1]のほうが大きく偏っている
    • インデックスで1項目当たりの平均の検索効率の向上が期待できるのは[例2]
  • ただしあくまで一般論
P.342 例1・例2の検索効率を確率的に考える
  • [例1]の場合
    • 検索条件が「項目X=A」である確率は(20/1200)
    • Aの検索はインデックスが使える
    • 目的のデータを検索するにはさらに20件を順次検索する必要が ある
    • このときの最大比較回数は20
    • 「項目X=B」の場合、1項目当たりの検索効率(期待値)は次の式で求められる
    • (20/1,200)×20+(40/1,200)×40+(80/1,200)×80 +(160/1,200)×160+(300/1,200)×300+(600/1,200)×600=403
  • [例2]の場合
    • 1項目当たりの検索効率(期待値)は(200/1,200)×200×6=200
  • 確率的意味からも[例2]のほうが検索効率がいい
  • 参考
    • 効率を下げる重複が多い値で検索する機会がほとんどない場合、実際の効率は例1の方が大きい可能性がある
    • いつでも実際のケースでどうかを考える必要がある
  • 参考
    • インデックスを張った項目を検索条件にして絞り込んだ選択率が10〜20%を大きく超える場合,インデックスの効果はあまり期待できない
P.343 連結インデックス

TODO

2021-02-07 課題

  • 先に進む前に録画してあるか確認しよう

進捗

  • 前回の進捗
    • 基礎知識編:「参考:楽観ロック」まで
    • 本編:04-02終了
  • 今回の進捗
    • 基礎知識編:「6.8.4 問合せ処理の効率化」まで
    • 本編:05-01終了

課題

TODO

* 自分用メモ

* Matplotlib

  • 本当に簡単な図を描く
  • これを参考に scipy お絵描き
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
import numpy as np
import matplotlib.pyplot as plt
from scipy.special import sph_harm

m,l = 3,7
theta = np.linspace(0, np.pi, 1001)
phi = np.linspace(0, 2 * np.pi, 1501)
theta, phi = np.meshgrid(theta, phi)

r = sph_harm(m, l, phi, theta).real
x = np.abs(r) * np.sin(theta) * np.cos(phi)
y = np.abs(r) * np.sin(theta) * np.sin(phi)
z = np.abs(r) * np.cos(theta)

fig = plt.figure(figsize=(8, 8))
ax = fig.gca(projection="3d")
ax.plot_surface(x, y, z, color="aqua", edgecolor="k")
plt.axis("off")
plt.show()

日々の勉強

Julia

IT 基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。
  • ネットワークの話もいい加減飽きたので、しばらく DB の話

復習

  • 3 つのスキーマ
    • ユーザーが見るレベル
    • 正規化などをかけておいたデータベースにもっていけるレベル
    • 個々のデータベースに合わせた具体的なレベル
  • インメモリの DB:コンピューターの基本的なハードウェア構成と意味を復習しよう

本の記述を追いかける

P.336 障害回復管理
P.336 障害の種類
  • データベースに発生する障害の三大分類
  • 媒体障害:記憶媒体の故障でデータが消失
  • システム障害:DBMSやOSのバグ・オペレータの誤操作によるシステムダウン
  • トランザクション障害:プログラムのバグ・デッドロック発生でのトランザクションの強制終了など、実行中のトランザクションが異常終了
P.336 目標復旧時点
  • RPO:Recovery Point Objective
  • システム再稼働時に障害発生前のどの時点の状態に復旧させるかを示す概念で、データ損失の最大許容範囲
  • 目標復旧時間(RTO、Recovery Time Objective)
    • 災害による業務の停止が深刻な被害とならないために許容される時間
P.336 事前対策
  • 障害回復:障害からデータベースを復旧して一貫性が保たれた元の状態に戻すこと
  • 障害回復には次のファイルを事前に取得しておく必要がある
  • ログファイル
    • 障害やバグ対策の基本
    • トランザクション処理でデータベースが更新されるとき,更新前ログ、更新後ログなどの更新履歴(変更情報)を取り、時系列に記録する
    • ジャーナルファイル、ジャーナルログともいう
    • 大量に出るので復旧や原因追及に必要十分な要素をピックアップする必要がある
    • ログファイル容量などを見て自動でファイルが切り替わる(ローテーション)
  • バックアップファイル
    • 媒体障害に備えてデータベースとログファイルを定期的に別の媒体にバックアップ(退避)する
    • データベースのバックアップは定期的に取る
    • ログファイル切り替え時にログファイルのバックアップも取る
      • ふつうn個のログファイルに対してログデータをログファイル1から順に書き込む
      • ログファイル1が一杯になるとログファイル2へと切り替える(ローテーション)
      • このタイミングでバックアップ
P.337 参考 バックアップの種類
  • フルバックアップ:すべてのデータをバックアップする
  • 差分バックアップ:直前のフルバックアップ からの変更分だけをバックアップする。
  • 増分バックアップ:直前のフルバックアップ または増分バックアップからの変更分だけをバックアップする。
  • メリット・デメリット
    • フルバックアップは何も考えずにドカンと復旧できるが容量を食う
    • 差分バックアップはバックアップに使う容量を減らせるが、復旧時に手間がかかる
P.337 媒体障害からの回復
  • 媒体障害発生時:バックアップファイルとログファイルの更新後ログを使ってロールフォワード処理でデータ ベースを回復させる
    • 参考:P.338 図6.8.6
    • T1:バックアップファイル取得
    • T2:媒体障害発生
      • バックアップファイルを別の媒体にリストア、T1時点に復帰
      • T1-T2間の更新データ回復:ログファイルの更新後ログによるデータベースの各レコードを順番に再現するロールフォワード処理
  • 参考:差分バックアップ方式採用時
    • フルバックアップファイルをリストア
    • 直近の差分バックアップファイルのデータを追加
    • 更新後ログでロールフォワード
P.338 トランザクション障害からの回復
  • アプリケーションプログラムのバグやデッドロックを解除するための強制終了などでアプリケーションが異常終了したとき
  • ログファイルの更新前ログを使ったロールバック処理でデータベースの内容をトランザクション開始時点の状態に戻す
  • 参考:P.338 図6.8.7
    • データxとyを更新しなければならないトランザクションがT1で開始
    • データyの更新を行う前にT2で異常終了
    • このままではデータxとyのつじつまが合わない
      • T1からT2の間に行われたxの更新を取り消す必要が出る
    • ログファイルの更新前ログによるロールバック処理 でトランザクション開始時点(T1)の状態に戻す
  • 参考:データとログをメモリ上にバッファリングしている場合
    • まだCOMMITされていないトランザクションはログ・バッファの内容で自動的にロールバック(ROLLBACK)される
P.339 システム障害からの回復
  • 現在のデータベース管理システムでのディスクの入出力効率向上のための工夫
    • データとログをメモリ上にバッファリング
    • まずデータベース・バッファに対してデータの更新
    • ある時間間隔でデータベース・バッファの内容をデータファイル(データベース)へ書き出す
    • 書き出し時点を行った時点:チェックポイント
    • チェックポイントの発生:トランザクションのCOMMITとは非同期で、トランザクションがCOMMITされてもデータベース・バッファの内容はデータファイルに書き出されない
      • チェックポイント発生時、稼働中のトランザクション情報もログファイルに書き出される
ログ・バッファの内容
  • トランザクションのCOMMITまたはチェックポイント発生でログファイルに書き出される
  • システム障害発生時の問題
    • データファイルに書き出されていないデータベース・バッファ上の更新データの消失
  • P.340 図6.8.9 の TR2
    • システム障害が発生した時点でCOMMITされていない
    • データベース・バッファの内容が消失しても問題ない:再処理で対応
    • 問題になるのはチェックポイント(T1)の前に開始されたTR1
    • TR1はシステム再立上げ後に更新前ログを用いたロールバック処理で
    • トランザクション開始時点の内容に戻す
図6.8.10の例
  • チェックポイント(T1)後
  • システム障害発生(T2)前にCOMMITされたトランザクションTR3,TR4による更新内容はまだデータファイルに書き出されていない
  • システム障害が発生した直前のチェックポイント(T1)まではデータベースの内容が保証されている
  • ここから更新後ログを用いてロールフォワード処理によって回復
  • システム障害における障害回復はシステム障害 発生時のトランザクションの状態に応じて変わる
  • チェックポイントを作ることでそれまで行われてきた更新内容はすべてデータベース・バッファからデータファイルに書き出される
  • システム障害が発生してもチェックポイント以降の更新後ログだけでロールフォワード処理で回復できる
    • 回復時間が短縮される

2021-02-21 オンライン プログラミング勉強会の記録

進捗

  • 前回の進捗
    • 基礎知識編:「P.341 6.8.4 問合せ処理の効率化」まで
    • 本編:05-01終了
  • 今回の進捗
    • 基礎知識編:「P.345 6.8.5 データベースのチューニング」まで
    • 本編:05-03終了

課題

TODO

Matplotlib

TeX

データ構造とアルゴリズムに関するリポジトリ

IT基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。

2021-03-07 オンライン プログラミング勉強会の記録

進捗

  • 前回の進捗
    • 基礎知識編:「P.345 6.8.5 データベースのチューニング」まで
    • 本編:05-03終了
  • 今回の進捗

予定

  • 基礎知識編: 本のP.345から
  • 次回から何するか?
  • 本編

課題

TODO

Matplotlib

TeX

データ構造とアルゴリズムに関するリポジトリ

IT基礎知識

  • 応用情報の本を一日2ページくらい眺めてみてください。毎日やれば大体 1 年で読み終わります。