Hatena::ブログ(Diary)

memo_ruby このページをアンテナに追加 RSSフィード

2012-04-03 03

[rails] Time#to_s(:db) と TimeWithZone#to_s(:db) は違うので注意

Time 型の表示は to_s よりも to_s(:db) の方が分かりやすいので良く使うのですが、Time と TimeWithZone で動きが違うことに気がつかず、とてもはまりました。

具体的にはこの違い...

> Time.now.yesterday.to_s(:db) #=> "2012-04-03 03:02:39" 
> 1.days.ago.to_s(:db)               #=> "2012-04-02 18:02:48"

上(Time.now.yesterday)はTimeクラス、下(1.days.ago)は TimeWithZoneクラスです。

ソースを読んでみると、TimeWithZone.to_sは :db が指定されたとき UTC の時間を返します。Time.to_s(:db)はJSTのまま返すので9時間の違いがうまれてしまうのです。

:db 以外は 同じです(正確にはフォーマットを定義されていないSymbolが指定された場合の仕様も違う)。


まとめると:

to_s は同じStringを返します。

> Time.now.to_s                 #=> "2012-04-04 03:03:44 +0900" 
> Time.zone.now.to_s        #=> "2012-04-04 03:03:40 +0900" 

to_s(:db) だと違うTimeZoneで時間を返してくるので9時間ことなる。

> Time.now.to_s(:db)         #=> "2012-04-04 03:03:28"  ←JST
> Time.zone.now.to_s(:db) #=> "2012-04-03 18:03:31"    ←UTC

参考

2012-03-21 21

password 入力エリアの文字を手軽に表示する

FirebugなどのDOMプロパティから探すといつもなかなか value が見つからず面倒なのでScriptを書く。

    $('[type=password]')[0].value

2011-03-23 23

[osx] Exuberant Ctags on OSX

rails.vim で :Rtags とコマンドがあります。

実行すると以下のコマンドが流れるのですが、このとき ctags に -Rオプションなんてないと怒られてしまいました。

:!ctags -f /Users/takemo/apps/rails3_app/sample/tmp/tags -R --langmap="ruby:+.rake.builder.rjs" --languages=-javascript /Users/takemo/apps/rails3_app/try-refinery

どうやら ctags といってもいくつか種類があるらしく、OSXの/usr/binに入っているctags(BSD Ctags) とは別に Exuberant Ctags と呼ばれる ctags(etags)を使う必要があるようです。

後者は MacPortsインストール可能なので "sudo port install ctags" でインストールします。

すでに インストール済みだったのですが、PATHの関係上、/usr/bin/ctags が使われていてので /usr/bin/ctags は 名前を変えて退避させ、無事に解決しました。


以下は調査したときのメモ。

ctags は、指定された C, Pascal, Fortran, YACC, lex, lisp のソースから、

ex(1) コマンド用のタグファイルを作成します。タグファイルは、指定されたオ

ブジェクトが一群のファイル中のどの場所に...

ctags および etags (以後、区別が必要なければ ctags) は、 さまざまなプログラミング言語で定義されているオブジェクト (関数やクラス、構 造体など) のインデックス (または "tag") ファイルを生成する。.... 25種類の言語に対応...

実際に両方で tag を作成してみるとコマンド名は同じですがかなり違いがあり、作成されたファイルサイズが6倍程度異なりますし、そもそも BSD の ctags では Perlスクリプトすら処理できません。ちなみに、以下は zlib.h の tags を作成したもの。

% /usr/bin/_ctags -f ctags.txt zlib.h
% /opt/local/bin/ctags -f etags.txt zlib.h
% ls -l *tags.txt
-rw-r--r--  1 takemo  takemo   909  3 23 10:19 ctags.txt
-rw-r--r--  1 takemo  takemo  6691  3 23 10:19 etags.txt
% head *tags.txt                 
==> ctags.txt <==
FAR     zlib.h  /^typedef unsigned (*in_func) OF((void FAR *, unsign/
address zlib.h  /^typedef void   (*free_func)  OF((voidpf opaque, vo/
deflateInit     zlib.h  /^#define deflateInit(strm, level) \\$/
deflateInit2    zlib.h  /^#define deflateInit2(strm, level, method, windowBi/
gzFile  zlib.h  /^typedef voidp gzFile;       \/* opaque gzip file d/
gz_header       zlib.h  /^} gz_header;$/
gz_headerp      zlib.h  /^typedef gz_header FAR *gz_headerp;$/
inflateBackInit zlib.h  /^#define inflateBackInit(strm, windowBits, window) /
inflateInit     zlib.h  /^#define inflateInit(strm) \\$/
inflateInit2    zlib.h  /^#define inflateInit2(strm, windowBits) \\$/
 :
==> etags.txt <==
!_TAG_FILE_FORMAT       2       /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED       1       /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR    Darren Hiebert  /dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME      Exuberant Ctags //
!_TAG_PROGRAM_URL       http://ctags.sourceforge.net    /official site/
!_TAG_PROGRAM_VERSION   5.8     //
ZLIB_H  zlib.h  /^#define ZLIB_H$/;"    d
ZLIB_VERNUM     zlib.h  /^#define ZLIB_VERNUM /;"       d
ZLIB_VERSION    zlib.h  /^#define ZLIB_VERSION /;"      d
ZLIB_VER_MAJOR  zlib.h  /^#define ZLIB_VER_MAJOR /;"    d
 :

2011-03-09 09

[rails] SpotliteからRailsリファレンスを登録する

これまでRailsリファレンスを引くときは、だいたい

RDoc + RDocIncsearch を使っていましたが, OSX辞書からつかえるRailsリファレンスがあることを知りました。

以下サイトからOSXの辞書アプリ用のRailsリファレンスダウンロードして、/Library/Dictionaries の下に展開して、辞書アプリの設定でRuby On Railsを有効にするだけ。

Priit Haamer • Ruby on Rails dictionary for Mac OS X

これを設定しておけばSpotlightで引けるます。MacDVDとか見てるときに、ふと気になったらすぐに Command + Space でリファレンスを引ける。これは便利!


ちなみに、久しぶりにHatenaつかったのですが、記事を書く画面が Hatena 記法の説明がなくなるなど変わっていますね。ユーザーフレンドリーになった気がします。

2010-08-14 14

[screen] iTermでscreen使うとWindowが小さくなる対策

.screenrc の termcapinfo を設定する。設定の意味は良くわからない。

% echo $TERM
xterm-256color

% echo termcapinfo xterm-256color 'is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l' >> ~/.screenrc

xterm-256color の所は xterm* でも可。


参考

GNU Screenの起動時やアタッチ時にターミナルをリサイズさせない方法

http://aperiodic.net/screen/commands:termcapinfo