Posts Tagged ‘fac2010’

{ 2010.12.4 }

rails 日付TIPS

    はてなブックマーク - rails 日付TIPS
    このエントリーをはてなブックマークに追加

    昨日まで続いた師走の嵐から一変、ど晴天の休日の今日、皆様いかがお過ごしでしょうか。

    昨日エントリーを書きました安元の結婚式である本日も、Advent Calendarのバトンを引き継いでおります。
    休日なので、軽めのtipsを書かせていただきます。

    皆さんは日付を和暦で表示する時、どのような処理をしているでしょうか。
    日付なんてDBに入ってる値を、多少整形する形で済めばいいのですが、案件によっては和暦表示にせざるを得ないことは、往々にしてあるかと思います。
    私がメインで扱っているruby(rails)では、和暦表示用のプラグインがあるので、それを導入すれば済むのですが、
    それを知らずに自前で作っていた時は以下のようにメソッドを作ってました。

    def get_wm_y(ymd)
        return "" if ymd.blank? 
        case ymd.year
          when 0..1925
            return "#{ymd.year}年"
         when 1868..1911
             return '明治' + "#{ymd.year - 1867}年"
          when 1912..1925
             return '大正' + "#{ymd.year - 1911}年"
          when 1926..1988 
             return '昭和' + "#{ymd.year - 1925}年"
          else 
            return '平成' + "#{ymd.year - 1988}年"
        end
      end

    とても泥臭い感じはしますが、和暦計算の法則に則ったかたちになります。
    ひとつ難点は、「元年」表示ができないことですが、これも条件分岐で処理すればいいでしょう。

    日付に関してもう一つ。
    これは日本特有かもしれませんが、「年度」という概念があります。
    2010年1月は、2009年度扱いにしないといけないわけですが、これは以下のようにしてます。

    def get_nend_y(ymd)
        return "" if ymd.blank?
        case ymd.month
        when 1..3
          (ymd.year - 1).to_s
        else
          ymd.year.to_s
        end
      end

    これはすごくシンプルですかね。

    大したことは書いてませんが、ちょっとしたtipsとしてお役に立てればと思います。
    あと、こうしたほうがいいというのがあれば、ぜひご意見お寄せください。

    では、めでたき結婚式に行って参ります。

      はてなブックマーク - Postgres generate_series関数によるデータの生成
      このエントリーをはてなブックマークに追加

      はじめましてこんにちは、明日(12/4)結婚式の安元です。

      弊社期待の新人の活躍によりクジを引き当て、

      結婚式の前日にAdvent Calendar2010に寄稿することになりました。

      明日の結婚式でいきなりスピーチさせてやろうかと思います。。。。

      というわけで、本日はPostgres generate_series関数のご紹介です。

      集合を返す関数 generate_seriesについて

      さて、Postgres8系からgenerate_seriesという関数が使えるようになっております。
      何をする関数か。以下をごらんいただければ一目瞭然

      
      SELECT * FROM generate_series(1,5);
      
       generate_series
      -----------------
                     1
                     2
                     3
                     4
                     5
      (5 rows)
      


      このように連番を生成してくれます。

      第3引数を渡すことで、刻み(増分値)の変更も出来ます

      
       SELECT * FROM generate_series(1,10,2);
       generate_series
      -----------------
                     1
                     3
                     5
                     7
                     9
      

      日付計算を行うことで、カレンダーも生成出来ます

      
      SELECT
          date('2010-12-1') + a::int as day
      FROM
          generate_series(0,5) as a
          day
      ------------
       2010-12-01
       2010-12-02
       2010-12-03
       2010-12-04
       2010-12-05
       2010-12-06
      (6 rows)
      

      generate_seriesを利用した集計

      さて、「連番が作れるのはわかった。それの何がうれしいの?」 という方もいらっしゃるかと思います。
      DBは、データの集計は得意ですが、そこに存在しないデータは集計することは出来ません。
      しかし、generate_seriesを利用すし、集計のキーとなる値を生成することで、「0」という集計を行えるのです。

      以下のようなデータを日付ごとに合計します

      
       id |    days    | customer
      ----+------------+----------
        1 | 2010-12-01 |       10
        2 | 2010-12-01 |       15
        3 | 2010-12-03 |       14
        4 | 2010-12-03 |       13
        5 | 2010-12-03 |        8
        6 | 2010-12-04 |       12
      
      (5 rows)
      
      SELECT days , sum(customer) FROM customer GROUP BY days ORDER BY days;
          days    | sum
      ------------+-----
       2010-12-01 |  25
       2010-12-03 |  35
       2010-12-04 |  12
      (3 rows)
      

      GROUP BYを使うとそこに存在する日付だけが集計情報として表示されます。

      generate_seriesを使ってみましょう。

      
      SELECT
      
      	generate.days,
      	sum(customer) 
      FROM 
      (
      	SELECT
      		date('2010-12-1') + a::int as days
      	FROM
      		generate_series(0,4) as a
      ) as generate
      LEFT OUTER JOIN
      	customer 
      ON ( generate.days = customer.days)
      GROUP BY generate.days 
      ORDER BY generate.days;
      
      
          days    | sum
      ------------+-----
       2010-12-01 |  25
       2010-12-02 |
       2010-12-03 |  35
       2010-12-04 |  12
       2010-12-05 |
      (5 rows)
      
      

      このままでは、「0」がとれませんのでcoalesce関数でもう一工夫

      
      SELECT
      
      	generate.days,
      	coalesce(sum(customer) ,0) --←変更してのはココ
      FROM 
      (
      	SELECT
      		date('2010-12-1') + a::int as days
      	FROM
      		generate_series(0,4) as a
      ) as generate
      LEFT OUTER JOIN
      	customer 
      ON ( generate.days = customer.days)
      GROUP BY generate.days 
      ORDER BY generate.days;
      
      
          days    | sum
      ------------+-----
       2010-12-01 |  25
       2010-12-02 |  0
       2010-12-03 |  35
       2010-12-04 |  12
       2010-12-05 |  0
      (5 rows)
      

      これで日付ごとの集計がそろいました。

      プログラムで、IF分岐でも出来る処理ですが、ビジネスロジックが複雑な場合など
      集計処理の一環として「存在しないデータを作る」とコードがすっきりすることもありますよ。

        はてなブックマーク - Twitterの検索をやってみました
        このエントリーをはてなブックマークに追加

         こんにちは。あるいはこんばんは。もしかして:おはようございます。

         Fusic仁井と申します。
         Fusic Advent Calendarの二番手になりました。二番手と聞くと緑の弟を思い出します。

         さて何を書こうかと思ったのですが時間もないことですし最近やったことについてまとめてみたいと思います。
         タイトルのとおり、Twitterの検索です。

        Twitter の検索

         というかそもそもTwitterの検索とは何ぞ、という方のために説明を。
         search.twitter.com/
         ここです。というだけではやっぱり不親切ですので。
         ページをご覧いただければわかるかとは思いますが、上記ページではTwitterに投稿されたつぶやきの検索ができます。私はコレを使いハッシュタグの検索などしておりました。
         このページ、単純にブラウジングで参照するだけでなく、json形式で検索結果を受け取ることができるのです。
         まあ素敵。
         というわけで、今回はその簡単な使い方と注意点などについて、軽くまとめさせていただきます。

        検索結果をPHPでjsonで受け取る

         というわけで早速始めますが、いきなり終わらせたいと思います。

        search.twitter.com/search.json?q=[検索したい文字列]

         これです。
         これで検索結果をjsonで受け取ることができます。
         PHPであればこのURLを file_get_contents して、 json_decode をすれば、Twitterの検索結果を簡単に扱うことができます。非常に簡単ですね。
         実際のコードは以下の通りです。

        $search = "検索文字列";
        $url = ('http://search.twitter.com/search.json?q='. $search .'&rpp=100');
        $result = file_get_contents($url);
        $data = json_decode($result);
        $results = $data->results;
        foreach($results as $key => $result) {
        // 好きに弄り回しましょう
        }

         このような次第です。

        注意点

         最後に、注意すべきとされている点と、私自身がちょっと引っかかった点について。
         まず、注意すべきとされている点。それは、ハッシュタグの検索です。
         ハッシュタグとは、Twitterにツイートを投稿するときに #mhp3 のように、半角シャープを付た文字列です。詳しい説明については、実際にツイッターのサイト等を参照していただきますよう。
         このハッシュタグを検索する場合、先程のコードで言うと $search に直接値を入れてはいけません。

         # は %23 へ置き換えて下さい。

         これが注意すべき点です。

         それからもう一つ。こちらは私が引っかかった点です。
         検索結果を実際に見ると様々なデータが返ってきています。
         そのなかの一つに時間があります。こちら投稿時間なのですが、時間がずれています。当然ですが基準時が日本のものではないせいです。
         そのため、もし投稿日時などを利用する場合は時間を合わせる必要があります。
         時間にして9時間のズレがあるので、 date で合わせても良いですが、もっと楽に合わせる方法もあります。

        // 時刻を日本に合わせる
        $jpn_time = date('Y-m-d H:i:s', strtotime($result->created_at));

         これで表示時刻が日本時間に修正されます。正確にはサーバのタイムゾーンに合うのでしょうか。そこは調査しきれていませんのでご容赦を。

         ということでTwitterの検索でした。
         検索の際にはオプションも付けられます。例えば、今回サンプルとした検索 URLの最後の『rpp=100』は、検索結果の件数を指定しています。指定しなければ15件、最大100件を指定できます。
         それでは、目的に沿った検索ライフを。