「いいね!」的なものの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以下の…

qudoで一日にjobが何件ぐらい投入されたか計測する

jobが一日あたり何件ぐらい投入されているのか、お手軽に確認できるようにするのに、MySQLのtriggerを使ってみるとどうだろ、ということでやってみた。まず普段のqudoのschemaに加え、以下のようなテーブルを追加します。 CREATE TABLE `job_counter` ( `enq…

KVMをコマンドラインから使うの術

kvm

結構前に自宅サーバーの仮想化はXenにしていたのをこれからはKVMらしいのでKVMに変えてみるか、とやってみたときは、ホストOSにX入れないとうまく動かなかったりそういう点が嫌だなぁと思っていたが、だいぶ環境や情報が揃ってきて、Xenで作ったりするのと同…

isuconに参加してきた

isuconに参加してきた 当日の行動 ややうろ覚えですが、自分がやっていたことをざっくり書いてみます。 まず、実行用の環境へアクセスしようとしたら、reverse proxyのサーバーへしかsshできなかったので、とりあえずisuconユーザー以下にあるファイルをざっ…

Test::Tester

以前テストライブラリのテストを書く際に、Test::Builder::Testerがつかえる、という記事を書いたが、Test::Builder::Testerは、テストの失敗の文字列を一字一句かえないように調整したりするのが、ダルいなぁ、というのがあったりして、もっとよいやつを探…

続 Test::TypeConstraints

http://d.hatena.ne.jp/walf443/20110704/1309738408 で公開した、Test::TypeConstraintsですが、反応をもとに、微調整してCPANへあげました。 type_is_a_okというメソッド名をtype_isaにしました Data::Validatorに依存せず、Mouse::Util::TypeConstraints…

local $var += 1の挙動

Test::TypeConstraintsのレビューをしてもらっていたときにid:gfxさんに教えてもらったのですが、 local $Test::Builder::Level += 2;としていたのですが、これは、「元々の$Test::Builder::Levelに2を足す」、という挙動にはならないです。そもそも、これは…

Test::TypeConstraints

ちょっと固めに書いておきたいところで、メソッドの戻り値の型をテストしておきたくて、Smart::Argsとかを使うのに慣れてくると、ArrayRef[Int]とかでテストできると楽だなぁと思ったので書いてみました。https://github.com/walf443/p5-test-type_constrain…

Skeleton::CoC

フレームワークにそってアプリケーションを開発していると、これを追加するには、このクラスとこのクラスを作って、ここにテンプレートを追加する、といったことがよくある。railsとかだとscript/generateとかあってテンプレートを元にファイルを自動生成で…

pathogenのhelptagsしたらsubmoduleがdirtyになってめんどい

最近pathogen.vimへ移行して、だいぶvimのライブラリをupdateしたりするのが楽になったのですが、 :call pathogen#helptags()とかやると、uniteのマニュアルとかも:h uniteとかで引けるようになる、というのはとてもうれしいのですが、その一方で、git statu…

Cache::Pluggable

Cache::な名前空間を持つライブラリは、get/setなどのインターフェースがわりとそろえてあるのですが、ライブラリによって微妙に挙動が違ったりして、ちょっと別のライブラリを検証してみたり、とかが意外としづらいです。例えば、Cache::Memcached::Fastで…

dainamoを書きました

ちょっと前からdainamoというプロジェクトを始めました。元々各プロジェクトの雛形にgearman/schwartz/qudoのworkerのスクリプトがあり、そこから自動生成させて、微妙にカスタマイズしつつ、使っていたのでした。 しかし、その自動生成させたやつに微妙にバ…

ファイルが更新されたら勝手にspork -makeするやつ

自前のプレゼンツールを作ろうといつも思いつつ結局時間に追われてついついSporkを使ってしまっています。しょっちゅうファイル更新するたびにspork -make打つのもめんどくさいので、ちょっと書いてみました。最近地味にFilesys::Notify::Simple期です。 use…

gearman-top

以前書いたperlbal-topのgearman版があると便利なことがちょっとあるかもしれないということなので書いてみました。http://d.hatena.ne.jp/walf443/20100121/1264083979 ./gearman-top statusとかで数秒に1回admin portをたたいてstatusを実行して表示するの…

DBIx::Skinnyの動的なSQL生成の挙動を調べるREPL

そもそも悩むくらいならsearch_namedでいいんじゃね?という話はありますが、動的生成するようにしておく方が便利ということもまぁまぁあったりします。あと、なんだかんだでsearchは便利なのでよく使うんですが、細かいところでどう書くんだったけなー、とい…

コマンドラインからjsのリファレンスを引く

js

昨日cpprefを久々に使ったりしていて改めてコマンドラインからリファレンスを(オフラインで)引けるのは便利だなぁと思ったので、ぱっとみないっぽかったので、jsrefというツールを作ってみた。基本的にはcpprefと同様にサイトのpathを書きかえつつ、scraping…

vim-refからcpprefを引けるようにしてみた

vim-refを愛用しているのですが、cpprefを引けるようにしたいなということでやってみました。vim scriptはあまり得意ではないですが、見様見真似でいくつか関数を書くだけで他と同様の感覚で使えるようになるというのがvim-refはとても便利ですねhttp://gith…

今いるwindowの番号をとなりの番号に変更する

途中で空きがあったりすると必ずしも正確ではないが export WINDOW=$(($WINDOW+1)) && screen -X number $WINDOWとか。:numberは引数に対して環境変数の展開等をしてくれないらしいので、screen -X経由で呼ぶことでshellの展開を利用している WINDOW環境変数…

kumofsを一台のサーバーで動かす

hbstudy #10に参加してきたんですが、いいかげんkumofsくらい動かしてみないとなぁということで動かすだけ動かしてみました。 基本的には複数のサーバーで使われることを想定されてるものなので、この構成は、あまり検証には向かないはず。とりあえずどんな…

Plack::Middleware::DoCoMoGUID

ドコモ向けのサイトを書いている場合に自分サイトのどのページでもiモードIDをとりたいというのはよくあることですが、 PlackのMiddlewareでやれそうかなと思いつつ、他に書いてる人がいなそうだったので書いてみました。http://github.com/walf443/p5-plack…

__PACKAGE__を使わない方がよいとき

一時期社内でbless {}, __PACKAGE__が流行っていて、このやり方は継承した際に問題があるので使わない方がよいんじゃないですかねということで問題になるケースをあげてみる。 package Foo; sub new { bless {}, shift; } sub call_foo { my $self = shift; …

更新のあったところだけテストする

Makefileとかのビルドツールを使って、変更のあったファイルあるいは、その依存関係だけをコンパイルするっていうのはよくやりますが、変更したところだけテストするようにしたプロジェクトってあまり見たことないので試しにやってみた。Makefile.PLとかで簡…

DBIx::Skinny::ProxyTable

すっかりブログに書きわすれていたんですが、こんなの作りましたhttp://github.com/walf443/p5-dbix-skinny-proxy_table基本的にDBIx::Class::ProxyTableの使い勝手を踏まえつつ、 微妙にこうだったらよかったねーという部分を機能追加した感じになっていま…

perlbalのadmin portをtop風に見る

夜中にサーバーが重くなったりしたときとかにチャットで同僚と会話しながらサーバーの増強とかやってると、進行状況が不明になったりしがちでperlbalの割り振り状況をtop風に見れるのが欲しかったので書きました。一定時間ごとにadmin portに引数で渡したコ…

Re: DBIx::Skinny で update_or_create

http://d.hatena.ne.jp/magicalhat/20100121/1264076085より オマケとして、UPDATE じゃなくて INSERT した場合には、関連するレコードも更新しなくちゃ! とゆーパターンも想定して、DBIx::Class でも利用できる in_storage というメソッドもつけてみました…

DBIx::Skinny::Pager

DBIx::Skinnyで簡単に使えるpagerが実装されていない主な理由は、 http://perl-users.jp/articles/advent-calendar/2009/dbix-skinny/19.html とかに書いているんですが、管理画面にありがちな データを様々な条件で検索するページみたいなのを書くときにはS…

perlapiのctags用ファイルを作るスクリプト

あけましておめでとうございます。今年もよろしくおねがいします。正月ということでふだんなかなかできないことをやろうかなということでXS勉強中です。XSにはあまり詳しくないのでCPANにある実例を色々読んだりしてるとperldoc引きまくりな刑になるわけです…

local::libと.modulebuildrc

自宅の開発マシン(MacBook)と自宅サーバー(色々)のCPANはlocal::libで インストールしたのを1つのgitリポジトリにしているのですが、 .modulebuildrcのpathがフルパスになっていてハマったのでいちおうメモ。 diff --git a/.modulebuildrc b/.modulebuildrc …

Git 1.6.6 Relnoteメモ

git

25歳になりました。それはさておき、1.6.6が出たらしいので例によってRelnoteをピックアップして気になったところにコメントしてみる。個人的には、設定ファイルの~/を展開してくれる機能だけでもupdateする価値はあるなぁといった感じで他にも細かいけどよ…

MySQLユーザー会2009年冬に参加してきた

http://atnd.org/events/2512元々はkazuhoさんにShibuya.pmの懇親会でお金を借りてしまってて、年内に返したかったという非常に個人的な事情で参加して、tritonnの開発者の人に会えたりする機会はあんまりなさそうだし、運用とかに関して色々聞いてみようか…

MogileFS::Client::WithCacheを書いた

MogileFS::Clientは通常、get_pathsで得られた結果をperlbal側にX-REPROX-CACHE-FORでキャッシュさせることでtracker(MySQL)へのアクセスを抑えるように運用するのが一般的ですが、たまにアプリ内でget_file_dataしてそれをもとに微妙にカスタマイズして画像…

彼氏がtmt.vimを使ってなかった。別れたい

Text::MicroTemplateで書かれているHTMLのテンプレを素のvimのシンタックスハイライトを有効にした状態で開いていると、ひどい状態になってしまいます。というわけで、eruby.vimを参考にしつつid:mikihoshiが書いていたのを、色々細々調整してみてだいたい変…

Testライブラリのテストを書く

テストライブラリを書くときに local Test::More::Level += 1 を忘れるとテストがこけたときに呼び出し元がおかしくてどのテストを直せばよいかわからないということになってしまいます。ということでしっかりそういうテストも書いておきたいですね。Test::B…

手元のgitリポジトリ一覧をgithubのwatched reposとsyncする

先日書いた、複数のgitのレポジトリを巡回するスクリプトは結構便利なのだけど、「その日にwatchしたプロジェクトとかはcloneしてこないとupdateをチェックできない」という欠点があって、IRCとかで話題になって興味を持って、家に帰ったらチェックしようと…

git 1.6.5 RelNotesメモ

git

もう数日経ってますが、git 1.6.5が出たっぽいので大雑把にRelNote-1.6.5.txtを訳しつつ、個人的に興味があったところを引っぱってみる。 いまいちわかっていないところもまずまずあったりはするので、コメント等で補足していただけるとありがたいです。 GIT…

複数のgitのレポジトリを巡回するスクリプト

git

ここ最近perl界隈の人たちもgithubに移行してきてて、watchしてるプロジェクトが大幅に増えてくると、githubのtimelineを全部みることもできないし、リポジトリの更新をサボりがちだったのですが、各プロジェクトを巡回してupdateだけ取ってくるスクリプトを…

git-svn使用時におけるsvnリポジトリの移行

svnリポジトリを別のサーバーに移して、 svn switch --relocate svn+ssh://old.example.com/path/to/project svn+ssh://new.example.com/path/to/projectみたいなのでワーキングコピーを切り変えるようなケースをgit-svnでやってみたメモ。まず.git/configの…

CPAN::Packgerと設定ファイル

CPAN::Packagerの設定ファイルの前提として、 なるべくなら設定しなくてよいのがベター(CPAN最新が依存関係が適切に設定されているならそれが一番望ましく、問題を見つけた場合はなるべくチケットを出すなりした方がよいかなと。) 独自パッチを当てる場合で…

libdrizzleのruby拡張ライブラリ

http://d.hatena.ne.jp/tokuhirom/20090612/1244764189ちょっと面白そうだったので、軽く調べた感じだと今のところなさそうだったので、上でやってることができるぐらいに作ってみた。ちょっと時間があまりなくてまだベンチマークとかはとったりできてない。…

Debianパッケージ構築のメモ

Debianパッケージはぱっとみ概念とかがわかりにくいので、色々省きつつ大雑把にとりあえず作ったりする上で必要な情報を説明してみる試み。簡単なdebはとりあえず作ったりできるようになってみて、個人的にはこういう情報がまとまってると楽だったなーという…

git-svnでリモートリポジトリのブランチにコミットする

ふつうに使ってるのですが、そういえばメモしてなかったなーと思い、なんとなくメモしておく。ちょっとBKなんですがもっとスマートなやり方はないものか。。。 $ git checkout -b working_branch $ git svn info # => trunkのURLになる # 何かしら作業する $…

gitのリポジトリを立てる(SSH経由)

git

そういえば、githubに頼りっぱなしで、共有リポジトリを作ってどうのこうのというのは試してなかったなと思いこんな感じでやってみた。 $ sudo useradd -d /home/git -s /bin/rbash -c "" -m -k '' git $ cd /home/git/ $ sudo cat > .bash_profile export P…