Entries in the Category “メモ”

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');
    });
  });

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

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を使った持続的接続のなかでゲームデータをやり取りするように移っていくんだろうなー、なんて事を読みながら考えた。

SQLAlchemyメモ

written by shn, on Aug 5, 2009 1:49:00 PM.

毎回ググるので、メモっておく。 このブログがSEOされて、このエントリが上位に来れば、次ググる時楽になる寸法だ!

INSERT IGNORE INTO ...

insert(..., prefixes=['IGNORE'])

SELECT ... FOR UPDATE

select(..., for_update=True)

随時更新したい。

自己参照のrelation @ sqlalchemy 0.5

written by shn, on Apr 13, 2009 12:31:00 PM.

自己参照型のrelationを作ろうとしていて、子供を追加しても「循環参照だ!」って怒られてプチ困った。 マニュアル読んだら答かいてあったよメモ

以下、Adjacency List Relationships - Mapper Configuration からコピペ

親 > 子は普通で良い

mapper(Node, nodes, properties={
    'children': relation(Node)
})

子 > 親はremote_sideという引数にカラムを指定する

mapper(Node, nodes, properties={
    'children': relation(Node, backref=backref('parent', remote_side=[nodes.c.id]))
})

remote_side

used for self-referential relationships, indicates the column or list of columns that form the "remote side" of the relationship.

とのこと。これ以上はコードを追ってないので、なんでこうしないと普通の1:Nとして関係が作れないかはわからず…

iPhoneとか海外携帯のデバイス固有ID

written by shn, on Apr 6, 2009 11:19:00 PM.

海外だと、Anonymous Subscriber ID (ASID)って言うのかね?

iPhone SDK: Retrieving MSISDN or SIM ID for Authentication (iPhone forum at JavaRanch)

NSString *uniqueID = [[UIDevice currentDevice] uniqueIdentifier]

あとで読む

ASID Mobile WebSite Developers Cookbook

日本のは

携帯の端末IDとCookieのまとめ - ueblog

OSバージョンによる分岐

written by shn, on Mar 29, 2009 7:58:00 PM.

WINVER的な奴が欲しい。とりあえず、これで良さげ。

#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_2_2

iPhoneでCrash Logから関数の位置を特定する

written by shn, on Mar 15, 2009 2:54:00 AM.

iPhoneの素晴しいところの一つは、Crash Logが本体に保存される事なんですが、

Thread 0 Crashed:
0   libobjc.A.dylib                 0x300c8c18 objc_msgSend + 20
1   Fastweet2k                      0x00016240 0x1000 + 86592
2   UIKit                           0x30b2b414 -[UITextView keyboardInputChanged:] + 80
3   UIKit                           0x30bcaf1c -[UIWebDocumentView keyboardInputChanged:] + 40

このように、デバッグバイナリでもシンボルが出ないときがあります。 symolicatecrashを使ってもだめでがっかり。

でも、dSYMがあるから頑張ればなんとかなるんじゃね?とやってみたらなんとかなった。 普段VisualStudioの微温湯に浸かっている僕には大変でした。

% gdb --quiet Fastweet2k.app.dSYM/Contents/Resources/DWARF/Fastweet2k
(gdb) info line *0x16240
Line 179 of "/Users/shn/Documents/projects/git/fastweet/Classes/TweetViewController.m" starts at address 0x16212 <-[TweetViewController sendPressed:]+118> and ends at 0x162e4 <-[TweetViewController sendPressed:]+328>.

てな感じ。

上記のCrash Logはdebug版バイナリのものだったので、_./build/Debug-iphoneos/_にあるdSYMをgdbで開き、info lineコマンドで、対応するソースコードの位置が出てきます。

しかし、出てきたのは良いが何故ここでハングアップするのか、というか何故あの操作でこの関数が呼ばれるのか不明で泣きそう。

ついでに、symbolicatecrashの解説はここが詳しいです。

Pythonの最小セット

written by shn, on Feb 24, 2009 6:28:00 PM.

Python(2.6@win32)を起動するだけなら、以下のlibがあれば良いようだ

site
    os
        ntpath (win32)
            stat
            genericpath
            warning
                linecache
                types
        UserDict(win32)
            _abcoll
                abc
        copy_reg

    encodings
        codecs

site.pyはいじって、site-packages等を読み込まないようにしている。

sys.setdefaultencoding('utf-8')とかしないなら、encodings以下もいらないのかな。codings:utf-8なんてスクリプトが読めなくなるかな。

_zipimportは組込みなので、上記パッケージはzipできる。zipすると57KBととてもスッキリ

Boost.Python@MSVCでpython-debuggingが

written by shn, on Feb 23, 2009 6:20:00 PM.

多分これと一緒。 Boost.Pythonをpython-debuggingにしてビルドしたものを使うと、Pythonの関数を呼んだ時に逝くという問題。 環境は恐らくWindowsのみで、うちの場合はboost 1.38.0, MSVC 9, Python 2.6。

原因はpython-debugging=onにしてできる、boost_python-vc90-mt-gy-1_38.dllPython26.dllと、Python26_d.dllの両方にリンクしてるからっぽい。

深く追うのがめんどくさかったので、tools\build\v2\tools\python.jam L:102に、condition = <python-debugging>on ;を挿入して無理矢理解決。

ざっと見た感じ、tools\build\v2\build\toolset.jam L:32initを空で呼んでいるせいで、 python.jamのinitに$(condition)が渡されてないのかなぁ、と。

bjamの引数に-d 7とか渡すとbjam内の引数と関数呼び出しを全部出力できて便利。 (ref: bjam usage)