はてなブックマーク – ウノウラボ Unoh Labs: MySQL5からのインデックス結合で1テーブル複数インデックスを使う

kubi

うわぁ、ショックだし理由が気になるわあ。追記:

$php→rails (rails に憧れる phper のブログ) – 複合インデックスと複数インデックス

でも、上の構造で、name, age を元に抽出するつもりだとすると、

自分の感覚では複合インデックス付ける。

こちらを見てて気づいたんですが、「あの例なら複合インデックスを使う方が良い、もしくは複合インデックスの存在を知らないのか?うちらならクビ」ってことなのかな?

文字コードや品詞IDの問題があってDebianパッケージのMeCabは使わず、ソースから入れてたんですが、mecab_dict_indexという辞書をコンパイルするコマンドが付いていることを知ったのでパッケージから入れた辞書をリコンパイルしてみました。(なるべくパッケージで管理したい)

パッケージのやつ(Ubuntu 7.04)だと文字コードがEUC_JPで品詞IDが使えない状態。

$ mecab -F"%m\t%h\t%H\n" 
すもももももももものうち
すもももももももものうち        0       ????,????,*,*,*,*,*

mecab-dict-indexに”辞書の元テキストの場所”、”辞書ファイルの出力先”、”辞書の元テキストの文字コード”、”辞書ファイル文字コード”、”品詞IDを使うためのオプション”を指定してやる。

/usr/lib/mecab/mecab-dict-index -d /usr/share/mecab/dic/ipadic -o /var/lib/mecab/dic/ipadic -f euc-jp -t utf-8 -p
$ mecab -F"%m\t%h\t%H\n" 
すもももももももものうち
すもも  38      名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      16      助詞,係助詞,*,*,*,*,も,モ,モ
もも    38      名詞,一般,*,*,*,*,もも,モモ,モモ
も      16      助詞,係助詞,*,*,*,*,も,モ,モ
もも    38      名詞,一般,*,*,*,*,もも,モモ,モモ
の      24      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    66      名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

ちゃんと出るようになった。

各言語のバインディングはlibmecab-devを入れとけば通るハズ。たぶんrpmでも似た感じでいけるハズ。

YouTubeの次期APIには、GDataを採用

YouTube APIの開発者ブログを見ていたら、そんなことが決定されたようだ。

ΩΩΩ < な、なんだっ(略

この瞬間に標準のWeb APIはGDataにきまっちゃった・・・?

MicrosoftがWin32 APIで開発者を取り込んで、(Windowsアプリが沢山出来たために)デスクトップOSで大成功したみたいに標準Web APIは糞重要なのにもう決まってしまった感が・・・。

候補としてはこんな感じ。

この候補にMicrosoft提案が入ってないのが悲しいですがしょうがない。とにかくGDataがかなりリードか!?

それとは別に野良APIの方でも今仕事で使ってますが、jester.jsのjsonp対応とか利便性が凄いのでこういうとこから新たな標準が出来ちゃうかもしれないですね。

RailsでRubyのl10n用ライブラリRuby-GetTextでハマってmasatoさんに助けられたのでメモります。

sudo gem install gettext

config/environment.rbに下記追加

$KCODE = 'u'
require 'jcode'
require 'gettext/rails'

app/controller/application_controller.rbに下記追加

class ApplicationController &lt; ActionController::Base
  init_gettext "my_app_name" # 自分のアプリ名
end

こんな感じのgettext.rakeタスク作成

require 'gettext/utils'

desc "Update pot/po files." 
task :updatepo do
  GetText.update_pofiles(
    "my app name",
    Dir.glob("{app,config,components,lib}/**/*.{rb,rhtml}"),
    "my app name 0.0.1" 
  )
end

desc "Create mo-files" 
task :createmo do
  GetText.create_mofiles(true, "po", "locale")
end

potファイルを作成

rake updatepo

potから各言語用ファイルを生成(cpでもいいがmsginitを使うといい感じのヘッダを入れてくれる)

msginit -i po/my_app_name.pot -o po/ja/my_ap_name.po -l ja

今回糞ハマったのは foo.pot → ja/foo.po としなければならないところを foo.pot → ja/foo.pot とそのままの名前でコピってたとこ。これだと当然moはできねえ・・・。

poを適当にいじってmoを生成

rake createmo
ls locale/ja/LC_MESSAGES/my_app_name.mo
locale/ja/LC_MESSAGES/my_app_name.mo

エラーメッセージが勝手に多言語化されてたりと、poいじる前からかなり便利ですな。追記:

Ruby-Gettextの翻訳具合が気に食わない場合はそっちのpoをいじればOK。大体この辺に入ってるハズ。

/var/lib/gems/1.8/gems/gettext-1.9.0/po/ja/rails.po

MeCabを使う時、辞書のインストールでこちらを参考にしてMakefileをいじらないと品詞IDが使えなくてはまる。

念のためこのページにも書いておこう。

http://keihanna.dl.sourceforge.jp/mecab/20904/mecab-ipadic-2.7.0-20060707.tar.gz
tar zxvf mecab-ipadic-2.7.0-20060707.tar.gz
cd mecab-ipadic-2.7.0-20060707
./configure --with-charset=utf8
vi Makefile
make
sudo make install

ipadicのMakefileの250行目あたりを変える

$(mecab_dict_index) -d . -o . -f euc-jp -t utf8   # 変更前
$(mecab_dict_index) -d . -o . -p -f euc-jp -t utf8   # 変更後

品詞IDが使えるとこんな感じで書けるので便利!

# 名詞かどうか
if (37..66).include?(node.posid)

それにしても最近はWebアプリのアイデアで、「その文章を形態素解析してリンクを張ろう」とか簡単に言うけど、完全にMeCabとかChaSenとかのおかげで、もしこういった成果が公開されてなかったら俺のような糞プログラマーには絶対無理ですな。大学と研究所の共同プロジェクトらしいですが、ナイス税金の使い方って感じです。国益です。

条件付き確率場?無制限多階層品詞?bi-gram マルコフモデル?ひとっつもわかんねえ・・・。これらのアプリがオープンソースであることに感謝します・・・。

p0t: インデックス結合最適化

3.2.6. インデックス結合最適化 http://dev.mysql.com/doc/refman/5.1/ja/index-merge-optimization.html

MySQL 5.1からの複数のインデックスが必要な時の話らしいので要調査!(というか誰か分かりやすく教えてください・・・)

自分で調べろや・・・ということで調べてウノウラボに書きました。

最近はレプリケーションやクラスターなど、スケールアウト系の話が話題ですが、ひとりWebサービスで派手な構成はちょっと・・・。(金が無い)

RDB本来の力を正しく使って速くできるならそれに越したことはないのでもっと勉強したいと思います。

new_mojavi_site.png

何かMojaviのサイトが復活しとる・・・。

このページ以外どこにもいけないので手間のかかった冗談かもしれないけど何をやるつもりなのか気になります。

Plnetで友達追加が出来ないという有りあえないバグを修正しました。

準備万端でrake svn:commit(svn upしてmigrateして全部のテストして通ったらciしてくれるヤツ)を実行したらテストが通らない。そんなばかなこ・・・

/usr/bin/ruby1.8 -Ilib:test "/usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake/rake_test_loader.rb" "vendor/plugins/redgreen_plugin_testing/test/redgreen_plugin_testing_test.rb" "vendor/plugins/ar_fixtures/test/ar_fixtures_test.rb" 
-- create_table(:beers)
   -&gt; 0.0800s
-- create_table(:glasses)
   -&gt; 0.0044s
-- create_table(:drunkards)
   -&gt; 0.0015s
-- create_table(:beers_drunkards, {:id=&gt;false})
   -&gt; 0.0011s
-- initialize_schema_information()
   -&gt; 0.0016s
-- columns("schema_info")
   -&gt; 0.0021s
Loaded suite /usr/lib/ruby/gems/1.8/gems/rake-0.7.3/lib/rake/rake_test_loader
Started
F.E...
Finished in 0.065891 seconds.

  1) Failure:
test_dump_to_file(ArFixturesTest) [./vendor/plugins/ar_fixtures/test/ar_fixtures_test.rb:22]:
&lt;2&gt; expected but was
&lt;0&gt;.

  2) Error:
test_load_from_file(ArFixturesTest):
NameError: uninitialized constant ArFixturesTest::Glass
    /usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/dependencies.rb:477:in `const_missing'
    ./vendor/plugins/ar_fixtures/test/ar_fixtures_test.rb:28:in `test_load_from_file'

6 tests, 7 assertions, 1 failures, 1 errors

おまえかよ(プラグイン)

最近Plnetで遅いクエリが溜まっていってあっという間にmax-connectionに到達してたんですが、mysqldumpslow(slowログをサマリしてくれるヤツ)で一番重いのを修正したら調子が良くなった。

Webサーバの死活監視にmontasticを使い始めたとたんに携帯にメールが糞来まくって追い詰められ、重い腰をやっと上げた結果です・・・。

sudo mysqldumpslow /var/log/mysql/mysql-slow.log
Count: 4  Time=104.75s (419s)  Lock=0.00s (0s)  Rows=1.0 (4), plnet[plnet]@local
host
  SELECT COUNT(e.id) AS CNT
  FROM  member_to_feed m2f
  JOIN feed f ON m2f.feed_id = f.id
  JOIN entry e ON f.id = e.feed_id
  WHERE DATE_FORMAT(e.date, 'S') = 'S'
  AND m2f.member_id = 'S'

Count: 5  Time=73.00s (365s)  Lock=0.00s (0s)  Rows=12.0 (60), plnet[plnet]@loca
lhost
  SELECT e.id, e.uri, e.title, e.description, e.author,
  UNIX_TIMESTAMP(e.date) AS date,
  f.title AS feed_title, f.link AS feed_link,
  f.uri AS feed_uri, f.favicon
  FROM  member_to_feed m2f
  JOIN feed f ON m2f.feed_id = f.id
  JOIN entry e ON f.id = e.feed_id
  WHERE DATE_FORMAT(e.date, 'S') = 'S'
  AND m2f.member_id = 'S'
  ORDER BY e.date DESC LIMIT N, N