DNSとDNSレコードについて

AWSについて勉強していて、Route 53に差し掛かったところでそもそもDNSよく分かってないや、ってなったので簡単なまとめ。
Route 53独自のレコードについても触れる。

そもそもDNSサーバ

  • 2種類あるから混同させちゃダメ
    1. DNSキャッシュサーバ
      • PCなどから名前解決を依頼されるサーバ
    2. DNSコンテンツサーバ(権威DNSサーバ)
  • DNSの詳細な仕組みに関しては詳細に説明されているサイト(例えばここ)を参照のこと

DNSレコードとは

  • DNSコンテンツサーバはDNSサーバからの問い合わせに対して、ゾーンファイルを参照する
    • ゾーンファイルには、DNSコンテンツサーバが管理する範囲内でのIPアドレスドメインの対応、
      他のDNSコンテンツサーバにドメインの管理を委譲しているのであれば、委譲先の情報が書かれている
  • DNSレコードはゾーンファイルの各行のこと

主なDNSレコード

タイプ 概要
A Address IPv4 IPアドレス
AAAA ? IPv6 IPアドレス
CNAME Canonical NAME ドメイン名の別名。
NS Name Server ドメインの管理の委譲先の権威DNSサーバのドメイン
MX Mail Exchange ドメインへのメール配送先サーバのドメイン
TXT TeXT コメント行。Sender Policy Frameworkにも使える
PTR PoinTeR IPアドレスに対応するドメイン名。
SOA Start Of Authority プライマリネームサーバ、ドメイン管理者の電子メール、ドメインのシリアル番号(更新されたかどうかの判別に使う)、ゾーンのリフレッシュなど
  • 上記のDNSレコード以外に、Route 53には独自のDNSレコードALIASがある

参考

バイト列を受け取ったブラウザがDOMツリーをつくるまで

概要

ブラウザがページをレンダリングするまでにはいくつかのステップを経ている。 googleConstructing the Object Modelを読んで、分からなかった単語などを調べながらまとめる。 CSSDOMのところは除いてとりあえずDOMツリーが作られるところまで。

バイト文字列からDOMオブジェクトになるまでの流れ

ブラウザーに渡されたバイト列は、下のような流れでDOMツリーになってレンダリングされる。 英語が苦手な人もgoogleのページの図を見てもらえると分かりやすいかと。

バイト列
  ↓
文字列
  ↓
トークン
  ↓
オブジェクト
  ↓
DOMツリー

バイト文字列から文字列へ - Conversion

ブラウザーは、サーバーやディスクから読み込んだバイト列を、決まった文字コードに応じて文字列に変換する。 例えば、htmlファイルのheadに<meta charset="utf-8">があれば、バイト列をUTF-8として処理する。

文字列からトークンへ - Tokenizing

ブラウザーは文字列を<html><body>などカギカッコ(angle brackets)に囲まれたトーク1に変換する。 それぞれのトークンはそれぞれの特性を持っている。

トークンからノードへ - Lexing

トークンがオブジェクト(ノード)へと変換される。 Tokenizeで、headやbodyなどの各タグは始まりのタグと終わりのタグで別個になっていたが、
この段階でひとまとまりのオブジェクトへと変換される。

  • Lex - レキシカルアナライザ(字句解析プログラム)を生成するプログラム

オブジェクトからDOMツリーへ

HTMLでは各タグ同士の包含関係などの関係性が書かれているので、オブジェクトは木構造へと結びつけられる。 htmlタグがparent、head、bodyがchildといった形。 リンク先の図が分かりやすい。

参考


  1. トークンはここでは、連続したデータにおいて最小の意味を持ったまとまりの意味。

MySQLのデータ型の後にある括弧について(おまけ: charとvarchar)

整数型の場合

  • テーブルを作る
  • 何文字まで入るのか、確認のためINSERTしていく
mysql> CREATE TABLE tinyint_test ( `num` tinyint(1) NOT NULL );

mysql> INSERT INTO `tinyint_test` VALUES ( 1 );
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `tinyint_test` VALUES ( 2 );
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `tinyint_test` VALUES ( 127 );
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `tinyint_test` VALUES ( 128 );
ERROR 1264 (22003): Out of range value for column 'num' at row 1
  • tinyintの取りうる範囲(符号ありの場合、-128 ~ 127)であれば、全て入れられる。
    • 値や桁数の制限にはならない

文字列型の場合

  • varcharの場合
mysql> CREATE TABLE `varchar_test` ( `string` varchar(5) NOT NULL );
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO `varchar_test` VALUES ( 'あああああ' );
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `varchar_test` VALUE( 'ああああああ' );
ERROR 1406 (22001): Data too long for column 'string' at row 1
  • charの場合
mysql> CREATE TABLE `char_test` ( `string` char(5) NOT NULL );
Query OK, 0 rows affected (0.02 sec)

mysql> INSERT INTO `char_test` VALUES ( 'あああああ' );
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO `char_test` VALUES ( 'ああああああ' );
ERROR 1406 (22001): Data too long for column 'string' at row 1
  • 文字列型の場合、文字数制限がかけられる
  • varcharは可変長、charは固定長なのでもしかすると、違う結果になるのかなと思って両方やったけど同じ結果になった。

数値型のデフォルトの括弧の値

  • 数値型の場合、デフォルトの値をしていなかった場合どうなるんだろう
mysql> CREATE TABLE `tinyint` ( `tinyint` tinyint NOT NULL );
Query OK, 0 rows affected (0.02 sec)

mysql> SHOW  CREATE TABLE `tinyint`;
+---------+-----------------------------------------------------------------------------------------------+
| Table   | Create Table                                                                                  |
+---------+-----------------------------------------------------------------------------------------------+
| tinyint | CREATE TABLE `tinyint` (
  `tinyint` tinyint(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+---------+-----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
  • 4桁or4文字までとな
  • あ、マイナスがあるからか!
mysql> CREATE TABLE `tinyint_unsigned` ( `tinyint` tinyint  unsigned NOT NULL );
Query OK, 0 rows affected (0.02 sec)

mysql> SHOW  CREATE TABLE `tinyint_unsigned`;
+------------------+-----------------------------------------------------------------------------------------------------------------+
| Table            | Create Table                                                                                                    |
+------------------+-----------------------------------------------------------------------------------------------------------------+
| tinyint_unsigned | CREATE TABLE `tinyint_unsigned` (
  `tinyint` tinyint(3) unsigned NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+------------------+-----------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
  • 数値型で値を指定しなかった場合のデフォルト値は文字数のようだ

文字列型のデフォルトの括弧の値

mysql> CREATE TABLE `string` ( `c` char NOT NULL, `v` varchar NOT NULL );
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'NOT NULL )' at line 1

mysql> CREATE TABLE `string` ( `c` char(1) NOT NULL, `v` varchar(1) NOT NULL );
Query OK, 0 rows affected (0.03 sec)
  • そもそも指定しないとエラーになる

charとvarcharについて

  • charは固定長で 255文字 まで格納できる
    • 最初に指定した値の長さになるように文字列の右側が空白で埋められる
    • 通常の設定では取り出す時に空白は削除される
  • varcharは可変長で 65,535文字(行全体のバイト数の最大値) まで格納できる
    • varcharはプリフィクスに値のバイト数を示すデータが格納される
      • ~255までであればプリフィクスは1バイト、256~ であれば2バイト。
  • 基本的には記憶域を節約できるvarcharがよいが、必ず同じ桁数の文字列が格納されるカラムであればcharがよい。

参考

URIのスキーマを省略すると?

どういうこと?

こうではなく

<img src="https://example.jp/index.html" />

こう書くということ

<img src="//example.jp/index.html" />

どうなるの?

  • 現在見ているサイトのプロトコルでリクエストが送られる。
    • httpで見ているサイトならhttpで、httpsで見ているサイトならhttps

短くかけて便利だけど、、、

参考

UUID生成について

webpack簡単まとめ

はじめに

  • react + echo でSPAを作るぞ、と意気込んだものの色々分からないので、ちょっとずつ進めていく。
  • 自分のレベルはcreate-react-appでTODOアプリくらいは作ってみたけど、なんで動いているのかよく分かっていないよ、くらい
    • node、npmはこの前簡単にまとめてみたのでなんとなく分かる
  • 公式ドキュメントのGuidesを進めていく中で、覚えときたいところ、よく分からなかったところ、忘れそうなところのメモ書き。
  • 具体的なコードは書かないのでモジュール名などでググるべし

Asset Management

  • webpack.config.jsにwebpackの設定を追加していく
  • npm管理されている各種loader(style-loaderなど)をconfig追加すると、各種ファイルをバンドルできる

Output Management

  • jsやcssファイルがバンドルされる際、ファイル名がハッシュになるが、htmlファイルが参照するファイル名は変わらないという問題が発生する
  • html-webpack-pluginを使おう
    • コンパイル毎にファイル名のハッシュが変更されてしまうのを解決してくれる
  • 使われないファイルが出力先フォルダに増えていく問題に対しては、clean-webpack-pluginを使うと、使わないやつを消してくれる。

Development

  • バンドルしたファイルでエラーが起こったとき、バンドル前のどのファイルでエラーが起こったか分からない?
    • webpackのinline-source-mapオプションを使うと、元ファイルのエラーを表示してくれる
  • ファイル変更する度にビルドし直すの面倒だよね?3つの解決方法がある
    1. webpackのwatchモードを使う
      • ファイルに変更があるとコンパイルし直してくれる
      • しかし、ブラウザで表示する場合にはリロードが必要
    2. webpack-dev-serverを使うと、webサーバーを立ち上げてくれて、ファイルに変更があると、コンパイル・リロードを自動でやってくれる
    3. webpack-dev-serverでは、webpack-dev-middlewareを内部的に使っている
      • webpack-dev-middlewareを切り出してカスタマイズして使うことも可能。
    4. とりあえず最初は2の方法でいいのではないかと思う。

Code Spliting

出力されるjsファイルを分割する方法は3つ。

  • ぱっと見は2が良さそう

  • Entry Pointsを分けること

    • webpack.config.jsファイルのentryを複数指定する
    • 簡単で直感的だが、複数ファイルで重複したモジュールがバンドルされる可能性がある
  • CommonsChunkPluginを使うこと

    • 重複したモジュールが1つの別ファイルに出力される
  • Dynamic imports で行うこと

    • インラインで読み込む

参考

React の Quick start の簡単なまとめ

はじめに

  • installなど、そのまま簡単に進められたものは省く
  • React公式ドキュメントを読み進める中で、覚えておきたいもののメモ。
  • github-pagesで動いていてて、コードはgithubにあるが、メモ程度に考えてもらった方が、、、

Rendering Elements

  • Reactで作られた作られたアプリケーションは、通常1つのrootDOMnodeからなる。
    • <div id="root"></div>しかないってこと。
    • 既存のアプリケーションに取り入れるなら、複数の独立したrootDOMを取り入れることになるみたい。
  • React Element(componentをクラスとするなら、elementはインスタンスみたいなもの?)はimmutableだ。
    • UIを変更するには、ReactDOM.render()に新たなelementを渡すしかない。
    • Reactは新旧のelementを比較して、変更部分だけを適用する
      • 仮想DOMといわれる仕組みで、部分的な再描画を行うのでコストが小さい

Components and Props

  • Reactのcomponentには2種類ある
    • functional componentsは、propsの受け取りはできるが、stateの変更は行えない。
    • class componentsは、propsの受け取りもstateの変更も行うことができる。
  • 描画の流れ(公式からそのままコードを持ってきている)
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}

const element = <Welcome name="Sara" />;
ReactDOM.render(
  element,
  document.getElementById('root')
);
  1. <Welcome name="Sara" /> element を持った、ReactDOM.render() が呼び出される。
  2. React が {name: 'Sara'} を props として持った Welcom component を呼び出す。
  3. Welcom component が結果として、<h1>Hello, Sara</h1> elementを結果として呼び出す。
  4. ReactDOM は効率的に受け取ったelementに合った形でDOMを更新する

  5. componentのpropsの命名は、呼び出されるcontextではなくcomponent単体から考えるべき

    • 再利用性も高まりやすい
  6. props は Read-Only なので、値の変更はできない。

State and Lifecycle

  • componentDidMount()
  • componentWillUnmount()
    • componentがDOMから消える前に呼び出される
  • stateの注意点
    • 直接stateに値を入れていいのはconstructorの中でだけ。
      変更はsetState()で行う
    • stateの更新は非同期に行われうるので、次の変更にその変更を依存してはダメ
      別変数に入れておくとかしましょう
    • stateの更新はマージされる

Conditional Rendering

  • 条件によって表示内容を変えたいときには、JSXの埋め込み表現内で
    • &&オペレーターを使う
    • 三項対立を使う
  • 特定条件でcomponentを表示したくない時には、propsの値によってnullを返す

Lists and Keys

  • component内でlistをレンダリングする場合には下の例のようにmap()を用いる
  • 下の例ではkeyというものを定義しているが、これはReactが要素の変更、追加、削除を特定するために使われる。
    • keyは、componentに渡されない。
const array = [1, 2, 3];
array.map( x => <li key={x.toString()}>x</li> );

Forms

  • formの入力値の制御・送信は、componentのstateで行う。
    • Controlled Componentと呼ばれる
    • onChangeonSubmitを使う
    • 複数のinput要素を扱う時には、それぞれのnameによって変更するstateを決める(handleChaneは共通でよい)

Lifiting State Up

  • 複数のcomponentの値を同期させたい時
    • 上位のcomponentのstateを使い、そのstateをhandleする関数を下位componentに渡す

Thinking in React

  • stateはinteractiveな値
  • stateアンチパターン
    • 親要素から渡されたpropsをstateにすること
    • 変化しない値をstateが変化しないこと
    • 別のstateやpropsから導き出されうる値である場合

次にやりたいこと

  • turorialをやる
  • apiサーバーと連携したアプリを作る
  • typescriptを導入する