タグ

ブックマーク / blog.mirakui.com (28)

  • ISUCON5本選で2位でした(白金動物園) - 昼メシ物語

    白金動物園、2位いただきました #isucon @sora_h @rosylilly と3人でチーム「白金動物園」として ISUCON 5 に参加し、選で2位を獲得しました。 主な分担としては sorah と rosylilly の2人が実装をして、僕はインフラまわりの整備と、ログ分析や指示出し、あと二人が喧嘩したら仲裁をするという分担でした。今年は二人が喧嘩しなかったので仲裁役は必要なくて良かったです。 (追記 2015/11/02 14:14)2人の記事が揃ったので以下にリンクしておきます。HTTP/2 まわりのチャレンジなどは彼らの記事に詳しいです。 sorah: ISUCON5 で準優勝してきた #isucon - diary.sorah rosylilly: ISUCON5 で準優勝しました - 鳩舎 やったこと 今回の問題はマイクロサービスがテーマになっていて、運営側が用意し

    ISUCON5本選で2位でした(白金動物園) - 昼メシ物語
    kamipo
    kamipo 2015/11/01
  • Nginx + Lua から MySQL を使う - 昼メシ物語

    この記事は MySQL Casual Advent Calendar 2013 の 12 日目です。 みんな大好き Nginx + Lua ですが、その Lua から MySQL が叩けるとなると、Nginx だけでウェブアプリケーションが書けちゃうという夢が広がりますね。 難しそうというイメージがあるかもしれませんが、実は OpenResty を使うと、そんな環境が簡単に作れてしまうので、今日はその方法を紹介します。 ngx_openresty のインストール 今回は Ubuntu 12.04 での例ですが、ほとんど同様の手順で CentOS 6.5 でも動くことを確認しています。 *1 $ sudo apt-get -y install gcc make libpcre3-dev libssl-dev perl5 wget $ sudo apt-get -y install libmy

    Nginx + Lua から MySQL を使う - 昼メシ物語
    kamipo
    kamipo 2013/12/12
    isuconで役に立ちそう!
  • 今さら聞けない Immutable Infrastructure - 昼メシ物語

    Immutable (不変な) Infrastructure は、サーバを一度セットアップしたら二度と変更を加えないという運用スタイルのことを指します。 クラウド環境では、必要に応じてすぐにサーバを用意し、不要になったら簡単に破棄することができます。Immutable Infrastructure は、このようなクラウドの特性を活かす運用スタイルとして、注目されつつあります。 背景 Immutable Infrastructure が提唱された背景にある技術として、 Auto Scaling や Blue-Green Deployment*1 などがあります。 Auto Scaling Auto Scaling は、負荷に応じて自動的にサーバ台数を増減させる技術で、 AWS では標準で提供されています。常に必要な台数だけ起動していればいいので、コスト削減になるというものです。 Auto S

    今さら聞けない Immutable Infrastructure - 昼メシ物語
    kamipo
    kamipo 2013/11/27
  • S3のダウンロード速度を1.5〜4.5倍高速化する怪しげな方法 - 昼メシ物語

    バケットのIPアドレスを適切なものに固定することで、期待値でいうと1.5倍、最大で4.5倍程度高速にダウンロードできます。 この方法は非常に効果が高いですが、非公式なものであり、ある日突然破綻する可能性もありますので自己責任でお願いします。 S3のバケットとエンドポイント まずは前提知識として、S3の名前解決について説明します。 S3のバケット "mybucket" というバケットを東京リージョンに持っているとします。するとそのバケットのドメイン名は mybucket.s3.amazonaws.comになります。これをエンドポイントと呼びます。このバケットの中にあるファイル "hello.txt" にアクセスする場合には、 http(s)://mybucket.s3.amazonaws.com/hello.txtというようなURLを用います。*1 エンドポイントのIPアドレス この myb

    S3のダウンロード速度を1.5〜4.5倍高速化する怪しげな方法 - 昼メシ物語
    kamipo
    kamipo 2013/04/05
  • 「全自動パラメータチューニングさん」は何であって何でないのか - 昼メシ物語

    発表資料: 全自動パラメータチューニングさん // Speaker Deck ソースコード: https://github.com/mirakui/tuningsan これは何なのか ハッカソンイベント「Open Hack Day Japan」にて、24時間の制限の中で開発し、90秒でプレゼンテーションした作品です 2013/2/16〜2/18 にかけてヤフー株式会社で開催された、「Open Hack Day Japan」という大規模ハッカッソンイベントで開発しました。 上記のプレゼンテーションは発表で使用したものです。 Open Hack Day Japan - Yahoo! JAPAN 作品は、全参加作品の中で唯一のコマンドラインツールであり非常に地味でしたが、ありがたいことに KLab賞をいただくことができました。どうもありがとうございます。 指定した1パラメータの自動調整によって

    「全自動パラメータチューニングさん」は何であって何でないのか - 昼メシ物語
    kamipo
    kamipo 2013/02/20
  • RailsじゃなくてもActiveSupportの自動require機能を使う - 昼メシ物語

    Railsでは、 config/application.rb で config.autoload_paths << Rails.root.join("lib") と書いておくと、例えば $ cat lib/my_library.rb class MyLibrary : endみたいなファイルが置いてあれば、Railsアプリ内で MyLibrary クラスを特にrequireしなくても使える。これは ActiveSupport::Dependencies というクラスが const_missing をフックして、 autoload_paths にあるディレクトリの中から適切なファイルを自動requireしてくれるから。 これは大変便利なので、Railsじゃないアプリから使いたい。 やりかた require 'active_support/dependencies' ActiveSupport

    RailsじゃなくてもActiveSupportの自動require機能を使う - 昼メシ物語
  • 不要なメルマガ広告はspamフォルダではなく配信拒否(オプトアウト)しましょう - 昼メシ物語

    一般にspamと呼ばれる電子メールには2種類あります。オプトイン(配信承諾)して受け取ったメールと、オプトインしてないのに届いたメールです。 この記事は、インターネット全体の利益を考えるなら、オプトインして受け取ったメール広告を迷惑に感じたら、spamフォルダに入れて放置するのではなく、配信拒否(オプトアウト)するべきであることを促すものです。 (追記:なお、お肉のほうのスパムは大文字のSPAMで、迷惑メールのほうは小文字でspamと書くそうです。コメントありがとうございます) オプトインとオプトアウト あなたがメールを受け取る意思を表明することを、オプトインと呼びます。 反対に、「このメールは受けとりたくない!」という意思を表明することを、オプトアウトと呼びます。 例えば、楽天などのネットショップで買い物をした時に、「メールマガジンに登録する」というチェックボックスがあったとします。これ

    不要なメルマガ広告はspamフォルダではなく配信拒否(オプトアウト)しましょう - 昼メシ物語
    kamipo
    kamipo 2012/11/06
  • Passenger 4.0 beta1 の新機能解説 - 昼メシ物語

    先日、 Phusion Passenger 4.0 beta 1 が公開されました。 近年は Passenger に代わり Nginx + unicorn の構成が Rails の業界標準になりつつありますが、Passenger 4 は大きく進化したようなので、そのアップデート内容を紹介します。 なお、この記事は 10/24 に公開された Phusion 公式ブログの記事「Phusion Passenger 4.0 beta 1 is here – Phusion Corporate Blog」を要訳したものです。説明をところどころ省いているので、詳しくは原文を参照してください。 What's new? 複数のRubyバージョンのサポート 1サーバで複数のアプリケーションをホストしている場合、アプリケーション毎に違うRubyインタプリタを指定できるようになりました。 イベント駆動 I/O

    Passenger 4.0 beta1 の新機能解説 - 昼メシ物語
    kamipo
    kamipo 2012/10/26
  • JPEGのフレームヘッダを読んでwidthとheightを取り出す - 昼メシ物語

    突然ですが、JPEG の構造はだいたい下記のような感じになってます。 今回は libjpeg 等のライブラリを使わずに、JPEGファイルから画像の width と height を取り出したいと思います。この width と height の情報は、上図におけるフレームヘッダセグメントに入っています。 基礎知識 フレームヘッダセグメント フレームヘッダセグメントの中身は、以下のとおりです。 データ サイズ(bit) フレーム開始マーカー 16 フレームヘッダのサイズ(byte) 16 サンプル精度 8 height 16 width 16 省略 あとは、サンプリングファクタとかが延々と続くんですが、今回は不要なので省略しています。 ヘッダセグメント フレームヘッダ以外のヘッダセグメントには、EXIFデータやサムネイルなど、画像のデコードに直接関係ないメタデータが入っています。 JPEGでは

    JPEGのフレームヘッダを読んでwidthとheightを取り出す - 昼メシ物語
    kamipo
    kamipo 2012/09/19
  • Rails3.2からログの行が他プロセスのものと混ざるようになった件について - 昼メシ物語

    Rails 3.2.0 から、マルチプロセス環境下(Unicornなど)では、 Rails.logger によるロギングが、以下のように複数のリクエスト同士で「混ざる」ようになってしまいました。 Started GET "/search?q=blip" for 0.0.0.0 at 2012-03-12 02:20:18 -0700 Processing by SiteController#search as / Parameters: {"q"=>"blip"} Started GET "/search?q=2bxen" for 0.0.0.0 at 2012-03-12 02:20:20 -0700 Processing by SiteController#search as / Parameters: {"q"=>"2bxen"} Rendered site/foo.html.erb

    Rails3.2からログの行が他プロセスのものと混ざるようになった件について - 昼メシ物語
    kamipo
    kamipo 2012/09/19
  • Unicornを同期的に再起動する - 昼メシ物語

    Unicornの再起動はシグナル(USR2等)を発行することで非同期的に行われるので、成功したのか失敗したのかがわかりづらい。 例えばCapistrano等でアプリケーションをデプロイしたあと、Unicornの再起動を行い、その再起動が成功か失敗かを判断したいことがある。 というわけで、 Unicorn を 同期的に restart するスクリプトを書いた。 使い方と仕組み 上記スクリプトを unicorn_restart.rb みたいな名前で保存し、以下のように Unicorn の PID ファイルを与えて実行します。 $ unicorn_restart.rb /tmp/unicorn.pidこれは以下のように動作します。 unicorn の master プロセスに USR2 シグナルを送る unicorn.pid.oldbin を監視し、再起動が終わるのを待つ 再起動が終わったら、

    Unicornを同期的に再起動する - 昼メシ物語
    kamipo
    kamipo 2012/08/27
  • ActiveRecordが発行するSQLをフックして色々やるためのライブラリArproxyを公開しました - 昼メシ物語

    https://github.com/cookpad/arproxy http://rubygems.org/gems/arproxy これは何? Arproxyを使うと、ActiveRecordが発行したSQLDB Adapterによって実行される直前をフックすることができます。これによって、カスタマイズしたクエリログを出力したり、どこからクエリが発行されたのかをトレースしたりすることができるようになります。 Arproxyでは、DB Adapterのフック処理を以下のように定義します。これはクエリが実行されるたびにバックトレースを出力する例です。*1 class QueryTracer < Arproxy::Base def execute(sql, name=nil) Rails.logger.debug sql Rails.logger.debug caller(1).join(

    ActiveRecordが発行するSQLをフックして色々やるためのライブラリArproxyを公開しました - 昼メシ物語
    kamipo
    kamipo 2012/04/30
  • Railsで遅いMiddlewareを探す - 昼メシ物語

    AさんはRailsで書かれたある遅いコードの検証をしていました。 X-Runtimeヘッダを見ると $ curl -Is localhost:3000/hello | grep X-Runtime X-Runtime: 5.008580 5秒もかかってる。 しかしRailsのログを見ると Started HEAD "/hello" for 127.0.0.1 at Tue Apr 03 13:04:11 +0900 2012 Processing by HelloController#index as */* Rendered text template (0.0ms) Completed 200 OK in 10ms (Views: 9.7ms) こんな感じで10msで返していることになっている。なんだこれは? こういう状況で疑わしいことの一つとして、Rack等のMiddlewareのど

    Railsで遅いMiddlewareを探す - 昼メシ物語
    kamipo
    kamipo 2012/04/03
  • capistranoで今タスクを実行中のホスト名を取得する - 昼メシ物語

    問題 $ cap hoge ROLES=app HOSTS=app-01,app-02,app-03 としたときに、各ホストに、ホスト名をファイル名にしたファイルをtouchするようなタスク hoge を記述せよ。 ただし、/etc/hostnameを参照してはならない。 こたえ task :hoge do run "touch $CAPISTRANO:HOST$" end $CAPISTRANO:HOST$ はcapistranoが内部的に使ってるプレースホルダなので、ドキュメントにも無いし、今後サポートされるかは不明。 結論 可能なら/etc/hostnameを配布しましょう とはいいつつもクラウドだとホスト名けっこう困るよね 参考 Getting the currently running host name in Capistrano | Code for Concinnity @

    capistranoで今タスクを実行中のホスト名を取得する - 昼メシ物語
  • unicornのタイムアウト時にもRailsのログをちゃんと出力させる - 昼メシ物語

    unicornはconfで timeout 20 とかやっとくと、20秒以上かかったらそのworkerが殺される。それはいい。問題はその殺され方にあって、タイムアウトしたunicorn workerはmasterにKILLシグナルで強制的に殺される。KILLで殺されてしまうと、worker側でtrapして安全に終了処理をすることができない。 一番困るのは、Railsloggerは(production環境のデフォルトだと)リクエストが終了するまでバッファリングしているので、リクエストの途中でKILLされてしまうとloggerがflushされない。つまり、unicornのタイムアウト時には、リクエストのログは一切production.logには出力されない。異常時のログが出ないとか、まじで困ると思うんだけど、みんなどうしてんだろ。 これに対処するためにはunicornのコードに手を入れるの

    unicornのタイムアウト時にもRailsのログをちゃんと出力させる - 昼メシ物語
  • Amazon EC2インスタンスに簡単にSSHできるようになるツールec2sshを公開しました - 昼メシ物語

    みんなが大好きなクラウドホスティングサービスのAmazon EC2ですが、インスタンスをバンバン立てたり落としたりしていると、ホスト名の管理が面倒になってきますよね。たとえば「さっき立てたインスタンスにSSHしたい!」と思ったら、consoleをひらいて、「ec2-xxx-xxx-xxx-xxx.compute.us-west-1.compute.amazonaws.com」なPublicDNSをターミナルにコピペして…みたいな面倒な事をやってしまいがちです。 これを避けるためには、~/.ssh/configをマメに更新したりするといいのですが、これはなかなか面倒な作業です。インスタンスは一旦StopしてRunし直すと、IPが変わってしまいますからね。 そこでec2sshの登場です ec2sshは、インスタンスのNameタグからホスト名を生成して、~/.ssh/configに書きこむツール

    Amazon EC2インスタンスに簡単にSSHできるようになるツールec2sshを公開しました - 昼メシ物語
    kamipo
    kamipo 2012/01/10
  • ActiveRecordのSQL実行をフックしていろいろやる - 昼メシ物語

    ActiveRecordで、あるSQLが発行された時に、そのSQLが実行されるDBのコネクション情報を調べたいときがある。 Hoge.find() したときにどういうSQLが発行されているのかというのはdevelopment環境ならデフォルトでdevelopment.logにクエリログが出る。 このログ処理は active_record/connection_adapters/abstract_adapter.rb に書かれてる。 # active_record/connection_adapters/abstract_adapter.rb 198 def log(sql, name) 199 name ||= "SQL" 200 @instrumenter.instrument("sql.active_record", 201 :sql => sql, :name => name, :c

    ActiveRecordのSQL実行をフックしていろいろやる - 昼メシ物語
  • Rackのミドルウェアをconfig.ruやapplication.rbじゃないところでuseする - 昼メシ物語

    RackのMiddlewareを書いたらどこかでuseしなくちゃいけないんだけど、どこでuseするのかという話になる。 Rails3だと、 config.ru config/application.rb その他(ただし Application.initialize! より前) っていうパターンがある。 config.ruとかapplication.rbで書いておくのがいいんだと思うけど、config/initializers/ 以下に置いた初期化スクリプトの中でuseしちゃいたい、そんな日もある。 こう書く。 # config/initializers/my_awesome_rack_middleware.rb ::Rails.application.config.middleware.use MyAwesomeRackMiddleware こんなところでuseする利点としては、 appl

    Rackのミドルウェアをconfig.ruやapplication.rbじゃないところでuseする - 昼メシ物語
    kamipo
    kamipo 2011/12/07
  • #RubyKaigi 2011で気になったgem 13選 - 昼メシ物語

    Rubyist達の夏フェスであるところのRubyKaigiが今年も開催され、猛暑の練馬が大いに盛り上がりました。今回が最後の開催とのことで、関係者各位は素晴らしい会議を当にどうもありがとうございました。 さて、今年のRubyKaigi2011での各セッションで紹介されたgemのうち、気になったものをピックアップしてみました。 1. fakeweb fakewebは、指定したURLのHTTPレスポンスを偽装する、テスト用のライブラリ。外部サービスと連携するプログラムのテストを書くにはとても便利ですね。 Engine YardのAndy Delcambre氏による「Toggleable Mocks and Testing Strategies in a Service Oriented Architecture」という発表で紹介されました。 以下、サンプルコードです。(READMEより) F

    #RubyKaigi 2011で気になったgem 13選 - 昼メシ物語
    kamipo
    kamipo 2011/07/19
  • 私がクックパッドの画像配信野郎です - 昼メシ物語

    一年ほど前にヤフーを退職した私ですが、その後なにをやっているかというと、クックパッドに入社して画像配信をしています。私が入社する前から動いていた画像配信の仕組みは設計が古くてなにかと困っていたので、より良いシステムを開発してリプレースというのをやっています。前職ではなかなかこういう基盤システムを一人でイチから作って運用までするという体験はできなかったので、でかい仕事をできるチャンスに恵まれて大変充実した毎日です。 入社当初はサービス開発の担当だったんですが、開発に必要な基盤システムを作り始めたらどんどんエンジニアリングのレイヤーが下がってきて、気づけばインフラチームに所属していました。 まあそんな話はさておき、この画像配信関連の成果をいくつかの勉強会で発表したので、その資料を紹介します。 サイバーエージェントxクックパッド合同勉強会(amepad) 弊社オフィスで開催された、サイバーエージ

    私がクックパッドの画像配信野郎です - 昼メシ物語