【読書】マスタリングTCP/IP

ループを検出するための技術

ブリッジでネットワーク接続するとき、ループを作るとフレームが次々コピーされて永久に増え続けてメルトダウンすることがある。

  • スパニングツリー

1〜10秒間隔でBPDU(Bridge Protocol Data Unit)と呼ばれるパケットを交換し、

使用するポートと使用しないポートを決めループを消すように制御する。

  • ソースルーティング

送信先コンピュータがどのブリッジを経由してフレームを流すか決定する。

フレームのRIF(Rooting Information Field)に書き込み、ブリッジがその除法を元に配送処理を行う。

PPP(Point to point protocol)

1対1でPCを接続するデータリンクプロトコル。データ通信を開始する前にPPPレベルでコネクションを確立する。認証や圧縮、暗号化などの設定を行う。

  • LPC

コネクションの確立や切断、パケット長、認証プロトコルの設定、通信品質の監視を行うかの設定を行う。

  • NCP

上位層に依存する。上位層がIPのときのNCPがIPCPである。IPアドレスの設定やヘッダを圧縮するかなどの設定を行う。

認証方式ではPAPとCHAPの二つがある。

  • PAP

コネクション確立時に一度だけIDとパスワードのやりとりを行う。平文で行われるため登頂の可能性がある。

  • CHAP

毎回パスワードが変更されるOTP(Once Time Password)を使用して盗聴を防ぐ。

通信中を定期的に交換を行い、相手が変わっていないかを確認する。

ルーティングプロトコル

スタティックルーティングとダイナミックルーティング
スタティックルーティングはルータやホストに固定的に経路情報を設定する。ダイナミックルーティングはルーティングプロトコルを操作させ自動的に経路情報を設定する。EGP(Exterior Gateway Protocol)とIGP(Interior Gateway Protocol)に分類される。EGPは地域ネットワークやプロバイダ間の経路制御が行われ、IGPによって組織内部の経路制御が行われる。EGPにはBGP(Border Gateway Protocol)が利用され、EGPにはRIP(Routing Information Protocol)、RIP2、OSPF(Open Shortest Path First)などが利用されている。
RIP
①経路制御情報をブロードキャストする。
30病周期で経路情報をブロードキャストし、6回(180秒)待ってもこない場合は接続が切れたと判断する。
②距離ベクトルにより経路を決定する。
距離(メトリック)の単位はホップ数(通過するルータの数)。できるだけ少ない数のルータを経由して目的のIPアドレスに到達できるように制御される。
③サブネットマスクを使用した場合の処理
サブネットマスクの情報は交換しないが、サブネットマスクを使用しているネットワークでも使用することができる。インターフェースに割り付けられているIPアドレスからクラスで判断したネットワークアドレスを求め、経路制御情報で流れてきたアドレスからクラスで判断したネットワークアドレスを求め、両者が同じネットワークアドレスとなった場合には、インターフェースに付けられているネットワークアドレスの長さと同じと見なす。異なる場合はそのIPアドレスをクラスで判断したネットワークドレスとして扱う。クラスで判断して異なるネットワークアドレスがある場合、ネットワークアドレス長が異なるネットワークを作るときは注意が必要。
④経路が変更されるときの処理
過去にルータに伝えた情報をネットワークが切断された後にも逆に教えられることで経路情報が無限に増える無限カウントが起きる。この問題を解決するために距離16を通信不能とし、さらに経路を教えたインターフェースには教えられた経路情報を流さないストリップホライズンと呼ばれる処理がなされる。
RIP2
RIPが改良されたもの。主な違いはマルチキャストを使用し、トラフィックの負荷を軽減する点、サブネットマスクの情報も組み込みサブネットマスク長の異なるネットワークにも対応している点である。
###OSPF
ルータがネットワーク全体の接続状態を理解して経路制御表を作成するリンク状態型のルーティングプロトコルのためループのあるネットワークでも安定した経路制御が可能。サブネットマスクに対応することで可変長サブネットで構成されたネットワークの経路制御が可能。エリアの概念(論理的な領域)を導入し不必要なプロトコルのやり取りを減少させる。OSPFでは各リンクに重みをつけることが可能であり、このコストが最小になるように経路制御される。OSPFでは役割ごとに5つのパケットを用意している。
・HELLO:隣接ルータの確認、指名ルータの決定。10秒に1回送信され接続が切れたと判断したらリンク状態更新パケットを送信する。
・データベース記述:データベースの要約情報(各ルータの経路制御情報同期用)
・リンク状態要求:データベースのダウンロード要求(要約情報が異なっていた場合)
・リンク状態更新:データベースの更新情報
・リンク状態確認応答:リンク状態更新の確認応答(更新情報を受けたら返す)
リンクコストに基づいてルートを選択する場合、ルータの性能やハードウェアの信頼性は考慮されなおので管理者によるコスト割り当てが必要となる。

アプリケーションプロトコル

遠隔ログイン

TELNET
ルータや高機能スイッチなどの設定を行うときに使用
行モード:改行キーが入力されるたびに1行分のデータをまとめて送る。
透過モード:入力された1文字ごとにサーバに送信する。

SSH
暗号化された遠隔ログインシステム。
より強固な認証機能を利用可能。
ファイルの転送が可能。
ポートフォワード機能(特定のp−と番号に届けられたメッセージを特定のIPアドレス、ポート番号に転送する仕組み)を利用可能。

FTP
制御用(21番)、転送用の2つのポートが利用される。
制御用コネクション上でPUT、GET、LISTといったコマンドが実行されるたびにデータ転送用のコネクションが確立される。

【読書】絵で見てわかるSQL Serverの内部構造

第1章 SQL ServerによるCPUリソースの使用

SQLOSスケジューラ
WINDOWSスケジューラにすべてのスレッドの管理を全て任せると、
待機中のSQL ServerにCPUリソースが割り当てられることがあり効率が下がる。
(ロック獲得待ちのスレッド、子スレッドの処理を待っている親スレッドなど)

Windowsスケジューラの配下にありながら、効率的にCPUリソースを使用する仕組みがSQLOSスケジューラ
SQL Server起動時にCPU数(コア数)と等しい数のスケジューラが作成される。
スケジューラがワーカの管理を行う。

ワーカ:
クライアントからのクエリは最終的に一つ以上のワーカに関連付けられて処理される。

ワーカスレッドプール:
各スケジューラで使用可能なワーカ数を管理する。
ワーカの最大数は「max worker threads」の設定値に依存する。
デフォルトで255個。
ワーカ使用要求があると、最大数に達していない場合は新たに作成され、
上限に達している場合はランナブルキューに追加され待機状態となる。

ランナブルキュー:
各スケジューラは一つのランナブルキューを持っている。
2つ以上のワーカが実行可能状態だった場合キューに追加され使用可能になるのを待つ。

ワークリクエストキュー:
ワーカ数が不足した時このリストに追加され、使用可能になるのを待つ。
ワーカ不足の一般的な要因はブロッキングや過度の並列処理。

I/Oリクエストリスト:
I/Oリクエストを要求したワーカは完了するまでこのリストに追加される。

ウェイターリスト:
ワーカ処理実行時に必要となるSQL Server内のリソースを確保できない場合にワーカはこのリストに追加される。
ロックやラッチが起きた時。ラッチとはページやアロケーションなどの物理的な単位に対して行われる。

第2章 SQL Serverが実行するI/O動作

管理するデータベースの実態
データファイル(.mdl, .ndf)とログファイル(.ldf)が存在する。

データファイル:
ユーザが参照・挿入・更新・削除を行うデータ本体。
8KBのブロックに分割されていて、ブロックは「ページ」という論理的な単位で管理されている。

ログファイル:
実行した更新内容を記録している。
先行書き込みログとなっており、トランザクションとデータの整合性を保つために
先にログに書き込み、その後処理を行う。必ず時系列順となる。

データベースへのアクセスパターン
・オンライントランザクジョンシステムの場合(OLTP)
多数のクライアントがアクセスを行い、それぞれが必要とする小規模データの操作を行う。
類似する小規模なトランザくジョンが多数存在する。
・意思決定支援システム(DSS)
データベースに蓄積されたデータを、経営戦略のためなどに様々な視点からの分析に使用する。
多くの場合結果としてデータファイルへ順次アクセスする傾向が強い。

先行読み取り(Read-Ahead)
実際の読み込み要求が発生する前にバッファキャッシュにデータを読み込むこと。
実際に読み込み要求が発生した際にI/Oのオーバーヘッドを緩和する。

チェックポイント(Check point)
以下、データ更新のフロー
先行書き込みログ操作⇨バッファキャッシュ上のデータが更新(論理書き込み)⇨物理ディスクに書き込み(物理書き込み)
まだ物理書き込みが行われていないバッファキャッシュ上のデータをダーティページと呼ぶ。
チェックポイントプロセスと呼ばれる内部コンポーネントが定期的にスキャンを行い、
ダーティページを物理ディスクに書き込む。

集中書き込み(Eager Write)
大量のデータを書き込む場合、大量のログ書き込みが発生し、
この処理がボトルネックとなりスループットを低下させることがある。
その場合に備えて一括操作と呼ばれる選択肢が存在する。
個別の更新データに対してログを書き込まなくなり、最小限のデータだけログに記録される。
一括操作が実行されるとバッファキャッシュ上に大量のダーティページが発生する。
このダーティページを物理書き込みする操作が集中書き込み。

レイジー書き込み(Lazy Write)
将来的なデータの読み込みに備えて、参照された頻度が最も低いバッファキャッシュ上のページを初期化する。
そのページがダーティページだった場合は物理ディスクへ書き込みを行う。

第3,4章 SQL Serverのメモリ管理

仮想アドレス空間の状態
・Committed
仮想アドレス空間で実際に使用されている領域。
この領域に対してはOSが物理メモリの領域を割り当てている。
・Reserved
後の使用に備えて仮想アドレス空間が予約済みとなっている状態のこと。
この状態では物理メモリは一切与えられていない。
SQLサーバで設定されたメモリ使用量は起動時に必要な分だけcommittedされ残りはReserved状態となる。
・Free
文字通り自由な割り当てが可能。
物理メモリ以上のサイズをReserved, Committedの状態にせず残りはFreeとなる。

ページング
SQL Serverの使用するメモリをページファイルへ書き込むことを抑制するために
「Lock Page in Memory」特権を
SQL Serverの起動アカウントに追加すればページング対象になることを避けることができる。

メモリ使用量
デフォルト設定の場合「物理メモリのサイズ-5MB」まで拡張される。
上限を設定する場合以下のコマンドを実行する。
exec sp_configure ‘max server memory’, 1024 — 最大値をMB単位で設定する。
go
reconfigure

バッファキャッシュ領域
・データキャッシュ
バッファキャッシュの大部分を占める。
DBのデータページやインデックスページを読み込んでキャッシュするために使用される。
各データページが持つ固有の値を基にハッシュ値が生成され、ハッシュバケットと呼ばれるページへ格納される。

・プロシージャキャッシュ
クライアントが実行したクエリは最適な形で処理されるようにコンパイルされ、
クエリプランに変換される。
一度コンパイルされたクエリプランは同じクエリが再度実行された時に備えてプロシージャキャッシュに保存される。

MemToLeave領域
8KBよりも大きなメモリブロックを使用する場合MemToLeave領域が使用される。
・SQLCLR
・拡張ストアドプロシージャ
・スレッドスタック
解放タイミングは不要になったらすぐに解放される。

第10章SQL Serverとネットワーク

通信の際SNI(SQL Server Network Interface)と呼ばれる層がTCP/IPや名前付きパイプといったプロトコルを抽象化。

上位層ではプロトコル間の差異を意識する必要がない。

複数のプロトコルの優先順位を設定して何らかのトラブルで特定のプロトコルで通信できなくても別のプロトコルで接続を試行する。

接続時にクライアント側で特定のプロトコルを指定することも可能だが、何らかの原因でそのプロトコルを使用して通信できない時に

問題が解決するまで通信ができなくなる。

・TCP/IPの場合

sqlcmd -E -Stcp : SQL1¥Instance1

デフォルトインスタンス

明示的に変更されない限り、常にポート番号1433を使用してクライアントからの接続を待ち受けている。

名前付きインスタンス

クライアントから接続要求を待つポートが複数。動的に決定される。

インスタンス起動時に未使用のポートを確認して自身に割り当てる。

クライアントが接続先のインスタンスを発見するのが容易ではない。

クライアントは接続時にSQL Server Browserサービスに必要な情報を問い合わせて接続に行く。

2度目以降はキャッシュされた情報を利用。

 

【覚書】メンテナンス・トラシュ用コマンド

・CPU状態確認
dbcc sqlperf(‘umsstats’)

・ディスクIO確認
dbcc sqlperf(‘waitstats’)
select * from sys.dm_os_wait_stats

・メモリ使用量確認
dbcc memorystatus go

・メモリ最大使用量設定
exec sp_configure ‘max server memory’, 1024 — 最大値をMB単位で設定する。
go
reconfigure

・キャッシュクリアコマンド
dbcc DROPCLEANBUFFERS — データキャッシュの削除
dbcc FREEPROCCACHE — プロシージャキャッシュの削除

・セッション確認
select * from sys.dm_exec_session

・コネクション確認
select * from sys.dm_exec_connections

【読書】絵で見てわかるOracleの基本

Oracleのプロセス

サーバプロセスとバックグラウンドプロセス
サーバプロセス:SQL文を処理するプロセス。
バックグラウンドプロセス:裏方で処理する。ログの書き込み等。

DBWR:更新済みのデータをキャッシュからディスクに書き出す。COMMITのタイミングでは書き出されず、時間をかけて書き出される。大規模なシステムやディスクへの書き込みが追いつかない場合複数のDBWRが起動されると性能が向上する。特に非同期I/Oが使えない環境で効果的である。

LGWR:COMMITの時に REDOログを書き出す。COMMITがなくても3秒に1回「rdbms ipc message」をタイムアウトしてログバッファのデータを書き出す。

PMON:メモリとプロセスの掃除屋。サーバプロセスが異常終了した場合にメモリやプロセスの片付けを行う。内部ロックやメモリを持っていたら解放する。約1分に一回行われそれ以外はスリープしている。

SMON:表領域内で隣り合う空き領域をくっつけて理12時間に1回UNDOの数やサイズを調整したり途中終了してしまったトランザクションをロールバックしたり、1次セグメントを掃除したりする。

ARCH:アーカイバプロセスはREDOログファイルをアーカイブするプロセス。保管されたREDOログファイルをアーカオブREDOログファイルという。アーカイブREDOログが作成されるまでREDoログファイルを再利用できないため動作が止まってしまうと大問題になる場合が有るプロセス。通常は「rdbms ipc message」という待機イベントでスリープしている。

RECO(リカバラー):分散トランザクション(複数のデータベースにまたがるトランザクション)の解決を行う。

CKPT(チェックポイント):テェックポイント(バッファキャッシュの変更済みデータをデータファイルに反映させる作業)の際、データファイルのヘッダにデータを書き込むプロセス。

キャッシュと共有メモリ

キャッシュをプロセスごとにもつと無駄が多く、他のプロセスが変更したデータを見られないといった不都合が生じる。
どのプロセスからも見ることができるメモリをキャッシュとしている。共有メモリを使用すると即座に他のプロセスからも見えるようになる。

SGA
PGA

共有メモリの設定

設定ファイルinitXXXX.oraを編集する。

「DB_CACHE?_SIZE」のパラメータを変更する。デフォルトでは48MByteが設定されている。

可能であれば数百MByte割り当てておきたい。

きょうゆうめもりはキャッシュだけでなく、共有プールやログバッファも存在する。

キャッシュに用いられるアルゴリズムはLRU。

キャッシュは読み込みだけでなく書き込みにもしようされる(DBWR等)。

 

SQL文解析と共有プール

オプティマイザ(パーサ)がSQL文をかいせきして実行計画を作っている。

コストベース;処理時間、I/O回数が最小になるものが最上

•SQL文の情報

•表やインデックスの統計情報(データ量、最大値、最小値、データ分布)

•パラメータの情報(ソートメモリのサイズ、シーケンシャルアクセスのサイズ)

•システム統計情報(CPUのクロック数、この環境のI/O性能)

例〕バインド変数を使用する。

→同じSQL文となればキャッシュが残っていれば解析が行われず、リソースの無駄がなくなる。

Oracleの起動

•NOMOUNT

初期化パラメタを読んでバックグラウンドプロセスと共有メモリ(バッファキャッシュや共有プール)の確保をする。バックグラウンドプロセスと共有メモリの事をインスタンスと呼ぶ。

•MOUNT

初期化パラメータファイルの記述にある制御ファイルの位置を確認しファイルを開く。データベースを構成するファイルの場所を知るだけなのでファイルがなくてもエラーにならない。

•OPEN

データファイルや、REDOログファイルに問題がなければ(内部的に使用するデータに辻褄が合っていれば)データを読み書きできる状態にする。

Oracleの終了

•データベースをクローズ

•インスタンスの停止

共有メモリの解放とバックグラウンドプロセスの終了。

書き込まれていない変更済みファイルをデータファイルに書き込む。

•デフォルト

接続の終了、データファイルへの書き込みを待つ。

•transaction

 

 

【読書】TCP/IP解析とソケットプログラミング

TCP

コネクション型でのエンドツーエンド間を接続するためのトランスポート層のプロトコル。信頼性を考慮しているため順序制御、ウインドウ制御、再送制御、フロー制御など上位アピリケーションに信頼性を提供している。

順序制御

FTPなどのプロセスからのデータをセグメントに分割して相手ホストに送信する。信頼性のために全てのセグメントに応答確認が必要である。1セグメント毎に応答を待つ。

ウインドウ制御

1セグメント毎に応答確認を待っていると通信性能が悪くなることがあるので、ウインドウという概念を取り入れて送信したセグメントの応答確認を待たずに複数のセグメントを送信することで通信性能を向上させている。

再送制御

ウインドウ制御をおこなっている時に、下位IP層はコネクションレスのためにセグメントが失われる可能性があるのでセグメントの再送を行う制御がある。受信側重複応答確認を送り次のセグメントを催促する。3回同じ応答確認を受けたらセグメントを再送する。

フロー制御

ウインドウ制御をおこなっている時に、受信側がセグメントを取りこぼすことがある。取りこぼすと送信側は再送しなくてはならず、処理効率が悪くなる。そのため受信側が応答確認時にWINDOWフィールドの値を制御することにより相手の送信データ量を規制する。受信側のバッファに余裕ができるまでデータ転送は中断され受信側からのウインドウ更新通知によりデータ転送が再開される。ウインドウ更新通知自体が紛失する可能性があるため送信側からウインドウプローブを時々送信し、受信側の状態を確認している。

コネクション型プログラムの通信の流れ

データを送受信する順番が決まっていないプログラムに多く使われる。

サーバプログラム

  1. サーバプログラムでソケットを作成し、それに名前をつける(bind)。ソケットに名前をつける時に使用するポート番号とプロトコルを決定する。ソケット作成にはアドレスファミリ、ソケットタイプ、プロトコルの情報が必要。TCPの場合ソケットタイプはバイトストリーム(連続したデータ)、アドレスファミリはインターネットアドレスファミリを設定する。ソケットを作成するとシステムからソケット記述子が得られる。
  2. クライアントからの接続要求を待つ(listen)。具体的には、クライアントからの接続要求をシステム側で保持するためのキューを用意する。
  3. クライアントから接続要求がきたら受け入れる(accept)。受け入れができると新しいソケット記述子を返す。

クライアントプログラム

  1. ソケットを作成しサーバの名前またはIPアドレスを探す(getbyhostname/getbyhostaddr)。getbyhostnameはホスト名からIPアドレスを取得するときに使用。DNSサーバやhostファイルが存在するときに有効。
  2. サーバへ接続要求する(connect)。connectが完了すると、サーバとの仮想回線が確立したことになる。回線が確立すると両方のプログラムがソケットに対して送受信することができる。

データの送信

送信側でデータをすべて送出できたか判定する責任がある。sendで送出できたバイト数が帰ってくるので 、送りきっていなかった場合は再送する必要がる。

データの受信

送信と同様にデータを読み込み終えるまでrecvしなければならない。TCPの上位プロトコルによって確認する必要が有る。受信データを待機する場合、1つのクライアントにrecvをだしてデータが送出されるまでrecvの制御が帰ってこなければ他のクライアントからの接続要求やsendに応えられない。待機方法としては割り込みや、ポーリングなどがある。様々な解決方法があるのでプラットフォーム毎に適切な対策をする。

ストリームデータの扱い

データに境目がない分期待したデータよりもたりなかったり、余分にデータを受信することがよくある。少ない場合:受信プログラムは受信データのヘッダと送信プログラムが先頭に付与したデータ長と比較する。たりない場合はバッファの先頭アドレスに受信したデータ分のアドレスを付与してそこから受信するようにTCP/IPへRecvを発行する。多い場合:再度Recvを発行せず、次のデータとして処理を行う。

クライアントプログラムからソケットを閉じる(勝手にソケットを破棄するのは良くない)。

①FINパケットを送る。送信するデータがなくなった側がFINパケットを送信する。FINを受信した相手は送信するデータがなければFINパケットを送信。残っていたら全部送信してからFINパケットを送信。

②RSTパケットを送る。強制的にその時点のコネクションが消滅する。

  1. クライアント→サーバ:sendの禁止
  2. 滞留しているすべてのデータをrecvする。
  3. ソケットを終了する(closesocket)。

コネクションレス型プログラムの通信の流れ

データグラムとして送受信するプログラムに使用される(データを受信したら送信する等順番が決まっているもの)。サーバとクライアント間で接続を確立せずにデータの送受信ができる。データを送受信するたびに識別情報をつけて送る。通信が終了したら両方のプログラムでソケットを閉じる。

【読書】C言語入門書の次に読む本

C言語入門書の次に読む本」を読んだので勉強になったことなどのメモ。

バグを出さないために

1.1つのローカル変数を複数の目的に使用しない

めんどくさくても、新しく変数を宣言して使用することで、デバック時、拡張時など結果的に時間短縮につながる。

2.関数の引数を複数の目的に使用しない

3.malloc()とfree()はセットでできるだけ近くに書く

malloc()で動的に確保されたメモリ領域はアプリケーションの終了とともにOSにより解放されるが、メモリリークを避けるためにできる限り使用しなくなった時点でfree() を使いメモリ領域を開放する。メモリ開放箇所は他人から見た場合わかりにくいものなので必要に応じてコメントを記述する。二重開放をすると意図しないメモリ領域が開放されてしまうので注意する。

4.構造体は作成すると同時に初期化する

初期化を行って返す関数にまとめる。同時に消去用の関数も作成する。nameset()は環境依存であるが、簡素に書くことができる。

5.関連のあるコードは近くに置く

追加忘れなどを防ぐことができる。

6.キャストは少なく/多く

コンパイラの持つ型チェック機能を無効にしてしまうので。必要最低限に。必要であれば明示的に書くべき。

(例)徐算を行うとき。

a+=1.0/a[i]

b+=(double)(i+1)/a[i]

7.開放したらNullクリア

関数の先頭で引数のNullチェック。

8.有用なコメントを記述する

アルゴリズムとデータ構造を明確にし、処理の概要と目的をある程度まとまった単位で書いておく。

(例)「…の時は…のように動作する」、「本当は…したいのに…理由で…している」

デバックの方法

1.コンパイル時の注意点

gcc xxx.c -0-wallでコンパイルする。

warningはあってもコンパイルは徹がバグに直結するので基本的にゼロになるまで潰していく。

2.分割コンパイルについて

 

Webフォント「Font Awesome」を使ってみた

Font Awesomeとは

スクリーンショット 2015-01-15 22.35.38

通常Webブラウザは端末にインストールされているフォントを呼び出して文字を表示します。ですが、端末にインストールされていないフォントが指定されていた場合、意図されていた通りにページを表示することができません。そこで登場したのがWebサーバー上にフォントファイルを置き、Webデザイナーの意図するフォントを表示できるようにしたWebフォントと呼ばれる技術です。Webフォントで表示できるのは文字だけではなく、アイコンをフォントとして使用することも可能です。Webアイコンフォントはフォントとして使用できるので大きさや色の変更が簡単にできます。代表的なWebアイコンフォントにFont Awesomeがあり、今回試しに使ってみました。

使い方

Font Awesomeの使い方には、必要なファイルをダウンロードして使用する方法とCDN(Contents Delivery Network)を利用する方法があります。

今回はCDNを利用して使ってみます。headタグの中に以下の記述をすればOKです。

<link href="http:</span>//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.min.css>

続けてbody要素の中身です。HTML5のマークを表示してみます。

スタイルシートでプロパティ設定を行えば、大きさ、色の変更ができます。

アイコンの種類はFont Awesomeから参照できます。

すでにたくさんのアイコンが用意されていますが、これからまだ増えていきそうです。

大きさ、色の変更ができました。

他の要素と組み合わせたり、アニメーションをつけたりすれば様々な場面で使用することができそうです。

 

【調査】レンダリングのパフォーマンス

Chromeの開発者ツールを使って、レンダリングのパフォーマンスを調査しました。快適にwebサイトを閲覧するために、ページの読み込みスピードは重要な要因の一つで、フロントエンド側でもパフォーマンスを考慮する必要性は大きいと思われます。ページの読み込みの中で時間がかかる物の一つに画像の読み込みがあります。一般的に画像を使わずにスタイルシートを使って表現できれば処理の性能があがり、またJavaScriptからアクセスすることもでき便利であるとは言われていますが、どの程度違いがあるのか今回検証してみました。

開発者ツールの使用方法

Chromeで、右クリックから「要素の検証」をクリック、もしくはF12キーから開発者ツールを起動できます。Chromeの開発者ツールでは左側のウインドウでHTMLの構造の確認や変更を行うだけではなく、スタイルシートのプロパティ変更を右側のウインドウで動的に行うことができ、効率的に開発を行うために大変便利です。様々な機能が用意されているのでテキストエディタを使用せずに、開発者ツールからページを作ることも可能です。

スクリーンショット 2014-12-21 21.37.44

読み込みスピードの検証

開発者ツールのTimelineでは、ページのローディンングやレンダリングにかかる時間を調べることができます。使い方は、左上の丸いボタンを押下すると計測が始まり、もう一度同じボタンを押下するまでに行った処理にかかった時間を計測して、タイムライン上や、円グラフで確認することができます。わずかな時間でも読み込みにかかる時間を短縮するためにとても便利そうです。

 

スクリーンショット 2014-12-21 21.38.41

 

今回は検証のために以下のテスト項目を用意しました。図形を表示するときにスタイルシートを使うべきか、画像を貼付けるべきか、もしくはSVGやCanvasを使うべきか開発するエンジニアの好みで決めてしまっていることが多いと思われます。

【テスト項目】
・CSSのプロパティで表示
・image(png)をはりつけ
・svgで表示
・Canvasで表示

CSSのプロパティで表示

25×25pxのdiv要素の個数と描画にかかる時間を調べました。この検証ではCSSのプロパティで背景色を指定しています。横軸がdiv要素の個数、縦軸がページをリロードするときにかかった時間をレンダリング時、ペインティング時それぞれを示しています。要素数が増えるに従ってリロード時間は増加傾向にありますが、81要素で2.25msとなっています。

css

 

 

ing要素でpng形式の画像を表示

次にimg要素を使って25×25pxのpng形式の画像を読み込んでみます。グラフを見てみるとほぼ同じ画面を表示するのにcssで表示した時の倍ほど時間がかかっていることがわかります。レンダリングよりもペインティングに時間がかかっているというよくわからない現象も起きているので、もしかしたら検証の仕方も良くないかもしれません。

 

img

 

SVGを使用して画像を挿入

SVG(Scalable Vector Graphics)はグラフィックスを描画する機能の一つで、拡大してもが図が荒くならない、XMLで記述されるためJavaScriptからDOMにアクセスできると行った特徴があります。同じように25px×25pxのSVG形式の画像を描画して検証してみました。

 

svg

 

 

今回の検証ではCSSのプロパティの設定で描画した場合と描画にかかった時間はほとんど同じであることがわかりました。

Canvasを使用して描画

Canvasはブラウザ上でグラフィックスを描画するための機能です。線を引く、短形で塗りつぶすといった描画用のAPIで<canvas>要素に対して描画を行います。

 

canvas

 

 

興味深いことにSVGと比較してペインティングには時間がかかっていますが、描画する要素の数が増えても描画にかかる時間はあまり変わりませんでした。

 

総合評価

最後に100個の要素に対して、ローディングとスクリプティングにかかる時間も含めて比較します。

hikaku

総合的に比較してみるとCSSとcanvasはほぼ同じだったのに対して、png形式の画像を読み込んだ場合に最も時間がかかっていることがこの結果からもわかりました。また、画像を読み込んだ場合loadingに最も時間がかかっている事がわかります。

 おわりに

これまでCSSのプロパティ、img要素で画像を指定して張りつけ、SVG、Canvasの4つの方法で図形を描画し、その処理速度を検証してきました。結果としてはimg要素で画像を貼付けた場合少し他の手法と比較して時間がかかることがわかりました。SVGは少し時間はかかるけどベクトル画像なので拡大しても画像が荒くならなかったり、CSSは描画に時間がかからず、JavaScriptのコードを書かずに描画できるなど、それぞれ特徴があるので用途に合わせて使い分けるのが良さそうです。img要素を使って画像を張る場合もCSSなどでは表現できない物もあるのでそういったときには積極的に使用すべきだと思います。スクリプトを読み込む位置や外部ファイルに記述するべきか、CSSスプライトの効果も今後検証してみたいと思います。

[追記]

図形を描画する際に考慮するべき事として、CPUやメモリの使用率も考慮しないといけない場合があります。通信速度がある程度速ければ画像を貼り付けてしまうのが適切な場合もあるので、どの手段が良いのか一概には言えず、それぞれのメリット、デメリットを考慮して選択していかなくてはいけません。

【調査】Chromeのkioskモード

Chromeを起動時に全画面表示する方法です。通常必要となる機能ではありませんが、Webアプリケーション作成時に必要となったので調査しました。

kioskモードとは

Chromeには、起動時のオプションとしてkioskモードがあります。このオプションを使用する事で、起動時に全画面表示(フルスクリーン)することができます。

起動オプションの設定方法と種類は下記のサイトにて記述されています。

http://chrome.half-moon.org/43.html#u1525a8d

kioskモードによる制約

kioskモードを使用する事で、起動時全画面表示が可能となりますが、通常使用できる機能が使用できなくなる事があります。

その一つにF11キーの無効化があります。

F11キーには通常全画面表とその解除機能が割り当てられています。

F11キーの機能を残したい場合、もしくは別の機能を割り当てたい場合これは大きな制約となります。

解決方法

試しにJavaScriptでキーの割当てみます。


document.onkeydown = keyevent();

function keyevent()

{

if (event.keyCode == 122) {

console.log("F11キーが押されました!");

}

この方法では、イベントを受け取る事ができず、メッセージは表示されません。

散々足止めを食らいましたが、下記サイトにて解決方法が書いてありました。

Stack Overflow : http://stackoverflow.com/questions/17570846/f11-in-kiosk-mode-in-google-chrome

海外版の知恵袋的なサイトのようです。

このサイトによると、Chromeでは、Key Downによるイベントのみ無効化されるので、Key Upを使えばイベントを取得できるとの事でした。

Key Downはキーが押し下げられた時のイベントを取得し、Key Upでは、キーを押した後、離されたときにイベントを取得します。

ですので、先ほどのコードを以下のように書き直せば動くはずです。


document.onkeyup = keyevent();

function keyevent()

{

if (event.keyCode == 122) {

  console.log("F11キーが押されました!");

}

今回は単純にkeydownではなくkeyUpに処理を割り当てれることで解決できました。日本語のサイトだけだとどうしても情報量が少なく、解決できない事がありますが、海外のサイトまで広げると多くの情報を得る事ができそうです。

 

DMLを使用した表の管理

□NULLを設定する際謝ったinsert文を選ぶ。

<MEMBER表>

mID mName age

A.  insert into member (mID, age) values(10, 17);

B.  insert into member values(10, ,17);

C.  insert into member values(10, NULL, 17);

D.  insert into member values(10, DEFAULT 17);

 

【解答】;

構文:INSERT INTO 表名[列名,列名…] VALUES (値,値…)

INSERT文でNULLを設定する方法には3つある。

・列リスト内の列指定を省略する。

・VALUE句でNULLを指定する。

・列のデフォルトがNULLの場合、DEFAULTキーワードで列のデフォルト値を指定する。

 

□UPDATE文に関する説明として正しいものを選ぶ。

A. WHERE句を省略すると一件も更新されない。

B. SET句では1つの列しか指定できない。

C. SET句では別表を参照する副問い合わせを使用できない。

D. 1つのUPDATE文で複数行を更新できる。

 

【解答】;

構文:UPDATE 表名 SET 列名=値[,列名=値…] [where 条件];

・同時に複数行更新できる。

・WHERE句を省略するとすべての行が更新される。

・SET句を使用して、別表に基づく行の更新を行う事もできる。

・SET句を使用して、複数列を更新する事ができる。

 

□Member表から全データを削除するDELLETE文として正しいもの(2つ)

A. delete Member;

B. delete * from Member;

C. delete from Member where 1 <> 2;

D. delete from Member where 1 = 2;

 

【解答】;

構文:DELETE [FROM] 表名 [WHERE 条件];

・同時に複数行削除できる。

・WHERE句を省略するとすべての行を削除する。

・WHERE句を使用すると、条件に一致した行のみ削除する。

・条件に一致する行がない場合は、0行削除のメッセージが表示される(エラーではない)。

 

AはWHEREの省略形で正しい。Cも常に条件が正しくなるので全行削除される。

 

□行の削除を行う場合、DELETE文ではなくTRANCATE文を使う必要がある場合はどのような時か?

A. 削除した行をロールバックする。

B. 一部の行を削除する。

C. 削除トリガーを起動する。

D. 他のオブジェクトのために、ディスクスペースをあける。

 

【解答】;

構文:TRANCATE TABLE 表名 [CASCADE];

・表からすべての行を削除する

・DDL文なので削除できないが、ロールバック情報を生成しないので、DELETE文を使用するより処理が早い。

・表が使用していた領域は、解放され他のオブジェクトで最利用可能となる。

・削除トリガー(データベース内に格納され、イベント時に暗黙的に実行されるプロシージャ)を起動しない。

・FOREIGN KEY(参照整合性)制約の親表を切り捨てる事ができない。ただし、ON DELETE CASCADEオプションを指定したFOREIGN KEY制約の場合のみ、CASCADEキーワードを使用して、親表を切り捨てできる。

 

□トランザクションが終了しないイベントはどれか(2つ)

A. COMMIT文の実行

B. SAVAPOINT文の実行

C. 「ROLLBACK TO セーブポイント名;」の実行

D. DDL文の実行

E ユーザによるSQL Developerの終了

F. マシン障害またはシステムクラッシュ

G. DCL文の実行

 

【解答】
・トランザクションとは、関連する更新を行うDML文の集まり。

以下の場合にトランザクションは終了する。

・COMMIT文、ROLLBACK文が実行時。

・DDL文、DCL文の実行時暗黙的にCOMMITが実行される。

・SQL*PlusおよびSQL Developerなどのデータベースを更新しているアプリケーションの終了時

・システムクラッシュ時

 

セーブポイントとは、1つのトランザクションの中で部分的にロールバックするための機能。SAVEPOINT文でセーブポイントを設定し、「ROLL BACK TO セーブポイント名;」でセーブポイントまでロールバックする。

DDLを使用した表の作成

・スキーマオブジェクトでないものを次の中から選ぶ。

A. ビュー  B. 記憶域  C. 表  D. シノニム

 

【解答】

データベースの中で定義及び作成され、利用される物をオブジェクトと呼ぶ。

オブジェクトはスキーマオブジェクトと非スキーマオブジェクトに分類される。

 

スキーマオブジェクト

特定のユーザによって所有される。データの格納や検索のために直接使用される。

スキーマオブジェクト 説明
データを格納する
インデックス データへのアクセスを高速化
ビュー データの表示を制限するためなど
シノニム オブジェクトに対する別名。長い名前を簡略化したり、オブジェクトの所有者を隠したりする。
順序 一意の値を生成
データベースリンク リモートデータベースへアクセス
順序 一意の値を生成
データベースリンク リモートデータベースへアクセス

 

非スキーマオブジェクト

特定のユーザには所有されず、システム全体で共有される。スキーマオブジェクトと同様にデータベースに格納され、SQLで作成および操作されるが、非スキーマオブジェクトとして扱われる。

非スキーマオブジェクト 説明
記憶域 オブジェクトを格納するための領域
ロール アカウント管理のグループのようなもの
ユーザ データベースを操作、作成などを行う者

 

・表の名前としてエラーにならないものを次の中から選ぶ。

A. 英字で始まる名前  B. 同じスキーマの中の他表と同じ名前  C. 32文字の長い名前  D. 数字で始まる名前

 

【解答】

■オブジェクトのネーミング規則

*スキーマ(1ユーザが所有するオブジェクト)の中で一意でなければならない。

*30バイトまで出なければならない

*名前は必ず文字から始まらなくてはならない

*始めでなければ数字、「_」、「$」、「#」は使用可能

*Oracle予約語は使用不可

 

・NUMBER(p,s)型の説明として謝っているものを選ぶ。

A. pは精度であり、10進数桁の総数を示す。指定範囲は「1<=p<=38」である

B. sは小数点以下の桁数を表す。指定範囲は「-84<=s<=127」である

C. NUMBER(p)とすると、小数点データは格納できない

D. pは省略できない

 

【解答】

10進数桁総数を表す「p」は省略する事ができない。

Oracleで使われる主なデータ型を示す。

データ型 説明
VARCHAR2(n) 可変長文字列。1〜4000バイトまで使用可能。「n」を超えるデータはエラーになる。「n」未満の値を入力しても空白が加えられる事はない。
CHAR(n) 固定長文字列。1〜2000バイトまで使用可能。「n」を超えるデータはエラーとなり、超えないデータの場合は空白で埋められる。
LONG/CLOB 可変長文字列。2GB/4GBバイトまで指定可能。
*LONG型は1つの表で1列のみ使用可能。
「WHERE」「GROUP BY」「ORDER BY」句の中で使用不可。
BLOB 可変長バイナリデータ。4GBまで指定可能。
BFILE Oracle Database外のファイルシステムにバイナリデータを格納できる。
NUMBER(p,s) 数値。pは最大38桁までの精度を使用可能。sは位取りを指定。
DATE 世紀、年、月、日、時間、分、秒
日付データは表示、入力の日付書式を指定する必要がある。「DD-MON-YY」
YYは常に現在と同じ上2桁で戻される。
(例)「01-DES-99」→「01-DES-2099」
TIMESTAMP 世紀、年、月、日、時間、分、少数秒
時間を厳密に使用したい場合。
INTERVAL YEAR TO MONTH 年と月の期間
INTERVAL DAY TO SECOND 日、時、分、秒の期間