ホーム > IT関係

IT関係のアーカイブ

apple-touch-iconがiPhoneで反映されないときの対応

「apple-touch-icon」とは、iOS用に、ホーム画面にサイトが追加されたときに表示されるアイコンです。
iPhoneで、サイト閲覧時にメニューから「ホーム画面に追加」をしたときに表示されます。

設置方法としては、アイコン用の画像をアップロードし、ヘッダで

のように記述してからアップします。
画像名は「apple-touch-icon.png」としておくとヘッダに記述しなくても拾ってくれるらしいのでそうしておくのが一般的のようですが、必ずしも指定しないといけないわけではないようです。

このアイコンを設置されたときに、「正しく記述して画像もアップしたのにテストしてみると反映されていない」ということがあったので対応方法について書いておきます。

まずは画像サイズによっては反映されないこともあるようなので、画像サイズは適切かどうかを確認してみてください。
(※サイズは様々なサイズで可能なようですが、私が試してみた場合では144×144で反映されました)

以下の方法を試してみると良いと思います。

1・Safariのキャッシュを消去する

iPhoneのSafariに残っているキャッシュがクリアされていないと反映されなことがあるようです。
キャッシュの消去は「設定」→「Safari」→「履歴とWebサイトデータを消去」から消去できます。

2・画像名を変えて、パスの記述も変えてアップしてみる

この方法でも解決することがあります。
結局、キャッシュの問題なようですが、別名にした画像ファイルをアップしてみて、パスの記述を変更すると試してみると反映されていることがあります。

Laravelのバージョンを確認する

Laravelのバージョンについては、コマンドラインで以下のコマンドで確認することができます。

php artisan –version

ただ、このコマンドをコマンドラインで使用したところ、以下のエラーが出ました。

Could not open input file: artisan

調べてみたところ、このエラーが出る理由としては、Laravelのプロジェクトフォルダに移動していないと駄目ということのようです。

Laravelで作成したプロジェクトのフォルダへ移動してコマンドを実行してみたところ問題なくバージョンが確認できました。

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(検索範囲,”*検索対象文字列*”)

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

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

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

[centos6]cronでデータベースバックアップ設定

重要なデータベースはバックアップをして日時ごとに取っておくといざというときのために少しは安心です。

ここでは、私が行ったcronをつかったバックアップ設定について書いておきます。

rootでサーバにログインして、コマンドラインで以下を実行

crontab -e

出てきた画面に、実行するコマンドを記述して保存します。

4 5 * * 0 mysqldump DB名 > /home/backup/db_00.sql -u ユーザ名 -ppassword
4 5 * * 1 mysqldump DB名 > /home/backup/db_01.sql -u ユーザ名 -ppassword
4 5 * * 2 mysqldump DB名 > /home/backup/db_02.sql -u ユーザ名 -ppassword
4 5 * * 3 mysqldump DB名 > /home/backup/db_03.sql -u ユーザ名 -ppassword
4 5 * * 4 mysqldump DB名 > /home/backup/db_04.sql -u ユーザ名 -ppassword
4 5 * * 5 mysqldump DB名 > /home/backup/db_05.sql -u ユーザ名 -ppassword
4 5 * * 6 mysqldump DB名 > /home/backup/db_06.sql -u ユーザ名 -ppassword

この例では、 /home/backup/ 以下に、1週間のローテーションでデータベースのバックアップを作成しています。
最初の数字はcronの実行間隔を指定しているので、動作確認として、数字以下の命令をコマンドライン上から実行してバックアップが作成されているかを確認しておくといいでしょう。

また、cronが起動しているかどうかは、以下のコマンドで確認できます。

/etc/rc.d/init.d/crond status

crond (pid 1415) を実行中…
のように出るとcronが起動しています。

起動していない場合は、以下のコマンドで起動します。

/etc/rc.d/init.d/crond start

また、cronの自動起動についても、設定されていない場合は以下で設定できます。

chkconfig crond on

また、この設定ではデータベースはサーバ内に保存しておくものなので、サーバ自体がハードウェア的に故障してしまった場合などに取り出せなくなる可能性があります。
そのため、サーバ外の保存領域にも定期的にバックアップをとっておくとより安心です。

centos6でApacheのログ肥大化対策

centos6で、Apacheのログが肥大化してサイトがクラッシュする事故が起きたので、対策を取ることにしました。

調べてみた結果、centos6の場合

/etc/logrotate.conf

このファイルにログファイルのローテーション数と間隔が入っているので修正するとよいということ。
開いてみると

# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 4

と、初期設定では1週間毎の間隔で4つのログファイルを作成するようになっているようです。
で、このくらいでサーバが一杯になってしまっていたようです…。

ディスク容量どんだけ少ないんだって話ですけど、ログは大事といえども、これまでの運用でそこまでログを活用したことがなかったので、以下の様に変更しました。

# rotate log files weekly
daily

# keep 4 weeks worth of backlogs
rotate 4

これで、少しはマシになるはず。これで様子見してみます。

WordPressのサーバ障害対応の記録

今日は、管理しているホームページのサーバに謎の障害が発生し、対応が大変でした。
何とか対応することができたので、備忘録も兼ねて対応の記録を書いておきます。

起きた障害の状況

WordPressのホームページが突然ダウンしてしまい、アクセス不可に。
データベース接続エラーという状況。

原因

サーバのディスク容量がMAXに達していました。
どうしてわかったかというと、FTPでアップしたファイルが全て0バイトになってアップされてしまい、アップできない。
それどころか、アップしたファイルで上書きをしたファイルが破損してしまう。
これは何故か調べてみると、容量がないときに発生する現象ということでした。

さらにディスク容量がマックスのため、データベース接続で問題が発生してしまっていたようでした。

対処法

1.サーバにある不要なファイルを削除

サーバ上の不要なファイルを削除しました。

サーバ上の不要なファイルの見つけ方
コマンドラインで
df -h
これで、まず現在のディスクの使用量が確認できます。いっぱいになっている場合は対処が必要です。
(今回のケースでは100%の使用になっており、早急に対処が必要な状況でした。)

容量を多く使っているディレクトリの見つけ方

du / | sort -nr | head -30

これで、サーバ上の容量の多い上位30のディレクトリを順に出力されます。

確認したところ

/var/log/httpd/

と、Apacheのログファイルのフォルダがほとんどディスク容量を使い切ってる状態でした。
そのため、過去の不要なログファイルを削除して、容量を確保しました。

2.データベースの修復

しかし、ディスク容量を確保しましたが、WordPressのデータベースが破損していて、トップページにアクセスしてもデータベース接続不可。
/wp-admin/にアクセスすると、「データベースの修復が必要」とメッセージが表示されました。

この時点で、phpmyadminにはアクセスできるようになっていたので、念のためデータベースのバックアップ後、データベースの修復を行いました。
データベースの修復は、wp-config.php に define(‘WP_ALLOW_REPAIR’, true); を追加後 /wp-admin/ にアクセスすると修復が必要なテーブルが表示されるので、あとはコマンドラインからMySQLに接続後、

repair table テーブル名;

とコマンドを実行して修正が必要なテーブルを修復します。
すると、これでサイトにアクセスすると無事表示されるようになっていました。

今後の対策

今回問題が起きた原因として、Apacheのログファイルが知らない間に肥大化し、ディスク容量を使いきってしまっていたことにありました。
そのため、まずは対策として、Apacheのログファイルの出力に制限をかける必要があります。
その上で、ディスク容量が危なくなってくると管理者にメールで通知するような仕組みが構築できればなおベストでしょう。

また、今回はデータベースが修復できたので良かったですが、もし破損してしまい修復できないと本当にどうしようもない事態に陥っていた可能性もあるので、念のためデータベースのバックアップをcronで組んでおくことも必要といえそうです。

今思えば・・・

今回起きた状況の事前の状況として、事前にフラグと思えるような現象が起きていました。

1.phpmyadminで画面が真っ白

phpmyadminにアクセスすると、画面が真っ白になりアクセスできず、原因が不明でした。
これも原因がディスク空き容量が少ないことが原因だったようです。

2・FTPで転送できない

あるタイミングから突然FTPでファイルが転送できなくなっていました。
これもディスク容量に空きがないことが原因でした。

このあたりで早めに気がつくことができれば事前に防ぐことができたかもしれないですが、これまでこういった現象に遭遇したことがないので気が付きませんでした。

ハングリード社のitem Robot/zaiko Robotを使ってみた感想

ECサイトを作る案件で、EC-CUBEと楽天との商品連携/在庫連携が必要という案件があり、ハングリード社のitem Robot/zaiko Robotというサービスを使ってみたので感想を書いてみます。

自分がこのサービスを選んだ時にはネット上にあまり情報がなかったので。

それでは、まずはitem Robotから

item Robotの感想

UIや機能は優れていて、使いやすい。
しかし、最大の問題点があった。それは、「重すぎ」。

店舗によって異なるのかもしれないが、商品点数やカテゴリ数が多くなってくると、操作する(例えば商品登録のとき)ときに管理画面が重くなり、作業効率がものすごい落ちた。
お客様からは「重すぎて使えない」ということでブーイングの嵐だったが、我慢して使ってもらっている。

管理画面が重い件をハングリード社のサポートに伝えた所「弊社のほうでも改善するべく検討はいたしております」と返答があったが、その後改善の報告はない。

はっきりいって、作業効率化の為に導入するソフトで管理画面が重いのは使いものにならないといっても過言ではない。

そのため、使う際には上記の点でニーズを満たすかどうか、事前によく検討してからのほうがいいだろう。

また、item Robotはあくまで商品データの同期をとるもので、在庫数の変更はできないということは考慮しておこう。

また、それぞれのモールやソフトに詳しい担当者がいないと、導入の際には非常に苦労するだろう。

zaiko Robotの感想

こちらは、item Robotよりもずっと洗練されていてよいソフトだった。

item robotの管理画面が重すぎて使えないのに対して、zaiko robotはさくさく動いてストレスなく使える。

こちらのソフトはお客様から「導入してよかった」という感想をいただけた。

しかし、item Robot/zaiko Robotは同じ会社が作っているソフトなのに、なんでこう違うのか不思議である。

結論を言うと、item robotは重いせいで使い物にならないソフトだったが、zaiko robotは十分におすすめできるソフトであった。

ハングリード社のサポート対応

あと、最後にハングリード社のサポート対応についてである。

個別には丁寧に対応をしてくれるサポートの方がいて、そこまで対応は悪くはない。

ただ1点問題がある。

対応が遅すぎる

という点である。電話をして調べてほしいことを伝えたり相談して、その調査や返答に時間がかかりすぎる。半日以上かかるということがざらである。

また、電話しても「現在担当がこみあっておりまして、おつなぎできません」ということで、しばしば電話がつながらない。

会社の体制の問題かもしれないが、サポートはお世辞にも素晴らしいとはいえなかった。

以上がサービスを使ってみた感想です。

ホーム > IT関係

フィード

ページの上部に戻る