DNSとDNSレコードについて
AWSについて勉強していて、Route 53に差し掛かったところでそもそもDNSよく分かってないや、ってなったので簡単なまとめ。
Route 53独自のレコードについても触れる。
そもそも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ツリーをつくるまで
概要
ブラウザがページをレンダリングするまでにはいくつかのステップを経ている。
googleのConstructing 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といった形。 リンク先の図が分かりやすい。
参考
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はプリフィクスに値のバイト数を示すデータが格納される
- 基本的には記憶域を節約できる
varchar
がよいが、必ず同じ桁数の文字列が格納されるカラムであればchar
がよい。
参考
URIのスキーマを省略すると?
どういうこと?
こうではなく
<img src="https://example.jp/index.html" />
こう書くということ
<img src="//example.jp/index.html" />
どうなるの?
短くかけて便利だけど、、、
- 参考リンクやGoogle HTML/CSS Style Guideにもあるように非推奨らしい。
参考
UUID生成について
- UUIDとは
- Universal Unique Identifier
- 汎システム的に他とは重ならない識別子
- uuidgen
- uuidを生成するコマンドラインユーティリティ
- libuuid(3)ライブラリが使われている
- 生成されたUUIDは、いつどこで作られたUUIDとも重ならないと考えて良い
- 書式
- uuidgen [ -r | -t ]
-r
乱数ベース-t
時刻ベース
- uuidgen [ -r | -t ]
- 使い方の例
- cookieにuser id としてセットして、効果計測に使う
- 例 UUIDでユニークユーザーを特定してアプリ広告の効果を測定
- ITP以降、3rd party cookieはセットしてもすぐ消えるかもしれないので注意!
- cookieにuser id としてセットして、効果計測に使う
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
オプションを使うと、元ファイルのエラーを表示してくれる
- webpackの
- ファイル変更する度にビルドし直すの面倒だよね?3つの解決方法がある
Code Spliting
出力されるjsファイルを分割する方法は3つ。
ぱっと見は
2
が良さそうEntry Pointsを分けること
- webpack.config.jsファイルの
entry
を複数指定する - 簡単で直感的だが、複数ファイルで重複したモジュールがバンドルされる可能性がある
- webpack.config.jsファイルの
CommonsChunkPluginを使うこと
- 重複したモジュールが1つの別ファイルに出力される
Dynamic imports で行うこと
- インラインで読み込む
参考
React の Quick start の簡単なまとめ
はじめに
- installなど、そのまま簡単に進められたものは省く
- installationを見るとよい
- 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といわれる仕組みで、部分的な再描画を行うのでコストが小さい
- UIを変更するには、
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') );
<Welcome name="Sara" />
element を持った、ReactDOM.render() が呼び出される。- React が {name: 'Sara'} を props として持った Welcom component を呼び出す。
- Welcom component が結果として、
<h1>Hello, Sara</h1> element
を結果として呼び出す。 ReactDOM は効率的に受け取ったelementに合った形でDOMを更新する
componentのpropsの命名は、呼び出されるcontextではなくcomponent単体から考えるべき
- 再利用性も高まりやすい
- props は Read-Only なので、値の変更はできない。
State and Lifecycle
componentDidMount()
componentWillUnmount()
- componentがDOMから消える前に呼び出される
state
の注意点- 直接stateに値を入れていいのはconstructorの中でだけ。
変更はsetState()
で行う - stateの更新は非同期に行われうるので、次の変更にその変更を依存してはダメ
別変数に入れておくとかしましょう - stateの更新はマージされる
- 直接stateに値を入れていいのはconstructorの中でだけ。
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
と呼ばれるonChange
、onSubmit
を使う- 複数のinput要素を扱う時には、それぞれの
name
によって変更するstateを決める(handleChaneは共通でよい)
Lifiting State Up
- 複数のcomponentの値を同期させたい時
- 上位のcomponentのstateを使い、そのstateをhandleする関数を下位componentに渡す
Thinking in React
- stateはinteractiveな値
- stateアンチパターン
- 親要素から渡されたpropsをstateにすること
- 変化しない値をstateが変化しないこと
- 別のstateやpropsから導き出されうる値である場合