パズドラとケリ姫スイーツな感じ

zomです。 更新がとんとありませんが、それは暇な時間すべてをパズドラとケリ姫に費やしているからです。 なので、今回はそのハマり具合を公開します。

まずはパズドラ。 所持モンスターはこんな感じ。 [caption id="attachment_670" align="alignnone" width="168"]パズドラ火 パズドラ 火メンバー[/caption] [caption id="attachment_671" align="alignnone" width="168"]パズドラ水 パズドラ 水メンバー[/caption] [caption id="attachment_672" align="alignnone" width="168"]パズドラ木 パズドラ 木メンバー[/caption] [caption id="attachment_673" align="alignnone" width="168"]パズドラ光 パズドラ 光メンバー[/caption] [caption id="attachment_674" align="alignnone" width="168"]パズドラ闇 パズドラ 闇メンバー[/caption]

どれも中途半端に育ってます。魔法石をガチャに使ってばかりでスタミナ回復やコンティニューにほとんど使ってません。 特筆できるのがVer5.3時点で水の神をすべて持っていることでしょうか。 あとゼウスをとったのがつい最近です。こんな連中なので、コンティニューするのは必至だろうということで降臨系がなかなか行けず、 虹栗ゾンビパが組める!という事に気づいてからヘラ→勇者降臨と、ちょっとずつ攻めていき、ルシルシでゼウス倒せる!と思ったのがつい最近でした。 結局キメラ戦でコンボが予想以上に繋がってしまい、スキル調整ができない状態でゼウスに突入してしまい8コンくらいしましたけど…。 でも、そこからは自信がついてイースゴエモン、ウルズとゲットしました。3体合わせて10コンくらいです。(ゴエモンは水パが充実してるおかげでノーコン) 今ある魔法石は既存モンスターのレベルアップに全力で使おうと思っていますが、明後日から中国娘(四聖獣)とメタトロンなんでその保障はできない…。

ちなみに、自分がパズドラを知ったきっかけですが、 2012年3月頃に行われたFANTASY ROCK FESという音楽のイベントで「怖い・不気味」な歌を歌うことで有名な谷山浩子さんが ステージ上で「ゲームの話をしなきゃいけませんよね?何がいいかな。あのね、パズル&ドラゴンっていうゲームがあってね、パズルでモンスターを倒すの!スマートフォンならできるから!みんなやってね!」と、とてもオチャメな感じで紹介をしていました。 それを聞いたその日のうちにGoogle playで検索しましたが、当時はまだAndroidに対応しておらずできませんでした。 それから約半年、9月頃にAndroid版もリリースされて、焦らされていた気持ちもあったせいか速攻でハマりました。 課金するまで要した時間は3ヶ月くらい。12月頃のイベントで初めてドキドキの課金をしました。昔ガチャガチャとかカードダスが好きだった自分には我慢出来ませんでしたね。 今となっては1ヶ月1万ペースくらいで総額6万とかそれくらい使ってると思います。たまに2chで言うところの「優勝候補」になれる程度の引きの悪さを持っています。 会社の同期からは蔑まれたり煽られたりしていますが、割と楽しいので良しとしています。癌畜と呼んで!

続いてケリ姫スイーツ。こちらもパズドラの流れで、無料で結構遊べるというのでプレイしてみたらそこそこハマりました。 現状こんな感じです。

[caption id="attachment_676" align="alignnone" width="300"]ケリ姫 ケリ姫 兵士[/caption] [caption id="attachment_675" align="alignnone" width="300"]ケリ姫 ケリ姫 ドレス[/caption]

先日のパズドラコラボ復活の際、2chを見ていたら「キンメタが超使える」「今めっちゃ出やすい」とか書いてあって、SAGAが抑えきれませんでした。 確かこのキャンペーンの時だけで4回課金しました。額?そんなのMAX(4100円)に決まってるじゃないですか(白目) そのかいもあってキンメタは見事+10になり、レベルも160まで行きました。 フレンドに貸すことが出来るわけでもないので完全に自己満足…と冷めた目で自分を見た日もありましたが、過去を振り返ったら負けだと思うので誤魔化しつつやってます。 で、このとき60回近くスロット回したのに金箱ドレスが一枚も出ないっていうね…。 その後のログインボーナスで溜めたのでなんとか出たのがこれ(+5で+48のドレス)。 会社の同期の二人は僕のススメで無課金プレイをしていますが、二人とも★4、★5の金箱ドレスを持っていてなんかもうガンホーふざけんなとか思ったりもしました。 まだ★4の限定ボスのドレスを+5にしてなかったり、通常ステージのボス(ふわふわ以降)の★3武器も+5にしていなかったりと強くなる余地はあります。 が、6月の中頃にやってたゴールドラッシュキャンペーンで燃え尽きた感はちょっとありますね。あれは激熱イベントだった。家事を全くしなくなってしまった。

こんな感じで、この時、自分は何をしていたのかという記録的な意味を込めて日記とさせて頂きます。 たぶん2~3年したら熱も冷めて「なんて無駄金を…」とか思うんだろうな…。性格的に思わないけど。 あ、冒頭で

それは暇な時間すべてをパズドラとケリ姫に費やしているからです。

とか書きましたけど、だいぶ誇張しました。月に何回か家事をすべてしなくなり、他の行動をしなくなる程度に費やしてます(悪化してる?)

Passenger4.0.0RCでalways_restart.txtが効かない件について

zomです。 もうね、ぐったりするほどハマったので、他にもハマった人がいると思い投稿します。 【2014/04/05追記】 ※4.0.40では元に戻っていたのでタイトルなどバージョンについて細かく追記しました。

ちょっとsinatraでWebAPIでも作ろうと思い、お遊びPCでApache×Passenger4.0.0RC4×Ruby2.0.0で環境作ってみようと思いました。 で、Ruby2.0.0をインストールしPassengerもインストールし(ここらへんは後日別エントリで投稿します!たぶん!きっと!) 開発ができるようにはなりました。

しかし、プログラムをなにか変更をするたびにサーバ再起動を要します。 これでは、Apache何百回再起動することになるねん、ということで rackアプリケーションのルートディレクトリにtmp/restart.txtというのをtouchで作成してやればいいとのことです。 まー、そこらへんはpassenger restart.txtとかでググれば山ほど情報が出てくるので詳しくは書きません。

で、いちいちtouchするのもメンドいということで用意されているのが「always_restart.txt」というのがあります。 これはそのファイルがありさえすれば、毎回キャッシュを見ないみたいな挙動をしてくれます。

がっっっっっっっっ

肝心のこいつが効いてくれません!!!!Passenger4.0.0RC4だと!!!!

さて、先に解決方法をば。 rackアプリケーションのルートディレクトリ直下にalways_restart.txtを置くだけ。 効かなかった人、Passenger4.0.0RC5でもかな?これで行けると思います。 やってみてください。

さて、なんでディレクトリが変わっているのか?

Passenger3.0.x系のソースから抜粋。

if (options.restartDir.empty()) {
  restartDir = appRoot + "/tmp";
} else if (options.restartDir[0] == '/') {
  restartDir = options.restartDir;
} else {
  restartDir = appRoot + "/" + options.restartDir;
}

string alwaysRestartFile = restartDir + "/always_restart.txt";
string restartFile = restartDir + "/restart.txt";

Passenger4.0.0RCのソースから抜粋。

 if (options.restartDir.empty()) {
   restartFile = options.appRoot + "/tmp/restart.txt";
   alwaysRestartFile = options.appRoot + "/always_restart.txt";
 } else {
   restartFile = options.restartDir + "/restart.txt";
   alwaysRestartFile = options.restartDir + "/always_restart.txt";
 }

というわけでですね、3系では、特定のディレクトリの下にalwaysもrestartも置きますよ、という実装から 4.0.0RCではディレクトリを指定しなかった場合はルートディレクトリ直下にalways、ルートディレクトリ/tmpの下にrestart、という謎実装に変わってるのが原因でした。 これバグなのかな?issueに上げていいかどうかの判断がつかないけど、ドキュメントでカバーできる範囲だからそうでもないのかなー、というのが自分の意見です。 もし英語に堪能な人がいたら作者の方に、意図とか訊いてみてください>< すでにどこかに書いてあるのかもだけど…。

これで三日ほど何もできなかった…

【2014/04/05追記】 passenger4.0.40で挙動が変わってたっぽいのでソースを見てみたらtmpの下に戻ってました。

  if (options.restartDir.empty()) {
    restartFile = options.appRoot + "/tmp/restart.txt";
    alwaysRestartFile = options.appRoot + "/tmp/always_restart.txt";
  } else if (options.restartDir[0] == '/') {
    restartFile = options.restartDir + "/restart.txt";
    alwaysRestartFile = options.restartDir + "/always_restart.txt";
  } else {
    restartFile = options.appRoot + "/" + options.restartDir + "/restart.txt";
    alwaysRestartFile = options.appRoot + "/" + options.restartDir + "/always_restart.txt";
  }

4.0.0のRCがなくなったときもtmpの下じゃなくなってたはずなのに、結局元鞘ですかね?なんだったのか。

さくらVPS CentOS6にgit1.8.2をインストールするときのエラーとか

zomです。git最新版入れるべ、と思い立ってしまったのでやってみたのですが、 ちょこっと手間取ったのでその解決方法などを書いておきます。

gitの公式サイトから現在の最新版(1.8.2)をダウンロードします。 Downloadページの方には行かずトップにあるtarballのリンクから行きます。 git Downloadページの方にLinux用のリンクがあって、yumでやる方法が書いてありますが、 yumリポジトリの問題か、自分がやろうとすると1.7.1をインストールしようとします。

なのでここではtarball(tarでファイルをまとめたものをこう呼ぶそうです)からやります。 で、リンク先からgit-1.8.2.tar.gzをwgetなどで取得、tar zxvfコマンドで展開します。 ここからはrootで作業しました。 ドキュメントに載っている通り、makeをします。

# make prefix=/usr/local all
中略
ttp.c:1 から include されたファイル中:
http.h:6:23: 警告: curl/curl.h: そのようなファイルやディレクトリはありません
http.h:7:23: 警告: curl/easy.h: そのようなファイルやディレクトリはありません
In file included from http.c:1:
http.h:46: error: expected specifier-qualifier-list before ‘CURLcode’
http.h:51: error: expected specifier-qualifier-list before ‘CURL’
http.h:97: error: ‘CURL_ERROR_SIZE’ undeclared here (not in a function)
http.h: In function ‘missing__target’:
http.h:102: error: ‘CURLE_FILE_COULDNT_READ_FILE’ undeclared (first use in this function)
http.h:102: error: (Each undeclared identifier is reported only once
http.h:102: error: for each function it appears in.)
http.h:104: error: ‘CURLE_HTTP_NOT_FOUND’ undeclared (first use in this function)
http.h:106: error: ‘CURLE_FTP_COULDNT_RETR_FILE’ undeclared (first use in this function)
中略
make: *** [http.o] エラー 1

と、こんな感じでエラーが出てしまいました。 curlでエラーが出ているっぽいぞ、ということでcurlyumで入れて再度試みます。

# yum install libcurl-devel
中略。curlはインストールできました。
# make prefix=/usr/local all
Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at Makefile.PL line 3.
BEGIN failed--compilation aborted at Makefile.PL line 3.
make[1]: *** [perl.mak] エラー 2
make: *** [perl/perl.mak] エラー 2

またもやエラー。何やらExtUtils/MakeMakerでエラーのようです。なんだそれ。 ぐぐってみるとperlのライブラリ?か何かでしょうか。これもyumで入れることができるのでサクッとインストールします。

# yum install perl-ExtUtils-MakeMaker
中略。perl-ExtUtils-MakeMakerもインストールできました。
# make prefix=/usr/local all
中略
MSGFMT po/build/locale/zh_CN/LC_MESSAGES/git.mo
2009 個の翻訳メッセージ.
※こんな感じで結構な数の翻訳に関するメッセージ(警告?)が出るけど気にしない
###マニュアル通りmake installをします(rootなのでsudoではないけど)###
# make prefix=/usr/local install
中略
# git --version
git version 1.8.2

ということでソースからのインストールは完了です。

こんな感じでエラーが出ても、たいていエラーメッセージで当たりをつけて、ぐぐってyumでインストールすればいけますね。

rbenvをインストールしたいからrvmを削除した

zomです。 タイトル通りです。ただ、ちょっとあれ、って思ったことがあったのでメモ。

$ rvm seppuku
Are you SURE you wish for rvm to implode?
This will recursively remove /home/zom/.rvm and other rvm traces?
(anything other than 'yes' will cancel) > yes
Removing rvm-shipped binaries (rvm-prompt, rvm, rvm-sudo rvm-shell and rvm-auto-ruby)
Removing rvm wrappers in /home/zom/.rvm/bin
Hai! Removing /home/zom/.rvm
/home/zom/.rvm has been removed.

Note you may need to manually remove /etc/rvmrc and ~/.rvmrc if they exist still.
Please check all .bashrc .bash_profile .profile and .zshrc for RVM source lines and delete or comment out if this was a Per-User installation.
Also make sure to remove `rvm` group if this was a system installation.
Finally it might help to relogin / restart if you want to have fresh environment (like for installing RVM again).

$ cd ~
__rvm_do_with_env_before:source:5: そのようなファイルやディレクトリはありません: /home/zom/.rvm/scripts/initialize
__rvm_after_cd:source:5: そのようなファイルやディレクトリはありません: /home/zom/.rvm/scripts/hook

ということで、rvm seppukuコマンドを使ってアンインストールをしたわけですが、 その後からcdコマンドを使うとエラーが出るようになってしまいます。 なんだこれは!と焦ったのですが、心配いらないことでした。 rvmは、なんとcdコマンドをオーバーライドしてしまっていたのです。 で、rvmをアンインストールしたことでオーバーライド時に参照していたファイルが消えてエラーになったと。

一回、セッションを繋ぎ直せば(ログアウトして、もう一回ログイン)問題ないです。 あとは英語で書かれている通り、各シェルのxxxrcとかに書いたrvmの記述を自分で消してね、という感じです。

いやー、さすが切腹。潔し。

Firefox19の新機能のPDF viewerをオフにする方法

zomです。 Firefox19になって新しく搭載された機能、PDFをhtml5で描画する! という革新的な機能ですが、拡大縮小が非常に重く、使いものにならないのでオフにしたいです。 ので、そのやり方をメモ。

ツール→オプション→プログラム→検索でPDFと入力→ 取り扱い方法を「Adobe Acrobatを使用(Firefox内で表示)」に変更してOK。 こうすると説明通りですが、FirefoxのなかでAdobeを利用して見れる形になります。 「Adobe Readerを使用」にするとファイルをダウンロードしてAdobe Readerが起 動する形式になります。 他のPDF viewerを入れている人はそれを選べばいいんじゃないでしょうか。

と、たったこれだけ。 糞重いのは自分のPCが糞なんですかね。 自分のと言っても会社のPCで(自宅じゃPDFなんて開く機会ないですよね)そろそろ5年目突入なので糞になりつつあるかもしれませんね。 当時はCore2Duo 3GHzきたこれ!クアッドじゃない中ではハイスペックや!とか思ってたんですけどねぇ。

【Ruby】case比較演算子(===)の挙動

zomです。 Rubyを始めてもう少しで1年になりますが、まだまだ知らないことだらけで 今日もまた新しい発見があったので書いておきます。

Rubyではcase比較演算子というものがあります。 それが===です。 PHPでは型もチェックする厳密な比較という意味でしたが、Rubyでは扱いが違います。 Rubyではクラスのチェックに使うことが主です。

data = 'hoge'
case data
when ::String
  p 'string'
when ::Hash
  p 'hash'
end
# => 'string'

Rubyでは上記のようにcase(PHPで言うところのswitch(※))でクラスの比較をすることができます。 'hoge'はStringクラスのインスタンスですので、Stringに属しているといってもいいかもしれません。 そのため::Stringにマッチしてp 'string'が実行されます。 このcaseの内部処理で使われているのが===ということです。

ですので、ifで書きなおせば以下のようになります。

data = 'hoge'
if ::String === data
  p 'string'
elsif ::Hash === data
  p 'hash'
end

では、ここで本題。

::String === 'hoge'
# => true
'hoge' === ::String
# => false

こんな実行結果になります。さて、なぜ順番を変えただけで実行結果が変わってしまうのでしょうか?

答えは、レシーバが違うことと、演算子メソッドであることかと思います。 レシーバとは、メソッドを呼ばれたオブジェクトのことで、ここでいうところの===の前に来るものです。 これでレシーバが異なることで===演算子(メソッド)の挙動も異なるということになります。

このケースを噛み砕いて言うと、人間は動物の一種であるが、動物は人間の一種ではない、というところでしょうか。

いやー、caseの実装をifに書き換えた際に、この現象にはまってしまい十数分、頭を捻っていましたが、 原因がわかったときはRubyすげぇ!となぜか感動してしまいました。よく考えて見れば普通のコトなんですけどね。 まだまだ勉強が足りませんな。

ちなみにcase比較演算子という呼び方はオライリーの「初めてのRuby」にて記載されていたので、使わせて頂きました。

PHPでいうところのswitchなんて書くと怒られそうですが、似て非なるものだということを下記のブログを見て知っておいてもらえると幸いです。 Rubyのcaseを〇〇(言語名)のswitch文だと思っている人たちにぼくから一言ガツンと申し上げたい 本当はこれくらい突っ込んだ内容を書いたほうが、読者のためにもなるんだろうなぁ…。

【Ruby】Ctrl-cの強制停止はrescueで補足できる

zomです。 Rubyのtips二本立てです。 ※2013/09/27追記 ensureはあんまり関係無かったのでensureに関わるタイトルと記事の内容を修正しました

今回もまぁ掲題のとおりでございます。 Unix系においてプログラムの強制終了、停止でCtrl-cを使うことは周知のことかと思いますが Rubyでも実行中にCtrl-cをやることで止めることができます。 ただし、どこまで処理が進んでいるのかわからないので、IOが発生するものはむやみにやるべきではないと思います。

でも、やらざるをえない場合もあると思います。 処理に3時間かかるバッチを間違えて実行しちゃった!3時間も待ってらんね!止まれぇェェ!! みたいな。なにこのテンション。

そこで掲題の話でございます。 百聞は一見にしかず。サンプルソースです。

begin
  sleep 1000
rescue Interrupt
  p 'exec Ctrl-C!'
ensure
  p 'done!'
end
# 'exec Ctrl-C!'
# 'done!'

見ての通りですが、実行すると1000秒待ちます。 「殺人鬼のいる部屋で1000秒も待ってられるか!俺は自分の部屋に戻る!」 と言いながらCtrl-cをするとInterruptが発生します。 rescueで指定しているInterruptはRuby1.9.3では例外クラスの一つとして定義されています。 そのため、rescueで補足できるし、ensureも実行されます。

ただし、rescueでエラータイプを指定しない場合はStandardErrorしか補足されないため、rescue節は実行されません。 というのもInterruptはSignalExceptionという別のクラスに属しているからです。

ということで、デバッグのためにわざわざInterruptを補足する処理を書くのか?いや、書かない(反語)となるようなtipsでした。 とりあえずrescueで補足してロールバックするような処理を書くことは可能、ってことだけ覚えておけばいいのかなー、と思います。

あ、ちなみに「殺人鬼のいる部屋で~」とかいう必要ないですよ。