SSブログ
[PR]本のベストセラー
プログラミング ブログトップ
前の3件 | 次の3件

24時間365日] サーバ/インフラを支える技術 ‾スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ) [プログラミング]

2008年出版の、オープンソースとコモディティな機材を使って、冗長化とスケーラビリティを兼ね備えたシステムを構築する方法。
インストール方法などはネットで簡単に調べられるが、その先の運用におけるこれらのノウハウには苦労したのでまとめたのだそうだ。
株式会社はてなとKLab株式会社による実際にサービスを提供するうえでの事例を扱っているため、より実践的になっている。

冗長化・・・障害が発生しても予備の機材でシステムの機能を継続できるようにすることを指す。可用性を確保するともいえる。

スケーラビリティ・・・利用者や規模の拡大にあわせて、どれだけシステムを拡張して対応できるかという能力。


1章サーバインフラ構築入門

冗長化の基本
 1障害を想定化する
 2障害にs萎えて予備の機材を準備する
 3障害が発生した際に予備の機材に切り替えられる運用体制を整備する。

シンプルなwebサーバー、ルーター、インターネットの構成を考える。

・ルータの故障
 ルータの予備機を用意してきりかえればよい。(コールドスタンバイ)

・Webサーバーの故障
 予備機に切り替えても内容が同じでないといけない。そのためコールドスタンバイは現実的ではない。
 常にネットワークに接続し、内容も同じに保たないといけない(ホットスタンバイ)

フェイルオーバー・・・現用機に障害が発生したとき自動的に処理を予備機に引き継ぐ仕組み。
 VIPで予備機が仮想アドレスを引き継ぐ、ヘルスチェックプログラムでルーターとサーバのVIPを自動的に引き継ぐプログラムの例。

負荷分散(ロードバランス)・・・複数台のサーバに処理を分散させてサイト全体のスケーラビリティを向上させる手法
 予備機になにもさせないのはもったいので、負荷分散で仕事をさせる。サーバ増設のときも古い資源も無駄にならない。
 
Webサーバの冗長化の具体的方法
DNSラウンドロビン・・・DNSを利用して一つのサービスに複数台のサーバを分散させる方法。
 比較的簡単に負荷分散できるが、欠点としては以下がある。
   ・サーバの数だけグローバルアドレスが必要(VIPにすれば解決)
   ・均等に分散されると限らない
   ・サーバがダウンしても気が付かない
実際にフェイルオーバーするときのスクリプト例がのっていた。個々のサーバーにこのスクリプトを乗せる

ロードバランサ(負荷分散機)・・・1つのIPアドレスに対するリクエストを複数のサーバへ分散する。
 この危機がサービス用のグローバルアドレスを持った仮想的サーバとして動作して、クライアントからのリクエストをリアルサーバに中継する。ヘルスチェックはロードバランサで行うので、個々のサーバにフェイルオーバーのプログラムを乗せる必要はないし、どのサーバに処理を割り当てるか制御できる。
 欠点としては、アプライアンス製品は高価であるため収益が確保できない段階では導入に踏み切れないこと。
 安価な構築方法としてLinuxのIPVSを利用したロードバランサの構築方法を紹介。

IPVS・・・Linuxが実装している負荷分散機能を提供するモジュール。L4スイッチ相当の機能を提供する。スケジューリングアルゴリズムを選択できる。
 具体的ソフトウェア
 ipvsadm・・・IPVSの開発元が提供しているコマンドラインツール。
 keepalived・・・C言語で書かれているデーモン(Windosでサービスプログラムのイメージ)
keepalivedを使用した具体的なロードバランサ構築例。

L4スイッチ・・・OSI参照モデルのレイヤ4(トランスポート層)のさす。IPアドレスやポート番号の解析ができる。パフォーマンスがよい。
L7スイッチ・・・OSI参照モデルのレイヤ7(アプリケーション層)を指す。クライアントからリクエストされたURLまで解析できる。柔軟な設定ができる。

L4スイッチの構成例
 NAT構成・・・クライアントからのパケットの送信先を書き換えてリアルサーバに送る。Webサーバからの応答パケットを受け取ってIPアドレスを描き戻す。
 DSR構成・・・クライアントから受け取ったパケットをそのままリアルサーバに送る。リアルサーバはL4スイッチを経由しないで応答を返すことができる。(リアルサーバがグローバルアドレスを処理できる必要がある、リアルサーバのループバックインタフェースに仮想サーバのIPアドレスをわりあてるか、netfilterで仮想サーバあてのパケットを自分あてにDNATする方法が考えられる)

ロードバランサで同じサブネットのサーバを負荷分散する場合はDSR構成にしないと正常に通信できなくなるので注意。

ロードバランサの冗長化
 VRRP・・・ロードバランサの冗長化プロトコル、ベンダ非依存。
   仕組み解説。
    VRRPパケット・・・マスターノードが定期的にマルチキャストアドレスに送出するパケット。仮想IPアドレス、仮想ルータID,プライオリティからなる。バックアップノードはこのパケットが一定期間こないとフェイルオーバーを開始する。
    仮想IPアドレス(VIP)・・・VRRPパケットはすべて同じIPアドレスに送出されるので、どのノードが見分けるのに使う。
    プライオリティ・・・どのノード(バックアップ)がマスタになるか、プライオリティで判別。自分よりプライオリティが高いノードがいたらマスタになるのをあきらめる。(ふぃえるオーバーしない)
    プリエンプティブモード・・・これを無効にすると、すでにマスターになったノードがある限り、自分の方がプライオリティが高くてもフェイルオーバーしない。
    仮想MACアドレス・・・MACアドレスも引き継がないと、通信相手の機器のARPテーブル(ここに通信相手のMACアドレスが入っており、キャッシュが更新されるまで変わらない)の内容と矛盾してしまう。

keepalivedでも利用できるので、ロードバランサをもう一台構築してkeepalivedを走らせれば簡単に冗長化できる。ただしkeepalivedは仮想MACアドレスを使っていないので、gratuitousARPを送出して、通信相手にARPテーブルを更新してもらう。ただし一度ではうまくいかないことがあるのでgrap_master_delay時間待ってから再送出を行う。

keepalivedを冗長化する例紹介。


2章ワンランク上のサーバ/インフラの構築

●リバースプロキシ・・・クライアントからの要求をうけとり(必要なら手元で処理を行った後)適切なWebサーバへ要求を転送する。Webサーバはリバースプロキシに応答を返す。普通プロキシサーバはLAN→WANの要求を代理で処理するが、リバースプロキシはWAN→LANの要求を代理するのでリバースとついている。この機能でクライアントからの要求がWebサーバに届く前後にいろんな処理ができる。動的コンテンツを配信するAPサーバの場合特に有効。

いろんな処理の例
  ・HTTPリクエストのURLをみて、/images/logo.jpgなら画像用Webサーバに、/newsであれば動的コンテンツ生成サーバ(APサーバ)に処理をわりあてる。通常1リクエストに1プロセスまたは1スレッドを割り当てるが、画像のような静的コンテンツまでメモリに常駐させる必要はないのでWebサーバをわけてAPサーバのメモリを節約する。
  ・クライアントのIPアドレスをみて、特定のIPアドレスのみサーバのアクセスを許可する。
  ・クライアントのUser-Agentをみて、任意のUser-Aentからのリクエストを特別なWebサーバへアクセス誘導する・
  ・/hoge/foo/barというURLを/hoge?foo=barというURLに変更してWebサーバへリクエストする。(見た目のURLをきれいにできる)
  ・HTTPのKeep-Alive機能を使ってAPサーバのバッファとして機能する。クライアントとリバースプロキシはKeep-Aliveだが、リバースプロキシとAPサーバの間はオフにする。APサーバよりたくさんのプロセスを立ち上げられる(1000-10000程度)リバースプロキシだからできる。

APサーバ・・・動的コンテンツを返却するWebサーバ。アプリケーションの起動に時間がかかるため、メモリに常駐させる手法をとることが多い。そのため大量のメモリが要求される。普通最大プロセス数は50-100。

HTTPのKeep-Alive・・最初の1リクエストで確率したサーバとの接続をそのリスエストが終了した後も切断せずに維持して、続くリクエストを処理する。複数のファイルをダウンロードするときなど早くなって便利。

Apachでリバースプロキシを構築するには、mod_proxy,mod_proxy_balancerを組み込む。
また、lightepd, Squidでも構築できる。
両方とも具体的紹介あり。


●キャッシュサーバ・・・HTTPはステートレスなプロトコルでドキュメントの状態をもたないためキャッシュしやすい
そのため、プロトコルレベルでキャッシュ機能がある。IEなどで一度取得したドキュメントはローカルにキャッシュしている。

FireFoxのLive HTTP Headerのやりとりをみてキャッシュの効果を説明。

サーバとサーバの間でもHTTPキャッシュは使える。

Squid・・・HTTP,HTTPS、FTPなどで利用されるオープンソースのキャッシュサーバ。複数のクライアントをSquid経由にすることでドキュメントの参照を高速化したりするのに使われる。
HTMLファイルCSS、JavaScript、画像などの静的ドキュメントを効率よくキャッシュできる。
動的コンテンツについては、一意なURLが与えられているドキュメントは基本的にキャッシュできる。またあるページを30分間だけキャッシュするなどの制御が可能。
ただし、動的なドキュメントでも状態を持つドキュメントはキャッシュするとまずい。この場合はより粒度の細かいキャッシュサーバ(memcachedなど)を選ぶ。

Squidでリバースプロキシを構築する方法を紹介。

mencachd・・・C言語で書かれた高速なネットワーク対応の分散キャッシュサーバ。ストレージにOSのメモリを使用。使用はプログラム内部から行う。


●MySQLのレプリケーション
DBサーバが停止した場合、問題となるの「DBのデータ」。

レプリケーション・・・一般的にはデータをリアルタイムに他の場所へ複製すること。
MySQLのレプリケーションとは2台のDBサーバでMySQLを実行して、まったく同じDBデータのサーバを作ること。

MySQLのバージョンは5.0.45を使用。
MySQLのレプリケーションの特徴は
 ・シングルマスタ、マルチスレーブ
 ・非同期のデータコピー
 ・レプリケーションされるデータの内容・・・レプリケーションがSQL文単位で行われる。この方法だとマスターとスレーブで異なる行が更新される可能性がある。MySQL5.1.5では行単位のレプリケーションができるので解決されている。5.1.8では混合モード(文単位と行単位の場合分け)もある。

レプリケーションの仕組み
 スレーブでI/Oスレッド(マスタからの更新ログをファイルにいれる)とSQLスレッド(更新ログのファイルを実行)がデータの更新をしている。
 マスタには「バイナリログ」(参照処理ではなく、更新処理のみが記録される、mysqlbinlogで解読できる)スレーブには「リレーログ」(マスタの更新ログをうけとったもの、更新が終わると自動で消去される)が作成される。
 ポジション情報はスレーブがどこまでレプリケーションしたかを記録する。maser.infoに保管され、SHOW SLAVE STATUSというSQL文で確認できる。

レプリケーション構成の作り方紹介
my.cnf設定方法、レプリケーション用ユーザ作成、レプリケーション開始に必要なデータなど
レプリケーションを開始するにはスレーブでmysqldを起動。レプリケーションの状況を確認するには、「SHOW MASER STATUS」 「SHOW MASTER LOGS」 「SHOW SLAVES STATUS」など。

参照系のクエリをMySQLのスレーブにやらせて負荷を分散する方法紹介。
方法としてはアプリケーションによる分散と、内部ロードバランサによる分散がある
内部ロードバランサによるスレーブ参照の方法を紹介。


●ストレージサーバ・・・大容量コンテンツ(動画や音声)を配信するサービスでコンテンツファイルを格納するサーバ。各WebサーバはNFSマウントでコンテンツファイルを読みだす構成になる。ただし、ストレージサーバはボトルネックになりやすく、単一故障点になりやすい。
理想的なストレージサーバは読み込みが速く、ディスク容量が大きいのが条件。

読み込みを早くするために、HTTPをストレージプロトコルとして利用したストレージサーバの例
アップロードするサーバのみNFSマウントしており、サーバ内のNFSサーバーがHDDに書き込みを行う。
他のWebサーバは同じくサーバー内のWebサーバーを介してHDDから読み込みを行う。こうするとすべてのWebサーバがNFSマウントする必要がない。
HTTPはNFSに比べるとサーバとクライアントの結合が祖であるので、万一ストレージサーバの異常を検出してもエラーを返したりできる。
筆者の環境では、ストレージサーバに読み出しのリクエストが集中するときには、だいたい同じデータが読みだされているのでthttpdを使うことで負荷分散できたという。

単一故障点になるのを回避するには、複数台のサーバにファイルを分散させる必要があるが、大容量であるだけに同期が難しい。詳細は3章で。


3章 止まらないインフラを目指すさらなる工夫

●DNSサーバの冗長化
 DNSサーバの障害は一旦発生すると原因が発生するまで時間がかかる。
 レゾルバライブラリを使用した冗長化・・・/etc/resolv.confにDNSサーバを複数指定する。手軽な方法だが、異常を検出するのにタイムアウトを待たないといけないので性能低下の危険があるので避けたほうがいい。
 サーバファームにおけるDNSの冗長化・・・VRRP(keepalived)を利用して、片方がVIPでActiveサーバになる構成にする。ただし、DNSサービスが停止してもフェイルオーバーしないので、digコマンドで自分自身にDNS問い合わせをするスクリプトを使う。さらにロードバランサを使って負荷分散をする。

●ストレージサーバの冗長化
 RAIDを使うのが一般的だが、整合性のチェックは時間がかかるしサーバに負荷がかかる。
 DRBDというソフトを使用するのを推奨していた。このソフトはファイル単位ではなくブロックデバイスに対する更新をリアルタイムに転送する。ネットワーク越しのRAID1と考えられる。このソフトの設定、フェイルオーバー(自動、手動)、方法紹介。
 keepalivedとVRRPでNFSサーバを冗長化する方法紹介。
 DRBDでディスクのミラーリングをしていても、オペミスで消してしまったファイルはやはり両方消されてしまう。バックアップはやはり行うべき。

●ネットワークの冗長化
 L1(OSI参照モデルレイヤ1)、L2(OSI参照モデルレイヤ2)で故障が発生してもシステム停止しないように冗長化する方法。
 故障の種類
 1LANケーブル
 2NIC(ネットワークカード)
 3ネットワークスイッチのポート
 4ネットワークスイッチ
1-3はサーバとスイッチ間の接続故障なので、リンク故障
1と3はスイッチ間接続の故障
4はスイッチ故障。

リンク故障対応・・・LinuxのBondingドライバは複数の物理的なネットワークカードをまとめて1つの論理的なネットワークカードとして扱う。この機能の設定方法解説。

スイッチ故障対応・・・スイッチを複数台用意して、Bondingドライバは以下の物理NICをそれぞれ別のスイッチに接続する。

スイッチ増設方法解説
ポートの多いスイッチに交換しただけなら状況は変わらないが、増設の場合は冗長性を保つうえでの条件が増える。カスケード接続した場合の例で解説。
すべてのスイッチが相互接続するとブロードキャストストームが発生するので注意。これを発生させないためのRSTPプロトコルの解説。
RSTPを使用するとBondingドライバn頼らずにスイッチの冗長化ができる。

●VLAN導入でネットワークを柔軟にする。
サーバファームにおける柔軟性の高いネットワークとは
 1新規サーバ追加が容易
 2サーバが故障したときにすぐに代替え機に移行できる
 3あるサーバを別の役割のサーバに切り替えられる
これらにこたえられて、作業場のネックがない。

VLAN・・・物理的な構成ではなく、ネットワーク機器やサーバの設定で「論理的」にネットワークを分割して構成する技術。ブロードkyストドメインの分割が論理的に可能になる。同じスイッチに複数のセグメントの端末を接続しても、設定によって論理的にブロードキャストドメインを分割できるので、適切なポートにのみ、フレームがフォワードされる。

VLANを導入すると、
1台のスイッチで複数のセグメントを管理できる。
設定だけでポートに流れるデータを制御できる。
というメリットがある。

VLANの種類
スタティックVLAN・・・ポート単位に手動でグループの割り当てを行う
ダイナミックVLAN・・・つながる機器などによって動的にグループの割り当てを変える。

近年の傾向として、ユーザごとやMACアドレスごとなどのルールで制御を行うVLANを利用してセキュリティを高めるなどの使い方をされている。

ベンダ依存のVLAN
ポートVLAN
タグVLAN

データセンター内のサーバが故障したという想定で復旧までの流れを解説。
VLANを使わない場合と使った場合。


4章性能向上、チューニング
●Linux単一ホストの負荷の見極め
 OSのチューイングとは負荷の原因を知り、それを取り除くこと。
 負荷は推測しないで計測する。
 Linuxのツールps, top, sarで負荷を調べる。

 ボトルネック見極めには、
 ロードアベレージ(システム全体の負荷)を見る・・・特に処理を実行したくても実行できなくて待たされているプロセスがどのくらいあるか?
 CPUかI/Oどちらがボトルネックか探る。・・・CPU使用率とI/O待ち時間

 CPU負荷が高い場合
 ・ボトルネックはユーザプログラムの処理化システムプログラムか。
 ・原因となるプロセス特定
 ・プロセスを詳細にみるのにstraceでトレースしたり、oprofileでプロファイリング

  I/O負荷が高い場合
  ・特定のプロセスが極端にメモリを消費していないか
  ・プログラムの不具合でメモリを使いすぎていないか
  ・多雨歳メモリが不足しているならメモリ増設か分散を検討。

 負荷の総体を知るために、マルチタスクOSの仕組み、カーネルの動作、スケジューリングとプロセスの状態解説。
 CPU使用率計算方法、マルチCPUの場合など。

 プロセスアカウンティングのカーネルコードの見方解説。スレッドとプロセス解説。
 ps, sar, nmstatコマンド使い方

●Apacheのチューニング
Apache=Apache HTTP SERVERはオープンソースのWebサーバのディファクトスタンダード。
 ApacheのMPMを利用した並列処理の解説。これを利用した負荷分散の方法を解説。

●MySQLのチューニングのツボ
DBサーバのチューニングは、サーバサイド、サーバサイド以外、周辺システムで考えられる。

 サーバサイドではディスクI/Oのチューニングがキモなので、ディスクI/O関連のKernelパラメータ調整、適切なファイルシステムの選択とマウントオプション調整が考えられる。

 サーバサイド以外では、テーブル設計(適切なインデックスの作成、意図的な非正規化)、SQLの最適化(インデックスをうまく使うように、テーブルの結合順序と方法を調整)

 周辺システムでは、memcachedなどのキャッシュサーバ。

 サーバサイドのチューニングの中で重要なもの
 メモリのパラメータ解説と、あるDBサーバ(実メモリ4GB)の設定値
 チェックルール


5章省力運用
●サービス稼働監視
 監視の種類
 1死活状態の監視(pingなど)
 2負荷状態の監視(CPU使用率、サービスの同時処理数)
 3一定期間サービス提供ができていたか(稼働率)計測。
監視ツールNagiosを使った監視方法の解説。

●サーバリソースのモニタリング
モニタリング対象として考えられるもの。
 CPU使用率、メモリ使用率、ロードアベレージ、ネットワークトラフィックなど
監視用ツールはいろいろあるが、MuninとCactiについて使用感がのべられていた。

●サーバ管理の効率化
サーバ管理ソフトPuppet紹介と設定方法解説。

●デーモンの稼働管理
デーモンは落ちたことにきがつきにくく、i/etc/init.dは再起動の機能がない。
デーモン稼働管理ソフトdaemontoolsの解説と設定方法。

●ネットワークブートの活用
ネットワークブートはマシンがブートするために必要なデータやファイルをネットワークから取得してブートすること。
PXEを利用したネットワークブート動作解説。
著者の環境でネットワークブートを利用しているのは、ロードバランサ、DBサーバ/ファイルサーバ、メンテナンス用ブートイメージ

●リモートメンテナンス
メンテナンス回線の構成例。インターネットからの入り口を二つに。
通常のログインができないときに使用するシリアルコンソールの紹介。
IPMIは隣のマシンからネットワークを通じて電源を制御する仕組み。

●Webサーバログの扱い
アクセスの集計やトラブル解析にログが必要。
ログの収集・・・各サーバに出力されたログを定期的にあつめ保存する
ログの集約・・・webサーバが出力するログを常に転送して1つにまとめること、そのときどきの状況を把握するために使う。

syslogを使用したログの集約解説
複数サイトの場合syslog-ngを使用。

Apacheのによるログのローテート方法。cronとrotatelogs

ログサーバ・・・ログの集約と収集、ログの保存、解析に使う。


6章 あのサービスの舞台裏
自律的なインフラへ、ダイナミックなシステムへ
●はてなのなかみ
 はてなのインフラ解説と写真。
 スケーラビリティと安定性のため、LVS(IPVS)+keepalivedを利用したサーバ2台。VRRPで冗長化したのを1セット、リバースプロキシサーバ、APサーバ、DBサーバの3層のそれぞれの手和えに1セット配置。
LVSサーバのストレージはコンパクトフラッシュを使用。

各サーバの構成解説。

サーバはパーツを調達して社内でくみ上げBIOS設定、OSインストール。LDAPやautofsによるユーザログイン設定、Puppet初期設定、IRCチャネルにIP通知。目的はリモートで作業できるようにすること。

アプリケーションの動作に必要なライブラリなどのインストール設定、監視などのインフラの一部として動作するための設定は自動化されている。

サーバ管理は独自の監視ツールを作っている。オープンソースとして公開予定。

電源効率、リソース利用効率の向上を目指したサーバの導入のガイドライン
・サーバを設計・調達するときに1Aあたりのパフォーマンスを重視
・1台当たりのサーバ能力をできるだけ高めて、仮想化技術により、分割して利用
・不要なパーツはのせない。

最終的には生物のような自律的強固なインフラを目指す。

●DSASの中身
DSASとはKLab(株)が運用しているサーバ・ネットワークインフラの総称。
東京都福岡のデータセンターで300台以上のサーバが稼働している。

DSASの特徴
・一つのシステムに複数のサイトを収容。・・・どのサイトがどのサーバを利用するかは動的に変更できる
・オープンソースで構築
・どこが切れても止まらないネットワーク
・サーバ増設が簡単・・・ネットワークブート
・故障時の復旧が簡単・・・RSTPでL2スイッチを冗長化。DSASではインターネット回線がL2スイッチに直接接続されている。ロードバランサが直接インターネットと接続しているとロードバランサ故障時に代替え機にNIC増設ケーブル差替えがあるが、これがない。


[24時間365日] サーバ/インフラを支える技術 ‾スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

[24時間365日] サーバ/インフラを支える技術 ‾スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)

  • 作者: 安井 真伸
  • 出版社/メーカー: 技術評論社
  • 発売日: 2008/08/07
  • メディア: 単行本(ソフトカバー)



RESTful Webサービス [プログラミング]

2007年出版のRESTに関する本。
RESTの概念。RESTfulなサービスとはなにか、現状でRESTの概念にそっているシステムや
RESTにみえているけど、そうでない場合の解説。
そうでないシステムをRESTfulにするための方法解説。
RESTfulなシステムの設計と実装の例
用語URI=URLのことと思っていいらしい。

Webは分散プログラミンのプラットフォーム。その仕組みは単純シンプルであるべき。
いまやWebサイト=Webサービスといってもいい。
COMやCORBAは重く、Webプログラミングの流れを阻害する。
WebはHTTPプロトコルというリクエストされたもののアドレスを返すというシンプルな仕組みで動いている。
そのプログラミングもシンプルであるべき。


プログラマブルWebの例を示すために、AmazonのS3で検索する操作などを解説。
HTTPでリクエストをうけて、データをXMLで提供する。
ただし、RESTならデータはROA(Resource-Oriented-Architecture)になる。
例はAtom Publidhing Protocol

大Webサービス=WSDLやSOAP
上記はHTTPとURIを使ってはいるが、データを扱うときに手続き指向なので、RESTではない。
新しいツールは複雑さを隠ぺいできるが、その正当性を証明することはできず、常に複雑さが増す。
いろんなWebサービスを統合して使いたいときとかに困るってことかな?

いろんなサービス(Ruby Railsやdel.icio.us)のレスポンス解説。


RESTという概念は、Webサービスの潜在能力を引き出すためのシンプルなガイドライン
RESTはアーキティクチャではない、アーキティクチャを検証するための手段。
HTTP、XML,URIを使用。シンプルなインターフェースでWebサービスからデータを引き出す。
特徴
アドレス可能性・・・すべてのリソースは独自の一意なURIを持つ。表現はアドレス可能でなければならない。サーバーがどのデータを送るかはURIに含まれる(スコープ情報)
アドレス可能性は、サービスの提供者が思いもしない利用方法を提供する可能性を示す。

状態とステートレス性・・・状態は2つ、リソースに関する情報を表すリソース状態(サーバー管理)と、アプリケーションにおいてクライアントがたどる経路に関する情報のみを表すアプリケーション状態(クライアント管理)。お互いの状態を知る必要がある場合は、状態を送信する。
ステートレス性によって、一つ一つのリクエストが独立するので、アプリケーションの拡張が容易になる。

接続性・・・リンクとフォームはリソースを相互接続する。サーバはリンクとファームを表現として送信することで、クライアントのアプリケーション状態を、ある状態からある状態に遷移することができる。
今のリンクは次のURIを構築する方法を文章で説明するという状況。リソースが相互に接続されることによって、クライアントがURIからURIへナビゲートするのがスムーズになる。

統一インターフェース・・・クライアントとリソースの間のやり取りは、いくつかの基本的なHTTPメソッドによって処理される。どのリソースもこれらメソッドの一部またはすべてをサポートし、メソッドはそれらをサポートするどのリソースでも同じように機能する。HTTPのもっとも一般的な4つの操作はGET,POST、PUT、DELETE
POSTについては誤解が多い、POSTの機能は実行されるサーバで決定する。RESTfulな設計ではPOSTは従属リソースを作成するために使用される。

例としてはAmazonのS3があがっていることが多かった。比較するRPCの例はdel.icio.us
RPCは内部アルゴリズムを持つことがRESTではない。


ROAはクライアントが使いやすいWebサービスを設計するのに適したアーキティクチャ。
リソースとはそれ自体を参照するに値するほどの重要性をもつもの。通常はドキュメント、データベースの行、アルゴリズムを実行した結果などの一連のビットで表せるもの。少なくとも一つのURIを持つ。
URIは構造的であるべき。(予測可能)
表現・・・アプリケーションをリソースに分割すると表面積が増える。Webサービスはリソースを特定のファイル形式と特定の言語で送信しなければならない、それが表現。表現の選択の一つにコンテンツネゴシエーションがある。
リソース間のリンク・・・完全にRESTfulなサービスはリソースは意味のある方法で相互リンクされている。

ROAの一般的手順
①データセットを特定
②データセットをリソースに分ける
 各種リソースに対して、
③リソースにURIで名前をつける
④統一インターフェースのサブセットを提供
⑤クライアントから受け取る表現(一つ以上)を設計
⑥クライアントに提供する表現(一つ以上)を設計
⑦ハイパーメディアリンクとフォームを使用して、このリソースを既存のリソースに統合する。
⑧イベントの標準的な流れについて検討する
⑨エラー状況について検討する。



RESTfulなサービスの設計方法解説
読み取り専用のリソース指向サービスの設計(地図情報システムを例として)
①リソース設計
②データセット特定
③データセットをリソースに分ける
 こうしてできた5つのリソースタイプ
  1 惑星のリスト
  2 名前によって識別される惑星上の場所(あるいは惑星全体)
  3 経緯度によって識別される惑星上の場所のリスト
  4 特定の地点を中心とした惑星の地図
⑤リソースに名前をつける
 名前付けの3つの基本ルール
 1パス変数を使用して、階層をエンコードする。(Parent/child)
 2パス変数に句読文字を挿入して、存在しない階層の暗示をさける(/parent/child1;child2)
 3クエリ変数を使用して、アルゴリズムへの入力を示す。(/serch?q=jellyfish&start=20)
⑥表現の設計
 リソースの状態の表現、他の状態にリンクする表現・・・・など
⑦リソースの相互リンク
⑧HTTPレスポンス、予想される操作とエラー


読み取り/書き込み可能なリソース指向サービスの設計(地図情報システムを例として)
上記システムに+してクライアントのためにデータを格納する機能をつける。

ユーザーアカウントを設計する
①リソースとしてユーザアカウントを設計
②ユーザアカウントの認証、認可、プライバシー、信用を設計
③要件に基づき読み取り/書き込み可能なリソースを作成
④データセット特定
⑤データセットをリソースに分ける
⑥リソースにURIで名前をつける
⑦統一インターフェイスのサブセットを提供
⑧クライアントから受信する表現を設計
⑨クライアントに提供する表現を設計
⑩このリソースを既存のリソース(地図)に統合する。
⑪期待される動作、予想されるエラー


サービスの実装
del.icio.usをRESTfulに実装しなおす例。
実装手段としてRuby Railsを使用する。
del.icio.us・・・ブックマークを公開し、短いメタデータ文字列でタグをつけ、他人が投稿したURIを参照する


RESTとROAを使ったベストな設計の例
①リソースの設計
 リソース間の関係、非同期処理、一括処理、トランザクション、迷ったらリソースにする
②URI設計 意味のあるもので、十分に構造化されている必要がある。
③出力表現
④入力表現
⑤サービスのバージョン管理
⑥永続的なURIと読み取り可能なURI
⑦HTTPの標準機能
 認証と認可、圧縮、条件付きGET、キャッシュ、石橋をたたいて渡るリクエスト、部分GET
⑧PUTとDELETEの偽造
⑨Cookieの問題・・・これはステートレス性の原則に反する。
⑨ユーザはなぜHTTPクライアントを信頼するのか


HTTP、URI,XMLの基本テクノロジを使用した他のサービスについて
表現フォーマット・・・XHTML、Atomなど
パッケージ済みの制御フロー・・・一般規則、データベース連動の制御フローなど
ハイパーメディアテクノロジ・・・リンクとファームの2種類あり、URI TemplateやHTML4など

RPCスタイルの大Webサービスの解説と、それをRESTfulにするための設計のヒント。

RESTクライアントとしてのAjaxアプリケーション解説。
Ajaxアプリケーション・・・Webブラウザ内で実行されるWebサービスクライアント。
利点もあるが、ブラウザごとにコードが違うとかセキュリティ問題とかある。

RESTfulサービスのためのフレームワーク解説
Ruby on Rails
Restlet
Django

付録
参考文献
HTTPレスポンスの良く使用されるコード42
よくしようされるHTTPヘッダー


RESTful Webサービス

RESTful Webサービス

  • 作者: Leonard Richardson
  • 出版社/メーカー: オライリー・ジャパン
  • 発売日: 2007/12/21
  • メディア: 単行本



例題30+演習問題70でしっかり学ぶ ExcelVBA標準テキスト [プログラミング]

Excel2007 2010 対応のマクロとVBAの解説書。
サンプルファイルはダウンロードして無料で使えるが再転載と、2次利用は制限される。定型の仕事を自動化するためにマクロとVBAを活用しよう。またExcelVBAエキスパートの学習用として使える。
機能の解説をしながら、例題と応用問題を解いていく形式。

1.マクロを記録する方法。
記録したマクロをコントロールキーやコマンドボタン、図形、リボンやクイックアクセスツールバーで実行する方法。
マクロの名前を変更する、削除する方法。
自動記録したマクロは実際にはVBAコードで記録される。
マクロの不便な点
・自動記録したマクロコードは冗長
・変数や配列VBA関数は使えない
・IF文などが使えない。
・ユーザーフォームが利用できない
・すべてのファイル処理には対応していない。(特定のファイルを開くだけならできる)

オブジェクト・・・VBAから操作の対象となるもの
 アプリケーション(Application)→ブック(Workbook)→ワークシート(Worksheet)→セル(Range)
コレクション・・・同一の種類または異なる種類の複数のオブジェクトの集まり。
プロパティ・・・セルの書式、編集の可否、ワークシートの表示非常を定義したオブジェクトの属性情報。
メソッド・・・オブジェクトが行う動作
イベント・・・オブジェクトから認識される動作。マウスクリックなど。


2.変数・配列ステートメント
変数のデータ型解説、定数解説、名前付け規則解説
Option Explicit→宣言してある場合、Dim宣言なしで変数を使うことはできない。

配列の宣言、インデックス番号、使い方解説。
動的配列(ReDim)による、データ数がわからない場合の変数の取り方解説。
多次元配列解説。
VBAではワークシートのセルでデータを管理する方が簡単なこともある。

ステートメント解説
If~Thenステートメント解説。ワークシート関数でもできるが、条件を細かく分岐させるときにはVBAコードの方が便利。
Select~Caseステートメント解説。分岐の多いとき使う。
For~Nextステートメント解説。繰り返し処理で使う。
Do~Loopステートメント解説。Forとの違いは繰り返しの回数を指定するのではなく、条件式で繰り返しを制御すること。このとき条件式を間違えて無限ループに陥った時には、Esc、Ctrl+Break、Ctrl+Alt+Deleteいずれかで止められる。

3.プロシージャとVBA関数
プロシージャ・・・VBAコードで書かれたマクロの実行単位。
Subプロシージャ=引数がとれるが。戻り値がない
Functionプロシージャ=引数がとれて、戻り値がある。
VBA関数=VBAモジュールのコードに記述されて使用される関数。Excelのワークシート関数と全く同じものがあるわけではないし、書式がちがうこともあるので注意。一覧表があった。
ワークシート関数呼び出し→Application.WorkSheetFunctionプロパティを使う。ただしすべてのワークシート関数が利用できるわけではない。
Functionプロシージャでユーザー定義関数を作り、VBAのコードだけでなく、Excelのワークシートのセルからも利用できる。
ワークシートのセルにワークシート関数を記述する→Application.Formulaプロパティ

日付・時刻の操作
日付・時刻操作関数解説。
Excelのシリアル値=1900年1月1日を1とする。時刻は小数部分で表す。
西暦を和暦に変換する関数→Format(Date, "ggge年m月d日)

文字列操作
文字列操作関数解説。

数値操作
数値操作関数解説。
Round=指定した小数点位置で丸めた数値を返す。指定がないと整数を返す。

Format関数で書式を操作する方法解説。
MsgBoxでユーザーにメッセージを表示する方法
InputBox関数でユーザが値を入力する方法
その他のVBA関数一覧。

ユーザー定義関数で処理をする方法。
ユーザー定義のFunction関数をアドインとしてExcelに登録すると、他のExcelファイルからもFunctionプロシージャを利用できる。


4.セル操作
Rangeプロパティ→セルまたはセル範囲を指定できる。
Cell→一つのセルしか指定できない。
セルを選択する→Activeメソッド、Selectメソッド
相対的なセルの位置を選択する→Offsetメソッド
行を選択する→Rowsプロパティ
列を選択する→Columnsプロパティ
Rangeオブジェクト.Rowsで選択範囲のすべての行。
セルに値を入力する→Valueプロパティ
セルに数式を入力する→Formulaプロパティ
相対参照と絶対参照の解説。
表全体を選択する→Rangeオブジェクト.CurrentRegionプロパティ
指定されたセルを選択する→Rangeオブジェクト.SpecialCellsメソッド

セルとセル範囲のコピーと消去
方法は、直接とクリップボード利用がある。
Copy、Paste、Cutメソッド解説。
書式を残して値を消去する方法→ClearContentsメソッド
Cellsプロパティでコピーされるのは値のみ。

セルの書式設定プロパティやwithステートメント解説。
文字列の折り返し→セルに合わせて折り返す場合はWraptext、任意の場所で折り返したいときんはChr関数を使う。
セルのデータに合わせて行の高さと列の幅を変更したい→Autofitメソッド
罫線を操作するプロパティ解説。

行と列やセル範囲の挿入と削除の方法解説。
Insert、Deleteメソッド。

行と列の非表示と再表示方法解説。
Hiddenプロパティ

エラーが発生したときの方法
On Error Go Toステートメント解説。
On Error Resume Nextステートメント解説。エラーが起きても無視して続ける、その後の動作に注意


5ワークシートの操作
ワークシート選択、名前変更、見出し色変更方法解説。
ワークシートがアクティブになったときの処理は対応するイベントプロシージャに記述する。作成方法を解説。
ワークシートをグループ化しておくと、複数のワークシートに同じデータ入力をする場合などに便利。Array関数を使う方法を解説。

ワークシートの追加と削除の方法解説。
Add,Delete, ActiveSheetプロパティ解説。

ワークシートの移動とコピー方法解説。
Copyメソッド、Moveメソッド。
セルの串刺し計算→合計額のワークシートに各月のワークシートの合計を計算するような場合。

ワークシートの非表示と再表示をする方法解説。
Visibleプロパティ解説。
Visibleでは組込み定数を使う。これはVBAのどこでも使える。

ワークシートの保護と解除の方法
Protect、Unprotectメソッド→ワークシートの保護と解除
Lockedプロパティ→セルのロック
FormulaHiddenプロパティ→数式を非表示にする。
その他VBAコードにパスワードをかけることもできる。

ワークシートの印刷方法解説
PrintOutメソッド→プリンターへの出力。パラメータとしてとれる値一覧。
セル範囲の印刷方法→Range.PrintOutメソッド
余白調整や、ヘッダ、フッタの印刷方法解説。
PDFファイルとして出力する方法を解説。


6.ワークブックとファイルの操作
ワークブックを開く→Openメソッド。カレントフォルダ解説。
ワークブックの選択や追加、保存のメソッド解説。
ワークブックを閉じる→Closeメソッド
ワークブックのイベントプロシージャ記述方法解説。

データファイルへの保存と読み込み
ワークブックのデータを他の形式のファイルに保存する方法
他の形式のファイルのデータをワークシートで開く方法
テキストファイルとCSVファイルの解説。
CSVファイルを扱うときには必ずカレントフォルダを使う。

VBAのヘルプの使い方解説
VBEメニューバーの「ヘルプ」から「Microsoft Visua Basic Applicationヘルプ」を選ぶと、「Excel2010 開発者用リファレンス ヘルプと使い方」が起動する。


7.データベース処理
Findでデータを検索する
Findメソッドでセル範囲のデータの検索方法。
データの完全一致、部分一致などをしていできるパラメータ一覧。
Findでは最初のレコードがみつかったら処理をやめてしまう。

Sortでデータを並べ替える。
Sortオブジェクトでセル範囲のデータの並べ替え・・・リボンの並べかえと同じ
Sortメソッドによるセル範囲のデータの並び替え・・・並べ変えのキーが3個までならSortオブジェクトよりコードが簡単になる。
ディフォルトでは元データが並びかえられてしまうので、並べ替える前のデータがいる場合は、元に戻せるようにしておく。

Filterでデータを抽出する
AutoFilterメソッドで、オートフィルターによるデータを抽出する方法
Selection.AutoFilterでオートフィルターの解除する方法
AdvancedFilterメソッドで、検索条件によるデータの抽出をする方法
抽出結果を別シートに出すようにしておけば、結果がない場合はなにも表示されないだけで元データに変更が加わらない。
抽出中に重複するレコードを除くには→Unique:=Trueオプション

Subtotalでデータを集計する
Subtotalメソッドでセル範囲の集計方法
Functionパラメータで、合計、平均、件数を集計する方法
RemoveSubtotalメソッドでセル範囲の集計を解除
Consolidateメソッドは複数のワークシートにある負数のセル範囲を1枚のワークシートの1つのセル範囲に統合する。この方法で串刺し計算ができる。

モジュール(SubやFunction)のエクスポート、インポートをして、他のExcelファイルでも使う方法。

8総合問題
名簿のデータをカード形式で管理する。
請求書と売り上げ明細データから売上帳と売り上げ集計表を作成する。
入庫と出庫のデータから在庫受払表と在庫残高表を作成する。

Tips
ワークシート画面の更新をコントロールするプロパティ→ScreenUpdating
セルに関数を設定しなければ、登録がない商品でも直接データを入力できる。
ワークシート関数も効率を考えて利用する。

次の学習ステップ
・ユーザ定義関数
・インターネットでのホームページの表示とメールの送信。
・画像データの処理
・ピボットテーブルとグラフ
・ADOライブラリー
・FileSystemObject(ドライブやフォルダ)
・クラスモジュール、よりオブジェクト指向に近いVBAコードが書ける。
・XMLファイル Excel2007以降で作成するExcelファイルはすべてXML形式である。


例題30+演習問題70でしっかり学ぶ ExcelVBA標準テキスト Excel2007/2010対応版

例題30+演習問題70でしっかり学ぶ ExcelVBA標準テキスト Excel2007/2010対応版

  • 作者: 近田 順一朗
  • 出版社/メーカー: 技術評論社
  • 発売日: 2011/04/19
  • メディア: 大型本



前の3件 | 次の3件 プログラミング ブログトップ
[PR]Kindle ストア ベストセラー

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。