KLab若手エンジニアの これなぁに?

KLab株式会社の若手エンジニアによる技術ブログです。phpやRubyなどの汎用LLやJavaScript/actionScript等のクライアントサイドの内容、MySQL等のデータベース、その他フレームワークまで幅広く面白い情報を発信します。

Uncategorized

なぜBTreeがIndexに使われているのか

maruyama-r(@h13i32maru)です。 なぜRDBMSのIndexはBTreeで実装されているものが多いのかを考察してみました。 検索アルゴリズムの評価はどうやるのか? なぜ二分木ではなくBTreeなのか? なぜBTreeはハードディスクと相性が良いのか? などについて書いてみたので興味のある方は下のURLからご覧ください(僕の個人ブログです) なぜBTreeがIndexに使われているのか - maru source

Amazon Web Services様、KLab合同勉強会を開催しました

はじめまして、manako-tです。 今年度の新卒として4月から入社し、今月で早4ヶ月目になります。まだまだ半人前ではございますが、よろしくお願いいたします。 先日、と言っても2週間ほど前ではありますが、Amazon Web Services様(以下AWS様と略記させていただきます)を社内にお招きし、合同勉強会を行わせていただきました。 AWS様と言えば、Amazon EC2をはじめとして、まさにこれからのクラウドとはかくあるべし!と言えるようなサービスの数々を提供されている企業様で、私自身、今回の勉強会を大変楽しみにしておりました。 その様子について、レポートさせていただきたく思います。 まず、弊社の方から、三浦、坂本が発表させていただきました。

三浦:パフォーマンスチューニングの裏側 〜インフラ編〜
坂本:パフォーマンスチューニングの裏側 〜アプリ編〜



近年、弊社においてはソーシャルゲーム事業にかなり注力しており、おかげさまで1日の平均PV数が億単位にのぼる案件も飛び出しています。 弊社はかねてよりDSAS Hosting for Socialの運用による負荷分散ノウハウを持ち合わせているものの、ソーシャルプラットフォームやゲームの内容によってユーザ数が大きく異なるのが現状で、ちょっとしたきっかけでユーザ数が急増することも珍しくありません。ちょうどここ数ヶ月にこうした事態に見舞われた現場の担当者2名に、どのように高負荷に対処したかについて、インフラ担当、アプリ担当それぞれの立場から説明してもらいました。 インフラ面でのアプローチとして、NICの割り込みの処理の中で、IRQのバランスをうまくセットすることにより、リクエスト単位でCPU負荷を分散することができ、ネットワークの流量の上限を大きく改善できたという説明がありました。 また、アプリ面でのアプローチとして、主にMySQLの同時コネクション数がボトルネックになることが問題として浮上し、クエリの数そのものの削減や、クエリキャッシュの無効化、MySQLのキャッシュの代替としての、memcachedやPHPのキャッシュ機能(Alternative PHP Cache)の適切な利用の仕方など、非常に具体的な説明がありました。 続いて、AWS様から、エバンジェリストの玉川様、ソリューションアーキテクトの大谷様、荒木様に発表いただきました。

玉川様:AWSでアジャイルなインフラを実現しよう



なんと、その場でAmazon EC2の最上プラン(!)で利用できる、スパコンの仮想サーバーを起動して物理計算を行うという、非常に貴重なデモをしていただきました! EC2には最初からサーバーのコピーイメージが多数用意されており、イメージを選択して起動するだけのたった数分の操作で、すぐにサーバーが使える状態になるそうです。また、基本的に1時間単位での課金なので、負荷分散のために複数のサーバーを利用したい場合、フレキシブルな運用が可能となりそうです。例えば、アクセスが集中するタイミングでサーバーの台数を増やし、使わないときはすぐにシャットダウンして台数を減らしたりと、動的に稼働サーバー数を変えることも簡単にできるわけですね。 実際にこうした運用の仕方を行っている企業もあるそうで、個人的にはこれからのWebサービス運用の主流となっていくのでは、という予感がしました。

大谷様:NoSQL超概説



AWS様のサービスの枠組みにとらわれない観点からNoSQLの概説をしていただき、大変勉強になりました。 Apache Cassandra, HBaseなど、近年オープンソースのソリューションも数多く出現してきているNoSQLですが、AWS様でも、Amazon SimpleDBというサービスを展開されているとのこと。Amazon DynamoというAmazon社内で利用されているKVSが元になっており、その技術概要については、論文も発表されているようです。 CAP定理で言う一貫性(Consistency)は保証されていませんが、DHTに基づき、全ノードがデータの格納場所がわかるような仕組みになっています。また、クエリ同期のリードライトは基本的にメモリ上で行うため、データはすべてメモリ上に持っており、バックアップのために非同期にストレージに書き込む仕組みになっているそうです。 KVSと言うと、KLabではPHPとも親和性の高いTokyoTyrantを利用しているのですが、今後新たなソリューションの検討を求められる時機に遭遇するかもしれません。

荒木様:AWSでインフラのトレーニングをしようぜ



常時稼働サーバーとしては、一般人には多少敷居の高い印象のあるEC2ですが、それならばということで、インフラのトレーニングの場としてのEC2の活用法についてご提案いただきました。私は寡聞にして知らなかったのですが、今現在AWS様のサイトからアカウントを新規登録すると、EC2をはじめとしたさまざまなサービスを、期間限定で無料で利用できる枠があるそうです(!) 詳しく知りたい方は、こちらをご覧ください。 gmakeを使った並列コンパイル、分散FSのテストなど、仮想サーバーだからこそできる利用法も色々あるようです。 Heroku、phpfog、PiCloudというPaaSサービスの名前も挙げていただきましたが、これらのサービスの一部はEC2上でホストされているんですね。


私だけでなく、他のKLabエンジニアにとっても、大変密度の濃い2時間になったと思います。 Amazon Web Servicesの皆様、本当にありがとうございました。 今後ともよろしくお願いいたします。

第1回チキチキIRCボットファイターズ! 祭りの後

ご無沙汰してました! sasaki-k です。 遅れてしまい申し訳ございません。先日ご案内した表題の「チキチキIRCボットファイターズ!」社内投票と読者の皆様のはてなブックマークと、いいね!を合計した結果をご報告いたします。 以前 takada-atさんが開発したAIが社内でも話題になっていたのですが、そのIRC版が好評だったようです。またはてなブックマーク、「いいね!」ボタンも1票づついただけて文句なしの1位でした!ちょっとした笑いを誘う粗品を贈呈させていただきましたー。 2位のosuga-hさんは締切り過ぎてしまったのですが、JavaScriptでボットを作るということが新鮮で、かつはてなブックマークも1票いただいて見事2位となりました。 3位のnakazawa-kさんのボットもご本人の熱い思いとともに、社内に増殖しつつある(?)pythonista達に火をつけたようです(?)で3位となりました。 エントリーいただいた皆様、ブックマークやいいねボタンを押していただいた皆様どうもありがとうございました!! 最後となりましたが、私の拙い案内文のためKLab社外からのエントリーも可能と誤解を受けてしまった方もいらっしゃったようです。実際には社内イベントでした。この場をお借りしてお詫び申し上げます。

ボットコンテスト twistedを使って常駐型IRC発言プロキシサーバ作ってみました

こんにちは! もう一人の sasaki-k です。 以前からpythonの twisted でなにか作ってみようと思っていたので、技術の無駄遣いネタとして 「常駐型IRCプロキシサーバ」を作ってみました。 バッチプログラムからIRCへ何度も発言させようとすると下のように都度joinとquitしてしまい、 「邪魔だなあ」と言われることが多かったのが背景です。
23:02 *hoge-bot join #channel (~hoge-bot@xxxx.klab.jp) (発言) 23:02 *hoge-bot quit (Remote host closed the connection) 23:02 *hoge-bot join #channel (~hoge-bot@xxxx.klab.jp) (次の発言) 23:02 *hoge-bot quit (Remote host closed the connection)
そこで、twistedに付属しているIRCのクライアントを改造して、サーバソケットで 外部プログラムから発言したいメッセージを受け付けられるようにしてみました。ソケットサーバ兼IRCクライアントです。 このpythonスクリプトをバッチの最初で起動しておいて、所定のListenポートに発言したい内容を Socketクライアントから流しこめば発言してくれる、という流れです。 あるいはdaemontools などでこのスクリプトを常駐させておくのもよさそうです。 使った環境は Twisted 10.1.0 python 2.5.2 です。

# vim: fileencoding=utf-8

"""
Announce irc bot.
"""

# twisted imports
from twisted.words.protocols import irc
from twisted.internet import reactor, protocol
from twisted.python import log

# system imports
import sys

class IrcBotClient(irc.IRCClient):
    """
    IRCに接続する側のprotocolです。接続するとfactoryのprotocolを差し替えます。
    """    
    nickname = "announce-bot"

    def connectionMade(self):
        irc.IRCClient.connectionMade(self)
        self.factory.protocol = self

    def signedOn(self):
        """Called when bot has succesfully signed on to server."""
        self.join(self.factory.channel)

class IrcBotFactory(protocol.ClientFactory):
    """
    IRCに接続する側のprotocolのfactoryです。
    """
    protocol = IrcBotClient

    def __init__(self, channel):
        self.channel = channel

    def clientConnectionLost(self, connector, reason):
        """If we get disconnected, reconnect to server."""
        connector.connect()

    def clientConnectionFailed(self, connector, reason):
        print "connection failed:", reason
        reactor.stop()

class IrcBotCommander(protocol.Protocol):
    """
    メッセージ送信プログラムからの文字列を受け取ります(utf-8固定)
    """
    def dataReceived(self, data):
        channel = "#" + self.factory.botFactory.channel
        data = unicode(data, 'utf-8')
        data = data.rstrip()
        data = data.encode('iso-2022-jp')
        self.factory.botFactory.protocol.msg(channel, data)
        self.transport.loseConnection()

class IrcBotCommanderFactory(protocol.ServerFactory):
    """
    メッセージ送信プログラムのfactoryです。IrcBotへのポインタを持ちます
    """
    protocol = IrcBotCommander

    def __init__(self, botFactory):
        self.botFactory = botFactory

# main
if __name__ == '__main__':
    # initialize logging
    log.startLogging(sys.stdout)
    
    ircBotFactory = IrcBotFactory(sys.argv[1])
    ircBotCommanderFactory = IrcBotCommanderFactory(ircBotFactory)

    # xxx.xxx.xxxはircサーバ
    reactor.connectTCP("xxx.xxx.xxx", 6667, ircBotFactory) 
    reactor.listenTCP(12345, ircBotCommanderFactory)

    # run bot
    reactor.run()


おかげで絶え間なく(?) 発言できるようになりましたー
23:02 *announce-bot join #channel (~hoge-bot@xxxx.klab.jp) 23:02 (announce-bot) ああああ 23:03 (announce-bot) <-------------- テストテスト --------------> 23:10 (announce-bot) <-------------- これからよろしくね -------------->
今後複数チャンネル対応とか、他の人の発言に対応した動きをするとか、できたらいいなと思ってます。

第1回チキチキIRCボットファイターズ!開催のお知らせ

暑い日が続きますが、皆様いかがお過ごしでしょうか。sasaki-kです。 さて、KLabでは社内コミュニケーションツールとして IRC を活用しています。 中にはIRCボットもおり、色々と仕事の役に立っています。 そこで読者の皆様に社内の雰囲気をお伝えするのと同時にお祭り気分を 盛り上げるため、この若手ブログの場をお借りして、今日から2週間程の期間で KLabの社員が作ったIRCボットを自慢する会を「チキチキIRCボットファイターズ!」 として開催いたします。 作成したボットに特にジャンルは設けてなく
  • 技術の無駄遣い
  • ひらすらウケ狙い
  • やっぱり実用本位
等々・・・法律、公序良俗に反しないものでしたらなんでもOK。 そこで本ブログの読者の皆様に少しだけお手伝いいただければと考えている ことがあります。hatena book mark あるいは facebook いいね! ボタンで 「いいな」と思われた ボット を応援していただけますでしょうか。 この応援の数と社内の投票によって優勝者を決定し、この若手ブログ内で お知らせしたいと考えております。 皆様、どんなエントリーがあるかお楽しみに! 以下要領となります。

場所

若手ブログ

参加資格

KLab社員であること

審査資格

この若手ブログ読者の皆様どなたでも構いません

投稿/審査期間

  • 2010/08/02 (火) ~ 2010/08/18 (水) 投稿、一般審査
  • 2010/08/19 (木) 社内投票

エントリー方法

自作のIRCボットを以下の項目で若手ブログへ投稿します。 タイトルに「ボットコンテスト」をつけてください。
  1. タイトル/作った人 (自己紹介するとよいかも)
  2. 簡単な機能紹介
  3. アピールポイント
  4. ソースコード/どうやってつくるか
(例)
  1. ノブレスボット / ささき
  2. お願いするとなんでもやってくれる
  3. 気の利いたことをしゃべってくれる。本物の人間かもしれないと思わせる。
  4. print "ノブレス・オブリージュ"

審査方法

下記、1と2の合計で順位をつけ優勝者を決定します。
  1. 若手ブログ (hatena bookmark数 + facebook いいね!数) × 2 point
  2. 社内投票 1人持ち点 1point で 8/19に投票します

それでは、応援宜しくお願いいたします!
 KLab若手エンジニアブログのフッター