classics.

2011/02/07 Monflickr

Ruby で ID3 Tag取得

リモートでサーバーの音楽流して(音はサーバーから出したい)Last.fmにscrobbleなりするのにID3タグの処理とかしなきゃいけない感じになったので、Python は2系統でやって文字コードのトラウマがあるのでRubyやってみた。

fairtilizer/ruby-taglib2 - GitHub これを入れたのだけれど、mt-daapdで文字化けしないmp3に関しては文字コード的にも問題なく読み取りできた。 適当に読み取ってみる。
require 'rubygems'
require 'taglib2'

tag = TagLib2::File.new(ARGV[0])
puts tag.title
puts tag.artist
$ ruby id3.rb ./shintou.mp3
浸透
Anemone
あとはWebから操作するインターフェース作ったり、Last.fmのAPI使ってscrobbleなりnow playingなり更新したり、スピーカーつなげたりすればできそうな感じ。

2010/11/22 Monflickr

zip2mobi 作った

http://oquno.com/log/eid2367.html の続き
昨日楽に作れそうなコードを見つけたので作って、自宅ライブラリのzipからKindleだけで落とせるようになったので一応公開しておきます。動けばいいかなという感じなのでコードは適当です。

大体の処理はzip2epubを使う https://gist.github.com/356303
それにkindlegenを組み合わせて、文字コードがなんか上手くいないのを無理矢理消したり、書籍名設定したりrmagickで横長画像を270°回転させたりちょくちょくいじったのが zip2mobi です。 https://gist.github.com/709699
なので、epubも一緒に作成される。使う場合は作成されるパスとか適当に弄ってみてください。

自分の環境では、apacheのmod_autoindexのHeaderNameで設定したファイルにzipへのリンクにmobiを作成するリンクも付けるJavaScriptを書いて、そのリンクを踏むとCGI経由でTask Spoolerにzip2mobiの処理を投げて、だいたい2分くらいでmobiができる感じです。出来上がったmobiは今のところ特に問題ない感じです。

autoindex

そんなわけで、Kindle買いましょう

2010/11/11 Thuflickr

goo 歌詞情報が歌詞の表示に canvas 使うようになって汚いし不便なので直した

なぜかjson/jsonpのAPIで歌詞データは自由に取れるので対応しやすい。
Firefox Greasemonkey : betterlyric.user.js
Opera UserJS : betterlyric.user.js

でもこの変更でクローキングでもしない限り歌詞の内容で検索に引っかかりにくくなってあれなんじゃないですかね.

2010/11/23 追記

なんか仕様が変わっていたので直した

2011/2/20 追記

Firefoxの方修正。
Operaは11.01だと元から表示されないので諦め。

2010/10/30 Satflickr

連番画像から .mobi への変換をUnixでしたい

自宅サーバーからKindle本体で落とすのはmobiとかしかできななくて、今は必要な際にはWindowsのデスクトップマシンでChainLPを使って作成していて、結構GUIで時間がかかる感じなので、ここはひとつサーバーサイドでなんとかしたい。

http://oquno.com/log/eid2361.html
これと組み合わせてうまくやれば落としたい時に変換するとかもできそうだし(Kindleのブラウザから変換するファイルを選ぶUIは別に必要そうだけど)。

で、さすがに広い世界だからzip2mobiとかimg2mobiとか作って公開してる人いるだろうと思って探してみたのだけれどいないようなので、自作するしかない様子。まあ閲覧ならzipの方がいいしファイルサイズも無駄に大きくならないのでわざわざmobiにすることはないのですが。

処理内容としては、

  1. % zip2mobi misawa.zip
  2. zip展開
  3. 展開した中にある画像ファイルを再帰的に取得、ファイル名でソート
  4. kindlegen用のhtmlとかなにやら作る
  5. kindlegenに投げる
  6. misawa.mobi 完成

みたいな感じですかね。4がめんどそうなのでまだ手をつけてないのだけど、できたら公開するのでその前に他の人が作って公開してくれるといいと思います。

このへん参考にする

あと、Kindle持ってない人は買いましょう
</a>

2010/09/16 Thuflickr

Ruby で User Streams の OAuth + https 対応

そろそろ User Streams の Basic 認証打ち切ったり https 限定にしたりするぞとかいうアナウンスが出てたりしていて、じゃあ OAuth に移行するかということで今更やってみた。

EventMachine だとか gem のアレとかアレとかあるのだけれど、なんか EventMachine でやったら数分でエラーも吐かずに流れなくなったり、その他の使える雰囲気を醸し出していた gem 達もうまく起動しなかったので、自分の解決策を書いておく。あと mongodb にそのまま入れるからjson そのまま欲しいというのもある。

まずこれの each_line メソッドを、User Streams を利用するコードに追加しておく。これはBasic認証の頃からのコード使い回し。

あと OAuth gem は入れておく。sudo gem install oauth とかそんな感じで。そしてそれに ruby-oauth にブロックを渡せるようにする - EAGLE 雑記 のパッチ適用。最後に、自分の環境だけなのかもしれないけれど、URL を https にしたらエラー吐いたので、oauth-0.4.3だとlib/oauth/client.rb 319行目あたりの OpenSSL::SSL::VERIFY_PEER を OpenSSL::SSL::VERIFY_NONE にした。

で、User Streams接続部分はこんな感じになった。いまのところ目立った不具合はないので多分大丈夫だろう。


consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, :site => 'http://twitter.com')
access_token = OAuth::AccessToken.new(consumer, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
access_token.get(USER_STREAMS_URL) do |response|
    if response.code == '200'
        response.each_line("\r\n") do |line|
            status = JSON.parse(line) rescue next
            Thread.start(status){|s|
                shori(s)
            }
        end
    end
end

2010/06/24 Thuflickr

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 Wedflickr

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
$ cd mecab-ruby-0.98
$ gem build mecab-ruby.gemspec
$ sudo gem install mecab-ruby-0.97.gem

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

2010/03/07 Sunflickr

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 Monflickr

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 Wedflickr

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

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

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

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