MNIST For ML Beginnersまとめ

Tensorflowチュートリアルで、いわゆるHello Worldに該当するMNISTがいきなり難しくて詰まってしまった。

が、それとなく分かってきたのでどういうイメージかをまとめてみる。

MNISTの目的

入力した手書き文字の画像に対して、0〜10何の数字かを類推して出力するモデルを構築する。

プログラムの流れ

//画像データをインポートする。画像データには訓練用の画像mnist.train.imageと、何の数字かを表す0〜10のラベルmnist.train.labelsがセットになっている。

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(“MNIST_data/”, one_hot=True)

import tensorflow as tf

//入力の画像。28×28で784の配列で現れる。複数の画像入力に対応するために[None,784]となっている。
x = tf.placeholder(tf.float32, [None, 784])

//画像の重みとバイアス。この部分はセッションにおいて可変であり、この2つの変数を訓練して調整することがプログラムの目的。
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

//入力画像から推定される数字の値を表している。
y = tf.nn.softmax(tf.matmul(x, W) + b)

//正解の数字ラベルの入力配列。0〜10
y_ = tf.placeholder(tf.float32, [None, 10])

//クロスエントロピー。分かりづらいが、入力画像群をモデルを通して得られた推定の数字群と、正解のラベル群の違いの度合いを表している
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

//最急降下法にて、上のクロスエントロピーを最小化することを目的としている処理。0.5は学習係数。
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

//セッション開始と初期化処理
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)

//1000回のループ。
for i in range(1000):
//55000ある入力画像の中から、100個の画像とラベルをランダムで取り出す
batch_xs, batch_ys = mnist.train.next_batch(100)
//最急降下法にて、クロスエントロピーを最小化するべく重みとバイアスを調整する。この過程をモデルのトレーニングと書かれている。
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

//画像入力に対しての出力のyと、正解のy_を比較し、等しければtrue、違えばfalseの配列を定義する。
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

//castすることでtrue→1、false→0の文字列に変換し、平均値を求めている。全て正解であれば1になるが、このケースだと0.9以上の数値で出力される。
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

//テスト用画像セットを入力として、訓練したモデルを使って正解率を出力する。
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

まとめ

最初見た時は分かりづらかったが、以下のようなポイントだと理解した。

1・手書き数字の画像を784の長さの配列に見立てる。それぞれ正解の数字もセットとなっている。
2・多くの訓練用の画像を準備することで、正解の数字(0〜9)をそれぞれ表す784の長さの配列(この例では「重み」と呼ばれている)を調整する。入力した画像に一番近似している重みの配列の数字が出力されるようになる。(これが y=softmax(Wx+b)
3・複数の入力画像と正解の画像群を準備することで、最急降下法を使うことで、0〜9の数字を表す重みの配列を調整することが可能となる。多くの訓練用の画像に訓練させるほどモデルの正確さが上がっていく。
4・最後にテスト用の画像を使って出来上がったモデルの精度を確認する。

MNIST For ML Beginnersの和訳

Tensorflowのチュートリアルともいえる「MNIST For ML Beginners」の英文について、機械学習初心者ということでまず文章を和訳してみました。

公式サイト(英語)はこちら

このチュートリアルは、機械学習とTensorFlowの初心者向けの内容となっています。
もしあなたがMNISTが何かを知っていて、多次元ロジスティック回帰(ソフトマックス回帰)が何かを知っているのであれば、こちらの上級者向けのチュートリアルのほうがよいでしょう。
どちらのチュートリアルにしても、事前にTensor Flowをインストールしておいてください。

プログラムについて勉強するときには、まず最初に「Hello World」を出力する伝統があります。
機械学習ではMNISTがHello Worldに相当します。

MNISTはシンプルなコンピュータのためのデータセットです。
それは、以下のような手書き文字で構成されています。

手書き文字

また、この文字セットはそれぞれの画像に対して、その文字が何であるかを示すラベルを含んでいます。
例えば、上記の画像に対してのラベルは5,0,4,1です。

このチュートリアルでは、モデルを文字が何であるかを予測できるように訓練します。
目的としては、最先端のパフォーマンスを達成する精巧なモデルを訓練することではなく(あとでコードを提供します)が、TensorFlowを試してみることです。
そのようなものとして、とても単純なモデルで多次元ロジスティック回帰(ソフトマックス回帰)と呼ばれています。

このチュートリアルで使用するコードはとても短く、たった三行で興味深いことがおきます。
しかしながら、背景にあるとても重要なアイデア(TensorFlowがどうやって動作しているかと、機械学習の中核となるコンセプト)を理解することが重要です。
このため、コードに対して注意深く理解していきましょう。

MNISTのデータ

MNISTのデータは、Yann LeCun氏のウェブサイトにホストされています。
簡単にするため、自動的にダウンロードとインストールするいくつかのpythonのコードを踏んでいます。
このコードをダウンロードして以下のようにインポートするか、以下のように単純にコピー&ペーストします。

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(“MNIST_data/”, one_hot=True)

ダウンロードデータは3つのパートに分かれています。
55,000の訓練用のデータ(mnist.train)、10,000のテストデータ(mnist.test)、そして5000の正規化データ(mnist.validation)です。
この区分はとても重要で、それは機械学習に必要不可欠なものです。

最初にも述べたように、MNISTデータは2つに分かれています。
手書きの文字と対応するラベルです。
この画像を「xs」「ys」と呼び、訓練用のデータセットとテスト用のデータセットの両方に含んでいます。
例として、訓練用の画像を「mnist.train.images」、訓練用のデータのラベルを「mnist.train.labels」とします。

それぞれの画像は28×28ピクセルです。
私たちはこれを大きな数値の配列と解釈します。

MNIST-Matrix

この配列を、線形の28×28=784の数値に戻します。
配列を数値に戻しているのは、画像と一致している限り問題ではありません。
この観点により、MNISTの画像は、とても豊富な構造体(注意:計算的に徹底的な視覚化)付きの、ただの784次元の線形空間です。

データを2Dの画像の構造の情報に戻すことは良くないことでしょうか?
コンピュータがこの構造を利用するとき最適の方法で、チュートリアルの後半でも使用します。
しかしここで使うシンプルな方法がソフトマックス回帰かというと違います。

mnist.train.imagesの結果は、[55000,784]のテンソル(n次元配列)です。
最初の画像の次元のインデックスと、2つ目のそれぞれの画像ピクセルの次元のインデックスです。
それぞれのテンソルのエントリーは、0と1の間であり、特定の画像の特定のピクセルです。

mnist-train-xs

MNISTのラベルは0〜9までで、どの数字がどの画像かを描いています。
このチュートリアルの目的では、ラベルを「one-hotベクトル」とみなしています。
on-hotベクトルは、多くの次元で0ですが、1は1つの次元であります。
このケースで、n番目の数字が、n番目の次元で1であるベクトルであると表します。
例えば、3は[0,0,0,1,0,0,0,0,0,0]です。
結果的に、mnist.train.labelsは[55000, 10] の配列となっています。

mnist-train-ys

これで、現実的なモデルを作る準備ができました。

ソフトマックス回帰

私たちは、MINSTの全ての画像が0〜9までの数字であることを知っています。
私たちは、画像を見てそれぞれの数字に確率を与えることができるようにしたいです。
例えば、私達のモデルは9の画像を見て80%で9だとします、しかし5%の確率で8になり、少ない確率で他のものになります。

これは古典的なケースで、ソフトマックス回帰が自然で、シンンプルなモデルの場合です。
もしあなたが複数の異なるもの確率を計算したいとき、ソフトマックスでできるでしょう。
後で、より宣伝されたモデルを訓練するとき、最終的にソフトマックスの階層になるでしょう。

ソフトマックス回帰は2つのステップです。最初に正しいクラスの入力のエビデンスを加えて、エビデンスを確率に変換します。

特定のクラスの画像から与えられたエビデンスの計算をすることで、いくつかのピクセルの強度の重みつけをします。
ピクセルがそのクラスにおける高い強度を持ったエビデンスを持っている場合、重みは負になり、エビデンスがin favorのとき正になります。

下記のダイアグラムは1つのモデルの重みがそれぞれのクラスを学習していることを表しています。
赤色は負の重みを表していて、青色は正の重みを表しています。

softmax-weights

私たちはバイアスと呼ばれる追加のエビデンスを加えました。
基本的に、いくつかの事象は入力の独立にむしろ近いということができます。
クラスiのエビデンスの結果はxを与えます。

evidencei=∑jWi, jxj+bi

Wiは重みでbiはクラスiとjのバイアスで、入力した画像xのピクセルの総和になっています。
そこでエビデンスの計算を予測された確率に変換します。
yはソフトマックス関数を使用します。

y=softmax(evidence)

ここでのソフトマックスは「起動」か「リンク」関数で、出力された線形関数を必要な形に整形します。
このケースでは、10のケースの確率分布です。
あなたはそれを、エビデンスの計算をそれぞれの入力したクラスの確率に変換することを考えることができます。
それは以下のように定義できます。

softmax(x) = normalize(exp⁡(x))

もしあなたが方程式を展開するのであれば、以下のようになります。

softmax(x)i = exp⁡(xi) / ∑jexp⁡(xj)

しかし、それはしばしばソフトマックスを考えるのにより役立つ第一の方法です。
入力のべき乗と正規化です。
べき乗は、1つ多くのエビデンスのユニットが、いくつかの仮説を倍にする重みを増加することを意味しています。

逆に言えば、1つ少ないエビデンスのユニットは、その前の重みの断片を得る仮説を意味しています。
ゼロまたはマイナスの重みを持つ仮定はありません。
ソフトマックスはこれらの重みを正規化し、そのためそれらは正しい確率分布に加えます。
(よりソフトマックス関数の直感を得ようとするなら、インタラクティブでビジュアルが充実したマイケル・ニールセンの本のをチェックしてみてください。)

あなたはソフトマックス回帰を、Xsが多いですが以下のように書くことができます。
それぞれの出力に対して、xsの重み付けされた合計を計算し、ソフトマックスに適用します。

softmax-regression-scalargraph

もし方程式にするのであれば、以下が得られます。

softmax-regression-scalarequation

この手順をベクトル化して、行列の乗算に変換します。
これはコンピュータの能率に対して効果的です。(それは考え方にも有用です)

softmax-regression-vectorequation

よりコンパクトに、以下のように単純に書くこともできます。

y = softmax(Wx + b)

回帰の実装

Pythonでの効率的な数値計算をするには、一般的にPython外の行列の乗算のような重い処理の演算をするNumPyのようなライブラリーを使い、他の言語に実装された効率のよいコードを使います。
残念ながら、Pythonの全ての演算に切り替えるのに多くのオーバーヘッドがあります。
このオーバーヘッドは、もしGPUで処理を実行するか、分散形式の場合にとりわけ悪く、データ転送に高いコストがかかります。
TensorFlowもまたpythonの外に重くありますが、しかしステップを踏むことでこのオーバーヘッドを避けることができます。
Pythonから独立した単一の重い演算の代わりに、TensorFlowは完全にPythonの外の相互の演算のグラフを描くことを可能にしています。
(このようなアプローチは、少ない機械学習のライブラリーに見られます)

TensorFlowを使うには、それをインポートする必要があります。

import tensorflow as tf

これらの相互演算を、記号変数を処理することで描きます。1つつくってみましょう。

x = tf.placeholder(tf.float32, [None, 784])

xは一定の値ではありません。
それはプレースホルダで、その値は計算を実行するためのTensorFlowへの問い合わせの際に入力します。
私達は、いくつもの入力したMNISTの画像を、それぞれ784次元のベクトルに平坦化したいです。
私達はこれを、[Noneg,784]の型の2Dの浮動小数のテンソルとして表します。
(次元は何の長さにもなりうるという意味ではありません)

私達もまた、モデル重みとバイアスを必要としています。
私達はこれらを追加の入力のように扱うことを想像できますが、TensorFlowはこれらでさえもよりよく扱う方法です:変数Aはインタラクティブな演算のTensorFlowのグラフに存在する変更可能なテンソルです。
それは使用可能で計算によって修正されました。
機械学習のアプリケーションにおいては、一般的に変数によってモデルのパラメーターを持ちます。

W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

私達は、変数の初期値のtf.Variableに与えることによってこれらの変数をつくります。
このケースでは、Wとbの両方をゼロで満たしたテンソルのように初期化します。
Wとbについて学ぶと、それらの初期値が何であるかがそれほど問題にならないでしょう。

Wは[784,10]の型ですなぜならそれの784次元画像のベクトルを、異なるクラス10次元のベクトル掛けたいです。
bは[10]の型を持っていて、出力に加えることができます。

ここまできて、モデルを満たすことができます。それは1つのラインを要します。

y = tf.nn.softmax(tf.matmul(x, W) + b)

最初に、xとWの乗算をtf.matmul(x, W)と表現します。
これは方程式においてそれらを掛けることで反転され、そこで複数の入力の2Dテンソルのxのように扱う小さなコツのようなWxを持ちます。
私達はそこでbを加え、そして最終的にtf.nn.softmaxを適用します。

それでおしまいです。
それはただ私達に、セットアップの短い線の組の後にモデルを定義するための1つの線を取ります。
それはTensorFlowがソフトマックス回帰をとりわけ簡単にするためいデザインされているからではありません。それは単に機械学習のモデルから物理シュミレーションからの幾通りの数値計算を描くための柔軟な方法です。
そしていったん定義されれば、モデルは異なるデバイスで動作できます。(コンピューターのCPUやGPU、そして携帯電話すら)

トレーニング

モデルをトレーニングするために、私達は良いモデルとは何を意味しているかの定義を必要とします。
実際には、機械学習において私達は一般的に、コストまたは損失を呼ぶののを悪いモデルと定義し、そしてどう悪いのかの最小化を試みます。しかしその2つは同じことです。

とても共通として、とてもよいコスト関数は「クロスエントロピー」です。
驚いたことに、クロスエントロピーは情報リオンにおける情報圧縮コードについて考えることから生じますが、しかしながらそれは多くのエリアにおける重要なアイデアを機械学習へのギャンブルに引き上げます。
それは定義されます。

Hy′(y)=−∑iyi′log⁡(yi)

yは予測された確率分布であり、y’は真の分布(入力するであろうひとつの熱いベクトル)です。
いくつの大雑把な判断では、クロスエントロピーはどれだけ真を描くための予測に無駄が多いかを計測します。
クロスエントロピーのより多くの詳細は、このチュートリアルの範囲を超えていますが、しかしそれは理解する価値があります。

クロスエントロピーを実装するために最初に新しいプレースホルダーを正しい解に入力する必要があります。

y_ = tf.placeholder(tf.float32, [None, 10])

そこで私達はクロスエントロピー−∑y′log⁡(y)を実装できます。

cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

最初に、tf.logはそれぞれの要素の対数を計算します。次に、tf.log(y)の要素の_yの要素を乗算します。
そしてtf.reduce_sumはreduction_indices=[1]のパラメータのため、yの2つ目の次元の中の要素に加えます。
最終的に、tf.reduce_meanはバッチの中のすべての例の中央値を計算します。

今は私達は、モデルが何をするべきかを知り、それは、訓練したTensorFlowを持つのにとても簡単です。
なぜならTensorFlowは計算のグラフ全体を知り、それは自動的にバックプロパゲーションアルゴリスム(誤差逆伝搬法)を、どう変数が最小化のコストに影響するかを効率的に決定するために自動的に使うことができます。
そこで選択した最適化のアルゴリズムを、変数を変更してコストを下げるために適用することができます。

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

このケースでは、私達はTensorFlowに尋ねます 50%の傾斜の勾配降下アルゴリズムを使ってクロスエントロピーを最小化することは単純な手順で、そこでTensorFlowは単純にそれぞれの変数を少しのビットをそのコストを減少する方向に移動します。
しかしTensorFlowもまた多くの最適化アルゴリズムを提供します。(1つはラインを調整するだけのことです。)

TensowFlowが実際ここで何をするかは、場合により、新しい操作をバックプロパゲーション(誤差逆伝播法)と勾配降下を実装するグラフに加えます。
そこでそれは単一の操作を変換し、実行したとき、勾配降下の訓練のステップをし、変数をコストを下げるために微調整します。

これでモデルを訓練する準備ができました。
最後にはじめる前に、作成した変数を初期化する操作を加える必要があります。

init = tf.initialize_all_variables()

これで、セッションでモデルを開始することができ、そして変数を初期化する操作を実行できます。

sess = tf.Session()
sess.run(init)

さあ、訓練しましょう。1000回トレーニングのステップを実行します。

for i in range(1000):
batch_xs, batch_ys = mnist.train.next_batch(100)
sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

それぞれのループにおけるステップで、訓練のセットから100のランダムなデータのバッチを得ることができます。
プレースホルダーを置き換えるためにバッチデータの訓練のステップを実行します。

小さなランダムのデータのバッチを使うことを、確率論的な訓練と呼ばれています。
–このケースでは、確率論的勾配降下です。
理想的には、すべての訓練のステップですべてのデータを使いたい、なぜなら何をするべきかのよりよいセンスを提供してくれるからで、しかしそれは高価です。
そこで代わりに、異なる部分集合をいつも使います。
これを行うのは安くて同様の利益を持っています。

モデルを評価する

モデルはどうするでしょうか?

いいでしょう、最初に、どこで正しいラベルを予測するかを解いてみましょう。
tf.argmaxは極度に使いやすい関数で、それはいくつかの軸のテンソルの高いエントリーのインデックスを与えます。
例えば、tf.argmax(y,1)はモデルのラベルで、それぞれの入力に最も近く、tf.argmax(y_,1) が正しいラベルです。
私達はtf.equalを、予測が真とマッチする場合にチェックに使うことができます。

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))

これはブール数のリストを与えます。
何の部分が正しいかを特定するため、浮動小数をキャストし、中央値を取り出します。
例えば、[True, False, True, True]は[1,0,1,1] になり、0,75となります。

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

最終的に、テストデータに正確さを問い合わせます。

print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

これはおよそ92%になるでしょう。

いかがでしょうか?
いや、そうでもないですよ。
実際に、それはとても悪いです。
これはとても簡単なモデルを使うからです。
小さな変更を伴うとき、97%を得ることがでいます。
最高のモデルであれば99.7%の正確さを超えることができます!(より多くの情報については、結果表を見て下さい。)

このモデルから学ぶことの何が問題でしょう。
まだ、これらの結果について少しがっかりすることがあるのであれば、より良くした次のチュートリアルを調べてみて、どうやってより洗練されたTensorFlowを使ったモデルを構築するかを学んでください。

Tensorflowの使い方(MNISTチュートリアル/Mac)

最近AIがいたるところで話題になっているので、Googleが公開している機械学習のツール「Tensorflow」を使ってみました。

ネットで情報を検索しながらやってみましたが、記事が更新されているのかなかなかうまく行かなかったので、やってみて上手くいったやり方を書いてみます。

Tensorflowは、言語がPythonに対応しているということで、Pythonで試してみました。
使用している環境はMac OSXです。
Pythonは2系です。
公式サイトの解説(英語)はこちら

Pythonのバージョンの確認

最初に念のためPythonのバージョンを確認しておきます。
私の場合は2系でしたので、2系ということで進めています。
※ 3系の場合は手順が異なります。

$ python -V
Python 2.7.10

tensorflowのインストール

VirtualenvはPythonの仮想環境を構築するパッケージソフトウェアです。
こちらを導入します。
※ Virtualenv以外にもDockerはAnacondaを使った導入方法などがあるようですが、本記事では割愛します。

pipを使ってインストールします。

$ sudo easy_install pip //pipのインストール
$ sudo pip install –upgrade virtualenv //virtualenvのインストール

仮想環境のディレクトリを作成します。

$ virtualenv –system-site-packages ~/tensorflow

仮想環境をActivateします。

$ source ~/tensorflow/bin/activate # bashを使う場合
$ source ~/tensorflow/bin/activate.csh # cshを使う場合

上記実行後、以下のようにプロンプトが切り替わります。

(tensorflow)$

仮想環境にtensorflowをインストールします。

(tensorflow)$ sudo pip install –upgrade https://storage.googleapis.com/tensorflow/mac/tensorflow-0.9.0rc0-py2-none-any.whl
※ MacOSX、Python2系の場合です。他のOSの場合パスが異なります。

※ 通常のプロンプトに戻す場合は以下で戻すことができます。
(tensorflow)$ deactivate

以上でtensorflowのインストールは完了になります。

tensorflowの動作テスト

tensorflowのインストールが上手くいっているかどうかをチェックします。

$ python
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
Hello, TensorFlow!
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b))
42

コマンドラインで python を実行すると対話形式で実行できますので、上記の通りに記述してみてエラーが起きず、実行結果が上記の通りに返ってくれば問題なく動作しています。

MNISTの動作テスト

MNISTというのは画像認識の機械学習の精度を試すプログラムのようなもので、通常の言語の「Hello World」に相当するレベルのプログラムだそうです。

公式サイトにプログラムの説明は載っていますので詳しい解説はそちらを参考にしてみてください。
記事に断片的なプログラムが掲載されていますが、それらを全て掲載すると以下のプログラムになります。
「mnist.py」など適当なプログラム名をつけて実行します。

実行すると以下のような結果がかえってきたので問題なく動作しています。
※ 一度目の実行はデータをダウンロードしてくるので少し時間がかかります。

$ python mnist.py
Extracting MNIST_data/train-images-idx3-ubyte.gz
Extracting MNIST_data/train-labels-idx1-ubyte.gz
Extracting MNIST_data/t10k-images-idx3-ubyte.gz
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz
0.9187

スプレッドシートで範囲内に出現する文字数を数える方法

Googleスプレッドシートで、特定の範囲内に出現する文字数(あるいは文字列数)を数える方法です。

エクセルでは、SUBSTITUTE関数があるのですが、スプレッドシートではSUBSTITUTEは置換関数なので用途として異なります。

スプレッドシートの場合は、COUNTIF関数でワイルドカードを使うことが出来ます。

=COUNTIF(検索範囲,”*検索対象文字列*”)

上記記述で、検索範囲内に出現する検索対象文字列の出現回数をカウントすることができます。

検索対象文字列を、アスタリスク(*)で囲むことがポイントです。
アスタリスクを使わない場合完全一致になるので、*で囲むことで範囲内の出現回数をトータルでカウントできます。

【Hearth Stone】Ranked Match 勝率 2016年4月度

Mech Mage
1-1

相手デッキ
freeze mage 1-0
murloc paladin 0-1

コンボドルイド
1-0

相手デッキ
zoo worloc 1-0

レジェンドウォーリア
2-0

相手デッキ
ウォーリア 1-0
プリースト 1-0

クラロワおすすめカード

クラロワのおすすめカードについて考察を書いてみます。

まず、このクラロワというゲームは勝つつれてカードが増えていき、その組み合わせでデッキの幅が上昇するゲームなので、どのカードが強いかというのは、そのデッキの戦略によって左右されるわけです。

ただ、その中でもよく使われているカードと言うのは存在しています。

メニュー内にクラロワTVというのがあって、そこで強い人のデッキ構成を見ることができるので、そこからよく使われているカードを調べてみました。

カード名 使用割合
矢の雨 7.8
女性ヒーロー 7.3
エリクサーポンプ 6.7
ダークプリンス 5.3
ゴブリン 5.3
プリンス 5
フリーズ 5
ガーゴイルの群れ 4.7
P.E.K.K.A 3.9
ホグライダー 3.9
男ヒーロー 3.6
ベビードラゴン 3.4
槍ゴブリン 3.4
大砲 3.4
スケルトン 3.1
ファイアーボール 3.1
マスケット銃士 2.8
バーバリアン 2.5
ウィザード 2.5
インフェルノタワー 2.5
テスラ 2.2
ゴブリンバレル 2.2
バルキリー 2.2
スケルトン部隊 1.7
ザップ 1.7
巨大スケルトン 1.4
ナイト 1.1
墓石 1.1
巨大クロスボウ 1.1
ボンバー 0.8
ジャイアント 0.8
ロケット 0.8
ミニP.E.K.K.A 0.6
ライトニング 0.6
ゴーレム 0.6
エアバルーン 0.6
クロスボウ 0.3
バーバリアンの小屋 0.3
ネクロマンサー 0.3
ガーゴイル 0.3
ボムタワー 0.3
迫撃砲 0.3
ポイズン 0.3
ゴブリンの小屋 0.3
バーバリアンの小屋 0.3
0.3
アーチャー 0.3

クラロワTVは上位プレイヤーのデッキが多いので、比較的後半で入手できるカードが多いですね。

まだ調査した数がそれほど多くないので、随時追記していきたいと思います。

【hearthstone】ヒーローごとのアリーナ勝率 201603

アリーナでどのヒーローを使うと勝率が高いか、メモをとっていきます。

自分選択
パラディン
2-0

相手
ウォーロック 1-0
ドルイド 1-0

【hearth stone】Ranked Match勝率記録 2016年3月期

hearth stoneの通常のRanked Matchでの勝率について記録していきたいと思います。

Ranked Match

結果

最終的にRank 13でフィニッシュでした。
後半は仕事が忙しくてあまりプレイできませんでした。

自分のデッキのみ

1:meck mage、コンボドルイド 100% (※ 1戦しかしてない)
2:シークレットハンター 75%
3:バーンシャーマン 66%
4:レジェンドウォーリア 60%
5:フリーズメイジ 33%
6:スペルメイジ、レノジャクソンメイジ、レノジャクソンウォーロック 0%

詳細

使用デッキ
・レジェンドウォーリア
6-4

相手デッキ
freeze mage 1-0
コンボウォーリア 1-0
ramp druid 1-1
ブースト10マナドルイド 0-1
レノジャクソンウォーロック 1-0
テンポメイジ 0-1
マーロックパラディン 0-1
メカメイジ 1-0
dethrattle シーフ 1-0

使用デッキ
Mech Mage
1-0

相手デッキ
シークレットパラディン 1-0

使用デッキ
freeze mage 1-2

相手デッキ
ヒーラー priest 1-0
feeze mage 0-1
Paladin 0-1

使用デッキ
レノジャクソンメイジ 2-3

相手デッキ
スペルメイジ 1-1
シークレットパラディン 0-1
コンボウォリアー 1-0
リブアウトドルイド 0-1

使用デッキ
スペルメイジ 0-1

相手デッキ
ハンター 0-1

使用デッキ
シークレットハンター 3-1

相手デッキ
プリースト 1-0
レノジャクソン ウォーロック1-0
レジェンドウォーリア 0-1
トークンドルイド 1-0

使用デッキ
レノジャクソンウォーロック 0-2

相手デッキ
シークレットパラディン 0-1
オイルシーフ 0-1

使用デッキ
コンボドルイド
2-0

相手デッキ
速攻シャーマン 1-0
トークンシャーマン 1-0

使用デッキ
バーンシャーマン 2-1

相手デッキ
コンボドルイド 1-0
プリースト 0-1
フリーズメイジ 1-0

カジュアルマッチ

以下は、カジュアル対戦での戦績
使用デッキ
レノジャクソンドルイド 2-2

相手デッキ
テンポメイジ 1-2
トークンウォーロック 1-0

負けた時
テンポメイジ:序盤のポータルからの猛攻からレジェンドを連打されて負け
・低マナ域で優秀なカードが少なく、場が支配されやすい
・支配された場をひっくり返せるカードが少ない(しいていえばSwipeがあるが)
・レノジャクソンは強いが、それだけでゲームをひっくり返せるわけでもない

使用デッキ
コンボドルイド 3-3

相手デッキ
ウォーロックトークン 0-1
ウォーロック 1-0
fleeze mage 1-0
オイルシーフ 0-1
メカメイジ 0-1
パラディン 1-0

負けた時:
優位を握られそのまま押し返すことができず:
エリッサが無駄気味なので、Sluge bulcherに変える
Ancient of Warはsnapで手札に戻されるいいカモ
1〜3ターン目の動きが弱い。Swipeしか逆転手段がない

勝った時:
やはり野生の咆哮+2/2×3体のコンボは強い

FFBEでFFTイベント後に聖石の欠片(および星6覚醒用アイテム)は入手できるか

FFBEでは現在FFタクティクスとのコラボを開催中ですが、イベント開催期間は3/3の23:59までとなっているため、その期間を過ぎてしまってから聖石の欠片のアイテムそのものや、星6進化素材をはじめとした交換素材を入手可能かどうか、不安に思う人もいると思うので調べてみました。

結論からいうと、星6進化のための素材は、今後も(おそらくイベントなどを通じて)交換または入手できる機会はあるということです。
集めるのはかなり大変な作業ですので、無課金では期間中には、星6進化素材1セットだけでも入手するのが難しい人も多いと思います。

ただし、「聖石の欠片」というアイテム自体が入手できるのかどうかは不明で、今後のイベントでは星6覚醒用のアイテムは、その他の素材との交換になる可能性はあります。

また、星6進化素材以外のアイテムに関しては、期間内でしか交換できないということです。

そのため、残りの期間は僅かですが、星6進化素材より、他の武器や防具、アビリティなどを優先すべきでしょう。

※ 以下、公式サイトの画像のキャプチャです。
FFBEお知らせ

【WordPress】.htaccessでドメインの301リダイレクト

ウェブサイトのドメイン変更時に、.htaccessを使ってドメインごと301リダイレクトする場合の記述についてです。

example.com を
example2.comに移転する場合の記述です。

# BEGIN WordPress

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(example\.com)(:80)?
RewriteRule ^(.*) http://example2.com/$1 [R=301,L]


# END WordPress

以上の記述をリダイレクトする前のサイトのドキュメントルートに設置することで、301リダイレクトできます。

リダイレクトした後に、WordPressのデータベースの投稿内に含まれているドメイン名は置換します。以下のSQLで置換できます。

update wp_posts set post_content = replace(post_content, ‘example.com’, ‘example2.com’);

【星ドラ】おすすめの上級職の考察

  • 2016年2月10日 2:01 PM
  • iPhone

星ドラで、上級職が本日から解放されましたね。

どの上級職にするか迷っている人もいると思うので、おすすめの上級職について考察を書いてみます。

上級職転職の基礎知識

まず、上級職に転職するには、下級職の2つをレベル50以上に上げる必要があることと、「職業神の聖堂」で、それぞれの上級職への転職に必要なさとりを入手する必要があります。

上級職のメリットとして、下級職では得意武器が3つだったのが、上級職では5つから6つの得意武器があるので、装備できる武器の幅も広がります。
また、基本職ボーナスとして、下級職2職の到達レベルに応じたボーナスを受けることができます。

バトルマスター

必要職業:戦士、ぶとうかレベル50

得意武器:剣、オノ、ヤリ、扇、棍、ツメ

アクティブスキル1:怒り LV5時:2ターンの間攻撃力40%、会心率25%アップ、被ダメージが増え、防御できなくなる。 CT33秒
攻撃力が大幅に上昇し、会心率も上がるが、被ダメージが大きくなり、防御できなくなる。

アクティブスキル2:チャージクラッシュ LV5時:261%攻撃、チャージタイム-30% CT28秒
物理攻撃を与えつつ敵CTをカット。会心も確率で発動。

パッシブ:打ち払う
稀に敵の物理攻撃を無効化する。

バトルマスターの考察

物理攻撃にエキスパートの「脳筋」ともいえる職業です。
装備できる武器の種類も6種類と多いのは良い点ですが、ムチやブーメランなどの範囲攻撃できる武器は装備できません。
ステータスとしては、攻撃力は高いですが守備力が低く、スキル「怒り」でさらに捨て身の状態になります。攻撃魔力と回復魔力は低いため、呪文要員には当然不向きです。
強力なコンボとしては、スキルを全てチャージしておき、「怒り」から攻撃スキルを全て解放して連続攻撃を加えるのは非常に強力です。
スキル「チャージクラッシュ」は、強力なチャージブレイクといったかんじで、攻撃力がチャージブレイク、やいばくだきよりも高く、減らせるCTも多くなっています。

パラディン

必要職業:僧侶、武闘家レベル50

得意武器:ヤリ、杖、扇、棍、ツメ

アクティブスキル1:戦友の盾
ダメージを抑えつつ、指定した味方一人のダメージを引き受ける
スキルレベル5で、3ターンの間ダメージ25%カット。 CT23秒

アクティブスキル2:グランドネビュラ
回復魔力値に依存するイオ系の全体ダメージ攻撃 スキルレベル5でCT30秒。

パッシブ;くじけぬ心
致死ダメージを稀にHP1で耐える。

パラディンの考察

HPを守備力が高い、いわゆる「タンク」の職業です。
上級職での回復役として「スーパースター」「賢者」か、パラディンかというところで悩むところです。
攻撃力が激しい敵との戦闘では、回復呪文と「戦友の盾」のスキルでパーティの生存率を高めてくれます。
特に、強力なボス戦を前にして特定の攻撃に対して耐性のある装備の組み合わせと、サポートスキル+戦友の盾のコンボは、パーティの生存率を飛躍的に高めてくれるでしょう。(ただし、対象は味方1体のみなので、他の2人の攻撃はさばききれません)

欠点としては、自身のスキルによる回復系スキルがないので、回復役にするのであれば、回復スキルのスロットのある武器か、杖を装備するなどでサポートが必要となります。

賢者

必要職業:魔法使い、僧侶レベル50

得意武器:ヤリ、短剣、杖、ムチ、棍

アクティブスキル1:ザオラル レベル5でCT:93秒
指定した味方一人を100%蘇生する。蘇生時HPはスキルレベルにより変化。

アクティブスキル2:連続じゅもん レベル5でCT:20秒
じゅもんスキルを2つ選んで発動する。

パッシブスキル:じゅもんのコツ
こうげき、ほじょじゅもんのCTを10%カットする。

賢者の考察

魔法のエキスパートの職業です。
攻撃魔力も回復魔力も高く、連続呪文で呪文を2つ選んで発動可能な他、蘇生効果の「ザオラル」を使える唯一の職業です。(しかもザオラルは100%蘇生なのはありがたいですが、CTは93秒とかなり長めです。)
魔法使いはこれまで使われない職業だったので、賢者の登場によって人気が出ることがあるかどうかは気になる点です。
欠点としては、物理攻撃と身の守りは低いですが、それぞれ全職業中最下位ではありません。
基本的には呪文アタッカー&回復要員のポジションなので、活かすためには強い杖がほしいところです。
最大HPは低いので、防具で補う必要はあるでしょう。

魔法戦士

必要職業:戦士、魔法使いレベル50以上

得意武器:剣、オノ、ヤリ、短剣、杖、ムチ

アクティブスキル1:魔法連斬 レベル5で威力261%+威力と属性を引き継いだ攻撃 CT40秒
指定した攻撃呪文のあと、属性ダメージ付きの物理攻撃で追撃する。

アクティブスキル2:マジックバリア
仲間全体のじゅもん耐性を上げる。レベル5で2ターンの間25%カット。

パッシブスキル:こうげきじゅもんのコツ
こうげきじゅもんのCTを15%カットする。

魔法戦士の考察

魔法と物理攻撃を兼ね備えた職業です。
バトルマスターと並ぶアタッカーといえる職業で、バトルマスターとどちらを選択するかが悩ましいところです。
バトルマスターと比べるとメリットとしては、全体攻撃可能なムチが得意武器なことや、守備力のステータスが高めなことがあります。また、専用スキルの「マジックバリア」は特にボス戦では役に立つスキルです。
バトルマスターが「怒り」のスキルで捨て身で攻撃をしにいけるのに対して、魔法戦士はマジックバリアで守りを固める印象でしょうか。
デメリットとしては、魔法は使えるものの、攻撃魔力はそこまで高くないので、魔法アタッカーとしてはやや中途半端な印象は残ります。
専用スキルの「魔法連斬」は、CTが40秒と溜まるのに時間がかかるのは難点ですが、威力261%+魔法ダメージ上乗せという、かなり強力な攻撃スキルです。

海賊

必要職業:船乗り、踊り子レベル50

得意武器:剣、オノ、ハンマー、短剣、扇、ブーメラン

アクティブスキル1:荒波の舟歌
味方全体の守備力と息耐性を上げる。
レベル5で2ターンの間、守備力20%、息耐性30%アップ。 CT61秒。

アクティブスキル2:ほうげき
無属性の敵ランダム複数回攻撃を行う。
レベル5で、威力85%の5回攻撃。CT58秒。

パッシブスキル:海の絆
味方にかける「ほじょとくぎ」「ほじょじゅもん」の有効ターン数が1ターン延長される。

海賊の考察

船乗りの上級職といった感じの職業で、味方へのサポートと攻撃を得意としています。
専用すきる「荒波の舟歌」「ほうげき」は、CTこそかかりますがいずれも強力なスキルで、ほうげきに関しては、最大レベルの場合、通常攻撃の4回連続攻撃以上の威力があります。
パッシブスキルの効果もあって、味方へのサポートを行いつつ敵への攻撃を行うのに適した職業です。
欠点としては、ステータス上のちからはバトルマスターや魔法戦士より低いです。

まものマスター

必要職業:船乗り、レンジャーレベル50以上

得意武器:剣・オノ・ハンマー・ムチ・ブーメラン、弓

アクティブスキル1:火炎のブレス
敵全体にランダムな炎系のブレスで攻撃する。レベル5でCT38秒。

アクティブスキル2:かみくだき
敵1体を攻撃しつつ攻撃力・守備力をそれぞれ確率で下げる
レベル5で威力222%の攻撃で、37%の確率で攻撃力と守備力をダウンさせる。CT28秒。

パッシブスキル:ほじょとくぎのコツ
ほじょとくぎのCTを15%カットする。

まものマスターの考察

自然を味方にして戦うタイプ?の上級職の職業。
上級職の専用スキル「火炎のブレス」「かみくだき」はそれぞれ便利なスキルです。

スーパースター

必要職業:踊り子、レンジャーレベル50以上

得意武器:短剣、ムチ、扇、ブーメラン、弓

アクティブスキル1:ハッスルダンス
味方全体のHPを中程度回復する。
レベル5でCTは33秒。

アクティブスキル2:オンステージ
味方全体の攻撃力と素早さを上げる。
効果は使用者が攻撃を受けるか行動不能になるまで永続する。
レベル5でCTは38秒。

パッシブスキル:ほじょじゅもんのコツ
ほじょじゅもんのCTを15%カットする。

スーパースターの考察

スーパースターの特徴は、何といっても、味方全体回復を回復できる「ハッスルダンス」を習得できることです。CTも33秒とそこまで長くないので、貴重な全体回復として、ボスバトルでは役に立つことでしょう。
この職業のデメリットとしては、攻撃力が低めなことと、下級職で覚えるスキルがそれぞれ微妙なものが多いので、物理攻撃+ハッスルダンス、いやしの風での回復要員といったかんじになりそうです。
「ベホマラー」が使用できる武器が登場したら価値が低くなる可能性がありそうな職業ですが、それまでの間は回復要員としては重宝しそうです。
パッシブスキルの効果があるので、ほじょじゅもんの運用要員としても向いています。

まとめ、おすすめの職業

特化アタッカー
・バトルマスター
・魔法戦士

補助よりアタッカー
・船乗り
・まものマスター

タンク
・パラディン

回復+補助要員
・賢者
・スーパースター
・パラディン

魔法エキスパート
・賢者

といったところでしょうか。
レベル50まで上げることはなかなか大変な作業なので、基本的にはこれまで自分の育成してきた職業から転職可能な職業や、また自分が持っている強力な武器が得意武器な職業をベースに考えて問題ないと思います。

MacのOSアップデート後にphpで不具合が起こる場合の対処法

MacのOSアップデートを行うと、自身のMac上に構築していたサーバ環境が動かなくなる場合がありましたので、対処法のメモです。

まず、私のケースでいうと、不具合が起きたのが、PHP+MySQLのサイトです。
(EC-CUBEサイトを構築)

アップデート前は動いていたのが、アップデート後には画面が真っ白になるなどのエラーが起きるようになってしまいました。

私の場合、EC-CUBEでのエラーだったので、EC-CUBEのログファイルを確認

/data/logs/error.log

確認すると、以下のようなエラーが起きていました。

Fatal error(E_USER_ERROR): DB処理でエラーが発生しました。
SQL: [SET SESSION storage_engine = InnoDB]
PlaceHolder: [array (
)]
MDB2 Error: connect failed
_doConnect: [Error message: No such file or directory]
[Native code: 2002]
[Native message: No such file or directory]

要は、DB接続に関するエラーです。

ここで、ネットでいろいろと調べてみたのですが、トラブルシューティングのポイントとしては、

MACは、OSアップデート時に各種設定ファイルを初期化するが、バックアップはとっている

ということです。
具体的には、今回のケースでいえば

Apacheの設定ファイルである「httpd.conf」「php.php」を、アップデート前のファイルと比較します。

ターミナルから、以下の方法で差分を確認できます。

httpd.confの場合

diff /etc/apache2/httpd.conf /etc/apache2/httpd.conf.pre-update

差分の部分を、httpd.confに追加してやります。

php.iniの場合

php.iniは、まず、アップデートするとそもそもphp.iniがなくなっているので、作成から入ります。

cp /etc/php.ini.default /etc/php.ini

これでphp.iniが作成されるので、あとは差分を比較します。

diff /etc/php.ini /etc/php.ini-◯.◯-previous

差分をphp.iniに適用してやります。

これで設定が同じになるので、アップデート前動いていたのであれば動くようになるはずです。

適用した後、

sudo apachectl restart

でapacheを再起動するとOKです。

nginx+hhvm+fastcgiが遅かったのを解消

先日WordPressサイト構築用に、爆速WordPress対応サーバーという「kusanagi(クサナギ)」というサーバを契約してみました。

サーバの設定は

Webサーバがnginxで、PHPがhhvmです。

それで早速使ってみたのですが、WordPressは確かに早くなりました。

ただ、何故か通常のPHPスクリプトの実行に非常に時間がかるどころか、タイムアウトを頻繁に起こす状態に。
特に、軽いPHPの場合は問題なく処理できるのですが、大きいファイルサイズのPHPの場合は頻繁にタイムアウトを起こしてしまう自体に・・・。

それで、nginxの設定とひたすら格闘していたのですが、何とか原因がわかりました。

このkusanagiというサーバ特有の設定で

fastcgi_buffers 8 256k;

という設定が設定ファイルの中に入っていたのですが、よくわからないのですが、この前半の「8」というのが小さい値すぎたみたいで

fastcgi_buffers 800 256k;

とか大きいサイズにしたら問題なく動作するようになりました。

サイズに関しては環境によって適切な値が異なると思うので、一番あった値に調整してみてください。

【Hearthstone】リング・オブ・エクスプローラーレビュー

Hearthstoneで新しいソロアドヴェンチャー「リング・オブ・エクスプローラー」がスタートしました。

現在1週目ですが、順次解放されていくとのことなので、入手できたカードのレビューをしてみたいと思います。

ハンター

探検家の帽子
コスト2でミニオンに+1/+1。つけたミニオンが死亡すると手札に戻ってくるというカード。
コスト1ならまだ使ってみようという気になりますが、コスト2でこの効果はちょっと渋い気がします。
速攻でテンポ重視のハンターのデッキにはあまり居場所はないでしょう。

メイジ

忘れられた松明
3マナで3点のダメージ。使った後デッキに戻って再度引いた場合は6点のダメージを与えることが出来るカードです。
弱くはないですが、正直微妙かもしれません。
メイジのカードには、2マナ3点フリーズ、4マナ6点があるので、それらに加えてデッキに入れるスペースがあるかどうか。
ただ、あまり多きの期待はできないですが弱くはないので試しに使ってみる価値は十分あるでしょう。

パラディン

1マナのシークレットで、場に出た時に相手の場に3体以上の生物がいると、追加で出てきた生物を破壊します。効果が限定されるので微妙だと思いますが、シークレットパラディンに入るかどうかというところでしょうか。

ウォーリア

オブジディアン・デストロイヤー
7マナ7/7で、ターン終了時に1/1Tauntを呼び出します。
弱くなったDr.Doomといったところ。

ウォーロック

闇の売人
2マナ2/2で、場に出た時ランダムに選ばれた1マナのカード3枚から1枚を選びます。
2マナのミニオンとしては悪くはない性能です。

ニュートラル

西風の精
5マナ4/6とサイズがけっこうでかいです。
能力として、他の生物へ自分が使った呪文の効果がこいつにもつくというもの。
はまったら強いかもしれませんが、コンボを狙ってデッキに入るかというと微妙なところ。
アリーナでは普通に5マナ4/6というだけでそこそこ強いのでピックする機会はあるでしょう。

宝飾スカラベ
2マナ1/1で、場に出た時、ランダムに選ばれた3マナのカードから1枚を選びます。
弱くはないですが、1/1というのが場へのインパクトがすくなすぎて何ともというかんじです。
アリーナで使うことはあるでしょう。

アヌビサス・センチネル
5マナ4/4で死んだ時に他の生物に+3/+3の効果があります。
正直5マナ4/4という時点で微妙というかんじです。
他のミニオンを除去されてから倒されると何の効果もないので単体で出したときの弱さも特筆です。

召喚石
5マナ0/6で、スペルを使った時にランダムでそのコストのミニオンを召喚します。
この専用のデッキを組んでみようと思わせるという意味では面白いカードですが、いかんせんパワーもなくコストも高めなので強くで使うというより、何とかこのためにデッキを組んで使ってみようかというかんじかと思います。

轟きのエレメンタル
4マナ2/6で、こいつがいると、場に出た時の効果を持つ生物が場に出た時ランダムの敵に2点のダメージを与えます。
こいつをいかした専用のデッキを組みたいと思うかというと…微妙なところです。

古代のシェード
4コスト7/4にでた時自分のデッキに呪いを仕込み、引くと7点のダメージを受けます。
正直微妙すぎます。タフネスが4なので死にやすく、パワーが7なので「Big Game Hunter」の餌食になってしまいます。デメリットの7点ダメージも馬鹿になりません。

レノ・ジャクソン
6マナ4/6で、自分のデッキ内容が全て1枚ずつだったらライフを全回復できます。
発動できれば強いですが、制限内容にはガチデッキの場合少し無理があるでしょう。

liuxでログファイル肥大化の対策

最近、個人で使っているVPS(仮想専用サーバ)が、頻繁にダウンするという現象が起きていたのですが、原因がサーバのディスク容量がいっぱいになっていたことでした。

どこがサーバの容量を圧迫している原因になっていたかというと、PlESKのログファイルでした。

PLESKのログファイルは、以下の場所に出力されます。

/var/www/vhosts/ドメイン名/statistics/logs

ここに出力される error_log と access_log が、サーバ標準の設定ではログローテーションの設定がされていなかったため肥大化し続け、気がつけばサーバ容量の大半を圧迫していました。

対策として、以下の2つを行いました。

1.PLESKログのローテーションの設定

PLESKのログのローテーションは、PLESKログイン後、以下から変更することができます。

ウェブサイトとドメイン → ログ → 該当ドメインの「表示する」 → ローテーション

2.ディスク容量が少なくなった時アラート設定

PLESKのログのローテーションが設定されたとしても、ログファイルは他のアプリケーションから知らないうちに生成されていることがあり、気がつけば同様のことが再度起こる可能性があります。

そのため、サーバのディスク容量が一定以下となった場合、管理者へメール通知をする設定を行いました。

これには、以下のブログ記事が参考になりました。

>Linux – ディスク使用量監視&メール通知! – mk-mode BLOG

パーティションの容量を確認して閾値以下だった場合管理者へメールを送信するシェルスクリプトを作成し、cronで実行します。

https://gist.github.com/komasaru/9580138

【Hearth Stone】The Grand Tournament個別カード評価

Hearth Stoneで、新シリーズ「The Grand Tournament」のカードの一部がTavern Brawlで遊べるようになっていたので、早速遊び倒してきました。

それぞれのカードの個別の感想と100点でのArenaでの点数を書いてみたいと思います。

全体的に運ゲーっぽい要素が少し増えたかなというかんじがしないでもないですが、新しいカードが多く登場するのはやはり新鮮です。

Neutral

Common

Lowly Sqruire

コスト1 1/2
Inspire:Attack+1を得る

アリーナ点数:65/100

1コスト1/2で、Heroが起動型能力を得るとパワーが+1されます。
このパワーが+1されるというのがターン終了時まででなく永続的というのがポイントです。
1コストのミニオンとしては優秀な部類に入ります。
後半に引いた場合でも、1ターンにヒーローパワーを複数回起動できるカードとの組み合わせで一瞬にしてパワーが5を超えるような場合があるので侮れません。

Tournament Attendee

1コスト2/1 Taunt

アリーナ点数:55/100

1コスト2/1でTauntを持っています。
同じくコモンで1マナ1/2でTauntのミニオンがいましたが、あちらに比べると攻撃的な性質を持っていて、先行で1ターン目に出した場合などにプレッシャーをかけていくことができます。

Lance Carrier

3コスト2/1 Divine Sield, Charge

アリーナ点数:75/100

3コスト2/1で、ChargeとDivine Shieldを持っています。
Health2以下のミニオンを一方的に倒すことができ、ゲーム序盤での優秀さはかなり高いです。
3コスト3/1でDivine SieldのSacret Crusaderがいますが、あちらに劣らず優秀です。

Dragonhawk Rider

3コスト 3/3 Inspire:ターン終了時までWindfuryを得る。
アリーナ点数:50/100

3コスト3/3で、Inspireでターン終了時までWindfuryを得ます。
状況によってはアタッカーとして活躍することもありますが、性能としては至って普通です。

Evil Heckler

4コスト 5/4 Taunt
アリーナ点数:80点

以前の5コスト5/4Tauntのミニオンはなんだったのという、同じ能力で1コスト下がって登場のミニオン。
4コスト5/4のBeastの評価はいまひとつでしたが、Tauntが付くことで、状況によっての場の支配力がアップして当然強力です。

Maiden of the Lake

4コスト 2/6
あなたのHero Powerのコストを1減らす

アリーナ点数:80点

Heroの起動型能力のコストを1下げるユニット。
今回のInspire持ちのミニオンとの相性が抜群です。
Healthが6あるので死ににくいのも高評価のポイントです。複数回Hero Powerを起動できるミニオンとのコンボでゲームを制圧できることがあります。

Refreshment Vendor

4コスト 3/5 Battlecry:両方のHeroのHealthを4回復する。

アリーナ点数:50点

場に出た時の効果は、有利に働くこともあれば不利に働くこともあります。
つまり、普通の4コスト3/5ですが、ただそれだけでもそこそこ使えます。

Kvaldir Raider

5コスト4/4 Inspire:+2/+2を得る
アリーナ点数:75点

5コスト4/4ですが、Inspireで永続的に+2/+2の修正を得ます。
2回もHero Powerを起動することができれば8/8とあっという間にゲームを支配するサイズに成長します。

Captured Jormungar

7コスト 5/9
アリーナ点数:55点

7コスト5/9のビーストです。
場に出るともちろん強いのですが、コストが高いので、普通です。
7コスト7/7のWar Golemと似たような評価になります。

North Sea Kraken

9コスト9/7 Battlecry:4ダメージを与える
アリーナ点数:55点

9コスト9/7のビーストで場に出た時の4ダメージを与えます。
シャーマンの6コスト6/5+3点の強化版なので場に出るともちろん強いのですが、コストが重いのが難点です。

Rare

Armored Warhorse

4コスト5/3 Battlecry:ランダムMinionカードでのコスト勝負に勝つと、チャージを得る
アリーナ点数:40/100

4コスト5/3で、場に出た時のカードコスト勝負に勝つとチャージを得ます。
チャージを得ることが前提で普通の性能といったところです。
もし失敗すると標準以下のカードの性能です。

Master Jouster

6コスト 5/6 Battlecry:ランダムカードコスト勝負に勝つと、TauntとDivine Shiledを得る。
アリーナ点数:75点

6コスト5/6で、場に出た時のカード勝負に勝つとTauntとDivine Shiledを得ます。
勝負に勝つことが前提の場合、以前からあった4/5のTaunt+Divineシールドの生物よりも強いので当然優秀です。
ただし、勝負に負けると標準以下のミニオンの性能となります。

Epic

Garrison Commander

2コスト 2/3
1ターンの間にHero Powerを2回使えるようになる。

アリーナ点数:75/100

2コスト2/3で、1ターンの間にHero Powerを2回使えるようになります。
2コスト2/3という時点で普通に使えるミニオンですが、状況によってはゲームの流れを変えることもあります。
特に、メイジやハンターのような複数回ヒーローパワーを起動すると強いヒーローと相性が良いです。
ただし、ゲーム序盤のマナが十分にない状況では思うように活躍もできません。

Kodorider

6コスト 3/5 Inspire:3/5のWar Kodoを召喚する。

アリーナ点数:75点

6コスト3/5というサイズ自体はかなりいまひとつですが、Inspireで自身と同じサイズを持ったkodoを召喚できます。複数回起動することができれば、あっという間にゲームを制圧できます。

Frost Giant

10コスト 8/8 Heropowerを使用した数だけコストが減る

アリーナ点数:80点

10コスト8/8ですが、Heropowerを使用した回数だけコストが減少します。
中盤以降になるとコストパフォーマンスに優れたミニオンで、後半になると0コストで出る場合もありますが、序盤にプレイすることは難しいです。

Hunter

Common

Bear Trap

コスト2 Secret:あなたのHeroが攻撃された後にTauntを持つ3/3のBearを召喚する。

アリーナ点数:50点

攻撃されたときに出るのではなく、攻撃された後に出るのが惜しいSecret。
2コストで3/3Tauntが出るのはコストパフォーマンスに優れているが、防御的なカードで攻撃的な使い方ができないのが惜しい。

King’s Elekk

コスト2 3/2 Battecry:カード勝負に勝つとそのカードを手札に加える。

アリーナ点数:75点

2コスト3/2という時点で既に合格ラインで、およそ1/2の確率でカードを1枚引くことが出来る。2コストで召喚できる生物としては優秀な性能。

Rare

Ram Wrangler

コスト5 3/3 Battlecry:自軍にBeast Minionがいると、ランダムのBeast Minionを召喚する。

アリーナ点数:60点

場に他のビーストがいると、ランダムでビーストを1体召喚する。
運が良ければ9/9チャージのビーストが出ることもあり、運ゲーを痛感できるが、1/1のBeastが出たりするとがっかりする。
強いときは強いが、強さが安定しないカード。

Epic

Lock and Load

コスト2 このターンにSpellをプレイするたびに、ランダムのハンターカードを手札に加える。
アリーナ点数:30点

これまでになかった面白いタイプのスペルカード。
状況に応じては多くのカードを引くことができるが、入手できるカードがランダムなのと、多くカードを引くにはマナが多く必要になるので、安定して大きな効果を得ることが難しい。

Legendary

Acidmaw

コスト7 4/2 他のミニオンがダメージを受けるたびにそのMinionを破壊する。
アリーナ点数:30点

7コスト4/2というのはかなり弱いが、場に存在していると、何でもダメージを与えるたびに他のミニオンが破壊されるようになる。
3コストで敵ミニオンの数だけ1/1ハウンドを出すカードとのコンボが強力で、敵ミニオンを全て破壊することができる。
状況によっては場の形成を変えることができるが、コストが高い上に安定して高い効果を発揮するのは難しい。

Mage

Common

Spellslinger

3コスト 3/4 Battlecry:ランダムのSpellカードを両方のプレイヤーの手札に入れる

アリーナ点数:80点

場に出た時に両方のプレイヤーの手札にランダムのスペルカードを入れる。
追加効果は完全に運ゲーで、たいていは微妙なカードが入手されるが、状況に応じて強力なカードがてにはいり、状況を有利にすることがあれば不利になる場合もある。
とはいえ、基本的に3コスト3/4というだけで強いのでそれだけでデッキに入る。
盤面が有利で押しているときに出すかどうかは判断が難し場合もある。

Flame Lance

5コスト 対象のミニオンに8ダメージを与える
アリーナ点数:60点

ミニオンに8ダメージを与えるカード。
実質的にほとんどのミニオンを除去することが可能だが、5コストと重いのと、本体を対象にできないので4コスト6点に比べると評価は落ちる。

Rare

Fallen Hero

2コスト 3/2 あなたのHero Powerが与えるダメージを1増やす

アリーナ点数:80/100

2コスト3/2という時点で普通のミニオンで、追加性能がメイジのHeroダメージが1増えるということでかなり強力。序盤でも活躍でき、2コストのミニオンとしてはトップクラスの性能といえるだろう。

Polymorph: Boar

3コスト 対象のミニオンを、チャージを持つ4/2のBoarに変身させる。

アリーナ点数:70点

4コストで1/1の羊に変えるのと似た性能を持ちつつ、攻撃的にも使えるようになったカード。
相手の高コストの強い生物を除去するのに基本的には使用するが、相手のライフの状況によっては、自軍の生物を猪に変えて特攻させることでとどめの4点ダメージを入れることもできる。

Epic

Coldarra Drake

6コスト 6/6 Hero Powerが何回でも使用できるようになる。

アリーナ点数:80点

6コスト6/6というのは普通だが、HeroPowerが何回でも使用できるようになる。
コモンのHeroPowerのコストが1になるミニオンとのコンボが決まれば、1ターン生き残ればゲームを終了させるこもできる。

Legendary

Rhonin

8コスト 7/7 Deathrattle:3枚のArcane Missilesをあなたの手札に加える。

アリーナ点数:40点

8コスト7/7というのはとにかく重いが、Deathrattleの能力が発動すれば強力。
ただし、Battlecryでなく、Deathrattleなのが残念で、効果を発揮するには自身が死亡しなければならない。
Dr.Doomと比較すると使いにくさが目立つミニオン。

EC-CUBE3.0のカスタマイズについて調べてみた

EC-CUBE3.0のインストールまでについては前回の記事でやってみました。

今回はカスタマイズについてどう変わったのか検証してみたいと思います。

テンプレートの修正

まず、テンプレートの修正については、EC-CUBEの管理画面から行うことができます。

EC-CUBE3.0管理画面

旧バージョンと比べてナビゲーションが左側になっていますが、ここから編集したいページやブロックを選択するのは同じです。

レイアウト編集かページ編集を選択します。

レイアウト管理

レイアウト管理の画面です。
ここは、EC-CUBEの旧バージョンとほぼ同じです。

ページ編集画面

次にページ編集画面を見てみます。

ページ編集画面

テンプレートの記述方式が、以前のSmartyからTwigに変更になっているため、記述が少し変わっています。
ただ、基本的にはHTML部分+変数部分という意味では同じなので、記述方法が変わっているだけで大きく変わったという印象はありません。

また、author、description、keyword、robotsなど、ページごとにmeta設定を書くことができるようになっています。

以前のEC-CUBEを触ったことがある人であればそれほど難しくはないでしょう。

プログラムのカスタマイズ

さて、続いてはプログラマの人に関しては重要なプログラムのカスタマイズ方法について見ていきます。

まず、テンプレートエンジンがTwigに変更されているので、プログラムの構成がかなり変わっています。

以前は、カスタマイズをする場合は
/data/class/ 以下、または /cata/class_extends/ 以下のフォルダを修正していましたが、フォルダ構成が大幅に変わっています。

プログラムの動作部分のファイルは「src/Eccube」以下にあります。

言語がPHPと、オブジェクト指向で、またテンプレート部分とロジック部分を切り分けて作られているというのは旧バージョンと同様です。

どうやってカスタマイズするかは、カスタマイズの内容によって異なるので何ともいえませんが、ファイル名でおおよそのあたりは付くようになっています。

問い合わせ=ContactController.php
購入=ShoppingController.php

など…。

データベースの構成に関しては、基本的に変わっていない印象を受けました。

データベース構成はほぼそのままに、プログラムのロジックの部分はほぼ丸ごと作り変えられたかんじになっています。

この部分に関しては、Twigのほうがカスタマイズをしにくいというのではなく、古いバージョンに慣れた人であれば、はじめはTwigのプログラムを理解するのにある程度苦労するものと思われます。

カスタマイズにプラグインを使用する

EC-CUBE3.0は、カスタマイズするのにプラグインを使用できます。
しかし、公式サイトを見ても、今のところプラグインは2系に対応したものしかないようです。
そのため、プラグインに関しては、今後3系に対応したプラグインが開発されるのを待つしかなさそうです。

総括

テンプレートとデータベースに関しては、あまり旧バージョンとの違いはありませんが、プログラムのロジックの部分が旧バージョンからTwig用にほぼ作りなおされているので、プログラマの人は旧バージョンに慣れていると、おそらくはじめはカスタマイズに苦労するのではないかと思います。
また、カスタマイズできるプラグインも3系に対応したものがまだでていないので、今作るのであれば2系で作ったほうが簡単かもしれません。
ただし、2系に関してはいずれサポートされなくなり、今後の開発も当面は3系で進んでいくと思われますので、どこかのタイミングでは、新規でサイトを作るのにEC-CUBEを使用する場合は3系を使うようになっていくことが予想されます。

EC-CUBE3.0の旧バージョンとの違いとインストール手順

先日国内の、オープンソースのECソフト構築システムとして最も使われている「EC-CUBE」のバージョン3.0がリリースされていたので、早速インストールしてどのようなかんじか試してみました。

EC-CUBE3.0の2系との違い

公式サイトの説明文を読む限りでは、以下のような違いがあり、かなり大幅なバージョンアップといえます。

スマホ対応、デフォルトテンプレートのショップ側、管理画面のレスポンシブデザイン対応

まず、全面的にシステムがスマートフォンに対応しています。
デフォルトのテンプレートがレスポンシブデザインに対応し、また、管理画面もスマホに対応しています。
これは、昨今のご時世を考えれば必然的な流れともいえそうですが、レスポンシブデザインを使わずに、従来のようにPCとスマホをユーザーエージェントで振り分けたい場合は対応に困るとも言えそうです。
実際に、Amazonや楽天などの大手ショッピングモールはレスポンシブデザインを使わずにユーザーエージェントで振り分けています。

テンプレートエンジンがSmartyからTwigに

EC-CUBEは、もともとプログラマ側の作業とデザイナー側の作業を分離するため、Smartyのテンプレートエンジンが使用されていましたが、EC-CUBE3.0ではTwigと呼ばれるテンプレートエンジンが使われています。

基本機能と追加機能の分離

EC-CUBE3.0では、受注管理、商品管理、顧客管理の3つをコア機能としてデフォルトで搭載され、追加機能はプラグインで対応するということで切り分けているようです。
これは、WordPress的な考え方ですね。

自動アップデート、移行ツールを搭載

EC-CUBE3.0では自動アップデート機能と、移行ツールが搭載されているということです。
これにより、例えば脆弱性が発見されたとして、旧来のようにカスタマイズ箇所を洗い出してソースコードを適用するなど専門的な作業が必要とならないそうです。

全体的にWordPressっぽくなった?

EC-CUBE3.0は上記のような特徴があり、全体的にWordPressっぽくなっているといえそうです。
WordPressはブログシステムや一般的なウェブサイトの構築に使われることが多いですが、EC-CUBEは若干用途が異なっているので、例えば管理画面をスマホから使えるニーズがどれだけあるのかとか、レスポンシブデザインはどうなのとか、意見が分かれる部分もありそうです。
ただ、システムはだんだんバージョンアップしていく必要があるということを考えると、結局のところWordPressっぽくならざるをえないのかなという気はします…。

実際にインストールして使ってみた

実際にEC-CUBE3.0.1をダウンロードして使ってみました。
ダウンロードは公式サイトから会員登録することで行うことができます。

EC-CUBE3.0のシステム要件は以下のページから確認できます。

システム要件 / ECサイト構築・リニューアルは「ECオープンプラットフォームEC-CUBE」

システム要件としては、大きく2系から変わっていることはありません。
基本的にはWebサーバとしてのApache or IIS + PHP + MySQLかPostgreSQL の構成となっています。
これは2系と同じです。
ただし、必須となるPHPやデータベースのバージョンは上がっているので、念のため使用するサーバで問題ないかどうか確認しておきましょう。

今回私の場合は、MacのApacheを使ってローカル環境で構築してみました。

まずは、ウェブサーバ上に、ダウンロードして解凍したEC-CUBEのファイルを一式アップロードします。
※ 設置するサイトのドキュメントルートが「html」フォルダになるようにアップロードを行います。

そして、アップロードしたファイルの/html/フォルダにブラウザでアクセスします。

すると、自動で/html/install.php にリダイレクトされてインストールがはじまるのですが

エラー1

何やらエラーが。「Fatal Error:UnexpectedValueException」というエラーがでました。
ごちゃごちゃかいているエラーコードを読み込んでいくと、/app/log/というフォルダに書き込みができないのでログファイルが作成できないということ。なので、フォルダにApacheからの書き込み権限を与えてやります。

もう一度アクセスすると今度は問題なくインストール画面が表示されました。

eccube2

しかし、上の方に何やら警告がでています。
これは単なる個人的なサーバ設定の問題で、テスト環境のphp.iniにtimezoneが設定されていなかったということだったので、設定しておきました。

すると今度は問題なくインストール画面が表示されました。

インストール画面
↑問題なく表示!

権限チェック

権限チェック

まずはディレクトリの権限チェックがあります。
書いてあるディレクトリの権限を変更します。変更して更新を押すと今度は問題無いと表示されました。
以前のEC-CUBEはファイルごとに細かいパーミッション設定が必要でしたが、EC-CUBE3では基本的にディレクトリのみのパーミッションで良いようです。
ただし、権限を追加してくださいとあるだけで、具体的なパーミッション値についての説明がないので、ここで素人の人は少し戸惑うかもしれません…。

サイトの設定

サイトの設定

サイトの名前やメールアドレス、SSL化するか、管理画面にIP制限を加えるかなどを決めることが出来ます。
ここは特に難しい点はありません。
管理画面のフォルダ名も決めることができますが、WordPressと同じ理由で/admin/は避けておいたほうが良いでしょう。
管理者のID、パスワードも変更できますが、同じく管理者IDに「admin」は避けておきましょう。

サイト設定オプション

オプションを表示にすると、メール送信設定もここで設定することができます。

データベースの設定

データベースの設定

次にデータベースの設定です。
こちらもWordPressや旧EC-CUBEと同じで特に難しい点はありませんが、DBサーバのIPアドレスは旧バージョンではなかった箇所ですが、必須となっています。

データベースの種類の選択肢が、デフォルトで「PostgreSQL」になっていたのは、そちらが推奨という意味かもしれません。
(※ 旧EC-CUBEがMySQLよりPostgreSQLのほうが安定していたり速度が出るのは有名な話)

データベースの初期化

問題なくデータベースに接続できたら、データベースを初期化するかどうか確認画面が出るので、初回のインストールは初期化します。

インストールが完了

無事インストールが完了しました。
管理画面に早速アクセスしてみると・・・

Not Foundに・・・

Not Foundになりました。
ApacheのMod_Rewriteが有効になっていなかったのが原因なので、http.confを編集してMod_rewriteを有効にしました。

EC-CUBE3ログイン画面

無事ログインすることができました。
インストール前に、Mod_Rewriteが有効になっているかのエラーチェックが入って欲しいですね。

管理画面
EC-CUBE3.0管理画面

管理画面については、レスポンシブデザインに対応してWordPressっぽい画面になっています。

サイト画面
サイト画面

サイトのほうも、デフォルトのテンプレートはレスポンシブデザインに対応しています。

さて、次はテンプレートや管理画面のカスタマイズ方法ということで調べてみたいと思います。

とりあえず今回はインストールまでをやってみましたが、旧バージョンと比べて難しくなったてということはありませんでした。
むしろ、インストールまでの手順に関しては旧バージョンよりもパーミッション設定の簡単さから簡単になったかなという印象です。

Xcode7で実機でiOSアプリのテストをする

iOSのアプリを開発するには、これまではAppleのDeveloper登録を行う必要がありました。

これには、年間1万円近くの会費をAppleに支払う必要があります。

しかし、実際にアプリを申請せずともXcodeで実機での動作確認をするだけでもDeveloper登録をする必要がありました。
(シミュレーターでのテストだけなら登録は不要です。)

しかし、現在ベータ版のみ配布されているXcode7では、実機テストだけならDeveloper登録が不要になるということです。
※ ただし、アプリの申請を行う場合には、これまで通りDeveloper登録が必要となります。

これは、アプリ開発の勉強をしていて実機テストしたい人にとってはありがたいですね。

かくいう私も早速Xcode7のBeta版をダウンロードしてみました。

それで、手持ちのiPhoneをMacにUSB接続すると、Xcode上のシミュレーターのOSを指定する箇所に、接続したiPhoneが表示されるようになります。

画面キャプチャ1

しかし、私の場合iPhoneのiOSが8.4で、Xcode7ベータ版ではiOS8.3までしか対象にならないため「No provisioning profiles found」とデバイス上に表示がでてしまい最初は実行できませんでした。

iOS8.4を対象にする方法としては、Xcode6を最新版にアップデート後、入っているリソースをXcode7ベータ版にまるっとコピーしてやる必要があります。

以下の記事などが参考になります。

Xcode7.0betaでiOS8.4の実機にインストールしようとしたら「No provisioning profiles found」になるときは – Cretan Blog

コマンドラインから行ってもMac上でコピー&ペーストしても問題ありません。

これで、iOS8.4がXcode7でもテスト可能になりました。

Xcode7設定画面
↑プロジェクトの設定画面からOSのDeployment Targetを8.4にします。

Xcode+Swiftでじゃんけんアプリを作ってみた

最近勉強もかねて、簡単なiOSアプリを作ってみています。

今日は、練習も兼ねて簡単なじゃんけんアプリを作ってみました。

言語はSwiftでOSはiOS8.4、Xcodeのバージョンは7のベータ版です。

じゃんけんアプリの仕様

・相手のジャンケンの画像が表示されている
・相手が何の手を出した、勝ったか負けたか説明のテキストが表示される。
・こちらがジャンケンでどの手を出すかのボタンが3つ置いてあり、ボタンを押すとジャンケンが実行
・相手のジャンケンの画像が表示され、勝ったか負けたか、あいこかが表示される

アプリ作成の手順

1・Xcodeで新しいプロジェクトを作成して「Single View」で作成をする。

2・Storyboardへの配置

Storyboardに、こちらが出すグー、チョキ、パーに対応するボタンをそれぞれ画面に配置する。
相手の手を表す画像を設置するため、「UIImageview」を画面に配置する。
説明のテキストを表示するため「Label」を中央に設置する。
これらのオブジェクトをauto layoutを使って表示位置を調整する。

3・画像のアップロードと設置

グー、チョキ、パーを表す画像を表示するため、画像をそれぞれ準備してプロジェクトフォルダにアップロードする。
アップロードはドラッグ&ドロップでも行えるが、画面左下の「+」ボタンから「Add files to ~~」からアップロードしてもよい。

それぞれのジャンケンのボタンを画像化するため、ボタンのプロパティから画像を選択する。
※ 画像を選ぶと右側のプロパティ画面に画像を選ぶところがある。

相手の手を表すUIImageViewに画像を設定する。
※ 同様に右側のプロパティ画面から設置する。

4・じゃんけん処理コードの記述

Story Boadに設置したそれぞれのオブジェクトをViewControllerのコードにCtrlを押しながらドラッグしてOutlet接続を行います。

また、3種類のジャンケンボタンを右クリックすると表示されるメニューの「Touch Down」の右側にある◯をView Controllerにそれぞれドラッグしてボタンを押したときの関数を作成します。関数名は適当につけたらOKです。

以下は、私が作成した関数のサンプルです。

これで問題なければ実行できるはずです。

以下は、今回作成したアプリの画面キャプチャです。

ジャンケン画像1

ジャンケン画像2

ジャンケン画像3

6歳の女の子がデザイン、ストーリーを考えたiOSアプリ「みんなクエスト」の発想が面白い

みんなクエスト

6歳の女の子がデザインしたゲーム。発想が新鮮で面白い!

本日、Appbankのサイトの以下の記事が面白かったです。

みんな、いい子になれ! 6歳の女の子が作ったRPGがぶっ飛んでいて面白い | 毎日17時更新!アプリをおすすめするAppBank

このアプリ、初期のドラクエのようなiOSのRPGのゲームなのですが、街や敵、武器などのアイテムなどのデザイン(というか、イラスト)、更にはストーリーまでを、6歳の女の子が担当しているということです。

そして、プログラムの部分は父親が担当しているそうです。

どうも、子供がゲームを作りたいということで、父親がゲーム開発者だったので、強力して作り上げたということ。

ゲーム内の絵が、子供の手書きのイラストで、見ていてほぼのぼします。
また、ゲームシステムも、街にある建物には全てトイレがついていてここでトイレができるのですが、時間経過でトイレにいきたくなると戦闘で不利になったりと、いかにも子供的な発想が随所にちりばめられています。

みんなクエスト

全て小さい女の子の手書きイラスト。なんだかほっこりする。


みんなクエスト

ドラクエっぽいかんじ?(笑)

ゲーム内の世界も動物達の世界で、通貨もお金でなくどんぐりで、戦闘でも敵を倒すと「いいこになる」など、大人では考えつかないようなほんわかした(ときに残酷な)ものになっています。

プレイしていたら、大人でも「こんな子供のころあったな〜」と懐かしい気持ちにさせられることがうけあいです。

ゲームとしてもクソゲーということもなく、意外とちゃんと遊べて楽しいです。

そして、この「みんなクエスト」、どうやら2もでたらしく、1は期間限定で無料でダウンロードできるそうなので、この機会に是非プレイしてみてはどうでしょうか。

私も序盤を少しプレイしてみたかんじでは、スマホなので操作性がいまひとつなのと、テンポの悪さに少しいらつくところもありましたが、初期のファミコンのゲームのようなかんじで、けっこうゲーム自体も楽しめるものでした。

みんなクエストのダウンロードはこちらから

みんなクエスト2のダウンロードはこちらから

MySQLのデータベースのテーブルの型の付け方

プログラミングで、データベースのテーブル作成時に考える必要があることが、項目への型の付け方です。

項目に入るのに適した型を付けることでデータベースのデータ量も変わってくるので、なるべく適切な型をつけたいところです。

型の付け方に関しては、以下のサイトの説明が参考になりました。

MySQLのカラム型(有効範囲と必要記憶容量)|MySQL|PHP & JavaScript Room

項目でINT型にするか、SAMALLINT型にするか、TINYINT型にするかなど、それぞれの型でどの大きさの値まで格納出来るかの説明が分かりやすく掲載されています。

例えば数値であってもTEXT型で格納することは可能ですが、型指定ができていにあとソートするときに正しく比較できないこともあるので、正しい型指定をしておくことが推奨されます。

また、MYSQLでは型を指定するときにint(11)などと長さを指定しますが、この意味は、「格納された値が指定した桁数に満たない時に、左側を空白で埋める」という意味だそうで、その意味ではint(100)だろうが特に問題はないようです。
また、オプション属性の ZEROFILL を使用した際に、スペースに代わってゼロが埋め込まれる際の幅だそうです。

基本的には、例えばINTであれば以下の指定で問題ないと思います。

TINYINT(4) -128~127
SMALLINT(6) -32,768~32,767
MEDIUMINT(8) -8,388,608~8,388,607
INT(11) -2,147,483,648~2,147,483,647
BIGINT(20) -9,223,372,036,854,775,808~9,223,372,036,854,775,807

小さい型指定であればそのぶん使用するデータ領域も少なく済みますので、適切な指定が理想的です。

MTGのiOSアプリ「マジック・デュエルズ」がクソゲーだった

マジック・デュエルズ

ストレスしか溜まらないゲームでした。

先日、iOS版「Magic the Gathering」のiOSアプリ「マジック・デュエルズ – Wizards of the Coast」がリリースされました。

昔MTGをやっていた人には、懐かしくてついインストールしてしまった人も多かったのではないでしょうか。

かくいう私もその1人で、ワクワクしながらインストールして早速プレイしてみました。


↑ダウンロードはこちらから。

しかし、チュートリアルも終え、少しプレイした結果、あまりのアプリの残念な出来にがっかりしてしまいました。

以下、残念だと思った点についてです。

全体的にアプリの操作が使いにくい、分かりにくい

まず、全体的にアプリの操作が使いにくいです。
例えば墓地からカードを戻したり、ライブラリーからカードを探したりするときに、カードを選択したのかどうか分からないときがあります。
例えば「グレイブディガー」をプレイして、墓地のクリーチャー・カードを選択したつもりだったのができてなく、何も手札に戻せないといったことがあります。
また、デュエルが終わった後、右下の「進む」のようなボタンを連打しているとすぐ次のデュエルに突入してしまったりといったことがあります。

日本語訳が間違っている

もちろん「マジック・デュエルズ」は日本語訳がされているのですが、ところどころ日本語訳が間違っています。

あるカードをプレイしたときに、カードの選択肢が2つ表示されるのですが、2つの選択肢に同じ意味の日本語が書いてあることがあり、面食らいました。どちらを選択したら望む結果が得られるのか、1/2の状態です。もはや何のゲームをプレイしているのか分かりません。

デイリーボーナスの条件がおかしい

このアプリは、基本無料の課金型のゲームなのですが、他の同じタイプのゲームにあるように、デイリーボーナスが存在しています。
例えば、「白黒のアーキタイプで勝利する」というボーナスがあり、これを達成するとボーナスのコインが貰える仕組みです。
しかし、この「白黒のアーキタイプ」というのが、手持ちのカードから白黒の2色で構築したデッキでなく、構築済みデッキのようなあらかじめカードが決まったデッキを使って勝利しないとボーナスが貰えません。また、この構築済みデッキが弱いので、難易度の一番簡単なゲームでもぼこぼこにやられます。

せっかく自由にカードが集められるゲームなのに、毎日ログインしてボーナスをもらうために構築済みデッキをプレイしないといけないという、マゾ向けの仕様としか思えません。

また、今のところデイリーボーナスの条件が、この「〜のアーキタイプで勝利する」しかありません。

AIの難易度もおかしい

マジック・デュエルズでは、他人だけでなくAIと対戦することもでき、AIの難易度が簡単から難しいまで3段階から選ぶことができます。
しかし、この「簡単」の難易度ですらけっこう難しく、上記の弱いアーキタイプのデッキではぼこぼこにやられてしまいます。

結論・改善待ち

結論として、今の状態ではプレイしていてストレスしか溜まりません。
恐るべき完成度の低い状態でリリースされたアプリだと思います。
今後のアップデートで改善されることを待つしかないでしょう。
MTGをオンラインでプレイしたい人は、Windowsでプレイできる「Magic Online」をおすすめします。

また、iOSでMTGに近いカードゲームをプレイしたいという人には「Hearthstone」がおすすめです。
こちらはかなり面白いので、MTGが好きな人であればはまることはうけ合いです。



Hearth Stoneのダウンロードはこちらから

Xcodeでタブ画面と画面ごとの処理を実装する

Xcodeでのアプリ開発について、まだまだ初心者ですが、勉強中です。

本日は、勉強したタブ画面の実装と、タブ画面ごとの処理の実装について書いてみます。

まず、タブ画面の作成については、下記のサイトの説明が分かりやすかったです。

第16回 タブコントローラーを表示させる|ドットインストールでiPhoneアプリ作成を勉強 | 経験知

詳しくは上記サイトを見てもらうとして、大まかな流れとしては

1・Story BoardへのTab Controllerへの埋め込み
2・追加したい画面の数だけView Controllerを追加
3・Tab ControllerとView Controllerを繋ぐ

といったところです。
これだけで、タブで画面表示が切り替わるアプリが完成します。

ただ、ここまでは簡単に出来たのですが、問題に突き当たりました。

それは、追加したView Controllerの画面への処理(ロジック)を記述できないということです。

追加したView Controllerから、もともとあったView Controllerへ定義しようと思っても…できません。

しかし、結果として、新しいViewConrllerのClassを定義してやる必要があるということが分かりました。

Xcodeの画面の左のプロジェクトのファイルが表示されているところの左下に「+」というボタンがあるので、そこをクリックすることで、新しいViewControllerのClassをプロジェクトに追加できます。

あとは、そのClassファイルと、追加したView Contorollerを紐付けてやることで、追加したClassファイルに処理を追加できることができるようになりました。

XcodeでWebviewを画面ピッタリに表示する

Xcodeで、とりあえず簡単にWebviewを使ってシンプルにウェブページを表示するだけのアプリを作ってみました。

手順
1・Single Veiwのプロジェクト作成
2・storyboadに、右下からWebviewのパーツをドラッグ&ドロップ
3・Webviewを選択し、大きさを画面ちょうどに調整
4・Webviewを選択し、右下にある四角い図形を選択し、Add Constrantsで、上が20、左右下は0に変更。Add 4 constrantsで適用

add 4 constraints

5・Webviewを選択し、右上の「Scales Page To Fit」にチェックを入れる

「Scales Page To Fit」にチェックを入れる

6・ViewControllerに必要なコードを追記

これでコンパイルして実行。

すると、ウェブページは表示されたのですが、右に謎のマージンが開いた状態に。

ここは、左メニューの「Constraints」で、設定されているConstraintsをチェックしていき、項目の中にある「Second item」を調整していくことで画面ピッタリに表示されるようになりました。


↓Story boardのConstraintsが余白に関係しているので、この中から関係ある余白の設定を調整する。


↑Relative to marginのチェックを外す

ポイントとしては、「Scale to Page To Fit」にチェックを入れることと、Constaraints追加後、左メニューに表示される各「Constraints」の設定が余白を表しているので、変な余白が入っている場合は、大抵このどこかにおかしいところがあるということです。
ここを調整していくことで画面ピッタリに表示されるようになりました。

怪しいConstraintsの設定のSecond Itemを「Superview.Leading Margin」にして、Relative Marginのチェックを外してみてください。

WordPressで投稿本文中にソースコードを綺麗に表示する方法

WordPressで、デフォルトの設定だと、本文作成中に、入力エリアにHTMLなどのソースコードを記述すると、そのままタグが解釈されていまい、本文中に入力したコードとして表示されません。

コードとして表示したい場合は、<を&ltと書いたり、コードを整形しないといけないので色々と手間です。

この場合、プラグインを使用すると簡単です。

Crayon Syntax Highlighter

このプラグインが便利でした。

このプラグインをインストールすると、本文中に投稿したソースコードを選択して、エディタ上部に表示された「crayon」ボタンを押すと、詳細設定画面が表示され、「Insert」ボタンを押すと整形されたソースコードに変更されます。

こんなかんじ。

xcode7のApp Transport Securtyエラーの対処

現在ベータで利用できるXcode7で、Web Viewのアプリを作ってテストしていたら、Xcode6では問題なかったHTTPのウェブページ読み込みの動作で「App Transport Securty」のエラーが起きるようになっていました。
これは、HTTPのサイトの読み込みでエラーになるというもののようで、HTTPSのサイトに関しては問題ないようです。

調べてみると、info.plistに以下の記述を追加することで問題なく動作するようになりました。

下記は、全てのサイトの通信を許可するという記述です。
特定のドメインのみ許可するようにしたい場合は、別の記述を追加する必要があります。

info.plistはXcodeで開いてもどこを編集するかわかりにくいですが、テキストエディタで開いてやると下記コードのコピー&ペーストで追加できます。

XcodeとSwiftでアプリ開発1 – ボタン押すとラベルのテキストが切り替わるアプリ

XcodeとSwiftでアプリ開発をする場合のメモについてです。

実際にXcodeで簡単なアプリを作るところからの勉強です。

ボタンを押してラベルを切り替えるアプリ

画面の中央にテキストがあって、ボタンを押すことでラベルの表示内容を切り替えるアプリです。

Xcodeで新規プロジェクト作成

Xcodeで新規プロジェクトを作成します。
「Single View Application」で作成します。

左側のファイルの中から「Main.storyboard」を選択します。

表示される正方形の画面が、実際に表示される画面のモデルです。
ここに色々なパーツを追加していきます。

まずは右下にあるパーツの中から「Label」を選択して画面にドラッグ&ドロップします。

同様に「button」を選択して画面にドラッグ&ドロップします。
表示位置を調整する機能もあります。

次に、「View Controller.swift」を開きます。

これが、コードの部分です。
ここに、プログラムを実行するときに必要なクラスやメソッドを追加していきます。

Xcodeでは、ここに直接ガリガリコードを書かなくても、このソースコードナイに先ほどのstoryboardからパーツをドラッグすることで必要なコードを追記できます。

まずは、先ほど作成したボタンとラベルとView Controllerのソードコード内にドラッグします。名前は適当に決めればOKです。

これで、先ほどのボタンとラベルを表す変数を定義できました。

次に、ボタンを押したときにラベルの表示を切り替えるメソッドを追加します。

storyboardで、ボタンを右クリックし、「Touch Down」の右側にある◯を先ほどのコードにドラッグします。
関数名は適当につけます。

あとは、ボタンを押した(Touch Down)時の処理をこの関数内に書くだけです。

例えば以下のように書きます。

label.text = “Hello World”

これでボタンを押したときに、ラベルを「Hello World」に変更するアプリが完成しました。

実行するとシミュレーターが立ち上がりますので、ボタンをクリックすると、ラベルが「Hello World」に切り替われば問題なく動作しています。

今日のポイント

Xcodeでのアプリ開発は、パーツの画面への設置にStoryboardを使う。
実行処理の記述にView Controllerを使う。
Storyboardからパーツをドラッグすることでコードの記述が最低限で済む。

MacでAVIファイルをmp4に変換する方法

  • 2015年7月10日 7:53 PM
  • Mac

使用しているPCがMacなのですが、AVIファイルだとiMovieで編集できないので困り、他の形式に変換出来る方法を探していました。

以下のMac用のアプリで簡単に変換できました。
値段も無料です。

FREE WMV AVI Converter

簡単にmp4に変換することができ、iMovieにて編集することができました。

Swiftについての勉強メモ

iOSアプリ開発言語「Swift」についての勉強メモ場所です。

Swiftの特徴

高速

Swiftは「速い」という意味。最速の言語というわけではないですが、Object-CやPytonより速いらしいです。

<3>モダン

様々な言語の新しい機能が搭載されているということ
例:複数の戻り値、クロージャ、ジェネリクス、タイプインターフェース、名前空間など

安全

メモリ管理やオーバーフローが自動的にチェックされるなど

開発しやすい

モダンな要素を取り入れることにより、多言語を使っているプログラマからするとObject-Cに比べて開発がしやすいという話です。
playgroundという機能を使えば、コンパイル前に、リアルタイムに実行結果を直ぐに確認することもできます。

Object-Cと共存できる

Object-Cと共存することができるので、アプリの作成で場合によって使い分けすることができます。

var

変数を格納する場所の意味

var x = 2

変数の値は後から変更できる

let

定数を格納する場所の意味

let y = 3

定数の値は一旦格納すると変更不可能

文字列

“” ダブルクオテーションで囲むと文字列として扱われる

let x = “aaaaa”
let y = “bbbbb”
let z = x + y

for文

for i in 1…50 {
 処理
}

iが1〜50までインクリメントさせて処理をループさせる

画面出力

println で画面に情報を出力できます。

println(“Hello World”);

明示的に型を指定

型はコンパイル時に

ホーム

フィード
リンク集

ページの上部に戻る