Safariからアプリを立ち上げる時に、インストールされていなかったら案内を出したい

written by shn, on Feb 2, 2012 1:32:00 AM.

タイトルな要望があったときにどうしたら良いのかなぁと調べようにも、どう調べよう? stackoverflowでどう調べればいいか思いつかないや。

アプリがあれば、Safariからアプリに切り替わる。無ければ、切り替わらずにアラートが出る。ということなので、以下のコードを書いた。

$(function() {
  $('a.launch-app').on('click', function(e) {
    $('#alert').hide();

    var timerId = setTimeout(function() {
      $('#alert').show();
      $(window).unbind('pagehide.appchecker');
    }, 500);

    $(window).bind('pagehide.appchecker', function() {
      clearTimeout(timerId);
      $(window).unbind('pagehide.appchecker');
    });
  });

アラートを出さないようにする。(もしくは、実際に遷移させようとする前にアプリがインストールされているか調べる方法はないのだろうか?

カスタムリソースにはNSURLProtocolを使えば良いのじゃないか?

written by shn, on Oct 4, 2011 11:05:00 PM.

「UIWebView の取り扱いによってはjavascript経由でサンドボックス外のファイルシステムにアクセスできてしまうという話と対処法」 で、UIWebViewにfile://スキームのリソースを表示する場合の脆弱性について触れられていた。 ちょうど自分もこのあたりの仕組みが必要だったのでいろいろ試してみたのだけど、結論から言えば、その場合はNSURLProtocolを使えば良いと思う。

CocoaではUIWebViewやその下のNSURLConnectionがアクセスするリソースはNSURLProtocolで抽象化されているので、 独自のスキームを定義し、それを通してアプリケーション内のリソースを表示するようにする。

以下のようなNSURLProtocolのサブクラスを定義する。:

@interface HogeProtocol : NSURLProtocol
@end

@implementation HogeProtocol
+ (BOOL)canInitWithRequest:(NSURLRequest *)request {
    return [[[request URL] scheme] isEqualToString:@"hoge"];
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request {
    return request;
}

- (void)startLoading {
    // ファイルから小さいリソースを読むぐらいだったら、dispachしなくても良いのかな...
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    NSString *filePath = [...] ///< self.request URL]から、該当するリソースのpathを
    NSString *mimeType = @"text/html"; ///< ここも

    dispatch_async(queue, ^{
        NSData *data = [NSData dataWithContentsOfFile:data];

        if(!data) {
            [self.client URLProtocol:self didFailWithError:[NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorResourceUnavailable:nil]];
            return;
        }

        [self.client URLProtocol:self didReceiveResponse:[[[NSURLResponse alloc] initWithURL:[self.request URL] 
                MIMEType:mimeType
                expectedContentLength:[data length]
                textEncodingName:@"UTF-8"] autorelease] cacheStoragePolicy:NSURLCacheStorageNotAllowed];
        [self.client URLProtocol:self didLoadData:data];
        [self.client URLProtocolDidFinishLoading:self];
    });
}

- (void)stopLoading {
    // stopLoadingが来たらデータの読み込みを中断するのだが、このコードだと中断しようが無い...
}
@end

随所が適当だが、こんな感じのを作って、UIWebViewでhoge:///スキームのリソースを読み込む:

[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"hoge:///index"]]];

リソース内で、例えば、<img src="sexy.jpg">のように相対パスでリソースをしても、hoge:///sexy.jpgのようなクエリが飛ぶので一安心。

実際には、リソース読み込み部分をカスタマイズして動的なデータにも対応していけば良いのだと思う。

ってほぼ↓のサンプルのコピペだな。

WebにはAppleのリファレンスぐらいしか情報がなかった。

EC2で時計がズレて困った人に送る、3つのライフハック

written by shn, on Aug 22, 2011 5:56:00 PM.

SESでメール送れない > 怒られる > 時計がずれてる > ntpdateしても治らない。

で困った。どうやらdomUは原則dom0に同期するので、ntpはイランらしいのだが、ずれてるものはずれている。そして私は困っている。

ごちゃごちゃやったらなんだか治った気がするので、これで良いのでしょうか?:

% sudo su
# echo 1 > /proc/sys/xen/independent_wallclock
# date
Mon Aug 22 17:47:20 JST 2011
# ntpdate time.asia.apple.com
22 Aug 17:47:28 ntpdate[20995]: the NTP socket is in use, exiting
# /etc/init.d/ntpd stop
Shutting down ntpd:                                        [  OK  ]
# date && ntpdate time.asia.apple.com && date
Mon Aug 22 17:47:44 JST 2011
22 Aug 17:58:07 ntpdate[21014]: step time server 17.83.253.7 offset 621.704371 sec
Mon Aug 22 17:58:07 JST 2011
# date && echo 0 > /proc/sys/xen/independent_wallclock && date
Mon Aug 22 17:58:49 JST 2011
Mon Aug 22 17:58:49 JST 2011
# /etc/init.d/ntpd stop
Starting ntpd:                                             [  OK  ]

追記

相変わらずズレズレなので、independent_wallclock=1にして、ntpdに任せた

『オンラインゲームを支える技術』 読了

written by shn, on Mar 25, 2011 3:42:00 PM.

中嶋さん(@ringo)さんから『オンラインゲームを支える技術』をいただいた。昨日読み終わったので書評的なものを書いてみる。

目次などは他サイトに譲るとして、僕はこの本を読む前は「オンラインゲーム(もっというとMMORPG)のサーバー実装」についての本だと思っていたのだが、実際は全く違い「オンラインゲーム(MMORPGからRTSからブラウザゲームまで)について設計し、見積もりし、実装するためにはどうすればいいか」について書かれた本だった。

つまりこの本には、開発者としてそしてプロジェクトリーダーとして、1998年のLifestormから日本のネットワークゲームに携わってきた中嶋さんの半生が詰め込まれているわけだ。これはお得すぎる!!
さらに、彼の会社であったCommunity Engineで開発していたVCEというオンラインゲームフレームワークまで付いてくる大盤振る舞いっぷり。 いいのか?と心配になる


本書は、C/S型(World of WarcraftやCounter Strikeのようなゲーム、それにブラウザゲーム全般も該当)とP2P型(Age of Empire, Stracraftのようなゲーム)についての、設計、見積もり、実装、運用について幅広く述べているとともに、筆者の経験からのアドバイスや、最新の技術(KVSとか。やたらGoが気になっているっぽい)にも触れている。 特に、見積もりや、運用で気をつける点についてまとまって触れている本というのは珍しいのでそれだけでも買う価値はある。
なので、この本をオススメするとしたら、プログラマーなどの実装者のみならず、企画やさらに言えば発注側などの所謂上位レイヤーの人たちなのではないだろうか。

特に面白かったのが、ゲームの論理設計に関する章(すべてのユーザーが同期するのか? それとも非同期か?)、通信速度の性能見積もりとチューニングに関する章、開発チームについての章。 反面、NATトラバーサルについてなどは、さすがに軽く触る程度で良いのではないか?とも思った。

僕が現在関わっている携帯ソーシャルゲームでは、端末が非力なのと、通信速度/レイテンシもショボイため、この本にあるようなゴリゴリのチューニングが必要な局面はあまり無い(むしろFlashの容量削減とかが多い)が、スマートフォンに移行すればWebSocketを使った持続的接続のなかでゲームデータをやり取りするように移っていくんだろうなー、なんて事を読みながら考えた。

地震 - 反省点(追記)

written by shn, on Mar 11, 2011 6:04:00 PM.

まだ余震が続くけど反省点

(追記@22:33 : 家帰ってもう一度反省)

棚の上のサーバー/ハブとかは固定する

イントラ用のハブを棚の上に置いておいたのが飛んだ… 横着しちゃダメですね

机の上の液晶パネルもヤバイ

スタンドで立てると飛ぶ。 アームに変えたほうが良い

避難したら単独行動しない

携帯電話が使えなくなるので、単独行動はしない。

避難後に戻るタイミングがわからん。

戻ったあとかなり大きい余震があった。

戻るな。ってことなのかもしれんが。

(追記分)家帰ってから反省

避難するときは財布、防寒具をもってく

揺れてる間は動けなかった。飛びそうな物抑えるとか、窓あけるとかで精一杯。 揺れが収まってから外に避難したのだが、手ぶらで出たので寒いしすぐ戻る > 余震で慌てる。で良くないなぁと思った。

避難するなら防寒具と財布をもって出ること。

家に帰るか留まるか

10時30すぎて、地下鉄は動き出したけど満足に乗られるような状況ではないらしい。道路もひどい渋滞。

明るいうちに歩いて帰られないならば、事務所に留まるという判断をしたほうが良さそう。 何がなんでも帰るってのは精神論で実利的じゃないんじゃないかなぁと思う。

落ち着け

かなりアドレナリンが出て、テンション上がるので気をつける。喧嘩売らない。

特に、地震の影響ない人たちもTVやTwitterでテンション上がって騒ぎ出すので良くないなぁ。東京は一部がセンセーショナルに酷いけど、ほとんどの人は交通が止まって、部屋がぐちゃぐちゃになるぐらいの被害。心配なのはわかるが騒いでもしょうがないなぁという気がするので逆の立場になったときに気をつける。

Twitterなり、Facebookなりを親族にも徹底する

嫁とはTwitterですぐに確認がとれたのだが、携帯電話しかない母と連絡とるのに苦労した。 災害伝言板もポコポコたつが、立ちすぎて確認しようがないので予め確認するところを決めておくこと。 もっと言うと、災害時にだけ立つ伝言板は確認しようがない、というか立つかどうかわからないので、TwitterなりFacebookなりで十分だと思う。(Googleの災害伝言板でさえ、数時間たったときに3000件しか安否情報がなかった。ガラケーの方はわからないけど)

母をインターネットに繋げる必要がある。

感想

iPhoneの通話/メールができなくなったのでTwitterしか連絡手段がなくなった。嫁ともTwitter経由ではじめて連絡とれるなど、強力な手段になったのだけど、デマも流れた。 ネタの真偽確認しろ、というのも限界があるので、こういう混乱時はRT一切しないとかそういう自分ルールをつくるべきか

FabricでSSHをトンネルする

written by shn, on Mar 5, 2011 3:17:00 PM.

今年はブログをちゃんと書くぞ!とおもってはや2ヶ月経ちました。その間、書こう書こうと途中まで書いて放置した記事が累々と横たわっているのですが、私はわかった。途中まで書いてもアップするぞ! そして酒のんでブログ書き始めると途中で眠くなるのでやめるぞ!

Fabricは良いですね。

shibatsの人がFabricネタをReblogしたりしていましたが、Fabricは便利ですね。

Fabricのきれいな書き方はIan Lewisさんの記事が参考になります。

rsyncしたい

Deployにrsyncを使う事はよくあると思います。Fabricにもrsync用のツールがありますが、もうちょっと細かくオプションを追加したい場合はlocal(...)で直接rsyncを叩いてもよいでしょう。

踏み出し越しにrsyncしたい。

システムが大きくなってくると、踏み台サーバ越しに向こう側のサーバにrsyncしたい。なんてことになってくると思います。 一旦踏み台サーバにDeployしてからそこから各サーバに配る方法もありますが、うちではまだサーバが数台なので、踏み台サーバにsshでトンネルを作ってトンネル越しにrsyncしています。

tunnel.py

fabfile.py側からは以下のようにします。:

# 踏み台サーバのhoststring
env.tunnel_hoststring = 'admin@192.168.12.34:10022'
# 証明書とか必要であれば
#env.steppingstone = '-e "ssh -i %s"' % env.key_filename

with tunnel() as t:
    ...

とりあえずこんな感じでざっくり動いてるのでイェイ!

アプリケーションコンテナ uWSGIを試してみた

written by shn, on Dec 4, 2010 10:55:00 PM.

このベンチマークで気になったアプリケーションコンテナuWSGIを試してみた。

uWSGIは独自のプロトコルでフロントエンドのWebサーバと通信するアプリケーションコンテナで、中身はPythonをメインターゲットにしているが、Perl, Erlang, Ruby(開発中)も動かせるらしい。独自プロトコルということで、Webサーバ側にもプラグインがいるが、nginxは0.8.40以上だったら組み込まれている。

気になった背景に、いままでWebサービスはnginx <-- [HTTP] --> pythonという組み合わせで使うことが多かったのだけれども、nginxのReverse Proxyが持続的接続をサポートしてなかったりしてイマイチだった。HTTPの代わりとなるとFastCGIかな、というところなのだが、python側のflupsがあんまり速くないなぁという印象。どうなんだろう。みんなどうやってんの?

uwsgiのビルドについては省略。pythonを複数バージョン使っている場合はバージョンごとにビルドする必要がある。

実行してみる

$ uwsgi2.6 -s 127.0.0.1:3031 -H env -w apploader

virtualenvを使っているので、そのディレクトリを -H で指定。WSGI appのためのブートストラップは -w で指定するのだがオレオレWAFを使っているのでapploader.pyを用意して、そこでapplicationをロードするようにした。

#!/usr/bin/env python

application = build_application(...) # 省略

nginx側ではnginx.conf内で以下のようにしてつなぐ

uwsgi_pass   127.0.0.1:3031;
include      uwsgi_params;

これで、nginxからuwsgiがたたけた! やったぜバンザイ

便利な機能

Master Process

上の例でuwsgiを動かすと、以下のメッセージが出る

*** WARNING: you are running uWSGI without its master process manager ***

-Mオプションを指定すると、worker processの親にmaster processを立ち上げるようになる(nginxと似たような感じ)(解説) master processを用いると、子プロセスのメモリを制限したり、Timeoutした場合に強制的に殺したりできるようになる。

Fork

PythonはGILがあるため、Workerをforkさせたかったりすることがあるのだが、そのあたりもuwsgiが面倒(-P [N])を見てくれる。(解説)

というわけで、

日本語文献が見当たらなかったので紹介記事を書いてみたけど、まだあんまり使ってないので書くことが無い!

自転車に乗ってる時の損害賠償保険

written by shn, on Aug 21, 2010 5:43:00 PM.

自転車の車道走行ルールを厳格化するため道路交通法が改正された07年以降、自転車で歩行者をはねて死亡させたり重傷を負わせた場合、民事訴訟で数百万~5000万円超の高額賠償を命じる判決が相次いでいることが分かった。

<自転車>歩行者との事故に高額賠償判決…過失相殺認めず

あと、車道走行時も自転車が危険運転をしているケースがあるので、その場合は、クルマとの事故でも相応の責任を問う仕組みも必要かと。自転車の自賠責保険や任意保険加入もしないと、無保険による被害も増えそう。いずれにせよ、自転車も道交法を守って安全運転の徹底をしてほしいものです。

歩道における自転車と歩行者の事故で高額賠償判決が出たことについての感想・意見

円高なのでロード欲しい熱が煮えたぎってる私ですが、自転車の事故に使える損害賠償保険について調べてみた。 (子供いない+夫婦とも両親健在なので、自分の休業補償とかはあまり心配していない)

ちょっとググると「自転車総合保険」というのに行き着くのだが、これは今現在はどの会社も取り扱っておらず「交通傷害保険」に切り替わっているようだ。 ただこの「交通傷害保険」は自分の入院保障などが補償範囲で、損害賠償は違うよう(それに年1,2万と結構高額)

「個人賠償責任保険」が年額数千円と安くお得だ、との話がAllAboutに出ている

個人賠償責任保険について、基本的なところをお話しておきます。この保険は私たち個人が日常生活の中で、第三者の身体や財物に対して法律上の損害賠償責任を負った場合に補償されるものです。

もちろん保険金が支払いとならない要件はありますが、日常生活全般を補償するものなので補償の範囲は広いといえます。また家族型あるいは家族全員で加入する必要はなく、例えばその家のお父さんが加入すれば、奥さんや子供などまで補償範囲に入ります。

個人賠償責任保険、お得な加入方法と注意点

このうち単体で加入するものは少額すぎて、どこもやっていないようだ。

なので結果的に、現状、自転車事故での損害賠償を補償するには何かの保険なりの付帯サービスに頼ることになる。 僕が現在加入している保険っぽいものは、三井ダイレクトのバイク保険と、UCカード(の一番安い奴)なのだが、これで使えるものはあるのだろうか

自動車 or バイク保険の個人責任賠償特約

例えば、損保ジャパンのバイク保険には個人責任賠償特約が年額1200円でついてくる。 > お客さまとそのご家族の日常生活における偶然な事故で、法律上の損害賠償責任を負担することによって被る損害に対して、保険金をお支払いする特約です > 保険金額は無制限、示談交渉サービスがセットされています。年間保険料は約1,200円。安心しておまかせください。

バイク保険の特約

三井ダイレクトの場合、ドライバー保険(車とか持ってないけど運転する人用の保険)には付帯してるようだ

 記名被保険者が自転車を運転しているときに生じた事故により、他人を死傷させてしまったり、他人の物を壊してしまったときに保険金をお支払いします。この特約はeドライバー保険に自動的にセットされます。

自転車運転者損害賠償責任補償特約 | 三井ダイレクト損保

バイク保険の場合、約款を見る限り「運転免許取得者に関する「損害賠償」自動補償特約」でカバーしている感じがするのだけど、これがなんなのか説明が探せなかったので今度電話してみる。

カード

例えばAMEXの普通のカードだと、補償限度が3000万だしカードで買い物した場合なので関係なさそう。 てか、カードで買い物した上でそれに関すれんする損害を与えるってなんだ? AMEXで買った包丁で通り魔とか? pricelessすぎる

どうしたらいいんだ!

All About的には

個人賠償責任保険に加入するには 現在、保険会社各社は個人賠償責任保険という名称でこの保険のみを販売している会社は稀です。数年前から各保険会社は単体での個人賠償責任保険は販売を停止しています。

現在は、火災保険、自動車保険、傷害保険など個人の方を対象とした保険に特約として販売しています。すなわち、これらの保険に加入していなければ個人賠償責任保険には加入できません。

火災保険の付帯した場合のメリットは、会社にもよりますが、長期間一括での加入が可能です また、自動車保険の特約で加入した場合は、火災保険や傷害保険に付帯した場合と異なり示談交渉サービスまで付いているというメリットがあります。 (通常、自動車保険を除く賠償責任保険は保険会社が示談交渉を行うことができません)

自動車保険や火災保険に加入していない、もしくは自動車保険や火災保険に何らかの形で特約を付帯できない場合は、傷害保険の特約として加入することをお勧めします。

傷害保険を死亡補償のみに絞り最低限の補償額を設定し、これに個人賠償責任保険を特約としてセットすれば、個人賠償責任保険単体で加入するよりも保険料の安い会社もあるので、どうしても個人賠償責任保険だけに加入したいという場合はこちらの方法をお勧めします。

個人賠償責任保険とは?

例えば損保ジャパンの障害総合保険には個人責任賠償特約が付いていました。

追記

@shn チューリッヒの交通~は賠償責任あるぞ。いくら増えたか分からない程度の増額。

@fakejames にチューリッヒの交通傷害保険について教えてもらった。

Q. 「賠償責任特約」では、何が補償されるのですか?

A. 日常生活の中で、誤って他人にケガを負わせてしまったり、他人のものを壊してしまったりして、法律上の損害賠償責任を負担することになった場合に補償されます。 ※日本国内のみ ※1事故につき自己負担額1,000円 ※他人から借りたり預かったりしているものや、職務上の損害賠償などは除きます (スーパー傷害保険Lite|補償内容|チューリッヒ)[http://www.zurich.co.jp/pa/lite/compensation.html]

試しに見積もってみたら保証限度額5000万で年額4000~6000円ぐらい。 バイク保険に特約がついてなかったらこれが良いのかなぁ。

追記2

@fchibaさんに他の保険を教えてもらった。

  • (モンベル | 保険 | 野外活動保険™(傷害総合保険))[http://hoken.montbell.jp/about/activity.php]
  • (Japan Cycling Association)[http://www.j-cycling.org/member/merit.html]

モンベルの野外活動保険はどのプランも賠償責任限度額は一億円なので、一番安いプランで就業中対象外のものだと2740円。(通勤は就業中に入るのか?) JCAは自転車登場中かつ賠償責任限度額3000万円で年会費4000円、ただし他の会員サービスもある。

あと、@MUN_JPさんによると

@shn 火災保険とかの「個人賠償特約」とかだと、自転車で怪我させたりってときの保障が出ます。今のアパート契約するときに入った保険も、確かこの辺りのフォローがついてました

(http://twitter.com/MUN_JP/status/21744883552)[http://twitter.com/MUN_JP/status/21744883552]

@shn 同じように、クレジットカードにも個人賠償に関する特約が付帯しているのがあるですよ。一連の話題になってるニュースの加害者も、民事の賠償金はカードの保険で払ったってありますよね。 約2時間前 webから shn宛

(http://twitter.com/MUN_JP/status/21745013195)[http://twitter.com/MUN_JP/status/21745013195]

だそうです。クレカでもいいのか。クレカで自転車買えばいいのか?

iPhone(JavaScript)でジェスチャ中にScrollを禁止

written by shn, on Aug 9, 2010 7:24:00 PM.

iPhone OS3系だと、touchmove中にスクロールしちゃって困ってた。(iOS4だと閾値が違うのかまぁ普通に動く)

phonegap / Preventing-Scrolling-on-iPhone-Phonegap-Applications

<script type="text/javascript">
touchMove = function(event) {
    // Prevent scrolling on this element
    event.preventDefault();
}
</script>
<body>
    <div id="container" ontouchmove="touchMove(event);">content goes here</div>
</body>

というわけで

written by shn, on Jul 26, 2010 7:53:00 PM.

reizou.coというドメインが取れたようなので、冷蔵庫関連のWebサービスをやりたい。