Hatena::ブログ(Diary)

家畜にっき

2011-07-28

isset(), empty()と__isset(), ___get()の覚書

PHP 5.3.6

<?php
class Hoge {
    private $v = 1;
    public function __isset($v) {
        echo "called __isset()\n";
        return isset($this->v);
    }   
    public function __get($v) {
        echo "called __get()\n";
        return $this->v;
    }   
}

$hoge = new Hoge;

if ($hoge->moge) {
    echo "returned true\n";
}
echo "\n";

if (!$hoge->moge) {
   echo "returned true\n";
}
echo "\n";

if (isset($hoge->moge)) {
   echo "returned true\n";
}
echo "\n";

if (empty($hoge->moge)) {
   echo "returned true\n";
}

実行結果

# ($hoge->moge)
called __get()
returned true

# (!$hoge->moge)
called __get()

# (isset($hoge->moge))
called __isset()
returned true

# (empty($hoge->moge))
called __isset()
called __get()

empty()は__isset()が真かつ__get()が空の場合にのみtrueを返す。

前者二つは__isset()を完全にぶっとばして__get()をコールするため、__isset()が未定義の場合は、意図しない動作をする場合があるかもしんないねというメモ。

2011-05-16

gem1.8のGem::Specificationワーニングを抑制する

rvm環境に入れておいたgemgem update --systemやらrubygems_updateを使って1.8.2にバージョンを上げた。

ところが、ひとたびgemコマンドを使うと以下のようなメッセージが大量に出力されるようになってしまった。大変だ!Rubygemsはクソだ!

$ gem -v
NOTE: Gem::Specification#default_executable= is deprecated with no replacement. It will be removed on or after 2011-10-01.
Gem::Specification#default_executable= called from /home/gen/.rvm/gems/ruby-1.9.2-p180@global/specifications/rake-0.8.7.gemspec:10.
NOTE: Gem::Specification#default_executable= is deprecated with no replacement. It will be removed on or after 2011-10-01.
Gem::Specification#default_executable= called from /home/gen/.rvm/gems/ruby-1.9.2-p180/specifications/rake-0.8.7.gemspec:10.
NOTE: Gem::Specification#default_executable= is deprecated with no replacement. It will be removed on or after 2011-10-01.
Gem::Specification#default_executable= called from /home/gen/.rvm/gems/ruby-1.9.2-p180/specifications/rubygems-update-1.8.2.gemspec:11.
1.8.2

Googleというとても便利なサービスを使ってこの問題を検索した所、これはgem開発者向けのメッセージであると判明した。

つまりわたくしのようなデベロッパボトムズには特に関係のない話だったのだけれど、エラーともつかないメッセージが出っぱなしという状況はどうにも精神衛生上よろしくないというか、不快で困る。なんてこった!Rubygemsはクソだ!

かといってdeprecate.rbを編集しコードを変更しろという解決策には恐れ多く、また修正を覚えておくのも面倒なので、以下の記事を参考にした。

https://github.com/rspec/rspec-core/issues/345

http://blog.zenspider.com/2011/05/rubygems-18-is-coming.html

これらによると、以下のコマンドで問題は解決する。

$ gem pristine --all --no-extensions

rvm環境下で上記がだめだった時は、いっそgemを再インストールしてみるといいようだ。

$ rvm rubygems current

2011-04-20

sakura vpsにubuntuとrvmをインストールする

Ubuntuインストール手順は省略。


aptからrubyインストール
$ sudo apt-get install ruby rubygems ri 

いやー本当にaptっていいもんですねぇ。


rvmをインストール
$ sudo gem install rvm
...
(省略)
...
Successfully installed rvm-1.6.3
1 gem installed
Installing ri documentation for rvm-1.6.3...
Installing RDoc documentation for rvm-1.6.3...
Could not find main page README.txt
Could not find main page README.txt
Could not find main page README.txt
Could not find main page README.txt

なんぞrdocでエラーが出た。糞か。

とりあえずてきとうにgemアップデートする。

$ sudo gem install rubygems-update
WARNING:  Installing to ~/.gem since /var/lib/gems/1.8 and
          /var/lib/gems/1.8/bin aren't both writable.
WARNING:  You don't have /home/gen/.gem/ruby/1.8/bin in your PATH,
          gem executables will not run.
Successfully installed rubygems-update-1.7.2
1 gem installed
Installing ri documentation for rubygems-update-1.7.2...
Installing RDoc documentation for rubygems-update-1.7.2...

$ sudo ~/.gem/ruby/1.8/bin/update_rubygems

$ gem -v
1.7.2

まだCould not find main page README.txtのエラーは出る。ファックか。

見た感じRdocで躓いているようなのでrdoc-dataを入れる事とする。

$ sudo apt-get install rdoc-data
$ sudo rdoc-data --install

これでapt-get install rvmが正常に通った。大変清清しい。


rvmのセットアップ

インストール画面の指示に従い以下を実行する。

$ sudo apt-get install git curl
$ bash < <(curl -s -B https://rvm.beginrescueend.com/install/rvm)

rvmにパスを通すため、.bashrcに以下を追加し、更新する。

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"
$ source .bashrc

以上でrvmが使用可能になりました。めでたし。

2011-04-01

うそです、のAAがかわいい

  *  うそです   +
      ∧_∧ _∧
 +  (* ´∀`)´∀`)
   n/    \n  \n
  (((ヨ  )   ノ\E) ノ\E)))
     (_⌒ヽ ⌒ヽ
      ヽ ヘ } ヘ }
  ε≡Ξ ノノ `Jノ `J