2013年8月24日土曜日

[Play][jQuery]GoogleReaderのStarを取り扱うWebアプリケーション

ちんたらしていましたが作りました。

https://github.com/eruchee/grstar/


使い方

  1. play frameworkを導入する
  2. 上記URLからプログラムを入手して展開する
  3. 展開先の public/ ディレクトリ に、ご自身のstarred.jsonを配置する。
  4. 展開したディレクトリでplay runを実行する
  5. http://localhost:9000/へアクセスする。

操作

j / k 下 / 上の記事を開く
n / p 下/ 上の記事を選択する
o 記事を開く
v 新しいウインドウで記事を開く
s 記事を削除する (削除を取りやめる、削除した記事を復帰させる)
r 読み込み直す

Sボタンを押した場合の動作
先頭に以下のマークがつきます。Sボタン押下時には以下のパターンで変化します。

(S押下前→S押下後)
  • 無印 → M ファイルからの削除待ち
  • D   → R   ファイルstarred.jsonへ復帰待ち
  • M   → 無印 ファイルstarred.jsonからの削除とりやめ 
 以下のマークは、starred.jsonへの反映が完了した時に変化します。
  • M   → D   ファイルstarred.jsonからの削除済み
  • R   → 無印 ファイルstarred.jsonへ復帰済み

制限

  • starred.jsonを最後まで読み切った際の考慮が甘すぎです
  • たくさんのアイテムにMやRをマークすると(特にR)、きちんと動きません。 原因?仕様?


2013年8月9日金曜日

[Play]Jsonデータの渡し方

ドキュメントでは受け取り方や、レスポンスの返し方は書かれているのですが、jQuery側から、サーバ側へのJSONの渡し方がありませんでした。この点を補足したいと思います。

Play Frameworkでは、JSONデータを受け取る際にContent-Typeがapplication/jsonでなければ、解釈しないようになっています。

jQueryには$.postもありますが、content-typeの設定が行えないのでこれは使わないことにします(注)。

低レベルで設定を行う$.ajaxを利用して、陽にContent-Typeを設定して、JSONを投げます。
$.ajax({
  type: "POST",
  contentType: "application/json",
  url: '/proccb',
  data: jsonstr,
  complete: function(e, xhr, setting) {},
  dataType: "json"
});

[JSON]改行を含めたJSON文書

Jacksonで、要素ごとに改行をする(インデントを加える)方法が日本語でなかなか見つからなかったので 記します。デフォルトですと一行で書き連ねるので、大きなサイズのJSONは読みづらくなってしまいます。

SerializationConfig.Feature.INDENT_OUTPUTをtrueにします。

mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT,true);

出典 http://jackson-users.ning.com/forum/topics/newbie-question-how-to-write-with-line-breaks

2013年8月4日日曜日

[Javascript] Google Chrome の違うプロセスでタブを開く

Google Chromeにおいて、普通にwindow.openとした場合、同じプロセスで新しいタブを開いてしまい、処理が非常に重たくなる場合があります。せっかくマルチプロセスで動いてくれるのにこれはもったいない。

これを回避しつつ、新しいタブを開くロジックです。

wo = window.open();
wo.opener = null;
wo.location.href = URL;


以下が参考になりました。
https://code.google.com/p/chromium/issues/detail?id=153363

(雑記)
wo.blur() とか試してみたいけれどもまだやっておりません。

(追記)
Firefox、IEでも動作はしたので、ブラウザで切り分けることはないでしょう。

$.ajaxの送信完了イベントの受け取り

$.ajaxにおいては、
  • 送信前 (beforeSend)
  • 送信後 (complete)
  • 送信成功 (success)
  • 送信失敗 (error)
のように、様々なイベントをキャッチすることが可能ですが、そのコールバック関数が取る引数について。

$.ajaxのイベントには、$.ajaxのパラメータに指定するローカルイベントハンドラと、$ajaxCompleteのように指定するグローバルイベントハンドラがあります。違いは以下のとおりです。

  • ローカルイベントハンドラ : 定義した$.ajaxのみ対象とするイベント
  • グローバルイベントハンドラ : すべての$.ajaxを対象とするイベント(ajaxCompleteなど)
それぞれ、ステータスや、XMLHttpRequestオブジェクトなどが格納されるのですが、順番が異なるため、同じように実装すると、期待していたように動かないといったことが起こります。
グローバルイベントハンドラは多々有りましたがローカルイベントハンドラの引数の情報が見当たらなかった(参考文献の$.ajaxは公式だと思います)ので作成しておきます。

例)complete / ajaxCompleteの場合:

ローカルイベントハンドラ
$.ajax ( 
  省略
  complete : function(XMLHttpRequest, status){ },
)

グローバルイベントハンドラ
ajaxComplete(status, XMLHttpRequest, setting)

settingは、$.ajaxの引数や$.ajaxSetupによって設定したオプションが格納されます。


参考