[Unite2019] レポートリンクまとめ
今年もUniteに参加したので講演のレポートを上げようと思います
去年のはこちら
turgure.hatenablog.com
公式サイト:Unite Tokyo 2019 - Unity
DAY1
- Unityで手軽に使えるAIエンジンailia SDK
- 中の人がいない!? 音声対話型AIサービスを使ったバーチャルキャラクターの作り方
- Game Server Services ではじめる サーバー開発運用しないゲーム開発
- AWS for Unity Developers
- Google Cloud for Games 〜オープンソースからマネージドサービスへ〜
DAY2
mysqlのストレージエンジンの種類について
mysqlのengineってなんだろうと思ったのでまとめてみた。
現在使っているのはInnoDB
というものだが、実はいろいろ種類があるらしい。
mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
公式リファレンスはこちら
MySQL :: MySQL 5.6 リファレンスマニュアル :: 15 代替ストレージエンジン
それらを1つずつざっくりと説明する。
InnoDB
mysql5.5以降はデフォルトでこれが指定される。
とりあえずこちらを利用しておけばいいと思う。
以下のような特徴がある。
MyISAM
InnoDB
と比較されるもう一つのストレージエンジン。
InnoDB
を使う理由がない場合はMyISAM
を使う。
以下のような特徴がある。
- テーブルロック
- アクセスが早い
- トランザクション機能がない
InnoDB
よりテーブルサイズが小さい
参考
MEMORY
名前の通り、データをメモリ上に展開して保存する。
そのため、mysqlを再起動するとデータが消えてしまう。
メモリ上にあるため、アクセスが非常に高速。
インデックスの種類として、b treeとhashの2種類が存在する(基本的にはb tree)
参考
- MEMORYストレージエンジンでMySQLのパフォーマンスをあげよう - Qiita
- MySQLのMEMORYストレージエンジンを試してみる - CORDEA blog
- [ThinkIT] 第3回:MemoryとArchive (1/3)
CSV
sqlのデータをcsvファイルとして扱うことができる。
my.cnf
に設定したdatadir
以下に、.frm
の他に、.CSM
、.CSV
の計3種類のファイルが作られる。
その中のcsvファイルを変更することで、DBのデータも一緒に変更することができる。
変更したあとはFLUSH TABLE;
を忘れずに。
参考
ARCHIVE
データの登録、参照のみ可能で、変更ができない。
つまり、SELECT
, INSERT
のみの操作しけ受け付けず、UPDATE
, DELETE
, REPLACE
などは利用できない。
データは圧縮して保存されているため、容量が小さく済む。
また、インデックスを付与することができない。(AUTO INCREMENTのカラムは除く)
参考
BLACKHOLE
SELECT
やINSERT
などのSQLを発行しても、すべてemptyが返ってくるような形式。
主に試運転時や、マスター-スレーブ構成のときに使うらしい(よくわかってないです)。
これについては参考サイトを確認してください。
参考
- MySQLでBlackholeストレージエンジンを活用するのオマケ - インフラエンジニアway - Powered by HEARTBEATS
- DECOLOGでのMySQL BlackHoleエンジンの使い方:DECOLOG TECH BLOG annex:エンジニアライフ
MERGE
複数のテーブルを結合し、あたかも1つのテーブルで処理しているかのようにできる。
INSERT
やUPDATE
,DELETE
をした場合、merge元とmerge先のテーブルの両方のデータが更新される。
merge先のテーブルがインデックスをもつ場合、merge元のテーブルも必ず同じインデックスを有している必要がある。
merge先のテーブルにINSERT
する場合、INSERT_METHOD
オプションでどのテーブルに挿入するかを決定する。
例
CREATE TABLE t1 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) ENGINE=MyISAM; CREATE TABLE t2 ( a INT NOT NULL AUTO_INCREMENT PRIMARY KEY, message CHAR(20)) ENGINE=MyISAM; INSERT INTO t1 (message) VALUES ('Testing'),('table'),('t1'); INSERT INTO t2 (message) VALUES ('Testing'),('table'),('t2'); CREATE TABLE total ( a INT NOT NULL AUTO_INCREMENT, message CHAR(20), INDEX(a)) ENGINE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;
参考
FEDERATED
別のネットワークのMySQLデータにアクセスし、あたかもローカルがDBを持っているかのように振る舞うことができる。
これによって、簡易的なマスター-スレーブ構成が作れる。
参考
EXAMPLE
自作のストレージエンジンを作成するための例として存在する。
クエリを発行できるが、SELECT
やINSERT
はできない。
参考
XMLHttpRequestと後継のfetch APIについて
XMLHttpRequest
XMLHttpRequestは、urlを指定してリクエストを送信することができる機能である。
基本的な使い方は以下の様になっている
const xhr = new XMLHttpRequest(); xhr.open('GET', 'http://~~~'); xhr.send(); xhr.onload = () => { console.log(xhr.response); }); xhr.onerror = () => { console.log('error'); }
open()
で対象urlを指定する。このとき、POSTとGETの2種類から選択する
send()
が実際に実行する部分
onload
は、実行が完了したあとに処理される部分
ただし、この処理のあとに、onloadした結果を使いたいとなった場合、その処理が完了するのを待たなくてはいけない
なにも考えずに使うとonloadの処理中に次にいってしまうため扱いづらい
fetch API
fetch APIは、よりシンプルに記述できるようになったもの
IEでは使えなさそう(Edgeは使えそう)
https://caniuse.com/#search=fetch
使い方は以下の様になる
fetch('http://~~~').then((response) => { console.log(response.status); }).catch(() => { console.log('error'); });
メソッドチェーンを作って記述できるので、確実に処理の流れをつかんで記述できる
メソッドチェーンを作らずに async/await
を使うことで、よりきれいに書くことができる
(async() => { try { const response = await fetch('http://~~~'); console.log(response.status); } catch (e) { console.log(e); } })();
外部から関数化して呼び出す場合は以下のようにする
const func = async() => { try { const response = await fetch('http://~~~'); console.log(response.status); } catch (e) { console.log(e); } }
async/await
を使うことで、よりスマートに書くことができる
参考文献
XMLHttpRequest
- 第12回 XMLHttpRequest入門:これでできる! クロスブラウザJavaScript入門|gihyo.jp … 技術評論社
- XMLHttpRequest の使い方 - WebOS Goodies