iCalデータの解析

そういえばこれまでiCalフォーマットというのを扱ったことなかったので、少し調べてた。
https://tools.ietf.org/html/rfc5545


試しにlivedoorで配信されてるiCal形式のお天気情報をローカルに保存。
http://weather.livedoor.com/weather_hacks/

$ wget http://weather.livedoor.com/forecast/ical/13/63.ics


ググって見つけた良さげなパッケージをインストール。
http://sabre.io/vobject/install/

$ composer require sabre/vobject ~3.3.3


ドキュメント見ながら、適当にスクリプトを書く。

<?php
require_once 'vendor/autoload.php';
use Sabre\VObject;

function puts($str) {
	echo $str . PHP_EOL;
}

$data = file_get_contents('./63.ics');
$vcalendar = VObject\Reader::read($data);

puts($vcalendar->{'X-WR-CALNAME'}->getValue());
puts('------');

foreach ($vcalendar->VEVENT as $event) {
	puts($event->DESCRIPTION->getValue());
	puts($event->SUMMARY->getValue());
	puts('---');
}


実行結果

東京の天気 - livedoor weather
------
http://weather.livedoor.com/area/forecast/130010?r=ical20141014 [ 東京 ] 14日の天気は晴時々曇、最高気温は26℃ 最低気温は22℃でしょう。
晴時々曇 26℃/22℃
---
http://weather.livedoor.com/area/forecast/130010?r=ical20141015 [ 東京 ] 15日の天気は曇のち雨、最高気温は21℃ 最低気温は17℃でしょう。
曇のち雨 21℃/17℃
---
http://weather.livedoor.com/area/forecast/130010?r=ical20141016 [ 東京 ] 16日の天気は雨のち曇、最高気温は21℃ 最低気温は14℃でしょう。
雨のち曇 21℃/14℃
---
http://weather.livedoor.com/area/forecast/130010?r=ical20141017 [ 東京 ] 17日の天気は晴時々曇、最高気温は24℃ 最低気温は16℃でしょう。
晴時々曇 24℃/16℃
---
http://weather.livedoor.com/area/forecast/130010?r=ical20141018 [ 東京 ] 18日の天気は晴時々曇、最高気温は22℃ 最低気温は15℃でしょう。
晴時々曇 22℃/15℃
---
http://weather.livedoor.com/area/forecast/130010?r=ical20141019 [ 東京 ] 19日の天気は晴時々曇、最高気温は22℃ 最低気温は15℃でしょう。
晴時々曇 22℃/15℃
---
http://weather.livedoor.com/area/forecast/130010?r=ical20141020 [ 東京 ] 20日の天気は晴時々曇、最高気温は22℃ 最低気温は15℃でしょう。
晴時々曇 22℃/15℃
---

2.1系もrubiniusに期待。

てきとうに重そうな再帰処理を用意

$ cat fib.rb
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

def fib(n)
  return n if n < 2
  fib(n - 1) + fib(n - 2)
end

puts 'fib(10) = %s' % fib(10)
puts 'fib(20) = %s' % fib(20)
puts 'fib(30) = %s' % fib(30)
puts 'fib(40) = %s' % fib(40)


CRuby

$ rvm use ruby-2.1.0
$ ruby -v
ruby 2.1.0p0 (2013-12-25 revision 44422) [x86_64-darwin12.0]
$ time ruby fib.rb
fib(10) = 55
fib(20) = 6765
fib(30) = 832040
fib(40) = 102334155

real  0m19.073s
user 0m18.980s
sys   0m0.031s


Rubinius

$ rvm use rbx-2.2.2
$ ruby -v
rubinius 2.2.2 (2.1.0 40836a40 2013-12-21 JI) [x86_64-darwin13.0.0]
$ time ruby fib.rb
fib(10) = 55
fib(20) = 6765
fib(30) = 832040
fib(40) = 102334155

real  0m5.804s
user 0m5.858s
sys   0m0.061s

Ruby2.1系もrubiniusに期待してる。

RedmineでPHPファイルを表示したときの文字化け対応

redmineリポジトリphpファイルを表示するとソースコード内の日本語が文字化けしていたので、調べてみるとcoderayの問題との記事がいくつか見つかった。

そんで、coderayのほうを調べにいってみると、どうやらv1.0.9で修正されたらしい。


てことで、bundle updateして coderayを最新版(v1.0.9)にしたら、phpファイルを表示したときの文字化け直った。

$ grep 'VERSION' -A3 lib/redmine/version.rb
  module VERSION #:nodoc:
    MAJOR = 2
    MINOR = 3
    TINY  = 0

$ bundle show | grep coderay
  * coderay (1.0.8)

$ sudo bundle update

$ bundle show | grep coderay
  * coderay (1.0.9)

$ sudo /etc/init.d/httpd graceful

要素がシンボルの配列(空白区切り)欲しい

x要素がシンボルの配列(空白区切り)欲しい, ○Ruby2.0.0で%i()使おう! | 實松アウトプット

上記エントリーを読んでみて、「要素がシンボルの配列」が得られる%記法はないことを知った。

%w(foo bar baz).map &:to_sym
#=> [:foo, :bar, :baz]

現状だと上のようにするのか。


追記

id:sanemat thx!

$ pry
[1] pry(main)> RUBY_VERSION
=> "2.0.0"
[2] pry(main)> %i(foo bar baz)
=> [:foo, :bar, :baz]

timecopライブラリにpull request

昨日くらいに timecopというライブラリをRuby1.8系で使った場合に起こる問題を修正してPull Requestを送ったところ、程なくして取り込んでくれた。

まだRuby1.8系を使っている人がどのくらいいるか分からないけど、timecop-0.5.4に対応が入ったらしい。
https://github.com/travisjeffery/timecop/commits/v0.5.4

Ruby2.0のRefinementsを試す。


http://el.jibun.atmarkit.co.jp/rails/2012/11/ruby-20-8256.html

Ruby2.0 のRefinementsなる機能を試す。
"クラス拡張の影響範囲を名前空間に限定する" とか。

test_refinements.rb

#!/usr/bin/env ruby
# coding:utf-8

module Hoge
  module Refinements
    refine String do 
      def say; "My name is #{self.capitalize}!!"; end
    end

    refine Integer do
      def say; "#{self} years old!!"; end
    end
  end

  class Foo
    using Refinements

    def initialize(name, age)
      @name = name
      @age = age
    end

    def say_name
      name.say
    end

    def say_age
      age.say
    end

    attr_accessor :name, :age
  end
end

foo = Hoge::Foo.new "hogetaro", 15
puts foo.say_name
puts foo.say_age

if String::instance_methods.include? :say
  puts "> String class has :say"
else
  puts "> String class has not :say"
end
$ ruby -v
ruby 2.0.0dev (2012-11-01 trunk 37411) [x86_64-darwin11.3.0]

$ ruby test_refine.rb 
My name is Hogetaro!!
15 years old!!
> String class has not :say

なるほど。