2010/06/24 Thu

Ruby+MongoDB+MeCabで全文検索

これに検索コマンドをつけたのでメモ。MeCabを選んだのは気分です。

User Streamsから取得する際にそのままのJSONをMongoDBに入れてたのを、MeCabかませた配列も入れるコードを追加(過去ログもバッチ処理した)。

if status['text']
    status['keywords'] = MeCab::Tagger.new("-Owakati").parse(status['text']).split(' ')
end

あとインデックスを張る

$ mongo
> use userstreams
> db.status.ensureIndex({keywords: 1})

検索する関数

def search(keyword)
    keywords = MeCab::Tagger.new("-Owakati").parse(keyword).split(' ')
    return $db['status'].find({'keywords'=>{'$all'=>keywords}},{:sort=>['id', 'descending'],:limit=>10})
end

いろいろ書いた気がしていたけどあまり書いてなかったですね。{'keywords'=>{'$all'=>keywords}} の部分がどうするのかよくわからず、はまった。あとバッチ処理が長かった。

これまでの検索用関数はこういう感じで正規表現で楽勝じゃんみたいなのにしてたけどクエリが重くて、タイムアウトエラー吐いたりしたので思い直したのでした。

def search(keyword)
    return $db['status'].find({'text'=>/#{keyword}/},{:sort=>['id', 'descending'],:limit=>10})
end

2010/06/23 Wed

Ubuntuにmecab-ruby入れるメモ

$ sudo apt-get install mecab libmecab-dev
$ wget http://jaist.dl.sourceforge.net/sourceforge/mecab/mecab-ruby-0.98.tar.gz
$ tar zxvf mecab-ruby-0.98.tar.gz
$ mv mecab-ruby-0.98
$ gem build mecab-ruby.gemspec
$ sudo gem install mecab-ruby-0.97.gem

libmecab-dev 入れてなくてはまった

2010/03/07 Sun

faviconがないサイトにfavidenticon.user.js

http://twitter.com/oquno/status/8528797858

そんなわけで、結構前から欲しかったのだけれど、ちょうどいいライブラリ( http://www.moreslowly.jp/products/identicon/ )があったので作ってみた。faviconがあるけどlinkタグで書いてないサイトに対応できないのはどうにかなるのかわからない。

ライブラリ自体のライセンスがよく分からないのと、外部から読み込むのがよく分からなかったので、ライブラリ以外の適当なコードだけ。自分用のだとライブラリごとコピペしてます。

var icon = document.evaluate('//head/link[@rel="shortcut icon"]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
if(icon)
    return;
var size = 32;
var domain = encodeURIComponent(document.domain);
domain = domain.replace(/[^0-9a-z]/ig,'');
var domain_id = parseInt(domain, 36);
while(Math.pow(2,32) > domain_id*10)
    domain_id*=10;
while(Math.pow(2,32) < domain_id)
    domain_id/=10;
domain_id = Math.floor(domain_id);
var favicon = document.createElement('link');
var canvas =  document.createElement('canvas');
canvas.width = size;
canvas.height = size;
canvas.id = 'temp_canvas';
canvas.style.display = 'none';
document.body.appendChild(canvas);
favicon.rel = 'shortcut icon';
favicon.id = 'favidenticon';
var head = document.getElementsByTagName('head')[0];
new Identicon(canvas.id, domain_id, size);
favicon.href = canvas.toDataURL();
head.appendChild(favicon);

2010/02/22 Mon

mod_extract_forwardedをCentOS 5に入れたメモ

先日、うちのサーバー構成を、しょぼいノートPCのwebサーバーをフロントに置いてたのを、無駄に置いてあったML115なんかと交換して、しかし kichikutter とかの移転がめんどいので、大体 mod_proxy で元のノートPCサーバーに送ってる感じにしました。

もうあまりCentOSは好きじゃないのですが、そんな経緯で、ブログのスパムブロックが正常に動くように mod_extract_forwarded を入れたので、CentOS用のそれっぽいのがすぐ見つからなかったしメモっておきます。apacheは2.2。

apxs入ってなかったら入れる

# yum install httpd-devel

mod_extract_forwarded 落として解凍

# wget http://www.openinfo.co.uk/apache/extract_forwarded-2.0.2.tar.gz
# tar zxvf extract_forwarded-2.0.2.tar.gz
# cd extract_forwarded/

パッチ当てる(今も有効なのかよくわかってない)

# vi extract_forwarded.patch
--- mod_extract_forwarded.c.orig	2004-03-09 00:27:36.000000000 +0900
+++ mod_extract_forwarded.c	2007-04-18 10:27:08.945045803 +0900
@@ -758,7 +758,7 @@
     {
         if (conf->debug == MEF_DEBUG_ON) 
         {
-            fprintf(stderr,"MEF: phase:%s, $s not acceptabler proxy, %s\n", 
+            fprintf(stderr,"MEF: phase:%s, %s not acceptabler proxy, %s\n", 
                     phase, conn->remote_ip, r->unparsed_uri);
             fflush(stderr);
         }
@@ -925,6 +925,9 @@
  * spoof one) is added to the X-Forwarded-For header.
  */
 static int mef_before_proxy_http(request_rec *r, 
+#if AP_SERVER_MINORVERSION_NUMBER >= 2
+                                 proxy_worker *worker,
+#endif
                                  proxy_server_conf *pconf,
                                  char *url, const char *proxyname, 
                                  apr_port_t proxyport)

(from mod_rpaf のかわりに mod_extract_forwarded なるものがあるらしい - daily dayflower)

# patch < extract_forwarded.patch

インストール

# /usr/sbin/apxs -c -i -a mod_extract_forwarded.c

有効にしてapache再起動

# vi /etc/httpd/conf.d/extract_forward.conf
MEForder refuse,accept
MEFrefuse all
MEFaccept 192.168.1.XXX # mod_proxy使ってるサーバーのIPアドレス
# /etc/init.d/httpd restart

これで、apacheのログ見てIPアドレスが外のIPっぽかったら成功のようです。

2009/12/02 Wed

Gyazo.appをKUINS proxy経由で使えるように

Macで大学のネットワーク使ってる時にgyazo(オレオレgyazo&オレオレgyazickr)れなくて不満だったので、修正してみた。適当に書いてみたのだけど、動いたので。

最後の方をこんな感じにして、通常のgyazoアップロードでタイムアウトエラーが返ってきたらKUINSのproxyサーバ経由でアップロードをするようにしてみた感じです。

あとはMacでHamachiとAdiumがKUINS PPTP+proxy.kuins.net経由で動くといいんですけど、やり方が分からない。

2009/07/05 Sun

Last.fm の loved tracks を mt-daapd のプレイリストに変換するやつを書いた

初めて比較的ちゃんをRuby書いたけど、とりあえずうごくくらいにはなりました。

なんで作ったかというと、先日の Windows のデスクトップ機 OS 再インストール時にレート付きのプレイリストのデータを消してしまったので、またやり直すのめんどいなーと思ってやりました。あとデスクトップ機と Ubuntu サーバ機両方に mp3 突っ込んであるのでプレイリストの同期とか面倒くさかったので。

それで今朝思いついて久しぶりに Python で書いていたのですが、何回やっても BeautifulSoup が Last.fm のページのパースに失敗するので、勉強も兼ねて Ruby で書いてみました。それで Ubuntu サーバで動かなかったりとかを直したり gem が重いのを待ってたりしてたら一日が終わりました。

対象は、Last.fm を使っていてちょくちょく love のボタン押す人で、同じ曲のライブラリで(ファイルの path は違ってもいけるはず) mt-daapd サーバを立てていて Ruby とか rubygems とか nokogiri とか sqlite3-ruby とかが使える人です。

使い方は、最初の user とか apikey (すぐ取れるので取得してください) とか プレイリストの path とか DB ファイルの path を環境に合うように書き換えて(パーミッションも変える必要あるかも)、上のスクリプトを last.rb として保存したとすると

# ruby last.rb all

ってすると loved tracks 全部がプレイリストになるはずなので、そのあとは crontab に

0 */3 * * * ruby /home/oquno/scripts/last.rb new > /dev/null 2&>1

とか書いとくと3時間おきとかに更新されるんじゃないかと思います。

2009/06/09 Tue

github(とrails)をようやくちょっといじった

githubステッカーこないので諦めていじりはじめた。そこそこできるくらいまではいじってみたいところですね。

2009/02/02 Mon

m.twitter.com から post しても mobile web って出ないようにするUserJS

Opera Mobileで使います

// ==UserScript==
// @name           twitter source to web
// @namespace      http://oquno.com/
// @include        http://m.twitter.com/home
// ==/UserScript==
document.getElementsByTagName('input')[0].value='web';

2009/01/06 Tue

UbuntuにRailsとかDjangoとかSymfonyとかいろいろぶっこむ

適当にやったので覚えてない。多分パッケージマネージャとかでできる。gitとか使えるようになって出先で万が一ネットつながらなくてもローカルで開発できるようにしたい。

2008/12/01 Mon

ImageMagickで透過ファイルをjpegとかにするときに透過色が黒くなる問題

kichikutterとかnocotterではPHP+ImageMagickで画像処理してるんですけど、透過ファイルからjpegに変換するときに透過色が黒くなる問題があって、白にしたかったのをなおせたっぽいので書いておく。バージョンはよく分からないけど古いかも。

サンプル
$icon = file_get_contents('http://s3.amazonaws.com/twitter_production/profile_images/65737920/oquno-c_bigger.png');
$image = new Imagick();
$image->readImageBlob($icon);
$image->thumbnailImage(48, 0);
$image->paintOpaqueImage(new ImagickPixel('rgba( 0, 0, 0, 0.0)'), new ImagickPixel('white'), 0);
$image->setImageFileName('/var/www/html/hoge/image/oquno_icon.jpg');
$image->writeImage();

ちなみに、なんか thumbnailImage の前に paintOpaqueImage やると黒くなったままになって、そこではまった。

1/2