2014年8月10日日曜日

Ruby Warrior をやってみる(Level3)

前回に引き続き、今回は Level3 をやっていきます。

画面を見てみると、敵の数が増えています。


そして、例のごとく説明文

The air feels thicker than before. There must be a horde of sludge.
Be careful not to die! Use warrior.health to keep an eye on your health, and warrior.rest! to earn 10% of max health back. 


毎度の意訳

空気がさっきよりも重たく感じる。どうやら敵の大群が居る感じがする。
殺られたらだめだ!warrior.health を使えば、戦士の体力を確認できる。
そして warrior.rest! で最大体力の 10% の体力を回復する事ができる。

とのこと。

戦士の初期体力が 20 で、敵は 3 回の攻撃で倒す事ができる。
つまり 2 回は敵の攻撃を貰う事になる。
敵の 1 回の攻撃で -3 のダメージなので、 (-3 x 2) x 4 = -24 となり、Level2 のままではクリアできない。

敵一体であれば、6 より大きい体力があれば倒す事ができる。
この判定を行うためには、自分の体力を見て判定するとよいので、今回の warrior.health を使えば乗り切れる体力かどうかの判断が出来る。
そして、体力的にまずい場合は warrior.rest! を使用すれば、最大体力の 10 % 回復できるということで、今回の場合は最大体力 20 の 10% で 2 回復できる事になる。

これを踏まえた上でプログラムを書いていく。

当然のことながら、目の前に敵がいるのに回復などしているとダメージ量と回復量の差によってクリアができないので、目の前に何も居ない事を見てから回復動作を行う必要がある。

これを踏まえて書いたコードがこちら

class Player
  def play_turn(warrior)
    if warrior.feel.empty? then
      # 目の前が空いている
      if warrior.health <= 6 then
        # 体力が 6 以下の場合は回復
        warrior.rest!
      else
        warrior.walk!
      end
    else
      # 敵がいる
      warrior.attack!
    end
  end
end

上手くいきました。
ここでは、条件分岐での関係演算子の使い方が分かりました。

まだなんとか行けるね。

RMagick を Windows にインストールしてみた

今回は Windows への RMagick のインストールを行ってみた。
RMagick というのは、ruby 用の画像加工ライブラリで、トリミングやサイズ変更などを行う事ができる物。

元々は、ImageMagick という Unix 系でのライブラリのようだ。

さて、発祥が Unix 系なので Linux 等の機械にインストールするのが筋なのだろうが、手持ちが Windows 機なので、こちらでインストールできるかやってみる事にする。
仮想環境で、Linux を入れて行う方法もあるが、PC が非力なために極力ネイティブで行いたかった。

どんな時でもそうだが、Unix 系やその他の環境からの Windows 機への対応は良くない印象で、今回も案の定だった。
結局、トライアンドエラーでインストールできたので(しかも今ひとつどれが有効だったのか核心がない。。。)、記録だけ残しておく。

まず、インストール時の環境確認をした。
Ruby 自体がインストールされているかを確認した。
ruby -v
ruby 1.9.3p392 (2013-02-22) [i386-mingw32]
少し古いが、たぶん去年 Rails の確認を取る際に使用したままの物だろう。
フォルダを見ると RailsInstaller とかいうフォルダが存在していたので間違いない。

次に、gem の update を行った。
正直 ruby にまだ入門したばかりなので、このアップデート方法が有っているかは分からない。
gem update
rails の rdoc で恐ろしく時間がかかった。
止まったのかと思って、強制終了使用かと思ったぐらいだったが、放置して別の事していたら終わっていた。それでも1時間はかかったと思う。

時は来たという事で、さっそく RMagick のインストールをと思ったが、よく分からないので、以下のページを参考にさせていただいた。

君の瞳はまるでルビー - Ruby 関連まとめサイト
RMagick を Windows 7 にインストールする方法

http://www.ownway.info/Ruby/index.php?rmagick%2Fhowtoinstall%2Fwindows

欲しいタイトルそのままで良かった。
このページを追いながら、省けるところは省いて作業をしてみたが。。。ダメでした。。。
手間を惜しんでせこくせこく小手先だけでの対応で色々やってみたけどダメだったので、一通り上から作業していく事で成功した。

やった事と言えば、

1. Development Kit の更新
上記に書いているとおり、インストールしているのは RailsInstaller を使用した Ruby ということもあり、Development Kit が古いのでは無いか?という推測の元更新を行ってみた。

RubyInstaller のページから Development Kit をダウンロードする。

RubyInstaller for Wndows
http://rubyinstaller.org/downloads/

現在使用している Ruby は、1.9.3 だったので、それに対応した物をダウンロード。
(DevKit-tdm-32-4.5.2-20111229-1559-sfx.exe 2014/08/10時点)

ダウンロードしたファイルを展開し、RailsInstaller のフォルダの DevKitへコピー。
ここを最初別の場所に置いて、後からフォルダ参照されない無い事に気がついてやり直したのは言うまでもない。

ファイルを置き換えたら、セットアップが必要とのことなので、フォルダまで移動してコマンドを実行。
cd {Development Kit のインストールディレクトリ}
ruby dk.rb init
ruby dk.rb install
2.ImageMagick のバージョンとインストール先ディレクトリの指定
RMagick をインストールするにあたり、ImageMagick のインストールが必要らしい。
そこで、インストールするバージョンだが、公式から最新版を取得して、またそのままインストーラのデフォルトのまま作業をした。
インストールを成功されている方の情報をみると、今のはバージョンが有っていないので、成功例があるバージョンを使用するようにした。

ImageMagic公式(今回ここは使わないけど参考に)
http://www.imagemagick.org/script/binary-releases.php#windows

ちなみに今回失敗した時のバージョンは、ImageMagick-6.8.9-6-Q16-x86-dll.exeだった。

今回は、参考サイトにある旧バージョン取得ページから成功例のある  ImageMagick-6.8.5-8-Q8-x86-dll.exe を使用してインストール。

SUNNET(スエーデンの大学?)
http://ftp.sunet.se/pub/multimedia/graphics/ImageMagick/binaries/

インストールの時には、インストール先フォルダを C:\ 直下にして
オプションは、
・ Add application directory to your system path
・ Install development headers and libraries for C and C++
にチェックを入れてインストールをする。

インストール後は、システム環境変数をセットする。
CPATH = {ImageMagick のインストールディレクトリ}/include
LIBRARY_PATH = {ImageMagick のインストールディレクトリ}/lib
セット後は、設定を反映させるために再起動をかけておく。

3.RMagick インストール時に gem にバージョンを与える
成功されている方のインストールでは、gem install の時にバージョンの指定を行っていたので、参考にしてバージョン指定してみた。
gem install rmagick - v 2.13.2
これで RMagick のインストールが成功した。


X.失敗の振り返り
ちなみに失敗したときはログを見ろと言う事で、指定されたログを見てみた。
....
======================================================================
Sun 10Aug14 13:52:13
This installation of RMagick 0.0.0 is configured for
Ruby 1.9.3 (i386-mingw32) and ImageMagick 6.8.9
======================================================================



make
generating RMagick2-i386-mingw32.def
compiling rmagick.c
In file included from rmagick.c:13:0:
rmagick.h:81:2: error: #error Specified QuantumDepth is not supported.
rmagick.c: In function 'Magick_colors':
rmagick.c:40:5: warning: implicit declaration of function 'GetExceptionInfo'
rmagick.c:42:5: warning: passing argument 2 of 'GetColorInfoList' from incompatible pointer type
C:\Program Files\ImageMagick-6.8.9-Q16\include/magick/color.h:75:5: note: expected 'size_t *' but argument is of type 'long unsigned int *'
rmagick.c: In function 'Magick_fonts':
rmagick.c:90:5: warning: passing argument 2 of 'GetTypeInfoList' from incompatible pointer type
C:\Program Files\ImageMagick-6.8.9-Q16\include/magick/type.h:98:5: note: expected 'size_t *' but argument is of type 'long unsigned int *'
rmagick.c: In function 'Magick_init_formats':
rmagick.c:178:5: warning: passing argument 2 of 'GetMagickInfoList' from incompatible pointer type
C:\Program Files\ImageMagick-6.8.9-Q16\include/magick/magick.h:135:5: note: expected 'size_t *' but argument is of type 'long unsigned int *'
make: *** [rmagick.o] Error 1
ハッキリ言って、これだけ見て分かったら何も困らないのだが、、、
今見ると、RMagick のバージョンが 0.0.0 になっていたりするのが気になる。
その他は、ImageMagick のバージョンが最新という点とインストール先が Program Files の下という点か?
Dev Kit も見当違いのフォルダに置いていたりとしていたので、結局核心を突く前にインストールが成功してしまった。
問題点の検証する気が起きないので、次出たら作業ログを取ってやっていこう。。。

参考ページには、インストールできたからと言ってRMgacik が動くわけではないとの事を書かれてあったので、サンプルページを作成、実行しエラーが出ない事を確認した。
(requrire でライブラリが読めるかの確認だけだけど)

はて、困っている方の参考になるであろうか心配である。。。

2014年8月8日金曜日

Ruby Warrior をやってみる(Level2)

昨日に引き続き Level2 です。
Level1 をクリアして次の画面へ進むとセーブの確認と、FaceBook に投稿が出来るっぽいのですが、FaceBook は使っていないのでここは SKIP LOGIN を選択します。
image
すると、次の Level2 が表示されます。
image
上部の説明文には
It is too dark to see anything, but you smell sludge nearby.
Use warrior.feel.empty? to see if there is anything in front of you, and warrior.attack! to fight it. Remember, you can only do one action (ending in !) per turn.
。。。意訳します。
とても暗く何も見えないが、臭いを感じ取る事はできる。
warrior.empty? を使えば、目の前に何かあるか確かめる事が出来る。そして warrior.attack! を使って戦う事が可能だ。
しかし忘れないでくれ、お前が動けるのは1ターンに一度だけだという事を。
こんな感じ?
要するに新しいメソッドが増えたって事ですね。
ここら辺は、画面の ABILITIES のボタンをクリックすると内容が書かれています。
image
これをみると、戦士の行動以外に周りの状況判断のメソッドも有る事が書かれています。
使い方は、warrior.feel.メソッド とやるみたいです。
(今回の .empty? も書かれています。)
画面の説明では、warrior.feel.empty? を使えばいけそうなので、早速使ってみたいと思います。
このメソッドは、目の前が空いているか?のチェックを行うもので、空いていれば true が返ってきて、何か障害物があれば false が返ってくる様になっています。
この判断を行うには if 文を使えば分岐が出来るので、今回は以下のような実装になります。
class Player
  def play_turn(warrior)
    if warrior.feel.empty? then
      warrior.walk!
    else
      warrior.attack!
    end
  end
end

見たまんまですけど、目の前が空いていれば歩き、空いていないなら敵がいる物として攻撃を行うようにしています。
あとは、特に説明する必要がないので、実行してみます。

道中を歩き、敵がいるところでは攻撃を行い、敵がない無くなったら再度歩き出してゴールまで行きクリアの動作となります。

image

今回も上手くいきました。
ここで得た内容は、if 文による分岐と、feel にぶら下がるメソッドです。

次回も頑張ります。

2014年8月7日木曜日

Ruby Warrior をやってみる(Level1)

Ruby を楽しみながら学習できるサイト「Ruby Warrior」がどこかで紹介されていたのでやってみようと思う。


Ruby Warrior
https://www.bloc.io/ruby-warrior/#/

検索すると、回答サイトなどもあるので、詰まっても大丈夫。。。

さて、サイトを進むと、戦士のセーブ情報が表示され、次に名前を付ける事が出来る様になっている。ひとまず名前は初期の物でいいとする。
次に、初心者か中級者かの選択がある。
Ruby は、あまり使ってないので、とりあえず初心者を選択し、次へすすむ。

すると、レベル1が表示された。


You see before yourself a long hallway with stairs at the end. There is nothing in the way.
Call warrior.walk! to walk forward in the Player 'play_turn' method.

ああ、いきなり英語が分からない。。。
Google 翻訳で読んでみよう、、、

あなたは自分の前に最後に階段の長い廊下を参照してくださいの方法では何もありません

・・・???
さらにわからん。
ひとまず意訳でいこう。

「あなたの前には長い廊下があり、最後に階段がある。ただそれだけ」
「Player の 'play_trun' メソッドで warrior.wark! を呼んで前に歩かせてくれ」

こんな感じか。まあ、画面見たまんまなんですけどね。
なので、早速コードを書いていきましょう。

画面の下の部分にコードを書くエディタがあるので、そこに記述して Run! ボタンを押せば、コードが実行されていきます。

今回は、歩くだけなので相当簡単。

class Player
    def play_turn(warrior)
        warrior.walk!
    end
end

こんな感じですね。
ちなみに一回の play_trun() で、戦士の動作を行う事は1回のみと言うルールみたいで、warrior.walk! を続けて書くと実行時にエラーで怒られます。


warrior.walk! を一回にして実行すると、ターンが繰り返され無事階段まで辿り着き
の表示が出て次のレベルへ。
一応意訳で、 「成功!次の旅へ Ruby 戦士」うーんいまいち。
もうすこしゲームっぽく「やったぜ!Ruby 戦士よ次の旅へ向かうんだ!」かな?

ひとまず、Level1 は簡単で良かったです。

ここでは、クラスと、メソッドの記述方法、引数は warrior で、消しちゃいましたが "#" でコメントが扱えると言う事がわかりました。

この調子で次回は Level2 をやってみたいと思います。


2014年8月3日日曜日

ノートPCの日本語キーボードと USB 外付け英語キーボードを共存させる(その2)

以前外付け英語キーボードの記事を書いた。

ノートPCの日本語キーボードと USB 外付け英語キーボードを共存させる
http://tizio1976.blogspot.jp/2013/11/pc-usb.html

そこでは別途購入した外付け日本語キーボードが有るので、使用しないとしていたが、記事を書いた状況から状況がかわり、購入していた外付けキーボードは現場で活躍する事になったので、再度外付けキーボードを使用する事になった。

今回は前回と違う方法でやってみようと思う。

ポイントは、
・ ノートPCは日本語キーボードで外付けは英語キーボードという環境と言う事。
・ IME の変更を出来れば右ALTで行いたい事。
の2点。

まずは、ノートの日本語キーボードを生かしつつ、外付けは英語キーボードで動作させるという部分。
これは、以下の記事を参考にさせて頂きました。

Windows7でUSBキーボードだけをUS配列として認識させる方法
http://calcurio.com/wordpress/?p=144

前回もレジストリを触ったが、今回もレジストリを触るようになる。

まずはレジストリエディタを起動。
スタートの「プログラムとファイルの検索」に「regedit」と入力して Enter キーで起動させる。
ツリー表示[HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Services¥i8042prt¥Parameters]を探す。
次に、[LayerDriver JPN] の値を [kbd106.dll] から [kbd101.dll] に変更。
次に、[OverrideKeyboardIdentifier] の値を [PCAT_106KEY] から [PCAT_101KEY] に変更。
最後にレジストリエディタを終了して、PCを再起動。

これで、ノートの日本語キーボードを生かしつつ外付けキーボードは英語配列の物が使用できる様になる。
(この状態で外付け日本語キーボード繋いだらどうなるかは未検証)

次に、右ALT で IME 制御を行える様にする。
これは苦戦して、最初は以下の記事を参考にさせて頂きました。

右Altキーに[漢字]キーを割り当てる方法(AXキーボード設定を利用する方法)
http://www.atmarkit.co.jp/fwin2k/win2ktips/041axkbd/axkbd.html

これもレジストリエディタを使用し、さらに上記で変えた部分を更に変更する内容となっている。
さっき変えたところをまた変えると言うのに抵抗を感じつつも変更し再起動をかけてみたが、結果失敗。
右ALT を押しても反応なし。

レジストリの設定値の組み合わせを変えてみたが状況変わらず。
半ば諦めが入ってきたところで、以前使用していた AltIME は無いものかと調べてみたが、Win7では上手くいかないとの事。
また配布が止まっているとの事。

あと別の方は、Change Key で設定をされている記事も有ったので試してみるが結果上手くいかない。

同じく AutoHotKey で設定している方も居られたので、最後とばかりに試してみたら上手くいったのでやり方を書いておく。

参考にさせていただいたのは以下の記事

英語配列のUSBキーボードを使う(付:右AltでIME切り替え)
http://posokosi.seesaa.net/article/314087768.html

まさにそのまま。
まずは、AutoHotKey をインストールする。

AutoHotKey
http://www.autohotkey.com/

インストール時の設定は適当に(特に気にせず次を押していった)。

次に、RALT_IME.ahk(ファイル名は任意)と言うファイルスクリプトファイルを作成し、中に以下のスクリプトを書く。

    RAlt::vk19


保存後は、スタートアップのフォルダにコピーする。
(再起動時にスクリプトを実行させるため)。
ひとまず使いたいのであれば、ファイルをダブルクリックで実行すればよい。

インストールが必要という事と、スクリプトファイルを使用と言う事で、常駐プログラムとして動き、キーイベントを取得してキーコードを変換している動きとなってるみたい
なので、非力な自分のPCでは大丈夫かと思ったけど、ストレス無く動いている。

これで、今回目的は達成した。
問題は、日本語キーボードが現場から返ってきたときにどうするかだけど、その時に考えるようにしよう。