Author Archive

    はてなブックマーク - Rails3 Arel ActiveRecord::Relation考察
    このエントリーをはてなブックマークに追加

    夏が過ぎ風あざみ。

    謎の首痛と腰痛、そして風邪に見舞われた8月でしたが、
    人にうつせば治るというもので、すっかりよくなった山本です。

    今日はRails3のコネタを。

    Arel

    Rails3では、O/RマッパーであるActiveRecordが進化を遂げ、「Arel」というライブラリを使用するようになりました。
    「Arel」については様々なサイトで解説が載ってますが、
    Rails2のfind系メソッドは、呼び出しの際にDBに対してSQLを発行していたのが、
    Rails3では、インスタンスは一旦、 ActiveRecordのサブクラスである、 Relationのオブジェクトとして格納されます。
    全部が全部ではないですが。

    例えば、Userモデルがあるとして、

    user = User.find(1)

    と、findを使ってデータを取得して、userの中身を見ると

    user.class
    => User(id: integer, email: string, .....created_at: datetime, updated_at: datetime)

    と、Userモデルのインスタンスになっていますが、

    user = User.where(:id => 1)

    と、whereを使うと、

    user.class
    => ActiveRecord::Relation

    となります。

    そしてこの時、SQLの処理は行われません。
    あくまで関係の定義が詰まっているだけ。

    この利点は、不要不急なSQL処理が走らないことですね。
    また、これこそが、whereを数珠つなぎにして条件を加える、メソッドチェーンの書き方ができるわけです。

    user = User.where(:id => 1)
    user = user.where("number  > 1")
    user = user.where("type  > 2")

    と書いて、3回もSQLが走ったら大変ですし。

    じゃあいつクエリが発行されるのかというと、
    実際に値を表示するときです。

    例えば、
    puts user

    user.all
    などと書いたときですね。

    本当に値が必要になったときに処理をしてくれるので、リソースの節約につながるのかなと。

    逆効果も

    ただ、使い方を誤ると逆に無駄にクエリを発行することにもなります。

    ある条件のデータの最大と最小を取り出したい、といった時、
    僕はこう書いてました。

    user = User.order("id ASC")
    user_min = user.first
    user_max = user.last

    rails2時代の感覚だと、1行目でレコードのデータが user に格納され、
    2行目と3行目では、ただの配列の操作を行ってデータを格納する処理ですが、
    実際には1行目では user にデータは格納されず、
    2行目と3行目でクエリが発行されてデータが格納されます。
    つまり、1回余分です。

    これじゃあ無駄なので、1行目を

    user = User.order("id ASC").all

    としました。

    こうすれば、1行目で user にデータが格納され、クエリ発行は1回です。

    時代はもうRails3.1

    まだ、Arelに馴染んでなかったといってしまえばそれまでですが、
    rails2の感覚でいると、いろいろ壁があるなーと実感しました。
    今やもう3.1ですし、次はcoffeescriptをやらないといけないかなと思ってます。
    上記は、あくまで自分の解ですが、他の解とか、そもそも論が何かあればツッコミのほどよろしくお願いします。

      はてなブックマーク - RubyKaigi2011に参加してきました
      このエントリーをはてなブックマークに追加

      山本です。
      海の日を含んだ3連休、みなさん、めいいっぱい楽しめたでしょうか。

      さて、私はというと、世のRubyistの祭典、「日本Ruby会議2011」に、河野と参加してきました。
      Rubyistとしての勉強のため、そして、ZENPREを使って、まつもとゆきひろさんのキーノートを配信するためです。

      初めてのRubyKaigi

      今年で最後となるRubyKaigiですが、参加は初めてです。
      ですので、どんな雰囲気なのか、どんな発表があるのか、全く想像がつきませんでした。
      いち地方都市から、不安を覚えながらのこのこと来てしまいました。

      発表の中身

      発表は「大ホール」と「小ホール」に別れ、
      前者はビックネームな方々の発表で、後者はコアデベロッパー向けの技術よりな話、という印象です。
      個人的には、よく使わせていただいている「jpmobile」の話を興味深く聞かせていただきました。

      闇RubyKaigi

      怪しげなタイトルですが、きっと参加者によっては、これがメインだと捉えている人もいるのでしょう。
      本編に登壇できなかった方達の、もしくは本編では発表できないような方達のためのLT大会がありました。
      この闇RubyKaigiでLT枠がもらえるかもしれない、とのことで、
      ZENPREを紹介すべく、お気楽に応募してみました。

      それが誤算でしてね。

      皆さんの発表の面白いこと。
      最初の基調講演を見て、あまりの自分の普通のスライドに焦りを覚えてしましました。
      私の順番は4番目だったのですが、前のお三方は全くすべらない。
      これはまずいと思いつつ、開き直ってやった結果、結構ウケてもらえました。
      ZENPREに興味を持たれた方もいたので、一安心でした。

      Matzのキーノート配信

      RubyKaigi最終日、最後のRubykaigiの最後の基調講演を務めるのは、まつもとゆきひろさんです。
      ZENPREでは、この模様を配信しました。
      タイトルは「三題噺: 振子とPGと百年の言語」と題して、
      振り子を例に挙げて、今後のプログラム業界がどういう道を進んでいくのかという話を中心に講演されました。
      私は、何回はまつもとさんの講演を見ているのですが、
      かなりリラックスして、活き活きとしている講演は初めてだったかなと思います。
      それだけ、この場このイベントを愛してらっしゃるということでしょうか。

      グランドフィナーレ


      最後はスタッフの方が全員壇上に上がり、グランドフィナーレです。
      これだけ大きいイベントを支えているのですから、責任もそれぞれ大きいことでしょう。
      スタンディングオベーションで拍手喝采です。

      謝辞

      ZENPREの配信にあたり、ご協力ご尽力いただきました皆様に、感謝いたします。
      本当にありがとうございました。

      まつもとさんの講演をいつでも

      まつもとさんの講演の模様は、ZENPREにて公開中です。
      見逃した方は、ぜひ一度以下のページからご覧ください。

      zenpre.net/p/rb11mz

        はてなブックマーク - Ustream Data APIの使い方
        このエントリーをはてなブックマークに追加

        ダーツの、Dartsliveのレーティングは9、PHOENIXのレーティングは12、の山本です。
        親にはゴルフをしろと言われてますが、休日は打ちっぱなしより投げっぱなしです。
        お父さん、すんません。

        さて、タイトルが、前の杉本によるエントリーと似ていてすみません。
        が、似て非なるもののご紹介です。

        Ustream Data APIは、Flash Client APIとは異なり、動画に関する情報やユーザーに関する情報がXML形式やJSONなど、計4種類の形式で受け取れますので、どんな言語にも組み込むことができます。PHP形式もありますので、PHPで組み込む場合はすごく親和性が高いのではないのでしょうか。

        API key の発行

        developer.ustream.tvから、開発者用のアカウントを作成する必要があります。
        登録するとAPI Keyが発行されます。

        ユーザー情報を取ってみる

        基本中の基本といえば、ユーザーの情報を取ってくることでしょうか。
        そのアドレスは以下のようになります。

        http://api.ustream.tv/xml/user/ya_ma23/getInfo?key=APIKEY

        ROOTのURL直下にある「xml」は、xml形式で返して表示することを示します。ここを、「json」「php」「html」のいずれかに変えることができます。

        「ya_ma23」に当たるところがユーザー名を指定します。
        そして、APIKEYの部分に、取得したAPIキーを入力します。

        これは私個人の情報になりますが、XML形式だとこんなふうに返ります。

        <xml>
          <results>
          <id>1134298</id>
          <userName>ya_ma23</userName>
          <registeredAt>2009-04-07</registeredAt>
          <url>http://www.ustream.tv/user/ya_ma23</url>
          <gender>male</gender>
          <website></website>
          <about></about>
          <imageUrl></imageUrl>
          <rating>0.000</rating>
          <numberOf>
            <comments>0</comments>
            <friends>1</friends>
          </numberOf>
          </results>
          <msg></msg>
          <error></error>
          <processTime>TRUE</processTime>
          <version>mashery-r10</version>
        </xml>

        テスト用アカウントのため、何とも寂しい情報しかありませんが、プロフィール情報等が取得できます。

        番組に関する情報を取得する

        番組に関する情報も取得できます。チャンネル自体の情報や、そのチャンネルの埋め込みタグや、投稿されたコメントなどを取得できます。
        ごく基本的な情報の取得のために「getInfo」メソッドがあります。

        http://api.ustream.tv/xml/channel/ya_ma/getInfo?key=APIKEY

        「ya_ma」の部分にチャンネル名を指定します。
        これで取得できる情報をここに書くとすんごく長くなってしまうので割愛しますが、
        このチャンネルを作ったユーザーや、ブラウザで見るためのURL、いつ作られたか、いつ配信されたか、視聴者数、埋め込みタグ、といった様々な情報が得られます。

        録画された全てのチャンネルを取得する

        Ustreamはライブ配信した映像を録画することができます。
        で、その録画したチャンネルのリストというものも、APIで取得できます。
        そのメソッドが「listAllVideos」です。

        http://api.ustream.tv/xml/channel/ya_ma/listAllVideos?key=APIKEY

        ZENPREでは、一度配信したプレゼンをあとでいつでも見れるようにする、同期録画機能を備えてますが、
        その設定画面にて、このAPIを使用しています。
        録画番組の一覧をAPIから取得し、ユーザーはただ選択するだけで済むように負担を軽減しています。

        おわり

        Ustreamは、Flash Client APIと合わせても、結構豊富にAPIを提供しています。
        ただ、そこまで普及していないのかな、という印象です。
        OAuthに対応して、Ustreamサイト以外からでも気軽に視聴や配信ができればなと思います。

        イベント、勉強会、セミナー、討論会、個人的に行なっている活動、など、多くの人に見てもらいたい活動を行うときに、
        テレビやラジオ、新聞等で宣伝するだけでなく、こういったネットでの配信も活用してほしいなあと、いち技術者は思う次第です。