SQLite3の.sqlite3ファイル操作中の挙動メモ

最近ゲームサーバーのランキングデータを、

簡単に扱えるSQLite3を使って運用した際に、びっくりした挙動もメモ。

即席で作ったのでベタソース2枚のみw

構成

  • SQLite3のsqlite3ファイルをマスター用とスレーブ(読み取り専用)用の2つ用意し、
  • Redisをキャッシュ&集計処理用として利用をしていて。

下記のようなアクセスが秒間で数十あり。


// redisから現在のスコア取得 $currentScore = $redis->hGet('score', $_user); // SQliteで現在順位を取得 $pdo = new PDO('sqlite:db.sqlite3', "", ""); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare("SELECT * FROM rankTable order by abs( ? - score) limit 1"); $stmt->execute([$currentScore]); $searchRank = $stmt->fetch();

毎回ソートとする集計はさすがに重いので、

下記のようなバッチソースをcronで一定間隔で集計。


// sqlite3ファイル上書きコピー if( copy($MasterDbFile, $ReadDbFile) ){ echo "db 上書きOK"; }else{ alertPush("sqlitecopy エラー"); }

このsqlite3ファイル、、毎回copyで上書きしている、、、!!!!
なのに、ReadDbFileのsqlite3ファイルへの接続は、、、

なんと生きているんす、、!!!

普通にselectで検索できちゃってます。。!

コピー中にアクセスしてもエラーにならない、、ロック処理みたいのがはたらいるのかな。。特に意識せずにやってけど、、

実際数十万のスコアデータランキングを格安(月額1000円未満の1台)サーバーでやって一度もエラーになっていませんでした(今のところ)wすごい

GameCenterのスコアボードを独自UI等で利用(swift版)

gamecenter アイコン

GameCenterのスコアボードを、swiftを使って独自UI等で利用する方法を〜〜〜φ(..)メモメモ

出来合いのスコアボードを自分のアプリデザインに合わせた形で表示したかったので、
GameCenterのスコアを取得し好きな方法で使ってみた。



var leaderboardRequest: GKLeaderboard = GKLeaderboard() leaderboardRequest.playerScope = .Global leaderboardRequest.timeScope = .Today leaderboardRequest.identifier = "itunes connectで指定したleaderboardID" leaderboardRequest.range = NSMakeRange(1, 10) // Request leaderboardRequest.loadScoresWithCompletionHandler{ (scores, error) -> Void in if error != nil { println("Error \(error))") } else if scores != nil { println("leaderboards \(scores)") // scoresという情報に配列で格納されている } }

scoresは、GKScoreという型で配列で入っているので、
TableViewのデータとして使う事も柔軟に対応できました!

デバッグログを確認すればわかりますが、


println("\(scores.player.alias)") // プレイヤー名 println("\(scores.value)") // スコア

上記のように、プレイヤーの名前や、スコアを取得できます。

参考にさせて頂いたサイト

http://iorisomo.hatenablog.com/entry/2014/04/09/193007

http://stackoverflow.com/questions/28519503/gkleaderboard-localplayerscore-returns-nil-on-ios-8-1-3

http://qiita.com/moco3/items/d9c2a8956d4377bad264

AndroidアプリのHTTP通信時のパーミッション設定

アンドロイドアプリでgooglemapなどAPIを利用して、他への通信をする場合は、
あらかじめ、AndroidManifest.xmlに下記のように通信機能のパーミッションを追加する必要がある。

[xml]

<uses-permission android:name="android.permission.INTERNET">
</uses-permission>


[/xml]