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すごい

AndroidのFragmentタブ画像をxmlのImageViewで指定

android fragment タブ カスタマイズ リサイズ
android fragment タブ カスタマイズ リサイズ
android fragment タブ カスタマイズ リサイズ

androidのfragmentでタブ画像をカスタマイズした時のメモ。

MainActivity.java


TabLayout mTabLayout = (TabLayout) findViewById(R.id.tab_layout); mTabLayout.setupWithViewPager(viewPager); mTabLayout.getTabAt(0).setText("").setCustomView(android.R.layout.tab_image_view_1); mTabLayout.getTabAt(1).setText("").setCustomView(android.R.layout.tab_image_view_2);

setCustomViewでレイアウトのxmlファイルを指定するのがポイント。

レイアウトは下記

res/layout/tab_image_view.xml


<ImageView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="80dp" android:layout_height="80dp" android:scaleType="centerInside" android:src="@drawable/hoge_image" />

hoge_imageが表示した画像ファイル

MySQL 『ロック関連』の入門メモ

たまにしか使わないので、よく忘れてしまうMySQLのロック処理。

この機会メモ!

mysqldump 時にread lock (読み込みのみ許可)をする際は、下記オプションをつける。


mysqldump -u root -p --lock-all-tables -A > dump20110120.sql

「–lock-all-tables」 = FLUSH TABLES WITH READ LOCKと同じ。(全テーブルをreadロック)

テーブルをreadロック


mysql> LOCK TABLES friends READ; READロックを取得

mysql> LOCK TABLES friends WRITE; WRITEロックを取得

mysql> LOCK TABLES table_a READ, table_b WRITE; 複数のテーブルを同時にロック

テーブルのロックを解除する場合は、以下のようにする。


mysql> UNLOCK TABLES;

※ロック中は、挙動としてselectやupdateをした際に、ロックがはずれるまで応答をまつ。

xcode上のソースに記載される Copyrightを変更する

// // AppDelegate.swift // hogeApp // // Created by foooooooo on 15/10/15. // Copyright © 2015 hoge corp. All rights reserved. //

xcode7.3xでソース上に自動で挿入される、会社名等のCopyrightを変更する方法。

// //  AppDelegate.swift //  hogeApp // //  Created by foooooooo on 15/10/15. //  Copyright © 2015 hoge corp. All rights reserved. //


// // AppDelegate.swift // hogeApp // // Created by foooooooo on 15/10/15. // Copyright © 2015 hoge corp. All rights reserved. //

こういうの。

変更方法

自分のプロジェクトファイルを選択↓

hogeApp

次に右のメニュに下記が表示されるので、Project DocumentsOrganizationの項目を変更!

copyright xcode
copyright xcode

参考になれば幸いです!

MySQLを停止できないし、起動もできなくなった時のメモ

いきなり、MySQLを停止できないし、起動もできなくなった時のメモ

“SQLSTATE[HY000] [1040] Too many connections”

というエラーがでて調べてみた。


mysql> show full processlist;

するとmysqlのプロセスが大量に残っている。

max clientsの上限まで立っているエラーでした。

この方法はmysqlというよりは単にプロセスを殺して解決した際のメモなので、
参考程度でお願いします(^_^;)


# service mysqld stop mysqld を停止中: [ OK ]

となるが実際はまだ起動中


# /etc/init.d/mysqld status mysqld (pid 20022) を実行中...

いくたstopコマンドをうってもダメ。


# service mysqld start

では失敗となる。

CentOS6.5のプロセスを確認すると

# ps -xaf | grep mysql

mysqldプロセスが残っている。

思い切って、プロセスを削除


# kill 対象プロセスid

これでも消えない。

もういいやと思い、強制的にプロセス削除


# kill -9 対象プロセスID

さすがに停止した。

で、
service mysqld start

すると、、また失敗。

で、サーバーの容量を疑いました。
最近容量いっぱいで、不要ファイル削除したばっかだよな。。とおもいつつ、
確認してみるとまた、、、


# df -h

100%使いきってました。。汗

不要なファイルを削除して、

再度


# service mysqld start

成功しました!・・・あああ
とてつもなく初歩的

参考にさせて頂いたサイト
http://beyondjapan.com/blog/2016/03/mysql-stop-start-issues

storyboradのsegueに紐付けないViewController(画面)に遷移する方法&引数も渡せます!

タイトルの通り、
storyboradのsegueに紐付けないViewController(画面)に、
遷移する方法。。+引数も渡せます!

自作のポップアップ画面等を実装する際に便利なので、
忘れないようにφ(..)メモメモ


// ストーリーボードのMain.storyboardファイルを指定 let storyboard = UIStoryboard(name: "Main", bundle: nil) // ストーリーボードで指定した「CustomPopupViewController」を指定 let vc = storyboard.instantiateViewControllerWithIdentifier("CustomPopupViewController") as! CustomPopupViewController // 予め、CustomPopupViewControllerで宣言してあるpopupNameメンバ変数に値を渡す! vc.popupName = hogeName

味噌は、


as! CustomPopupViewController

ちゃんとクラス名でaliasしてあげないと、


vc.popupName = hogeName

で、引数がわたせないので注意!

swiftで画質を担保したままUIImageをリサイズ

粗い画像

UIImageを高画質のままリサイズするメソッド

extension UIImage{

    // 画質を担保したままResizeするクラスメソッド.
    func ResizeUIImage(width : CGFloat, height : CGFloat)-> UIImage!{

        let size = CGSize(width: width, height: height)

        UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
        var context = UIGraphicsGetCurrentContext()

        self.drawInRect(CGRectMake(0, 0, size.width, size.height))
        var image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return image
    }

}

使い方


// 80x80にリサイズだけど画像も高画質のまま! let resizeSelectedImage = UIImage(named: "hoge.png")!.ResizeUIImage(80, height: 80)

綺麗な画像のままリサイズできました!

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

storyboard等で利用しているラベルのフォントを一括で変更(swift版)

swift フォント一括指定

swiftのコードで、ラベルのフォントを一括で変更

AppDelegate.swift


〜省略〜 @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. // 一括でLabelのフォントを変更 UILabel.appearance().font = UIFont(name: "Helvetica Bold Oblique", size: 18.0) 〜省略〜

もちろん UILabel以外も可能!

また、”Helvetica Bold Oblique” みたいに、

コードから呼び出す際に指定するフォント名の確認は下記で可能です!