2010年8月17日火曜日

klabのソーシャルアプリ勉強会に参加してきた

ちょっと古い話になってしまいましたが、【LAMPで作るソーシャルアプリの負荷対策 ~アプリとインフラの調和のテクニック~】に参加してきたので、内容をまとめてみようと思います。


主に、klabが提供しているヒットソーシャルアプリ「恋してキャバ譲」を開発、運用する上で得たノウハウの話でした。


システム構成

  1. フロントWebサーバー
    ソフトウェア
    - apache-2.2系
    - php-5.2系

    負荷対策
    - 各種データのキャッシュ
       apcを利用しており、さらに、apcの以下の関数で各種変数をキャッシュしている。
    apc_store
    apc_fetch
    apc_delete

    - HTTPの待ち行列を取り除く。
    具体的には……
    mysqlのレプリカにselect文を発行する。
    snsのプロフィールを取得するような外部APIの利用とDB接続を混同しないようにする。

    駄目な例
    1,mysqlへの接続
    2,snsのプロフィール取得
    3,mysqlのクエリーの発行
    4,mysqlの切断

    良い例
    1,mysqlへの接続
    2,mysqlのクエリーの発行
    3,mysqlの切断
    4,snsのプロフィール取得

    - xdebug
    遅い処理を検出する

    スケールアウト
    LVS配下に新しいホストを立てて負荷分散する。

  2. memcacheサーバー
    全フロントサーバーからアクセスできるキャッシュサーバー

    利用用途:
    セッション情報の保存する。
    目的:各フロントサーバーのセッション情報を一元管理する。


    利用用途:DBのクエリー情報をキャッシュする。
    目的:DBの負荷を下げる。

    利用用途:snsのプロフィール情報をキャッシュする。
    目的:外部API接続を行わないようにして、処理を高速化する。

  3. DBサーバー
    ソフトウェア
    mysql-5.1系

    負荷対策
    - my.cnf でスロークエリーを検出して、プログラム修正を行う。
    log-queries-not-using-indexes
    インデックスを利用しないqueryを検出
    slow_query_log
    パラメータに閾値を設定して利用(1sec)

    スケールアウト
    write系のDBは、ハードウェアの性能アップ
    read系は、スレーブの数を増やす。

  4. サーバーの監視
    Ganglia
    http://ganglia.info/





2010年8月11日水曜日

twitterの情報を外部サイト(ブログ等)に貼る方法

公式のtwitterウィジェットのタグが発行されているようです。

ここで各種設定をすると、ブログに貼れる様になります。
http://twitter.com/goodies


詳しい使い方は以下のブログが分かりやすかったので。
http://r.nanapi.jp/569/

2010年8月10日火曜日

iTunesのアップデートで英語になった場合の対処

iTunesはいつのまにやらアップデートされたりしますが、アップデート直後に、言語設定が日本から、英語に勝手に書き変えられてしまう現象が発生してしまいました。

編集 > 設定 > 言語 の手順で変えられそうですが、上手く行きませんでした……。

というわけで色々情報を探し回っていたら、同様の現象ではまっているブログ記事を発見してさっそく実行したら上手く行きました。

解決手順は以下のシンプルな手順。
WindowsのプログラムメニューからiTunesを起動する
です。

いつもの癖でショートカットから起動していたのが問題だったようです。

参考元:
http://kohchi.vox.com/library/post/itunesが英語表記になった件.html

2010年8月9日月曜日

pythonの変数

昔読んだ python 本で変数の説明について、pythonはスコープの狭い方から評価される、という記述を見かけたのですが、それをすっかり忘れていて、その法則を久々思い出すパターンにハマったので、メモ代わりに記事にしておこうかと思います。

以下のソースでは、Line 4 でグローバルスコープの hoge を宣言して、関数 func1, func2 で参照しています。

ただし func2 では func2 の関数中で value == 3 の場合、変数 hoge への代入を行っています。

この代入があるせいで func2 内では hoge は func2 のローカル変数になります。
python のソースがバイトコードに変換される際に func2 内の hoge はローカル変数として予約されるので value == 2 のように if 文を通過しない際には func2 内で hoge が宣言されず UnboundLocalError: local variable 'hoge' referenced before assignment という例外を発生してプログラムが終了します。
スコープを股がって変数を利用する際には注意が必要ですね……。

  1. # -*- coding: utf-8 -*-  
  2.   
  3. #global変数  
  4. hoge = "hoge"  
  5.   
  6. def func1():  
  7.     return hoge + " return by func1"  
  8.   
  9. def func2(value):  
  10.     #ここではローカルで hoge が利用される可能性があるので、  
  11.     #hogeはローカル変数として割り当てられている  
  12.     if value == 3:  
  13.         hoge = "value is 3"  
  14.     return hoge  
  15.   
  16. print func1() #成功  
  17. print func2(3#成功  
  18. print func2(2#hoge がなくて、失敗  

test syntax high light

  1. public class HelloWorld {  
  2.     public static void main(String[] args) {  
  3.         System.out.println("Hello World!");  
  4.     }  
  5. }