Author Archive

    はてなブックマーク - Google Base Data APIで商品検索
    このエントリーをはてなブックマークに追加

    Fusic 平田です。
    1回くらいはさっさと当たれーとか思ってたら、ここまで引っ張りました。

    前提

    本題の前に。
    数日前に弊社の化学系新卒君が書いたAmazon APIの記事
    これとの繋がりが微妙にあるような話です。

    要は商品検索をいろいろ調べたり調べてもらったりしていたのです。
    Amazonだと多種多様の商品調べられてすごく便利、なんですが。
    1時間で2000アクセス~だと、あまり思い切ってリクエスト投げられない。
    # amazletでも最近引っかかっていましたし。
    てことでGoogle先生に頼ってみたところ、思いのほかいい感じだったのでご紹介。

    Google Base Data API

    Google Product Searchと言えばピンと来る人もいるでしょうか。
    旧Froogleだったりしながら未だにbetaなのですが。
    このデータ群を検索するためのAPIがGoogle Base Data APIです。
    # 商品に限らずいろいろ検索できます。

    とりあえず使ってみる

    # 以下のリンクはIEやFirefoxで開くとより分かりやすいです。
    仕組みは単純で、クエリを投げたら結果がFeedで返ってきます。
    例えば「モンスターハンターポータブル」で検索してみると
    www.google.com/base/feeds/snippets/?bq=モンスターハンターポータブル
    こんな感じです。

    突っ込んだ使い方

    bq=で渡す値をいろいろ変えることで、いろいろ検索できます。

    例えば中古品だけを探したい場合。
    スペース空けて後ろに[condition:used]を追加すればOK。
    「モンスターハンターポータブル」を中古のみ検索

    値段で絞りたい場合は[price >= 2000 JPY]とか付ければいいです。
    「モンスターハンターポータブル」を2000円以上で検索

    これらは組み合わせて使えるので[condition:new][isbn][price <= 1000 JPY]とか後ろに付ければ
    「デジタルカメラで新品でISBNコード持って(書籍かCDあたり)て1000円以内」
    とかもできます。

    更に値段でソートしたければ後ろにorderbyとsortorderを渡せばいいです。
    「更に値段の昇順でソートした結果」

    プログラムで取ってくる

    単にリクエスト投げてFeedを受け取るだけなので、割と簡単です。
    例えば引数でクエリの値を渡すようなプログラムだとこんな感じになります。

    #!/usr/bin/env perl
    use warnings;
    use strict;
    use Furl;
    use XML::Feed;
    use URI::Escape;
     
    if (@ARGV != 1) {
        die 'Usage: perl /path/to/snippet.pl [bq parameter]';
    }
     
    # 引数を受け取る
    my $query = shift;
     
    # Furl初期化
    my $furl = Furl->new(
        agent => 'Sample script for Google Base Data API',
        timeout => 10,
    );
     
    # リクエスト送信
    my $request_url = 'http://www.google.com/base/feeds/snippets/';
    my $res = $furl->get($request_url . '?bq=' . uri_escape($query));
     
    # レスポンスのXMLをパース
    my $feed = XML::Feed->parse(\$res->content);
     
    # SnippetのURLとタイトルを表示
    foreach my $entry ( $feed->entries ) {
        my $snippet_url = $entry->id;
        my $title = $entry->title;
        print "$snippet_url : $title \n";
    }
     
    exit;

    で、実行すると

    debility@xebius:~/works$ perl ./snippet.pl "デジタルカメラ [condition:new][isbn][price <= 1000 JPY]"
    http://www.google.com/base/feeds/snippets/9861142365767353685 : 55才から楽しむデジタルカメラで写真工房 Windows XP版 お父さんお母さんのための 押すだけ撮影から卒業・デジカメで思い出を残そう
    http://www.google.com/base/feeds/snippets/8908453582924256996 : デジタルカメラとパソコンを合わせて使える本
    http://www.google.com/base/feeds/snippets/12581094022531619238 : デジタルカメラ批判序説 あるいは、デジタルカメラで写真は撮れない
    http://www.google.com/base/feeds/snippets/1086636419406988656 : FMVでもっと楽しむデジタルカメラ わかりやすい図解入り
    http://www.google.com/base/feeds/snippets/13607998448764488416 : デジタルカメラ進化論
    http://www.google.com/base/feeds/snippets/10565006307493625118 : デジタルカメラで「趣味」を撮ってらくらく印刷
    http://www.google.com/base/feeds/snippets/13954829398014624305 : 大人のためのはじめてのデジタルカメラ 賢い選び方と快適活用術
    http://www.google.com/base/feeds/snippets/16925320360818721412 : デジタルカメラエクスプレス Vol.1
    http://www.google.com/base/feeds/snippets/13769101776078837942 : デジタルカメラエクスプレス Vol.2
    http://www.google.com/base/feeds/snippets/11531105340749645450 : デジタルカメラLabs Vol.1
    http://www.google.com/base/feeds/snippets/16563827664371922494 : いっきにわかるデジタルカメラの買い方・使い方―あなたのパソコンライフをいっきにひろげるデジタルカメラのすべて
    http://www.google.com/base/feeds/snippets/15904047532666634991 : 今日から上達デジタルカメラスーパー活用!
    http://www.google.com/base/feeds/snippets/8964847794878919955 : デジタルカメラ選び方・撮り方・楽しみ方 最新43機種の○と×がイッキにわかる!
    http://www.google.com/base/feeds/snippets/7419790109938360232 : デジタルカメラマガジン No.4
    http://www.google.com/base/feeds/snippets/6668800394078123731 : Best GearデジタルカメラSpecial ミラーレス一眼の真価キャッチせよ!激変のコンデジ
    http://www.google.com/base/feeds/snippets/5458330732187518314 : デジタルカメラマガジン Vol.16
    http://www.google.com/base/feeds/snippets/3282137698886167565 : デジタルカメラを始めよう
    http://www.google.com/base/feeds/snippets/16178408780302372761 : こんなに簡単デジタルカメラ徹底活用術 撮影・プリント・レタッチ・Web・デジカメの基本がよくわかる!すぐできる!
    http://www.google.com/base/feeds/snippets/15687552409826306759 : 55歳から楽しむデジタルカメラで写真三昧
    http://www.google.com/base/feeds/snippets/15331179909448343256 : デジタルカメラを始めよう
    http://www.google.com/base/feeds/snippets/6890264039679668486 : こんなに簡単デジタルカメラ&デジカメ写真のためのパソコン活用術 日本でいちばんやさしく丁寧な解説本
    http://www.google.com/base/feeds/snippets/6673485326686974641 : デジタルカメラを始めよう―For Windows & Macintosh (2002年版)
    http://www.google.com/base/feeds/snippets/5869285652009149385 : デジタルカメラを始めよう (2003年)
    http://www.google.com/base/feeds/snippets/3661117677961004259 : 中高年のための最新デジタルカメラ使いこなし術
    http://www.google.com/base/feeds/snippets/12355831548414530192 : 超図解ビギナーズデジカメ

    てな具合です。
    他の言語でも実装は非常に簡単でしょう。

    制限

    リクエスト制限については
    code.google.com/apis/base/faq.html#Limits

    > The Google Base data API supports up to approximately 5 queries per second, per user.

    てことで秒間5クエリくらいまでOKなので、だいぶ思い切って投げられます。多い日も安s

    てことで

    次の方にバトンタッチ。

      はてなブックマーク - NIFTY Cloudのベンチマークをいろいろ比較
      このエントリーをはてなブックマークに追加

      Fusic 平田です。

      先日のPHP Matsuriで弊社社員がNIFTY Cloud無料利用券を持ち帰ってきました
      というわけで、ベンチマーク取っていろいろ比較。

      各プランの比較

      mini/small(1GB Mem)/medium(2GB Mem)/large(4GB Mem)でそれぞれベンチマークを取ってみました。
      UnixBench 5.1.2を使用して、

      # yum -y install gcc
      # wget http://byte-unixbench.googlecode.com/files/unixbench-5.1.2.tar.gz
      # tar zxf unixbench-5.1.2.tar.gz
      # cd unixbench-5.1.2
      # vim Makefile
      ※ GRAPHIC_TESTSとGL_LIBSをコメントアウト
      # make
      # ./Run

      ってな感じで取ってます。

      で、Index Scoreだけを書くとこんな結果になりました。
      mini 1CPU: 665.4
      small 1CPU: 1875.8
      medium 1CPU: 1844.8
      large 1CPU: 1720.5
      medium 2CPU: 2380.3
      large 2CPU: 3672.6
      グラフにするとこんな感じ(クリックで拡大)。

      1CPUの場合、small以上だとだいたい同じ結果になりました。
      スペック変えた分だけ素直に出てるな、といった印象1 です。

      手元との比較(仮想マシン同士)

      2vCPU/2GBメモリ同士の比較ということで、以前手元で組んだ仮想環境と比較します。
      比較対象は
      1. VMWare ESXi
      2. KVM on Redhat 5.4(qcow2)2
      で設定をいじらずに組んだ結果との比較です。
      Index Scoreがそれぞれ
      VMWare 1CPU: 838.0
      KVM 1CPU: 700.0
      medium 1CPU: 1844.8
      VMWare 2CPU: 1299.6
      KVM 2CPU: 1285.6
      medium 2CPU: 2380.3
      で、グラフだとこんな感じ(クリックで拡大)。


      載せてるマシンの性能差だったり設定差だったりするんでしょうが、スコア差がかなり大きいので驚きました。

      手元との比較(実機と比較)

      検証機(この辺でも使っているPowerEdge T105)が4CPU/4GBメモリだなと思い、これもlargeと比較してみました。
      # とっさに思いついたため、OSがUbuntu 10.04だったりします。


      これまた思った以上に差をつけられました。

      おまけ:さくらVPSと並べてみる

      さくらインターネットの田中社長がさくらVPSのunixbench結果を公開されていたので、これとも比較してみました。
      互いのサービス提供のスタイルから違うので一概に比較できるものでもないんですが、まあ参考程度にってことでとりあえずmini/smallと並べてみることに。
      ちなみにさくらのIndex Scoreは
      1CPU: 1157.7
      4CPU: 1540.6
      となってます。これまた優秀なスコア。

      まとめ

      NIFTY Cloudのスコアはさすがに優秀ですね。
      VPSじゃ足りない、なんて時には選択肢の一つとして十分ありなのかなーと思いました。
      構成もある程度柔軟にできますし。
      コントロールパネルも、特に使いにくい箇所はなかったです。

      miniより下があればもっと手軽に使えるのになーといった個人的な希望もありますが、まあそこは棲み分けみたいなものかなとも思っています。

      CM

      株式会社Fusicでは、エンジニアを積極的に募集中です。
      気が付いたら社員が賞を取ってきたり無料サービス券を獲得してくれたりする(こともある)Fusicで働いてみたい方は、こちらからエントリーをお願いします。

      1. Pipe-based Context Switchingの値がなぜかCPU数に反比例してますが。。。 []
      2. qcow2よりLVM割り当てたほうが良い結果出せていましたね。。。 []
        はてなブックマーク - LinuxでUSB外付けHDDを追加 – USBハブ使って倍プッシュ編
        このエントリーをはてなブックマークに追加

        Fusic 平田です。
        とあるお客様のところにLinuxのサーバを納入しているのですが、今回はそのお話を。
        # 倍プッシュ編しかありませんので、そこはご容赦ください。

        このサーバ、普段はファイルサーバとして活用しているものです。
        で、今回別途USBの外付けHDDを2台追加することになりました。
        用途はSambaでアクセスできればいいよーだったのですが、問題がひとつ。
        他にも外付けHDDなどなど挿したりしてて、USBポートに余裕がないと。

        で、USBハブあるよーとのことなので挿してみました。
        さっくり動いてmountできたのでおー動く、と思ったのもつかの間。
        数分たったりUSBハブに他の機器を挿したりした瞬間に動かなくなりました。
        /var/log/messagesを見ると、以下のIO Errorがずらり。

        scsi 9:0:0:0 rejecting I/O to dead device

        これを解消すべく、以下の手順でいろいろやってみました。

        0. 前提

        サーバマシン: Linux(CentOS 5.3)の2Uサーバ
        元からあったUSB外付けHDD: 1台(IO-DATA)
        今回増やすUSB外付けHDD: 2台(IO-DATA)
        問題: USBポートが既にいっぱいいっぱい
        目標: 正常に動かす
        目標2: さらに増やす時に手間がかからないようにする

        1. /dev/***の部分を各HDDで固定する

        現象を見ていると、/dev/sd*の部分がころころ変わるようで。
        と言うか/dev/sd*の部分はudevで勝手に割り当てるので、再起動時なんかに変わってしまう可能性が大。
        これをまずは固定しようということでいろいろ調べたところ、↓を発見。
        fredericiana.com/2006/03/15/writing-udev-rules-short-notes/
        要はudevのruleを作成して、デバイスファイルを固定しようってことです。
        というわけでudevルールの書き方を読んでみると、

        > ユーザ指定のルールは、基本の/devレイアウトを作成するudevの初期設定を、事実上無効にしてしまいます。したがって、ユーザが記述するルールには、実用的である初期設定の名前とユーザ指定の名前両方を得るために、devfs形式の名前やシンボリックリンクも指定することをお勧めします。

        とあったので、/etc/udev/rules.d/98-local.rulesとして以下の内容のファイルを作成。

        BUS=="usb", KERNEL=="sd*", SYSFS{serial}="0010100740AABBCC", NAME="%k", SYMLINK="usbhda\n"
        BUS=="usb", KERNEL=="sd*", SYSFS{serial}="0010100740DDEEFF", NAME="%k", SYMLINK="usbhdb\n"
        BUS=="usb", KERNEL=="sd*", SYSFS{serial}="0010100740ABCDEF", NAME="%k", SYMLINK="usbhdc\n"

        # SYMLINKの値はこちらで決めていいので、”usbhd/****”とかにして別途まとめる形でもいいです。
        serialの調べ方ですが、1つずつ挿して/dev/sdbなりで認識されているのを確認した後に

        udevinfo -a -p $(udevinfo -q path -n /dev/sdb)

        と実行すると

        # udevinfo -a -p $(udevinfo -q path -n /dev/sdb)
         
        Udevinfo starts with the device specified by the devpath and then
        walks up the chain of parent devices. It prints for every device
        found, all possible attributes in the udev rules key format.
        A rule to match, can be composed by the attributes of the device
        and the attributes from one single parent device.
         
          looking at device '/block/sdb':
            KERNEL=="sdb"
            SUBSYSTEM=="block"
        ----- (中略) -----
          looking at parent device '/devices/pci0000:00/0000:00:03.1/usb3/3-1/3-1.4':
            ID=="3-1.4"
            BUS=="usb"
            DRIVER=="usb"
            SYSFS{configuration}==""
            SYSFS{serial}=="0010100740AABBCC"
        ----- (後略) -----

        てな感じでずらずら出てくる中から読み取れます。

        ruleを保存した後に再度挿すと、こんな感じになります。

        # ls -l /dev/usbhd*
        lrwxrwxrwx 1 root root 3  8月 20 17:57 /dev/usbhda -> sdb
        lrwxrwxrwx 1 root root 4  8月 20 17:57 /dev/usbhda1 -> sdb1

        複数台挿して/dev/sd*の順序がずれても、

        # ls -l /dev/usbhd*
        lrwxrwxrwx 1 root root 3  8月 20 17:57 /dev/usbhda -> sdb
        lrwxrwxrwx 1 root root 4  8月 20 17:57 /dev/usbhda1 -> sdb1
        lrwxrwxrwx 1 root root 3  8月 20 18:06 /dev/usbhdb -> sdd
        lrwxrwxrwx 1 root root 4  8月 20 18:06 /dev/usbhdb1 -> sdd1
        lrwxrwxrwx 1 root root 3  8月 20 18:05 /dev/usbhdc -> sdc
        lrwxrwxrwx 1 root root 4  8月 20 18:05 /dev/usbhdc1 -> sdc1

        といった感じできちんとアクセスできます。

        2. USBハブを変える

        使用したハブがそこそこ古いものだったので、外付けHDDを複数台挿すと途端に動かなくなります。
        デバイスファイルの問題は解決しているので、あとは単純にUSBハブの供給電流とかの問題だろうなと。
        # あとusb2.0に対応してなさそうだな、とか。
        # 型番を必死に調べたのですが、外観以外の情報がないので絞り込めませんでした。。。
        というわけで今回使用したのはこちら。
        ELECOM U2H-GM002BK
        PS3用じゃないか!とツッコミをいただいたりもしたのですが。
        > セルフパワー時/7ポート合計3500mA以内
        が非常に強力なので、これにしました。
        # 4ポートのELECOM U2H-TAP3420Sもあったのですが、口に余裕があったほうが困らないので今回は却下。
        # 7ポートのほうはマグネットが付いてたりするので、そういうの困るなって場合は後者がいいと思われます。

        というわけで設置、USBハブ電源スイッチオン、USB外付けHDDをざくざく挿入。
        きっちり稼働して万々歳です。
        以降定期的にちょこちょこ覗いてますが、特に問題も発生していないようです。

        同様の事象で困る例は非常に少ないと思いますが、備忘録がてらということでひとつ。
        何か後日談なんかが出てきた場合は、またこちらで紹介させていただきます。
        まあ後日談=十中八九トラブルなので、なるべく書かなくて済むことを祈りますが。。。