2012年11月25日 利用者に一斉通知するためのプッシュ通知サービスメモ
_ [Web] 利用者に一斉通知するためのプッシュ通知サービスメモ
Boxcar
- 定番。iPhoneアプリのみ。ブラウザから履歴閲覧・設定とかはできる。
- Twitter、Facebook、メール(アドレスが用意され、そこに転送する形)、RSSフィードなどに対応。
- たまに通知してくれないとき、すんごい遅れて通知してくるときがある。
- 開発者独自のプロバイダを作成し、キーを取得する。
- 利用者登録: HTTPでキーと利用者メールアドレスを投げる。 (Provider API#SUBSCRIBE)
- Boxcar未登録のメールアドレスを投げると、そのアドレス宛に「Boxcar登録しませんか」メールが届く。
- 登録解除はBoxcar上から。公開プロバイダになれれば登録もBoxcar上から出来るようになる、たぶん。
- ブロードキャスト: HTTPでもろもろ添えて投げるだけ。 Provider API#BROADCAST
Airgram
- iPhone/Android両対応。
- 使ったことないので安定性とかわかりません。。
- Boxcarと利用方法は同じ。 (Airgram - API Reference)
Notifo
- ブロードキャストできないぽいので却下。 (API Documentation - Notifications - Notifo)
2012年11月18日 Monoと.NET FrameworkとのDateTime.Parseの挙動の違い
_ [C#] Monoと.NET FrameworkとのDateTime.Parseの挙動の違い
Windowsで動くプログラムがLinuxだとコケる。もとい、.NET Frameworkだと動くプログラムがMonoだとコケる状況に遭遇しました。
デバッグするとDateTime.Parseでコケてたので、挙動の違いを調べてみました。
文字列 | .NET Framework | Mono |
2012年11月18日 | ○ | ○ |
2012年11月18日12時00分 | ○ | △ (DateTime.Parseはエラー。ParseExactで対応可) |
平成24年11月18日 | ○ | × |
Monoだと和暦はまったくダメで、西暦でも時刻が含まれていると DateTime.Parse では対応できないようです。困りました。
以下、詳細です。
実行環境
- Windows 7 x86 + .NET Framework 3.5 (Visual Studio 2008)
- Ubuntu Linux 12.04 x64 + Mono 2.10.8.1
1. 西暦を日本語表記、日付のみ
string target = "2012年11月18日"; DateTime parsed = DateTime.Parse (target); Console.WriteLine (parsed.ToString ());
.NET Framework
2012/11/18 0:00:00
Mono
2012/11/18 0:00:00
2. 西暦を日本語表記、日時
string target = "2012年11月18日12時00分"; DateTime parsed = DateTime.Parse (target); Console.WriteLine (parsed.ToString ());
.NET Framework
2012/11/18 12:00:00
Mono
Unhandled Exception: System.FormatException: String was not recognized as a valid DateTime. at System.DateTime.Parse (System.String s, IFormatProvider provider, DateTimeStyles styles) [0x00000] in <filename unknown>:0 at System.DateTime.Parse (System.String s, IFormatProvider provider) [0x00000] in <filename unknown>:0 at System.DateTime.Parse (System.String s) [0x00000] in <filename unknown>:0 at DateTimeTest.MainClass.Main (System.String[] args) [0x00006] in ***/DateTimeTest/Main.cs:10 [ERROR] FATAL UNHANDLED EXCEPTION: System.FormatException: String was not recognized as a valid DateTime. at System.DateTime.Parse (System.String s, IFormatProvider provider, DateTimeStyles styles) [0x00000] in <filename unknown>:0 at System.DateTime.Parse (System.String s, IFormatProvider provider) [0x00000] in <filename unknown>:0 at System.DateTime.Parse (System.String s) [0x00000] in <filename unknown>:0 at DateTimeTest.MainClass.Main (System.String[] args) [0x00006] in ***/DateTimeTest/Main.cs:10
3. 西暦を日本語表記、日時、ParseExact使用
string target = "2012年11月18日12時00分"; DateTime parsed = DateTime.ParseExact (target, "yyyy年MM月dd日HH時mm分", new CultureInfo("ja-JP")); Console.WriteLine (parsed.ToString ());
.NET Framework
2012/11/18 12:00:00
Mono
2012/11/18 12:00:00
4. 和暦を日本語表記、日付のみ
string target = "平成24年11月18日"; DateTime parsed = DateTime.Parse (target); Console.WriteLine (parsed.ToString ());
.NET Framework
2012/11/18 0:00:00
Mono
Unhandled Exception: System.FormatException: String was not recognized as a valid DateTime. at System.DateTime.Parse (System.String s, IFormatProvider provider, DateTimeStyles styles) [0x00000] in <filename unknown>:0 at System.DateTime.Parse (System.String s, IFormatProvider provider) [0x00000] in <filename unknown>:0 at System.DateTime.Parse (System.String s) [0x00000] in <filename unknown>:0 at DateTimeTest.MainClass.Main (System.String[] args) [0x00006] in ***/DateTimeTest/Main.cs:11 [ERROR] FATAL UNHANDLED EXCEPTION: System.FormatException: String was not recognized as a valid DateTime. at System.DateTime.Parse (System.String s, IFormatProvider provider, DateTimeStyles styles) [0x00000] in <filename unknown>:0 at System.DateTime.Parse (System.String s, IFormatProvider provider) [0x00000] in <filename unknown>:0 at System.DateTime.Parse (System.String s) [0x00000] in <filename unknown>:0 at DateTimeTest.MainClass.Main (System.String[] args) [0x00006] in ***/DateTimeTest/Main.cs:11
5. 和暦を日本語表記、日付のみ、ParseExact使用
string target = "平成24年11月18日"; CultureInfo culture = new CultureInfo("ja-JP", true); culture.DateTimeFormat.Calendar = new JapaneseCalendar(); // 和暦使用 DateTime parsed = DateTime.ParseExact (target, "ggyy年MM月dd日", culture); Console.WriteLine (parsed.ToString ());
.NET Framework
2012/11/18 0:00:00
Mono
Unhandled Exception: System.FormatException: Invalid format string at System.DateTime.ParseExact (System.String s, System.String[] formats, IFormatProvider provider, DateTimeStyles style) [0x00000] in <filename unknown>:0 at System.DateTime.ParseExact (System.String s, System.String format, IFormatProvider provider, DateTimeStyles style) [0x00000] in <filename unknown>:0 at System.DateTime.ParseExact (System.String s, System.String format, IFormatProvider provider) [0x00000] in <filename unknown>:0 at DateTimeTest.MainClass.Main (System.String[] args) [0x00022] in ***/DateTimeTest/Main.cs:14 [ERROR] FATAL UNHANDLED EXCEPTION: System.FormatException: Invalid format string at System.DateTime.ParseExact (System.String s, System.String[] formats, IFormatProvider provider, DateTimeStyles style) [0x00000] in <filename unknown>:0 at System.DateTime.ParseExact (System.String s, System.String format, IFormatProvider provider, DateTimeStyles style) [0x00000] in <filename unknown>:0 at System.DateTime.ParseExact (System.String s, System.String format, IFormatProvider provider) [0x00000] in <filename unknown>:0 at DateTimeTest.MainClass.Main (System.String[] args) [0x00022] in ***/DateTimeTest/Main.cs:14
2012年09月24日 padrinoとmongoid 3.0系は相性が悪い? → padrino edge(git版) なら大丈夫
_ [Web][Ruby] padrinoとmongoid 3.0系は相性が悪い? → padrino edge(git版) なら大丈夫
先日 padrinoとmongoid 3.0系は相性が悪い? → mongoid 2.5系を使う を書きましたが,githubのpadrino (padrino edge)だと大丈夫だったので,その方法をば.
ちゅうい
- githubのpadrino は,きちんと動く状態になっているとは限りません.
- よーく見ると「build status: failing」になってたりします.
方法
- まずはGemfileを編集して, Padrino Edge (gitのもの) を使うようにします.ついでに,bson_extをコメントアウトしておきます。
# gem 'bson_ext', :require => "mongo" (省略) # Padrino Stable Gem # gem 'padrino', '0.10.7' # Or Padrino Edge gem 'padrino', :git => 'git://github.com/padrino/padrino-framework.git'
- bundle installします.
$ bundle install
- config/database.yml ファイルを作って,良い感じに書きます.書き方は Mongoid: Installation #Configuration あたりを参考に.
development: sessions: default: database: myapp_development hosts: - localhost:27017
- config/database.rb を書き換え,以下の3行だけにしてしまいます.
Padrino.before_load do Mongoid.load!(File.join(Padrino.root,"config/database.yml")) end
- 動作確認してみましょう.
$ padrino c => Loading development console (Padrino v.0.10.7) => Loading Application MyApp => Loading Application Admin 1.9.3-p194 :001 > Account.first => #<Account _id: 505d79e18e406f2bc4000001, _type: nil, name: "Foo", surname: "Bar", email: "test@example.com", crypted_password: "$2a$10$MuNCMgHB.jnz5d4g9clSQurCyRamdppvHglTRFB9ZvGyDBbXER5IC", role: "admin">
めでたしめでたし.
参考
2012年09月22日 padrinoとmongoid 3.0系は相性が悪い? → mongoid 2.5系を使う
_ [Web][Ruby] padrinoとmongoid 3.0系は相性が悪い? → mongoid 2.5系を使う
- 2012/09/24追記: 3.0系を使う方法も書きました -> padrinoとmongoid 3.0系は相性が悪い? → padrino edge(git版) なら大丈夫
padrino入れて,mongoid使うように設定したところエラーが.
$ padrino s ~/.rvm/gems/ruby-1.9.3-p194/gems/bundler-1.0.22/lib/bundler/runtime.rb:68: in `require': cannot load such file -- mongo (LoadError)
足りないなら足せばいい,ということでGemfileに gem 'mongo' を追記.bundle installしても,またもやエラー.
$ padrino s ~/test_app/config/database.rb:12: in `<top (required)>': undefined method `database=' for Mongoid:Module (NoMethodError)
調べてると Error running "padrino g admin" ・ Issue #881 ・ padrino/padrino-framework ・ GitHub が見つかりましたが、どうもデータベースの指定を読み込んでくれず(英語を読み違えてるのかもしれませんが)… 結局 Mongoid 2.5系を使う ことにしました.
対処方法: Mongoid 2.5系を使う
まずは Gemfile を編集し,Mongoid 2.5.xが読まれるようにします.
gem 'mongoid', "~> 2.5.0" # gem 'mongo' # 読まれるのでわざわざ記述する必要なし.
bundle installします.
$ bundle install (省略) Your bundle is complete!
起動します.
$ padrino s => Padrino/0.10.7 has taken the stage development at http://0.0.0.0:3000 [2012-09-22 23:37:56] INFO WEBrick 1.3.1 [2012-09-22 23:37:56] INFO ruby 1.9.3 (2012-04-20) [i686-linux] [2012-09-22 23:37:56] INFO WEBrick::HTTPServer#start: pid=11079 port=3000
めでたしめでたし.
githubのTagsでリリース日時を確認してみると,
ということで,PadrinoがMongoid 3.0系に対応していないのかもしれません.
2012年08月19日 [P2PQ] 毎秒何接続さばいているかを調べる
_ [P2PQ] 毎秒何接続さばいているかを調べる
あらすじ。
p2pquake.ddo.jpサーバが落ちて、もともと計画停電用に契約した"さくらのVPS 2Gプラン"で動かしていた(Debian上のVirtualBox上の)Windowsに処理を肩代わりさせることに。
…というところまでは良かったんですが、仮想環境上のWindowsは動作がもっさりとしていて、かつVB6の擬似マルチスレッドは効率が悪すぎて、アクセスをさばききれませんでした。ちゃんちゃん。
本題。
いったいP2P地震情報サーバへの接続は、1秒あたりどのくらい来ているのか。2012年8月18日(土)の状況を調べてみました。
ピーク時にだいたい6接続/秒くらい。
8月18日はほぼ3サーバ体制で動いていたので、(接続が3サーバへ均等に分散していたとすると、)全体としては6×3で18接続/秒くらいになります。
いまの設計だと、いちばん良い条件で8000ピアで13接続/秒くらいなんですが、30〜40%くらい差がありますね。ふむ。