Facebookについて今日調べたこと

Facebookを使うには、Facebookのトップページ(http://ja-jp.facebook.com/)にアクセスして、まずアカウントを登録する。アカウント作成には、メールアドレス、パスワード、生年月日が求められる。生年月日は本人を特定したり、年齢ごとにコンテンツを切り替えたりするのに使用される。入力したメールアドレスに送られる確認用リンクをクリックすると、登録は完了する。

トップページから「有名人、バンド、ビジネスのためにFacebookページ」をクリックして、同好のファンとつながるためのページを作成する画面に遷移できるが、実際にFacebookページを作成するためには、Facebookのアカウントを作成する必要がある。ただし、プロフィールを作成しないと、そのページの編集しか行えない。

Facebook利用規約https://www.facebook.com/terms.php)には、「Facebookユーザーのコンテンツまたは情報を収集することはできません。また、弊社の許可を得ることなく、自動化された手段(情報収集ボット、ロボット、スパイダー、スクレーパーなど)を使用して、Facebookにアクセスすることはできません。」とある。Facebookページの作成時などにCAPTCHAが表示され、ユーザが実際に操作していることの確認が行われる。

http://www.facebook-japan.com/use/part1/function.htmlのよると、Facebookにはチャット、コミュニティ(ファンページ)、外部ブログのインポート、アプリケーション、友達検索、リアルタイムコミュニケーション(状況)、メッセージ統合などの機能がある。
http://socialmediaexperience.jp/2638によると、Facebookアプリケーションは、外部に公開したHTTPSサーバ上でPHPを用いて作成するのか。そして、アクセスしてきたユーザの情報はFacebookAPIから取得できると。認証以外は、ただのPHPアプリケーションだとすると、何を書けばいいのやら。PHPに限定されるというのが、疑問。最初は限定されていたのかも。

http://developers.facebook.com/Facebook APIの公式ページである。
http://developers.facebook.com/docs/guides/web/のSocial Pluginsでは、Facebookの「いいね」リンクを自分のサイトに組み込む方法を説明している。コメントやライブストリームを取り込むには、XFBML (eXtended Facebook Markup Language)が必要となる。

http://itpro.nikkeibp.co.jp/article/COLUMN/20070828/280514/によると、Facebook を利用したアプリケーションは,大きく次の3種に分類できる。
1. 外部ウェブサイト向けアプリケーション(External Web Apps): Facebook 外のウェブサイトが Facebook の会員ユーザー情報などを利用する
2. デスクトップ向けアプリケーション(External Desktop Apps): Facebook 外のデスクトップアプリケーションが Facebook の会員ユーザー情報などを利用する
3. Facebook 内アプリケーション(Internal Facebook Apps):Facebookのサイト内で、Facebook の機能を拡張する。A. プロフィール画面用(プロフィールの画面要素をAPIを用いて更新する)とB. キャンバス画面用の2種類が存在する。B. キャンバス画面用のアプリケーションは、http://apps.facebook.com/foo-bar/という専用URLを取得できる。iframeを用いた場合、外部ウェブサイト向けアプリケーションをFacebook サイト内のキャンバス画面に押し込んだような形となる。Facebookから呼び出された外部ウェブサイトがFBMLを返す形式もある。

http://itpro.nikkeibp.co.jp/article/COLUMN/20070828/280514/の記事では、Facebookから外部サイトにXMLが返されるとあるが、JSONの場合もあるのでは。APIのバージョンが違うからかもしれない。

いずれの場合も、Facebookによるアプリケーションの認証、そのアプリケーションへの情報提供をユーザが明示的に許可することが必要となる。

http://developers.facebook.com/docs/を読むと、認証情報+αにアクセスするだけといっても、考慮すべきことは山ほどある。まずはどこにフォーカスを当てようか。

http://developers.facebook.com/docs/plugins/に、外部サイトに組み込めるSocial Pluginの一覧が記されている。
プラグインのページで、そのプラグインを使用するためのiFrameとXFBMLのコードを吐きだすことができる。XFBMLの場合は、読み込むJavaScriptロケールをen_USからja_JPに変える必要があるだろう。

Facebookは、OAuth 2.0(http://oauth.net/2/)を利用している。

デスクトップアプリケーションの場合は、下記にアクセスすれば、いいらしいが、エラーとなる。何かが足りないらしい。アプリケーションIDをちゃんと取得しないと駄目だという話だった。あとは、httpsではだめで、httpならうまくいく。あるいは、自動ログインをオンにしていたらうまくいく?
https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=http://www.facebook.com/connect/login_success.html&response_type=token

http://www.sociallipstick.com/?p=239ではOAuth 2.0がFacebookで、どのように使われている解説されている。OAuth 2.0では、アクセストークンを取得し、そのトークンを用いて、保護されているリソースにアクセスする。typeを指定しなかったときのデフォルトがWeb server flowである。Facebookのサイトからclient_idに登録されたサイトに、ユーザからのアクセス許可後にリダイレクトしてくる。デスクトップアプリケーションでは、User-agent flowが使われる。トークンはサーバに送られず、直接クライアントに返される。

http://developers.facebook.com/setup/にアクセスして、アプリケーションを取得し、アプリケーションIDを取得する。

http://www.facebook.com/developers/apps.phpで、自分が作ったアプリケーションの状態が確認できる。

jQueryなどについて今日調べたこと

jQueryなどについて今日調べたこと

http://docs.jquery.com/Downloading_jQueryからCurrent Release(1.5.2)のMinifiedをダウンロード。

jQueryは通常単一のJavaScriptファイルとして存在し、その中に全ての共通DOM、イベント、エフェクト、Ajax関数が含まれている。次のようなマークアップを使って、任意のWebページにこれを含めることができる。(http://ja.wikipedia.org/wiki/JQuery

http://docs.jquery.com/How_jQuery_Worksにしたがって、jQueryを実際に試していく。
$(document).ready(function(){
ページを読み込んだ直後(DOMの構築が完了した直後)に実行する処理を書く。
$(function(){ と短縮して書くことも可能である。
$("a").click(
a要素にクリックハンドラをセットする
$("a").addClass(
a要素にCSSのクラスを追加する
event.preventDefault();
クリックなどのイベント発生時に行われる動作(ページ移動など)が行われないようにする。
$(this).hide("slow");
イベントを受けた要素をゆっくりと非表示にする。


http://docs.jquery.com/Frequently_Asked_Questionsからの抜粋

フォーム要素のdisable/enableを切り替えるには、disabled属性を動的に追加削除する。



チェックボックスを動的にオンオフする際には、checked属性を動的に追加削除する。
選択されたオプションの値を取得するには、$('#myselect').val()を使用する。ここで、myselectはselect要素のID。オプションのテキストを取得するには、$('#myselect option:selected').text()を使用する。

マウスホバー時にサブメニューをアニメーションとともに表示させる例(http://docs.jquery.com/Cookbook/Navigation
タブのように、選択されたブロックだけを表示する例。ハッシュを使い、ブックマーク対応可にしているが、ブラウザの戻る・進むボタンだと画面は切り替わらない。再表示させると切り替わる。(http://code.enure.net/Hide-All-Except-One/

JavaScriptのwindowには、プロパティを独自に追加することができる。また、windowのプロパティにはwindow.を付けなくても、アクセスすることができる。jQueryのメインオブジェクトは、内部的には以下のように宣言されている。(http://www.authenticsociety.com/blog/jQueryPluginTutorial_Beginner

var jQuery = window.jQuery = window.$ = function(selector, context)
{
// ...
// other internal initialization code goes here
};

jQueryには要素選択のメソッドが豊富に用意されているので、自分でdocument.getElementById を書く必要はない。
(function($){ ... })(jQuery);というコードは、定義した匿名関数を即座に実行している。$が別のフレームワークjQuery以外を参照しているかもしれないので、そのような呼び出し方をしている。

remoteクラスのa要素に、ロードのイベントハンドラを追加するサンプル。ロード結果に含まれるリンクに対してもイベントハンドラが追加されるようにしている。(http://docs.jquery.com/Tutorials:Getting_Started_with_jQuery
function addClickHandlers() {
$("a.remote", this).click(function() {
$("#target").load(this.href, addClickHandlers);
});
}
$(document).ready(addClickHandlers);

jQuery UIプラグインを使うと、簡単にアコーディオンメニューが実装できる。(http://michaeljacobdavis.com/tutorials/statesavingaccordion.html

EJBなどについて、今日調べたこと

アプリケーションのパフォーマンスを計測のコードを内包させるのではなく、コンテナのCall StatisticsやHibernateの統計、データベースが提供する統計値を駆使する。

コネクションプールでの最小接続数、最大接続数はチューニングすべき。またプリペアード・ステートメント・キャッシングも設定すべき。利用していないコネクタのスレッドプールは削除すべき。

本番環境では、コンソールロギングをOFFにする。

アプリケーションサーバで、必要とされるサービスだけを動かす。ホットデプロイも使わないなら無効にする。

EJB3.1仕様(http://www.jcp.org/en/jsr/detail?id=318)では、EJBコンポーネントを直接WARの中に入れてデプロイできる。EJBタイマーが自動的に生成される(ステートレスとシングルトンのセッションオブジェクトの場合にだけタイマーをセットできる)。stateful、stateless、singletonの3種類のsession bean(クライアントの要求に応えるセッションオブジェクト)が存在する。クライアントからのメッセージ受信時に実行されるメッセージ駆動オブジェクト。データベース内のデータをオブジェクトとして表現するエンティティオブジェクト。

Managed Beans 1.0 Specificationは、コンテナ管理オブジェクトの最低限の要件を規定する。セッションBeanコンポーネントは、Managed Beanである。

クライアントは、セッションBeanを同期、または非同期で呼び出すことができ、非同期の場合は、Futureオブジェクトを用いて、結果の取得や、処理のキャンセル等を行うことができる。詳細はjava.util.concurrent.FutureのJavadocを参照。@Asynchronousの付いたビジネスメソッド、または@Asynchronousの付いたクラスのビジネスメソッドが非同期のメソッドである。Bean側は、SessionContext.wasCancelCalled()を呼ぶことで、クライアントからのキャンセルを知ることができる。戻り値がvoidの非同期メソッドの場合、メソッド内で例外が起きても、クライアントに知らせる術はない。

クライアントは、セッションBeanのビジネスインタフェースをdependency injection、またはJNDIネームスペースのルックアップによって取得することができる。セッションBeanがリモートにあるときも、ローカルにあるときも、同じように記述する。

dependency injectionの例
@EJB Cart cart;

JNDIネームスペースルックアップの例
@Resource SessionContext ctx;
...
Cart cart = (Cart)ctx.lookup(“cart”);


セッションBeanがステートフルな場合、cart1 != cart2 だが、ステートレスの場合は、cart1 == cart2である。

@EJB Cart cart1;
@EJB Cart cart2;


ステートフルセッションBeanのconversational stateは、ステートフルセッションBeanインスタンスのフィールド値として定義される。ステートフルセッションのフィールド値は、passivateによって、二次ストレージにシリアライズされることがある。passivate時にステートフルセッションBeanが呼び出されると、activateによって元に戻されて実行が継続する。@StatefulTimeoutで、ステートフルセッションBeanがアイドル状態であり続けることのできる時間を指定する。

コンテナは、ステートレスBeanとステートフルBeanのメソッドをシリアライズして(1度に1つずつ)呼び出すので、それぞれのメソッドを、リエントラント(再入可能)にする必要はない。また、メソッドの中で自分を再帰的に呼び出すこと(ループバックコール)はできない。コンテナは複数のクライアントからのステートレスBeanへのリクエストをステートレスBeanのそれぞれ別のインスタンスに割り振る。

シングルトンBeanのインスタンスはアプリケーション内に一つだけ存在し、すべてのクライアントに共有されるので、同時にアクセスできる仕組みが必要である。Container Managed Concurrencyを利用した場合、メソッド呼び出しにReadまたはWriteのロックを指定することができる。

クライアントにおいて、メッセージの宛先は、以下のようにインジェクションされるか、JNDIの名前空間でルックアップされる。

@Resource Queue stockInfoQueue;

Context initialContext = new InitialContext();
Queue stockInfoQueue = (javax.jms.Queue)initialContext.lookup
(“java:comp/env/jms/stockInfoQueue”);

メッセージ駆動Beanはコンテナの中で管理され、実行される。複数のインスタンスが同時に実行可能だが、ひとつのインスタンス内のメソッドが同時に実行されることはない。

flotなどについて今日調べたこと

Ext JSなどの本格的なGUIライブラリの登場により、デスクトップアプリケーションと遜色ないユーザインタフェースの構築が可能。(http://ja.wikipedia.org/wiki/JavaScript

Direct Web Remoting (DWR) などの技術の発達によりクライアント・サーバ間の通信が著しく容易になったことや、JettyなどのアプリケーションサーバがComet利用時のメモリ使用量の削減を実現したため、サーバからクライアントへの情報のプッシュ型の配信が実用的となった。(http://ja.wikipedia.org/wiki/JavaScript

Ext Flot は flot を Ext JS の UI で拡張した、Javascript のみで動作するグラフ描画ライブラリ。(http://code.google.com/p/extflot/wiki/ProjectSummaryJa)flot 0.5 とr148(r156?)に関する記述はあるが、現在のflotのバージョンは0.7。

flot は、jQuery用のプロットライブラリ。(http://code.google.com/p/flot/

https://github.com/flot/flotからflot-flot-v0.7-6-gb2fedcd.zipをダウンロードして、examplesのhtmlをFirefox4に読み込ませて、動作確認。

basic.htmlを改造し、サインカーブで頂点の数を増やしたときに、パフォーマンスが悪化しないかを検証。10万件ぐらいで、体感的に待たされるようになる。jquery.jsとjquery.flot.jsをロードして、$.plot($("#placeholder"), [ d1, d2, d3 ]);とやると、良きに計らって描画してくれる。ここで、placeholderはdiv要素のID、d1, d2, d3 は、プロットする点[x, y]の配列。

graph-types.htmlにあるように、$.plotの第2引数の配列の各要素のオブジェクトで、dataキーにプロットする点[x, y]の配列、lines、bars、pointsキーにプロットするグラフの種類を指定できる。lines: { show: true }がデフォルトだったことがわかる。

setting-options.htmlでは、$.plotの第2引数の配列の各要素のオブジェクトで、labelを指定し、凡例が表示されるようにしている。そして、第3引数のoptionsオブジェクトで、series、xaxis、yaxis、gridを指定している。

annotating.htmlでは、プロットやグリッドの色指定、チャート上の指定した位置への注釈文字列の追加、2Dグラフィックの描画を行っている。

ajax.htmlでは、データを受信するたびに、$.plotメソッドを呼び出している。

realtime.htmlでは、updateInterval(ミリ秒)ごとにチャートを更新している。series: { shadowSize: 0 }をオプションに指定して、影を付けないことで描画を高速化している。また、$.plotメソッドを繰り返し呼び出すのではなく、軸やグリッドは変わらないので、plot.setDataで最新のデータをセットし、plot.draw()で描画している。

turning-series.htmlでは、チェックボックスの選択状態によって、$.plotの第2引数で指定するデータ系列を切り替えて、$.plotメソッドを呼び出している。

selection.htmlでは、jquery.flot.selection.jsをロードして、チャートのX軸範囲の選択を行っている。plotselected、plotunselectedイベントに対するハンドラを指定するとともに、setSelectionメソッドとclearSelectionメソッドで選択範囲の設定をプログラムから設定している。xaxis: { min: ranges.xaxis.from, max: ranges.xaxis.to }をオプションに動的に追加することで、ズームを行っているのが、plotが置き換わるので、選択状態は自動的に解除される。

zooming.htmlでは、placeholderとoverviewで同じrangeがselectされるようにする。placeholderはselectされたrangeだけが表示される。legend: { show: true, container: $("#overviewLegend") }をオプションにセットすることで、凡例はチャートの外に表示される。

interacting.htmlでは、grid: { hoverable: true, clickable: true }をオプションに指定することで、plothoverとplotclickのイベントが発生するようにしている。plothoverではマウスをかざした点の座標をツールチップなどに表示している。plotclickでは、クリックされた点をplot.highlightメソッドでハイライトしている。

navigate.htmlでは、jquery.flot.navigate.jsを利用して、ズームとパンを行っている。

resize.htmlでは、jquery.flot.resize.jsを利用して、チャートのリサイズを自動的に行っている。

symbols.htmlでは、jquery.flot.symbol.jsを利用して、○以外の形で、点を描画している。

time.htmlでは、x軸の値がJavaScriptのタイムスタンプなので、xaxisのmodeをtimeに設定している。

visitors.htmlでは、grid: { markings: weekendAreas }を指定し、週末だけが別の色の背景で表示されるようにしている。

multiple-axes.htmlでは、オプションにyaxesを指定して、データにyaxis: 2を指定して、2つの軸でチャートを描画している。

interacting-axes.htmlでは、2つのX軸と、4つのY軸を表示し、軸をクリックすると、どの軸がクリックされたかをメッセージ欄に表示するようにしている。

thresholding.htmlでは、jquery.flot.threshold.jsを利用して、閾値を外れたデータは、別の色で描画するようにしている。

stacking.htmlでは、jquery.flot.stack.jsを利用して、チャートのスタック表示を行うようにしている。

percentiles.htmlでは、jquery.flot.fillbetween.jsを利用して、上下の系列をグラデーションで描画している。

tracking.htmlでは、jquery.flot.crosshair.jsを利用して、十字カーソルを表示させ、マウスの現在位置にあるチャートのアイテムのy座標を凡例に表示させている。

image.htmlは、jquery.flot.image.jsを利用して、チャート内にイメージを表示している。イメージがロードされるのを待って、チャートの描画処理が開始されるようにしている。

pie.htmlは、jquery.flot.pie.jsを利用して、円グラフを表示している。

JavaScriptのチャートコンポーネントには、Emprise JavaScript Charts(http://www.ejschart.com/)というものもあるが、こちらはオープンソースではない。

PlotKithttp://www.liquidx.net/plotkit/)は、JavaScript用のチャートライブラリで、HTML CanvasSVGに対応している。

flotr(http://solutoire.com/flotr/)というライブラリもある。

HBaseなどについて今日調べたこと

HBaseはGoogleの基盤ソフトウェアであるBigTableオープンソースクローンである。Javaで記述されていて、Hadoopに依存し、実際のデータはHDFSHadoop Distributed File System)上に安全に保存される。Hadoopは、Google File Systemのオープンソースクローンである。(参考:http://codezine.jp/article/detail/2448?p=2

HBaseにおけるテーブルはHadoop上のMapReduceジョブの入出力として機能し、Java APIを通じアクセスが可能である。(参考:http://ja.wikipedia.org/wiki/HBase)。

BigTableは、数ペタバイタにもなり、数千台のサーバにまたがって保存される、構造化されたデータを管理するためのシステムである。Googleのさまざまなプロジェクトで使われている。Bigtableは疎な、分散され、永続化される、多次元な、ソート済マップである。テーブル内の行のキーとして任意の文字列が使用される。BigTableは行キーの辞書順でデータを管理する。ある範囲の行がタブレットとして、同じサーバ上に格納される。そこで同時にアクセスされることの多いデータには(FQDNを逆順にするなど)、辞書順で近くなるようにキーを割り当て、同じタブレットに入るようにする。列キーは列ファミリに所属し、列ファミリの単位でアクセス制御とメモリ割り当てが行われる。列ファミリの数は多くても100までだが、列の数に限りはない。BigTable内の各セルには同じデータの複数バージョンを持つことができる。最新Nバージョンだけを保持することもできる。(参考:http://labs.google.com/papers/bigtable-osdi06.pdf

HBaseの公式サイト(http://hbase.apache.org/)から、hbase-0.90.1.tar.gzをダウンロードしてみた。README.txtに触れられていたdocs/book.htmlを読み進めていく。conf/hbase-site.xmlでhbase.rootdirプロパティを設定する。HBaseの起動は、./bin/start-hbase.shで行えるらしいが、cygwinだと、cygpath: cannot create short name ofなどの文句が数行出た後、localhost: ssh: connect to host localhost port 22: Connection refusedというメッセージで終了する。

http://d.hatena.ne.jp/Takao/20100203/1265193613にあるように、SSH Serverをcygwin上で動かさないとだめなようなので、インストールしてみる。cygrunsrv -S sshd をいきなりやると、cygrunsrv: Error starting a service: OpenService: Win32 error 1060:と怒られる。sshdの設定ファイルが必要なのかと、ssh-host-config -y をやってみると、パーミッションの問題でエラーになるので、chmod +r /etc/passwd を実行しようとしたら、やはりPermission denied。Vista以降の場合は、管理者としてcygwinを実行しないといけないようだ。

管理者としてcygwinを起動し、以下を実行すると、ssh-host-config -yが成功した。(途中でcyg_serverアカウントのパスワードを聞かれた)
chmod +r /etc/passwd
chmod +r /etc/group
chmod 755 /var

ssh-host-config -yが成功したら、cygrunsrv -S sshd も成功したので、./bin/start-hbase.shを再実行。
javaがみつからない、hbase-daemon.shがみつからないというメッセージで落ちる。

以下のように、シンボリックリンクを張って、
ln -s /cygdrive/c/Program\ Files/Java/jdk1.6.0_23 /usr/local/jdk1.6.0_23

conf/hbase-env.shでJAVA_HOMEを設定する。
export JAVA_HOME=/usr/local/jdk1.6.0_23

hbase-daemon.sh: No such file or directoryでエラーになっているためか、masterのログで2181ポートに接続できていない。

2011-04-08 15:24:17,085 INFO org.apache.zookeeper.ZooKeeper: Initiating client connection, connectString=localhost:2181 sessionTimeout=180000 watcher=regionserver:60162
2011-04-08 15:24:17,085 INFO org.apache.zookeeper.ClientCnxn: Opening socket connection to server localhost/0:0:0:0:0:0:0:1:2181
2011-04-08 15:24:17,085 WARN org.apache.zookeeper.ClientCnxn: Session 0x0 for server null, unexpected error, closing socket connection and attempting reconnect
java.net.SocketException: Address family not supported by protocol family: connect
at sun.nio.ch.Net.connect(Native Method)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:500)
at org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1050)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1077)

hbase shell を動かすと、下記のようなエラーも出る。

java.lang.UnsatisfiedLinkError: C:\cygwin\tmp\jline_.dll: プロセスはファイルにアクセスできません。別のプロセスが使用中です。

で、ここまできたところで、hbase-0.90.1.tar.gzの中に、docs/cygwin.htmlがあることに気付いた。ううん。状況は、あまり変わらない。うーん、cygwinを業務でバリバリ使うというのは、やはり無理があるか。

HTML5などについて今日調べたこと

HTML5canvas要素や他の機能は、Flash Playerを駆逐するのだろうか。Canvasチュートリアルhttps://developer.mozilla.org/ja/Canvas_tutorial)をみると、キー入力で画面を切り替える例はあったけど、マウスで操作などはできるのだろうかと思っていたら、マウスクリックでcanvasを入れ替えるゲームがあった(http://nic-nac-project.de/~jcm/index.php?nav=puzzle)。それにしても、ライブラリかコンポーネントがないと、CanvasAPIを直接叩いての実装というのは、ちょっと難しい。RubyにおけるRailsにあたるものは、Canvasに対しては何なのだろうか。

ブラウザは最新の標準に準拠すれば、古いバージョンのHTMLでも問題なく扱えるようになっている。ブラウザは標準のすべてを実装しているわけではない。全体としての仕様のステータスよりも、セクションごとの状態に注目すべきである。(参考:http://www.html5.jp/trans/whatwg_html5faq.html

HTML5で追加されたoutput要素、datalist要素、をFirefox4で確認(参考:http://www.atmarkit.co.jp/fwcr/design/benkyo/html5appli08/01.html

HTML5で追加されたinputタグのplaceholder属性をFirefox4で確認(参考:http://www.atmarkit.co.jp/fwcr/design/benkyo/html5appli06/01.html)

HTML5で追加されたチェックボックスのindeterminateプロパティをFirefox4で確認(参考:http://www.atmarkit.co.jp/fwcr/design/benkyo/html5appli06/02.html

削除された要素をウェブ製作者は使ってはいけないが、ユーザエージェントはサポートしなければいけない。ウェブ製作者向けとユーザエージェント向けでルールは分かれている。(参考:http://www.html5.jp/trans/w3c_differences.html

HTML5ボキャブラリはDOMによって規定され、それをシリアライズしたのが、HTMLであり、XHTMLである。(参考:http://www.atmarkit.co.jp/fwcr/design/benkyo/html5appli03/01.html

HTML4ではdiv要素で書くしかなかったパーツを、HTML5では、それぞれの役割や内容ごとに、header、nav、section、article、footer要素で表現することができる。HTML5のinput要素には、従来はJavaScriptで行われていた入力バリデーションをブラウザー内部で行うためのtype属性が追加されている。(参考:http://www.html5.jp/html5doctor/designing-a-blog-with-html5.html

HTML5をtext/htmlで記述する場合、

>のように終了タグを省略したり、タグを丸ごと省略することが可能。値の中に空白などがなければ、属性値を引用符で囲む必要はなく、checkedのように属性名だけで、値をtrueにセットすることもできる。SVGやMathMLを簡単に埋め込むことができる。(参考:http://www.atmarkit.co.jp/fwcr/design/benkyo/html5appli02/02.html

mark要素は、検索結果の中で、検索対象キーワードを目立たされる場合などに使用する。strongやemとは意味合いが異なる。(参考:http://www.html5.jp/html5doctor/draw-attention-with-mark.html

memchachedなどについて今日調べたこと

memchachedとはキャッシュサーバである。本来は複数台のマシンに分散してデータを持つことで効果が発揮されるものであるが、一台のマシンで動かして、気軽に効果を感じることはできないものか。

Webアプリケーションサーバを複数台用意することで、同時に処理できるリクエストの数を増やす。WebアプリケーションサーバからDBへのアクセスがネックとなるので、WebアプリケーションサーバとDBとの間にキャッシュサーバを置き、処理を高速化される。キャッシュサーバを複数台用意することで、さらに処理を高速化させるが、そのとき、どのキャッシュをどのサーバに置くかのアルゴリズム(Consistent Hashingなど)を統一することで、Webアプリケーションサーバ上のキャッシュクライアントが、必要とされるデータを持つキャッシュサーバに正しくアクセスできるようにする。(参考:http://gihyo.jp/dev/feature/01/memcached_advanced/0004

どのページでも利用するような共通データは、すべてのキャッシュサーバに置き、クライアントからは均等に(ランダムに)アクセスされるようにする工夫が必要となる。(参考:http://gihyo.jp/dev/feature/01/memcached_advanced/0004

稼働監視の方法には、「サーバからのping応答を確認する」「サーパプロセスが待機しているポートに接続できることを確認する」「CPU使用率を確認する」「Disk使用率を確認する」「サーバプロセスに簡単なコマンドを送って応答を確認する」「サーバプロセスの接続数を確認する」などがある。監視用のツールとして、NagiosやCloudForecastがある。(参考:http://gihyo.jp/dev/feature/01/memcached_advanced/0003

memchachedにインターネット上からアクセス可能にしていると、memchached上のデータがすべて漏えいしてしまう。グローバルIP側のポートをリッスンしないようにするあるいは、可能であればSASLを使用する必要がある。また不要なデータをキャッシュしないようにすることが重要である。アスキープロトコルではコマンドインジェクションの問題が生じやすい。(参考:http://gihyo.jp/dev/feature/01/memcached_advanced/0002

Kaiはmemcachedプロトコルのサーバをクラスタ構成し、memcachedクライアントからのリクエストを処理する。memcachedクライアントではなく、Kai側でデータの取得、格納ノードを判定する(参考:http://gihyo.jp/dev/feature/01/kai/0003

memcachedはスラブ単位でキャッシュを格納する。(参考:http://gihyo.jp/dev/feature/01/memcached/0002?page=3

memcachedの特徴は、データの揮発性である。(参考:http://gihyo.jp/dev/serial/01/various-nosql/0002
TokyoTyrantmemcachedに永続性機能を追加した代替実装である。expiresを指定できない以外は、memcachedと同じように使用できる(参考:http://gihyo.jp/dev/serial/01/various-nosql/0003

HBaseとCassandraは、列指向型データベースとして、大規模なデータを扱うのに適している。(参考:http://gihyo.jp/dev/serial/01/various-nosql/0005

MongoDBは、スキーマレスなDBである。(参考:http://gihyo.jp/dev/serial/01/various-nosql/0004

JOINを行うselect文が遅くなる原因の一つが、データがメモリー内に収まらないこと。Sort MergeとHashアルゴリズムでは、メモリ上に一時的な作業領域が必要となる。Nested Loopでは、そのようなことは起きにくい。(参考:http://gihyo.jp/dev/serial/01/db-academy/000403?page=2

システムのパフォーマンスにおけるボトルネックの原因は、「リソース消費」(CPU・メモリ・ディスク・ネットワークの消費)と「流量制限」(コネクションなどが空くのを待っている)以外にはない。(参考:http://gihyo.jp/dev/serial/01/db-academy/000502

システムのパフォーマンスチューニングでは、最初に滞留時間を計測し、ボトルネックを探す。クライアント側やネットワークが問題となっていることもある。(参考:http://gihyo.jp/dev/serial/01/db-academy/000501?page=2

統計情報が間違っているために、オプティマイザが最適な実行計画を選択できないという問題が起きる。(参考:http://gihyo.jp/dev/serial/01/db-academy/000401?page=2

Serializableだと、Dirty Read(他トランザクションの未コミットのデータが読みだされる)、Unrepeatable Read(トランザクションの途中で、他のトランザクションによるコミットが行われたので、最初に読み込んだレコードの値と、次に読み込んだレコードの値が異なる)、Phantom(トランザクションの途中で、他のトランザクションによるコミットが行われたので、最初の検索結果と次の検索結果が異なる)のどれも発生しない。Repeatable ReadだとPhantomは防げない。Read CommittedだとPhantomとUnrepeatable Readは防げない。Read Uncommittedだと、どれも防げない。パフォーマンスと厳密性のトレードオフの結果、ほとんどのRDBMSでRead Committedがデフォルト。(参考:http://gihyo.jp/dev/serial/01/db-academy/000203?page=2

トランザクションがコミットされると、WALでひとまずログファイルに書き込んで、データ反映処理はあとでゆっくりとやる(チェックポイント)。障害発生時にログファイルからデータファイルに変更を反映させることをロールフォワードという。(参考:http://gihyo.jp/dev/serial/01/db-academy/000202

OLAP関数のサポートはPostgres8.4から。OLAP関数を使うと、ランク付けや移動平均の計算などができる(参考:http://gihyo.jp/dev/serial/01/sql_academy2/001101