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℃ ---
レスポンスヘッダのX-Powered-Byの消し方
nodejs + expressアプリケーションのレスポンスヘッダに出力される
X-Powered-By: Express
を消したい場合。
こうすればいいらしい。
var express = require('express'); var app = express(); app.disable('x-powered-by');
試したバージョン。
$ npm info express version 4.8.7
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で修正されたらしい。
- https://github.com/rubychan/coderay/issues/40
- https://github.com/rubychan/coderay/commit/afd056744d5ccb0749e0d295a67eaae5ce6a3859
てことで、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
なるほど。