作成者別アーカイブ:

jQueryで非同期処理の完了を待つ(jQuery.Deferred())

 jQueryのAJAX実装をすると、通常、通信が戻ってくるのを待たずに次の処理に進んで、通信の結果はコールバックで処理するよね。

function getResponse(url, parameters, target){
  jQuery.post(url, parameters, function(response){
    for(i in response){
      $(target).html(response[i]);
    }
  });
}

みたいな感じね。

 でも、この処理をまたどこからか呼び出していて、呼び出し元で、この通信が終了している必要がある場合(たとえばappendした結果に対して何か処理したいとか)、普通に

getResponse(‘http://hoge.tld/piyo.php’, {‘request’:’getMessage’}, ‘#targetArea’);
alert($(‘#targetArea’).html());

とかすると、getResponseは要求を作っただけで戻ってきてしまうので、alertの中身は空っぽ、みたいな事になる。
で、これに対応するためにどうするかというと、jQueryのDeferredを使うと良いようだ。

ファンクションの方は

function getResponse(url, parameters, target){
  var def = jQuery.Deferred();
  jQuery.post(url, parameters, function(response){
    for(i in response){
      jQuery(target).html(response[i]);
    }
    def.resolve();
  });
  return def.promise();
}

みたいな感じで、Deferred.promise()を戻すようにする。
AJAXの戻り値を待つ必要がない既存のコードは、特に何も変えなければそのまま動く。 そして、先のように待機する必要がある場合のコードでは、

jQuery.when(
  getResponse(‘http://hoge.tld/piyo.php’, {‘request’:’getMessage’}, ‘#targetArea’)
).done(
  function(){
    alert($(‘#targetArea’).html());
  }
);

みたいな感じにすると、getResponseが返したDeferredがresolveを実行次第doneの中身が呼び出される。
done()は、Deferredにバインドしている形なので、

jQuery.when(
  getResponse(‘http://hoge.tld/piyo.php’, {‘request’:’getMessage’}, ‘#targetArea’)
).done(
  function(){
    alert($(‘#targetArea’).html());
  }
);
window.close();

みたいにすると、表示してから閉じると言う動きにはならず、すぐ閉じてしまう。

なお、失敗時のために、resolve doneの組み合わせに対して、reject failがある。。

jQuery.when( asyncFunc() ).done( trueFunc() ).fail( failFunc() );

みたいにすれば、asyncFunc()の返したDeferredでresolve()が実行されればtrueFunc()を、reject()が実行されればfailFunc()が実行されるようになる。

 ファンクションが何かの値を戻していた場合、普通に書き換えるとDeferredを戻さなくてはならなくなると言う問題があるが、resolve/rejectに引数として与えると、done/failの引数として引き継がれる。

function getResponse(url, parameters, target){
  var def = jQuery.Deferred();
  jQuery.post(url, parameters, function(response){
    for(i in response){
      jQuery(target).html(response[i]);
    }
    def.resolve(response.length);
  });
  return def.promise();
}

jQuery.when(
  getResponse(‘http://hoge.tld/piyo.php’, {‘request’:’getMessage’}, ‘#targetArea’)
).done(
  function(len){
    alert(len + ‘:’ + $(‘#targetArea’).html());
  }
);

みたいな感じ。

whenはDeferredを複数くっつけるための物なので、1個の実行を待つだけならDeferredを戻すファンクションに対して、 asyncFunc().done(trueFunc()) 的な呼び出しでも良いっぽい。

(10588)


カテゴリー: jQuery | コメントをどうぞ

RTX1000で複数の経路を切り替える

 RTX1000を1台使用したネットワークで2本のプロバイダ接続を行って、使用する経路を切り替える。
 宛先毎にルートを指定する場合は、スタティックルーティングで

ip route 8.8.8.8 gateway pp 1
ip route default gateway pp 2

みたいにするわけだけど、今回の要望は同じサブネット上に存在する特定の端末について、回線を切り替える必要が生じた。

この場合は、フィルタ型ルーティングと言う方法を利用して、

ip filter 101 pass 192.168.0.0/24 * * * *
ip filter 201 pass 192.168.0.100 * * * *
ip route default gateway pp 2 filter 201 gateway pp 1 filter 101

のようにすると、各ゲートウェイに対してフィルタを適用して、先頭から順次チェックして通れるゲートウェイを通過するようになる。
この場合は、192.168.0.100から送出されたパケットはpp2を通り、それ以外の192.168.0.0/24ネットワークから送出されたパケットはpp1を通る。
pp2を通るPCを追加する場合は、

ip filter 202 pass 192.168.0.101 * * * *
ip route default gateway pp 2 filter 201 202 gateway pp 1 filter 101

みたいな感じで並べる。
連続IPなら、

ip filter 201 pass 192.168.0.100-192.168.0.101 * * * *

でもOK。

(1687)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

自宅のテープドライブを更新した

 昔から自宅のデータ保管装置としてテープドライブを使ってます。
 DDSからDLT、SDLTと変遷し、今まではLTO(LTO2)を使っていたんだけど、このたび、LTO4に更新しました。
 LTOは最新の6が出始めた感じで、その流れからLTO4の安い中古品が結構で回り始めていて、今回のLTO4購入となりました。

 最近は、テープは過去の遺物的に言われることも多いのですが、諸々考えると十分選択肢となり得るデバイスだと思います。

 手軽なバックアップメディアとしてはBD-Rがあるかと思いますが、LTO4は1本で800GBの保管が可能なので、BD-R1層25GBの32枚分が1本のテープに収まります(BD-Rは2層やXLメディア等もありますが、容量単価、書き込み速度、信頼性などの点では、BD-R1層メディアがベストでしょう)
 また、BD-Rは書き込みエラー率も結構高く、保管中に記録面に傷が付いて読み込み不能という確率も結構あります。 LTOは書き込みエラーはほぼ無く、カートリッジ式で記録面むき出しではないので保管が容易です。
 転送速度的に、BD-Rは最新16倍速で毎秒72MBの転送が可能であるものの対応メディアは価格が高く、信頼出来て容量単価に優れたメディアでは6倍速の毎秒27MBの転送速度です。 LTO4は毎秒100MB以が可能であるのに比べると低速と言わざるを得ません。
 容量単価としては信頼出来る6倍速メディアは30枚で2100円程度です。 LTO4カートリッジは海外から仕入れれば1本20ドル以下なので、容量単価は同等~やや高価な感じです(BD-Rのディスクは怪しいメーカーの製造した物が多々ありますが、LTO4のテープなんてメジャーメーカーしか作っていないため、ブランド不明の物を購入しても、たいていTDKや富士フイルム等が製造した物です)
 BD-Rはランダムアクセスが可能なので、保管したメディアをドライブに入れればすぐ読めるのは利点ですが、バックアップ作業時のメディア交換の手間や、速度・信頼性を考えるとLTO4が有利だと思います。

 大容量・高速と言う意味では、HDDをそのまま保管という方法もありますね。
 速度はLTO4よりも高速、大容量、ランダムアクセス可能であり便利ではありますが、保管の難しさは高く、衝撃や静電気への高い配慮が必要ですね。
 容量単価は1本あたり3TBの物で1万円程度、LTO4カートリッジ4本3.2TBの80ドルと比較するとやや高価です。

 テープはバックアップソフトが必要等という意見もありますが、単純にファイルバックアップであれば、Linux環境でAmanda等のフリーソフトを使用すれば無料で構築可能です。

 今回はドライブを348ドル、PCI-Express接続のSCSIアダプタとケーブルセットを38ドルで購入しました。 同時に、クリーニングカートリッジ5本を17ドル、データカートリッジ50本を950ドルで購入しました。
 約11万5千円で40TBの保管が出来る計算になります。
 そんなに容量なにするねんと言う人もいるかもしれませんが、テレビ録画しまくってて、それを保存したいんです。
 これから年末・年始にかけて10TBくらい開けておかないと番組が保存しきれません。

 今後、熱アシスト記録方式によりHDDは一気に大容量化が進む(最終的に3.5インチ装置で60TB程度まで)と言われていますが、2013年中に一般向け製品が出るかどうかと言うところのようです。 それまでは、現行の垂直磁気記録方式の密度上限で現行の4TB、移行の状況によっては経過的に5TBが出る程度のようです。
 1ドライブ10TBとかのHDDが低価格化してくると、ミラーして同じデータを複数保管等の方法をとって容量単価と信頼性をある程度得られるようになるかなと思いますが、2~3年はLTO4かなと思います。

(1023)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | 1件のコメント

Windows Server 2012のCHKDSKもやっぱりメモリ不足で止まる。

 Windows7 64bitで話題になったCHKDSKするとメモリ不足になるという話だけど、WindowsServer2012(WS2012)でも同様に発生した。

破損ファイル (…\sc_files_001.jpg <0x2,0xef18d>, …\sc_files_002.jpg <0x2,0xef18e>, …) が 3 個見つかりました。ディレクトリ “\??\D:\found.001” のインデックス “$I30” への再接続を要求しています。
メモリ不足のため、自己復旧用のコマンドを送信できませんでした。

 実装メモリ8GBで24TBアレイを低レベルセクタ書き換えで無理に破壊してCHKDSK /SCANを実行したらこうなった。
 さて、どうしたら上手く動くようになるのかな。
 とりあえず、こういった、非正常時の動作を検証しないと本番化はできないよなぁ。

(843)


カテゴリー: Windows VPS | コメントをどうぞ

GMOクラウドVPSのSLA返金がきた

 先日のGMOクラウドVPSダウンで、サポートに入れてあった問い合わせに返信メールが来て、SLA適用で月額の10%分をデポジットとしてチャージしたとの事。
 管理画面で確認すると118円がチャージされていた。 しかし、6ヶ月契約してるから、次回の契約更新時にすこし(7080-118)値引きされる感じだね。
 しかし、デポジットだから契約を継続しないと受けられないわけだな。
 まぁ、どこの世界にも絶対に落ちないサーバは無いんだし、一度ミスった方が安全かもしれない? しばらくつきあいますか・・・

(371)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ

簡易サーバ監視用シェルスクリプト

 先日のGMOクラウドVPSのダウン時に活躍した簡易スクリプト。
 現在運用しているさくらVPSお名前.com VPSと共に、このバッチを走らせて相互に簡易監視している。

#!/bin/sh
serverlist=(‘server1.hoge.tld’ ‘server2.hoge.tld’ ‘www.piyo.tld’)
mailto=’address@hoge.tld’
date=date '+%Y-%m-%d %H:%M:%S'
for server in ${serverlist[@]}
do
loss=ping -c 1 $server | grep "% packet loss" | sed -e "s/^.* \([0-9]*\)% packet loss.*/\1/"
if test $loss -ne 0; then
echo "[$server] : No responding." | mail -s "Server alert [$server] @ $date" $mailto
fi
done

 HTTP監視とか一切せず、pingを一回打ってみて帰ってこなかったらサーバ名をメールするシェル。
 serverlistに監視対象サーバを列挙して、mailtoに通知先アドレスを入れるだけ。

実行権限をつけてcronで、

*/5 * * * * /home/myhome/bin/pingwatch.sh

みたいにして回す。

 ちょっと書き足して、wgetとかcurlを使うようにすればHTTP等の監視も出来るけど、これくらいがコンパクトで良いかと。

(214)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP], サーバ設定 | コメントをどうぞ

GMOクラウドのサーバ障害を食らった

 昨日(2012/10/18 20:47)からこのブログを入れているGMOクラウドVPSで障害が発生、結局、今日2時7分頃になってやっとサーバが立ち上がった。
 ダウンタイムは5時間強、SLAで返金があるのかな。
 会社から帰宅途中に監視のアラートメールがケータイに飛んできてなかなか慌てた(GMOクラウドとさくらで相互に監視している)

 当初2時間近くアナウンスもなく公式サイトにも接続できず、ユーザのTwitterや掲示板で状況確認する羽目になった。
結局、得られた公式情報は22:30の公式Twitterが最初だった。 障害情報すら得られないのは困りものだ。
 メールがバックアップサーバに飛んでいるからマスタサーバに統合しなきゃなぁ・・・

(331)


カテゴリー: LAMP[Linux, Apache, MySQL, PHP] | コメントをどうぞ