Stellaqua - TOMの技術日記 このページをアンテナに追加 RSSフィード

2010年08月08日

[]Amazon EC2上のHadoopMeCabを使えるようにしてみた…い

最近すっかり"Webサービスを作ってみた"系の記事ばっかりでしたが、今回は久々にEC2上でのHadoopのお話。

以前の記事EC2上でHadoopを動かした時は、MeCabデフォルトで入っていなかったので、事前に自宅サーバ上で分かち書きしたデータを使っていました。

ただ、日本語処理するならMeCabはほぼ必須だろうし、せっかくならMeCabが使える状態でMapReduceしたいのが人情ってもんです。

という訳で、EC2上のHadoopを使って、MeCabを利用した日本語文章の単語カウントMapReduceに挑戦してみました。

基本的な方向性としては以下の通りです。

  1. EC2上でインスタンス起動。
  2. 起動したインスタンスMeCabインストール
  3. AMIとして保存。
  4. Hadoopを起動する時にこのAMIが使われるようにする。

で、実際にやってみた訳なんですが、結論から言うとうまくいきませんでした…。

AMIを保存して、そのAMIが使われるようにするところまではできたんですが、そのインスタンスログインできない状態になってしまって、実際にMeCabを利用したMapReduceを動かすところまでできていません。

という事で途中までではありますが、やってみた手順を書き残しておきたいと思います。

以下、"[local]$"がローカルのサーバ上、"[ec2]$"がEC2上でのプロンプトを表す事とします。

EC2上でHadoopを起動してログインする

まずはEC2上にインスタンスを1つ起動させてログインします。

[local]$ hadoop-ec2 launch-master hadoop-test 1
[local]$ scp -i stellaqua.id *.pem root@ec2-XXX-XXX-XXX-XXX.compute-1.amazonaws.com:/mnt
[local]$ hadoop-ec2 login hadoop-test

タイムゾーンを変更する

今回(というか毎度)参考にさせて頂いているid:rx7さんの記事によるとタイムゾーンの設定をしておいた方がよいとの事なので、ついでにここでタイムゾーンの変更をしておきます。

[ec2]$ cp /usr/share/zoneinfo/Japan /etc/localtime
cp: `/etc/localtime' を上書きしてもよろしいですか(yes/no)? y

MeCabインストールする

続いて本命のMeCabインストールします。

[ec2]$ yum -y update
[ec2]$ yum -y install mecab mecab-devel mecab-ipadic
[ec2]$ echo 'こんにちは' | mecab
こんにちは      感動詞,*,*,*,*,*,こんにちは,コンニチハ,コンニチワ
EOS

ちゃんとMeCabが使えるようになりましたね!

EC2root権限が与えられるので、yumで必要なものをガシガシ入れてしまうとよいですね。

AMIを作成してS3にアップロードする

AMI作成の手順については、毎度お世話になっているid:rx7さんの記事を参考にさせて頂きました。

Amazon EC2/S3を使ってみた - 3.EC2起動後〜AMI作成 - 元RX-7乗りの適当な日々

[ec2]$ cd /mnt/
[ec2]$ ec2-bundle-vol -d /mnt --privatekey pk-XXXX.pem --cert cert-XXXX.pem --user XXXX-XXXX-XXXX -p hadoop-0.17.0-i386 -r i386
[ec2]$ ec2-upload-bundle --bucket stellaqua/ec2_images/hadoop_mecab --manifest hadoop-0.17.0-i386.manifest.xml --access-key XXXX --secret-key XXXX
[ec2]$ exit
[local]$ hadoop-ec2 terminate-cluster hadoop-test
[local]$ ec2-register stellaqua/ec2_images/hadoop_mecab/hadoop-0.17.0-i386.manifest.xml
IMAGE   ami-XXXX
[local]$ vi hadoop-ec2-env.sh
→"S3_BUCKET=hadoop-ec2-images"となっているところを、上記で指定したバケットに変える

ポイントは、manifestファイルをHadoopのバージョンとアーキテクチャの名前を付けて保存する事と、設定ファイルでAMIを保存したバケットを設定しておく事ですね。

これで、hadoop-ec2コマンドでHadoopを起動する時に、登録したAMIが使われるようになるはずです。

早速、クラスタを起動してログインしてみます。

[local]$ hadoop-ec2 launch-cluster hadoop-test 1
[local]$ hadoop-ec2 login hadoop-test

これでログインできるはずなんですが、なぜかログインしに行ったままウンともスンとも言わない状態になってしまいます。

"Permission denied"とも言われないし、netstatで見るとESTABLISHEDにはなっているので、接続自体はできているとは思うのですが…。その後も色々試してはみたんですが、現時点でお手上げ状態になっています…。

また折を見て試してみて、うまくいったら記事にしようかなと思います。

2010年07月14日

[][]何となくどこかで聞いた事があるような気がする歌詞を自動生成するWebサービスを作ってみた

ちょっと捕捉できていなくて出遅れた感はあるんですが、何だか面白そうだったので乗っかってみました。

J-POPの歌詞における「何か」の探され率は異常 ニュース速報BIP

この中で34224のコメントがうまくまとまっていたので、そちらから拝借させてもらって、適当に並び替えて歌詞を生成するWebサービスを作ってみました。

どこかで聞いたような歌詞メーカー

今のところ、単語を適当にパラグラフにばらけさせてるだけな感じですが、それでもそれなりにそれっぽくなるのが面白いところですな。(笑)

ただ、もうちょっと工夫してみると、もっとそれっぽくなって面白くなりそうな感じもするので、もうちょいいじってみようかなと思っています。

ちなみに、ニコニコ動画でも、元のスレの歌詞を使って曲を作っちゃった動画が既に上がっているようで、こういう職人さんの才能はやっぱりスゴイなぁと思ってしまいます。

ニコニコラム‐J-POPの歌詞における「何か」の探され率は異常 のうた

歌詞が自動生成できるなら、曲も自動生成したくなるところなんですが…作曲の才能が無い私には荷が重過ぎる課題ですね。(^^; その辺りはどこかのエラい人がやってくれる事を願って…。

という訳で、ぜひ遊んでみて下さいね〜。

2010年06月22日

[][]ひらがなをTAS語画像に変換するWebサービスを作ってみた

何だかTAS語っていうのが面白そうだったので、画像変換のWebサービスを作ってみました。

TAS語ジェネレーター

TAS語については、以下の動画を見てもらうと分かって頂けるかと思います。

D

試しにという事で、「たすごじぇねれぇたぁ」だと以下のような感じに…。

f:id:stellaqua:20100622165755p:image

何ともカオスっぷりが素敵な感じです。(笑)

あいかわらず、いったい何の役に立つWebサービスなのか不明ではありますが、ぜひ遊んでみて下さいね〜。

2010年05月12日

[][]"オセロを1時間で作ってみた"の中の人がWEB+DB PRESSの特集の中の人と同一人物だった

以前、ニコニコ動画でプログラミング実況というのをやっている動画をご紹介しました。

1時間でオセロを作る動画が面白い - Stellaqua - TOMの技術日記

当ブログでは書かなかったんですが、その後、ITProさんでこの動画の事が取り上げられていて、作者さんのインタビューが載っているのを見つけて、「やっぱりすごい人だったんだなぁ。」とか、こっそり思ってたりしました。

「テトリスを1時間強で作ってみた」動画の投稿者にインタビュー──「プログラミングの楽しさ伝えたい」 | 日経 xTECH(クロステック)

これが昨年終わり頃のものなので、すっかり記憶から薄れていたんですが…先月発売のWEB+DB PRESS Vol.56をペラペラ眺めていたところ、何となく既視感が…。

特集2の"はじめの一歩が見えてくる プログラミング一部始終"という記事の雰囲気が何とも、ニコニコ動画でのプログラミング実況と似ている…と思っていたら、やっぱり同じ人が書いた記事でした!

紙面での記事なので、当然動画でのおしゃべり以上に、どんな事を考えながらプログラミングしているのかが分かって、非常に参考になりました。記事の中で、さらっと"砦の攻防"なんて単語が書かれているのを見て、私もベーマガで育った身として思わずニヤリとしてしまいました。(笑)

私自身、プログラマとしての原点はベーマガで、掲載されていたプログラムの写経→改造→自作というステップを踏む事で、"プログラミングがどういうものか"・"コンピュータがどういうものか"というのを学ぶ事ができたかなと思っています。

昨今は、ソースコードはダウンロードしてきて実行するだけのモノという感じだと思うので、プログラミング初心者の方が"写経→改造→自作"というステップを経験する事が少なくて、なかなかプログラミングの勘所みたいのを掴めないまま、プログラミングを好きになれない人が多かったりするんじゃないかなぁ…なんて勝手な想像をしていたりします。

そういう意味では、WEB+DB PRESSの記事で書かれているような、何でもいいからごく簡単なゲームを自分で作ってみるというのは、プログラミングを覚える上で非常に有効な手段なんじゃないかなと思います。

こういった記事や動画によって、プログラミングを楽しめる人がもっと増えるといいですね!(^-^)

2010年05月01日

[][]コメント投票機能・Twitter連携機能など付けてみました

BEAR連載のおかげで、できる事の幅も広がってきたので、今まで作ってきたWebサービスリニューアル大作戦の第一弾として、今北川柳をBEARベースに置き換えつつ、機能拡張してリニューアルしてみました。

追加した機能のご紹介

Twitter連携

作成された川柳を、@imakitasenryuでつぶやくようにしました。フォローしてもらうと、意味が分かりそうで分からない川柳がいっぱい流れてくると思います。(笑)

面白い川柳があったら返信またはRT(QT)してもらうと、その川柳への投票になります。コメント付きで返信・RTすると、ちゃんと投票コメントとして反映されるようになっています。

返信・RTする場合、以下のような書式でないと正しくコメントを抽出できない事があるので、ご注意下さい。

コメント投票機能

今まで川柳への投票は、はてなスターの機能を使っていたんですが、いかんせん敷居が高いのか全く投票に使ってもらえなかったので(^^;、自前で投票機能を実装しました。

「面白い!」と思ったら、"天晴+"ボタンを押すと、その川柳に投票する事ができます。また、"天晴+"ボタンの隣の吹き出しボタンを押してコメントフォームにコメントを入力してから投票すると、コメント付きで投票する事もできます。

コメント表示機能

川柳を色紙画像で表示する個別表示画面で、投票されたコメントを吹き出しで表示するようにしました。鬱陶しいと思ったら"コメントを非表示にする"のリンクをクリックすれば、表示を止める事ができます。表示設定はCookieに保存されるので、次回訪れた時も設定がそのまま引き継がれるようになっています。

APIの追加

ブログなんかで簡単に紹介してもらえるように、画像のAPIは前バージョンからあったのですが、今回、テキストベースのAPIも作ってみました。現在、以下のAPIが利用可能です。

画像取得API(URLを指定)
http://www.stellaqua.com/imakitasenryu/api/images.php?url={対象サイトのURL}[&size=small]
画像取得API(IDを指定)
http://www.stellaqua.com/imakitasenryu/api/images.php?id={川柳ID}[&size=small]
テキスト取得API(URLを指定)
http://www.stellaqua.com/imakitasenryu/api/texts.php?url={対象サイトのURL}[&format=(xml|json|jsonp&callback={コールバック関数})]
テキスト取得API(IDを指定)
http://www.stellaqua.com/imakitasenryu/api/texts.php?id={川柳ID}[&format=(xml|json|jsonp&callback={コールバック関数})]
コメント取得API
http://www.stellaqua.com/imakitasenryu/api/comments.php?id={川柳ID}[&format=(xml|json|jsonp&callback={コールバック関数})][&_start={表示ページ}]

テキスト取得APIのレスポンスは以下のような感じです。(XMLの場合)

<?xml version="1.0" encoding="utf-8"?>
<results>
    <senryu>
        <id>52e85875124208d7c40ff10d16d7bae0</id>
        <createdtime>2010-05-01T14:55:14+0900</createdtime>
        <sourceurl>http://news.google.co.jp/</sourceurl>
        <sourcetitle>Google ニュース</sourcetitle>
        <votecount>0</votecount>
        <commentcount>0</commentcount>
        <texts>
            <text1>出席し</text1>
            <text2>訴えている</text2>
            <text3>謝罪する</text3>
        </texts>
        <links>
            <imageurl>http://www.stellaqua.com/imakitasenryu/api/images.php?id=52e85875124208d7c40ff10d16d7bae0</imageurl>
            <entryurl>http://www.stellaqua.com/imakitasenryu/api/texts.php?id=52e85875124208d7c40ff10d16d7bae0</entryurl>
            <commenturl>http://www.stellaqua.com/imakitasenryu/api/comments.php?id=52e85875124208d7c40ff10d16d7bae0</commenturl>
            <tweeturl>http://www.twitter.com/imakitasenryu/status/13173910635</tweeturl>
        </links>
    </senryu>
</results>

コメント取得APIのレスポンスは以下のような感じです。(XMLの場合)

<?xml version="1.0" encoding="utf-8"?>
<results>
    <pager>
        <totalResults>1</totalResults>
        <startIndex>1</startIndex>
        <itemsPerPage>1</itemsPerPage>
        <firstpageurl></firstpageurl>
        <nextpageurl></nextpageurl>
        <prevpageurl></prevpageurl>
        <lastpageurl></lastpageurl>
    </pager>
    <comments>
        <comment>
            <id></id>
            <createdtime>2010-05-01T15:00:00+0900</createdtime>
            <targetid>52e85875124208d7c40ff10d16d7bae0</targetid>
            <body>コメントしてみたよ</body>
            <targeturl>http://www.stellaqua.com/imakitasenryu/api/texts.php?id=52e85875124208d7c40ff10d16d7bae0</targeturl>
            <via>http://www.stellaqua.com/imakitasenryu/api/texts.php?id=52e85875124208d7c40ff10d16d7bae0</via>
        </comment>
        <comment>
            :
        </comment>
            :
    </comments>
</results>

レスポンスコードは、200(OK)・400(呼び出し方の不正)・403(高負荷によるアクセス規制)・500(サーバエラー)のいずれかが返ってきます。

こんなAPIを公開したところで何かに使えるのかどうか全くもって不明ではありますが、まぁこれを使って何かを作ろうという奇特な方が現れた時の為に公開しておきます。(笑)

ちなみに、川柳を作成する対象URLを指定してアクセスした時に、対象サイトの内容のキャッシュが無い場合、レスポンスに数秒掛かる事があるのでご注意下さい。

その他こだわった点とか

細かい事なんですが、今回のリニューアルに伴ってタイトルからα表記を外して、ついでにfaviconも作ってみました。ドットを置いていくタイプのfavicon作成Webサービスで、5分くらいで作ったやっつけにしてはそれなりなモノができたので満足しています。

あと、コメントの表示は結構こだわってみました。ボワンと現れて、スーっと消えていく感じが結構気にいっています。最初はニコニコ動画風な流れるコメントにしようかとも思ったんですが、何か今や目新しさも無くなった感もあるし、あんまりやり過ぎても鬱陶しくなるだけかなと思って、今の形に落ち着きました。

この辺りのアニメーションと、Ajaxのデータのやり取りでjQueryをふんだんに使ってみたんですが、色々と勉強になりました。Webサービスにちょっとした彩りを添えるのにはjQueryは使い易くって非常に良いですね。

それから、川柳の元になる単語を拾ってくる時に、数字の読みをきちんと行うようにしてみました。

MeCabで普通に数字を読ませると一桁ずつでしか読んでくれないので、"123"を"イチニサン"と読んでしまうんですが、こういうのをちゃんと"ヒャクニジュウサン"と読めるように、自前で専用のクラスを作って変換をするようにしてみました。これで、数字を含む単語でもそれなりに抽出できるようになったのではないかと思います。

その他困った点とか

TwitterのOAuth対応は以前に試した事があったので、そこでの苦労はあまり無かったんですが、RTを取り込んで投票に反映させる機能が大変でした…。

以下、ハマりどころ…。

  • 公式RTは、自分のつぶやきの内のどのつぶやきがRTされたかは分かるけど、誰からRTされたのかはAPIで取得できない…。(仕方がないので、公式RTを投票に使うのは諦めた。)
  • 非公式RTだと書式が決まってないから、コメント部分だけ抜き出そうとすると、どうするのがベストか分からない…。(仕方がないので、最初に出てきた"RT"より前の部分をコメントと決め打ちしちゃう事にした。)
  • 非公式RTだと、どのつぶやきに対する返信か分からないから、どの川柳に対する投票なのか特定できない…。(仕方がないので、元のつぶやきに含ませてあるURLから川柳のIDを取得する事にした。)
  • 非公式RTで元のつぶやきのURLを短縮URLにしないで入れてもらおうとすると、コメントに使える文字数が少なくなってしまう…。(仕方がないので、短縮URLの場合は展開してからIDを取得する実装を入れた。)

Twitterも今やインフラとしての利用価値が大きいから、できるだけTwitterからもWebサービスに参加できる間口は広げたいんですが、自由度が高過ぎる故に、Webサービスとして欲しい情報を拾ってこようと思うと妥協しなきゃいけない部分が多くて悶々としますな…。

Twitter連携は突っ込むと泥沼にハマりそうな感もあるので、そこそこの線で妥協しときたいと思います…。


そんな訳で、色々と機能追加してより遊べるようになったかと思うので、「これからも 今北川柳 よろしくね♪」(一句)

*1:"RT"or"QT"が1回("RT:"とかコロン付きでもOK)、コメントが"RT"or"QT"より前にある、元のつぶやきの中のURLが含まれる(短縮URLでもOK)、という条件を満たしていれば大丈夫なはずです。