なるほどUNIXプロセス

http://tatsu-zine.com/books/naruhounix 帰省中の新幹線でナルホディウス!しながら読んだ。 中身としては思っていたよりはライトな内容で、わりと知っていることだった。 Resqueのworkerが毎回worker実行するときにforkするのはなんでだろーと思っていたの…

はてなブログへ移行しました

はてなブログがでてからだいぶ経過して、ぼちぼち、はてなダイアリーもいつ終了してもおかしくないかなという気もしたので、いい加減重い腰をあげて移行しました。 今年は、去年よりもうちょいコンスタントに書けるようにがんばろうと思います。なるべく休日…

isucon #3 予選に参加してきた

1日目で参加してきた。今回は他の二人にアプリケーション側はお任せして、自分はミドルウェアまわりをやる、ということにしていた。最初は、PHPを動くように設定を変更して、ベンチマークを実行していたのだけど、どうもfailしてしまう。原因を見ると、ログ…

SELECT ... FOR UPDATEとロックの挙動

kamipoさんが補足を書いてくれたので、参照するとよいです。

SELECT COUNT(*) FROM (SELECT 1 FROM xxxx)が、SELECT COUNT(*) FROM (SELECT item_id FROM xxxx)より速い理由

とあるサービスでslow logをみていたら、どこかの記事で読んだことのあるクエリがでてきたのだけど、もうちょっと速くできないものか、と考えてみた。結論を言えば、 BEFORE: SELECT sql_no_cache COUNT(*) FROM (SELECT item_id FROM category2item WHERE c…

Minillaで複数のテストスイートを実行するようにする

今ちまちま書いてるRedisismというRedis向けのフレームワークでは、Redisとのコネクション周りとかクエリ投げたりするところのハンドリングを自前では持っていなくてほとんど同じインターフェースなので、RedisDBあるいはRedisに任せている。そうなると、Red…

ActiveRecordのSQLの実行箇所をSQLのコメントに入れる

arproxyを使うと、SQLにフックして色々書きかえることができて非常に便利ですね。 module Arproxy class QueryLocationCommentAppender < Arproxy::Base WHITE_LIST_WORD_RE = %r{^[a-zA-Z0-9\-_/:\?]+$} def execute(sql, name=nil) if ENV["ARPROXY_QUERY_…

isucon #2へ参加してきました

前回非常に楽しかったので、今回も参加したいなーと思っていたのですが、「くらげとみかん」チームで、なんとか参加できました。走り書きだけど、考えたこと、やったことをメモっておく(あとでまとめなおすかもしれない)まずは最初に全サーバーへsshの鍵を通…

Play Framework 2.0雑感

scala触ってみたいなぁ、とは前々から思っていつつ、なかなか触れていなかったので、えいやと最近よく聞く気がするPlay Framework 2.0のチュートリアルを触ってみたり、軽いアプリケーションを書いてみての感想。 APIはよくできていて、非常に綺麗なAPIをし…

Sphinx+Guardでファイルを変更したときにビルドしつつ、自動でブラウザをリロードする

色々な言語が混ぜまくりすぎなので、他の人も環境を用意するようなものであればあまりおすすめできない。guardfile内でふつうにWEBRick起動させるコードを書くのがよいんかな。source/buildするディレクトリを分ける設定であるのを前提としております。guard…

rrails v1.0.0 released.

以前公開した、rails/rakeコマンドを超早くするrrailsですが、 http://d.hatena.ne.jp/walf443/20120427/1335482420あれから、色々な方に使っていただいているようで、パッチをいくつかもらったりしてupdateしたりしています。最近quark-zjuさんという方から…

DCIについて思うこと

最近DCI(Data Context Interaction)アーキテクチャというのを良く耳にするので、ちょっと調べたり他の人のコード例などをもとにちょろっと書いてみたりしたところ、やっぱりよくわからないなーと思いつつ、つまりはこういうこと?というのをまとめてみる。た…

gitのtagを元にChangeLogっぽいものを出力する

git

ChangeLogはリリースのたびに見直して手で丁寧に書いておく方が利用者にとってはうれしいことが多いですが、一方でまとめなおし作業はまぁまぁめんどいです。そこで、手直しするにしてもそれまでの情報をコミットログから雛形を自動生成してやれないかなーと…

適度に実行時間を抑制するrate_throttle

cronなどで統計処理のSQLをたくさん投げたりするときに、mysqlにあまり負荷をかけたくないので、適度にsleepを挟みながら実行させる、という処理を書くときに、perlだと、Sub::Throttleというid:kazuhookuさんのライブラリを使っていたのですが、rubyで同様…

text型のカラムを明示的にINSETRTしなかったときのNULL値の挙動

後輩に訊かれてどうだったっけ?と思って調べたので、まとめておく。 まとめ text型でINSERT時に明示的に情報を入れない場合、カラムがNOT NULLであったときは、""が入る。NOT NULLでない場合はNULLが入る。 作業ログ # not null制約をつけている場合 mysql> …

fork時のrand()の挙動

perlでforkしたときに、srand呼ばないと親プロセスとseedの値が同じになってしまうので、子プロセスの間でrand値が変わらなくてハマる、という経験があったのだけど、rubyの場合だとそのようなことはないようだ。 # perl use strict; use warnings; warn ran…

fluentdのログを調査するためのツールflgrepを書きました

おかげさまでRack::CommonLogger::Fluentを運用しはじめました。 Mongoに記録してごにょごにょとか、色々な方法があるらしいのですが、とりあえずファイルに記録しておいて、用途はあとで考えようという感じで使っています。ということで、ログファイルを色…

rackのアクセスログをfluentdへ投げるミドルウェア

railsのアクセスログは、とても機械的に解析しづらく、運用するにはあまりよろしくない。そこで、Rack::CommonLoggerを使ってアクセスログを別途とったりしようとしていたのですが、(一般的にはNew Rericとかをつかうのが普通なんでしょうか?) ログのローテ…

UNIXSocketに対応してないライブラリを無理矢理対応させる

プロトコルは同じなので、既にあるクライアントライブラリを使いたいのだけれど、そのクライアントライブラリが想定しているサーバーは、unixsocketには対応していない場合、クライアントライブラリにUnixSocketに対応させるpatchを送ってもacceptはされない…

railsコマンドの実行を超早くするrrails

最近はお仕事で久々にがっつりrubyを書いてます。rails難しいです。それはさておき、railsコマンドの実行が遅いのがつらいので、色々探していたら、jugyoさんのrails-shを見つけました。rails-shはscalaのsbtとかみたいに、railsを読みこみ済みの環境を起動…

phpでTAP

php

phpでTAPやらperlのTest::Moreを移植しよう、というのは調べてみると、色々な人がやっているのだけど、subtestあたりに対応しているのはないっぽかったり個人的にあまり気にいったやつがなかったので書いた $t = new TestTAP(); $t->ok(1==0, "failed test")…

「いいね!」的なもののschema

facebookの「いいね!」やはてなstarみたいなものを自分でつくるとすると、どういうschemaにするかなーということで、ちょっと考えてみた。(mysql 5.1以上) create table user ( id int unsigned not null auto_increment, primary key id(id) ) ENGINE=InnoD…

statsのcmd_setは、incrなども含むのか?

twitterで@nekoyaさんがつぶやいていて、memcachedは他のミドルウェアとかよりはソースコードはだいぶ簡潔だろうし、このぐらいならコード調べるのはわりとできそうだな、と思ったのでせっかくなので追ってみた。結論としては、incrの更新の場合には、stats…

退職します

月日の流れは早いもので、「モバイルファクトリー入りたい」の記事を書いて会社へ遊びにいってから、5年と約半年が過ぎました。昨日が最終出社日でした。会社では、様々なサイトの開発、運用、フレームワークの開発、deploy/監視のフローやツールの整備、様…

post-recieveを遅延実行

git

gitのリポジトリへpushしたら、jenkinsへ通知とかは、メインリポイトリ側で、post-recieveフックの設定をすることでできるのだけど、通知先が大量に増えたりすると、git pushが重くなってしまいストレスフル、ということで、遅延実行させる仕組みをつかって…

マスターデータの書きかえ

メンテナンスなどで、マスターデータを書きかえるときは、 use strict; use warnings; use DBIx::Handler; my $db = DBIx::Handler->new("dbi:mysql:test;", "root", "", { RaiseError => 1}); $db->dbh->do(q{ CREATE TABLE IF NOT EXISTS hoge ( id int un…

enum列へのalter table

巨大なtableへのalter tableが必要になったのだけど、enumへのalterって確か最適化してくれたんじゃなかったっけな、ということで、一応確認のため検証してみる次のschemaを用意します。 CREATE TABLE `enum_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, …

複数サーバーでtail -fする

各サーバーへ入ってなんか状態を監視というのをやりたいことがあります。各サーバーのログファイルをtail -fとか。それだけだと、単にforkして何かコマンド実行させればよいだけ、だったりしますが、単にそうしてしまうと、標準出力などがメインのプロセスに…

○○した順に保つデータ構造

http://www.amazon.co.jp/dp/475981339X を読みつつ、もしランキング = 確率的ランキングとみなし、注文した順をランキングとして採用し、実現するとしたら、どうやって実現するだろうか、というのを考えてみた。 (実際のところ、かなりの更新頻度がないと…

memcachedのように使えるBloomFilter

YAPCでmalaさんの話を聞いていて、memcachedのようにお手軽に使えるbloom filterがあるとひょっとすると便利かもしれない、とふと思ったのでAnyEventつかって、Bloom::Fasterのwrapperを書いてみました。https://github.com/walf443/p5-bloomd-server以下の…