phpにmycrypt拡張を追加する

phpmyadminを使っていたところ、画面の下に「mycrypt拡張がない」と表示が出たので、調べて入れてみた。

yumでepelリポジトリからインストール

yum install –enablerepo=epel php-mcrypt

エラーが表示された(以下訳)

Resolving Dependencies
依存性を解決しています

There are unfinished transactions remaining. You might consider running yum-complete-transaction first to finish them.
終了していないトランザクションが残っています。
完全なyumのトランザクションを最初から完了まで実行することを検討してください。

The program yum-complete-transaction is found in the yum-utils package.
yumの完全なトランザクションプログラムはyumのユーティリティのパッケージに見つかりました。

–> Running transaction check
トランザクションの実行をチェックしています。

—> Package php-mcrypt.x86_64 0:5.3.3-5.el6 will be installed
php-mcrypt.x86_64 0:5.3.3-5.el6のパッケージがインストールされます。

–> Processing Dependency: php(zend-abi) = 20090626 for package: php-mcrypt-5.3.3-5.el6.x86_64
パッケージのためのphp(zend-abi) = 20090626は依存性があります。

–> Processing Dependency: php(api) = 20090626 for package: php-mcrypt-5.3.3-5.el6.x86_64
パッケージのためのphp(abi) = 20090626は依存性があります。

–> Finished Dependency Resolution
依存性の解決が終了しました。

Error: Package: php-mcrypt-5.3.3-5.el6.x86_64 (epel)
Requires: php(api) = 20090626
Installed: php-common-5.4.20-1.el6.remi.x86_64 (@remi)
php(api) = 20100412-x86-64
Available: php-common-5.3.3-49.el6.x86_64 (base)
php(api) = 20090626

エラー:
パッケージのためにphp(api) = 20090626が必要です。
php-common-5.4.20-1.el6.remi.x86_64 (@remi)がインストールされています。
php-common-5.3.3-49.el6.x86_64 (base)が利用可能です。

You could try using –skip-broken to work around the problem
–skip-brokenをつけることでこの問題に対処できるかもしれません

You could try running: rpm -Va –nofiles –nodigest
rpm -Va –nofiles –nodigestを実行してみてください

訳してみたが、訳しきれないし、結局意味もよく分からない。

ただいえることは、依存性関係でエラーが起きているということである。

エラーメッセージの中の

Installed: php-common-5.4.20-1.el6.remi.x86_64 (@remi)

に注目すると、php-commonがremiで入っているということなので、remiリポジトリからインストールしてみた

yum install –enablerepo=remi php-mcrypt

すると今度は問題なく実行できた。

よく意味は分からないが、結果的にインストールできたので良しとする・・・。

ダイジェスト認証を使うメリットと使用方法

特定のサイトや、公開していない特定のディレクトリに閲覧制限をかけるときによく使われるのが基本認証(basic認証)です。

ただし、基本の認証方法の問題点として、パスワードが平文で送信されてしまうというものがあります。

このため、公衆無線LANなど暗号化されていない場合、かつ非SSLのようなサイトで基本認証のみに頼るのはセキュリティ的に問題があるといえます。

この問題点を解消しているのがダイジェスト認証です。
認証をかけているサイトにアクセスした場合、IDとパスワードを入力するとアクセスすることができるのは同じですが、パスワードが暗号化されて送信されるため、基本認証よりもセキュリティ的に安全性は高いといえます。

ただし、問題点としては基本認証に比べると新しいためか一部の古いブラウザなどに対応していないことです。
ただし非対応ブラウザがIE5以前とか、古いガラケーなどということで、多くの人が通常使用しているブラウザには概ね対応しているということなので、開発用に使用するにあたってはそれほど大きな問題とは言えないと思います。
なお、対応していないブラウザでアクセスした場合はエラーを返してアクセスはできないようです。

また、サーバによっては使用できない場合もあるそうなので、その場合はApacheであればhttpd.confの設定を一行変更することで使用できるようになります。

LoadModule auth_digest_module modules/mod_auth_digest.so

上記記述(最初からある)がコメントアウトされていなければ問題なく使用できます。

設定方法に関してですが、基本認証と同じように .htaccessに記述する方法で設定できます。

ほとんど基本認証と変わりませんね。

.htpasswdの記述方法に関しては、以下のように書きます。

ユーザ名:認証名:暗号化したパスワードフレーズ

例えば、以下の例であれば

user:auth:password

パスワードの部分には、上記の文字列を(user:auth:も含めて)そのままMD5暗号化したものが入ります。

上記の例であれば

user:auth:4481f9057c05e4c3c85c52d9d7dee0f0

が入るわけです。

設定方法は以上になります。

基本認証よりはセキュリティ的に強度は高いので、問題がなければ基本認証よりはダイジェスト認証を使うので良いのではないかと思います。

phpmyadmin設置時に画面が真っ白になるエラー(500)に対処

使用していたサーバに最新のphpmyadmin(この記事を書いている時点で4.7.4)を設置したところ、画面が真っ白になるエラーに見舞われた。

chromeの場合は画面が真っ白になって
「このページは動作していません(500エラー)」
といった内容で、SafariとFirefoxではただ真っ白になるだけ。

初期設定がいるのかと思い、調べてみたところphpmyadminはファイルをアップドーロするだけでよく特に初期設定は不要ということ。

とりあえずphpmyadminは、プログラムはphpファイルなので、index.phpに

ini_set( ‘display_errors’, 1 );

を頭に追加してやり、エラー表示をさせたところ、読み込んでいる特定のphpファイルで

phpmyadmin Parse error: syntax error, unexpected なんちゃらなんちゃら

といったエラーが表示された。
構文エラーが起こっているということ。

調べてみると、最新のphpmyadmin(4.7.4)には、動作するのに php5.5〜7.1 と MySQLの5.5が必要となるということ。

結論をいうと、サーバのphpのバージョンが最新版に対応していませんでした。

phpmyadminのダウンロードサイトで旧バージョンも提供されていたので旧バージョンをインストールしなおすことで解決しました。

CentosでデータベースのバックアップをDropboxに転送する

CentOSでデータベースのバックアップをDropboxに転送する方法についての解説です。

データベースの二重バックアップの必要性

CentOSのサーバでデータベースを使ったサイトを運用している場合に、まずやる設定がデーターベースのバックアップを取って(mysqldump)、同じサーバのバックアップ用のディレクトリに保存するということをやる人は多いと思います。

しかし、この方法だともしサーバ自体に障害が発生して使えなくなったり、あやまって全部消してしまった場合などにデータの復旧ができなくなります。

この場合に、サイトを運用しているサーバ内に保存し、かつ外部のストレージにも保存しておくと、もし何らかの障害がサーバに発生した場合でもデータの復旧が可能になります。

外部ストレージに何を使うか

保存する外部ストレージには最近ではいろいろありますが、安価で有名なストレージはDropboxがあります。
無料の場合は容量に制限がありますが、それでも2GBまでであれば保存可能なので、ある程度までのデータであれば保存可能です。

欠点としては、セキュリティ上の問題は考えられますので、個人情報など重要な情報を含むDBの場合はもっと安全な方法を取るべきです。

Dropboxへのデータの保存手順

Dropboxへのデータへの保存手順にはいくつか方法があります。

まず、サーバにDropboxをインストールして、直接サーバ内のDropboxの保存ディレクトリに保存するという方法もあります。
この方法は分かりやすいですが、調べた所によると問題もいろいろあるようなので今回はパスしました。

他には、Wordpressの場合であればプラグインを使うことでも簡単に設定可能ですが、サイトの数が増えていくると都度プラグインを入れて設定する必要があるので多少手間がかかります

別の方法としては、サーバ内のデータを指定してDropboxにアップロードする方法です。
今回はこの方法を採用しました。

分かりやすいサイトとしては、以下のサイトの説明をほぼそのまま参考にしました。

第54回「SORACOM応用編!ラズベリーパイからDropboxへファイルをアップロード(1)Dropbox-Uploader」 | Device Plus – デバプラ

詳しくは上記のサイトに手順が書いてあるので詳細は割愛。

やり方としては至極単純で、Dropbox Uploaderという便利なシェルスクリプトがあるので、これをダウンロードしてサーバ内に設置して実行権限をつけるだけ。

最初にこのシェルスクリプトを実行するときにDropboxのアクセストークンについて入力しないといけないので、その設定をDropboxのサイトにログインして取得しないといけません。
必要な作業としてはそれだけです。

あとは、そのシェルスクリプトを実行して、引数にファイル元とアップロード先のディレクトリとファイル名を指定してDropboxにアップロードするだけです。

実行してアップロードが確認できれば、それをcronにセットしてやると問題なくDropboxへの転送ができました。

問題点

この方法の問題点としては、まずはDropboxのセキュリティ上の不安というのはあるかもしれないと思うので、個人情報を含むデータなどの場合は注意する必要があります。

それ以外では、Dropboxの容量が知らない間にいっぱいになっていてアップできていなかったというトラブルが起きる可能性はあるので、データのアップロードと保存が失敗した場合にメールでアラートが届くようになるとなお信頼性が高くなります。

phpでGoogleでの検索ランキングを取得する

PHPのプログラムで特定のサイトURLとキーワードからGoogleでの検索順位を取得し、結果を返すプログラムを作りたいと思いました。

理由としては、運営しているサイトの検索順位の日時変動を手動でチェックして記録するというのは手間がかかる作業だからです。

プログラムで実行でき、さらにcronで自動実行し、結果をデータベースに保存するということができれば楽になります。
そういうツールもあるのですが、何かと制限があったり、融通はきかないので。

まず、プログラムで検索順位を取得する方法についてですが、考えられる方法として、Googleの検索フォームにポストで変数を投げて、結果をスクレイピングするというものですが、これは規約によりやるとまずい場合があるということでやめました。
実行回数が多かったり検知されるとIPアドレスをブロックされるということがあるみたいです。
実際にやってないので分かりませんが・・・。

もう1つの方法として、Google Custom Search APIを使用するというものです。
こちらは公式に許可されている方法なので問題はないのですが、無料の場合は1日100クエリまでということで制限が入るようです。

それでこの方法を試してみたところ、一応目的に近いものはできたので、詳細は省略しますが、ざっくりとその過程と、この方法の現状での問題点を書いていこうと思います。

1. Google Custom SearchのAPI keyを取得する

Google Custom SearchのAPIを使用するにはAPI KEYが必要となるので取得します。
方法はネットを探すと出て来る思うのでここでは省略します。

2. カスタム検索エンジンIDを取得する

プログラムの中で使用するカスタム検索エンジンの検索エンジンIDを取得します。
カスタム検索エンジンIDは、カスタム検索エンジンを作成してから、詳細の画面で「検索エンジンID」というボタンを押すと表示されます。
※ 画面はときどき変わってしまいますが、探すと詳細画面のどこかで取得できると思います。

なお、カスタム検索エンジンを作成の際にはどのサイトで使用するかのサイト名を入力する必要があるのですが、作成後に詳細画面から「基本」タブの「検索するサイト」の項目で「追加したサイトを重視して、ウェブ全体を検索する」に設定を変更することで、

3. プログラムを作成する

1.2.のAPI KEYとカスタム検索エンジンIDを作成できればあとは、目的のサイトURLとキーワードから検索結果を取得できます。

プログラムの詳細としては、カスタム検索エンジンに、検索キーワードと、その他のパラメータを引数にしてクエリを作成して引き渡すことで、JSON形式でデータが返ってくるので、それをデコードして解析します。
こう書くとややこしそうですが、プログラムとしてはそれほど複雑ではありません。
以下のサイトが参考になりました。

Google Custom Search APIを使って検索結果のURLを取得する【PHP】 – autofocus onfocus

あとは、それを目的に応じてプログラムをチューニングすると完成です。

私の場合は、複数のサイトとキーワードとサイトで調べたいので、それをテーブルに保存して引っ張り出してきてキーワードとサイトごとに実行して順位を返す。
帰ってきた順位と日付をDBに保存というところまではできました。

問題点

これで一応目的としたものについてはできたのですが問題もあります。

1.無料でのクエリ数の制限

まずは先にもあげたように、無料の場合は1日100クエリまでしか実行できないというもの。
このため、サイトの数やキーワードが増えてくると無料では対応しきれませんので、調べたい数を絞る必要があります。
増やそうと思った場合、1日に追加で1000クエリあたり$5がかかるようです。

2.検索順位が微妙に本家サイトと違う?

あと1つの問題点は、この方法で得られた検索結果と順位が微妙に本家のものと違うということです。
これは理由がよく分からないので、検索結果の厳密さを必要とする場合にこの方法はあまり推奨できないのですが、大まかな目安とする程度であれば問題なく使用できます。
これは、何故検索結果が本家と異なるのかがよく分かっていないので、今後もし原因が分かれば追記しようと思います。

phpでYoutubeの短縮URLを埋め込み用URLに変換して出力する方法

PHPで、Youtubeの短縮URLを、埋め込み用URLに変換して出力する方法についての解説です。

Youtubeの短縮用URLとは、

youtubeの短縮URL

上記のようなURLで、Youtubeの動画を共有ボタンを押すと表示されて、それをSNSやブログに投稿すると、Youtubeの動画が埋め込まれた状態で出力されます。

これは、例えばそれぞれのブログエンジンや、SNSなどが上記の短縮URLを埋め込み用のコードに変換して出力する仕様になっているのでそのようになっています。

そのため、例えばPHPのファイルで、上記のYoutubeの短縮用URLを受け取ってそのまま出力すると、そのまま短縮用のURLが出力されるだけで、埋め込まれた状態で出力されません。

これをそのまま埋め込み用の動画として出力したい場合は、埋め込み用のURLに変換して出力する必要があり、そのための関数を作ってやると出力することができます。

埋め込み用のコード

埋め込み用のコードについてですが、基本的にiframeを使って、先程の短縮URLを一部変形させて埋め込んでやればそのまま出力できるので、それほどややこしい処理は必要ありません。

以下は私の方で作成した関数例です。
関数呼出し時に関数に短縮用URLを渡し、埋め込み用のiframeにしたURLを返却します。
ifameの横幅はデフォルトが560にいていますが、引数として渡すことで大きさを変える事が可能です。

ゲーム市場についての考察

最近のゲーム市場と、今後のゲーム市場についての考察です。

1・日本のゲーム市場について

2016年の日本のゲーム市場は全体が1兆4000億円程度の市場規模。
オンラインプラットフォーム(PC、スマホだが、おそらくほぼスマホ)がここ5年くらいで大きく成長しているが、スマートフォンの普及に伴って
成長率はここ最近は伸びが低調になってきている。
家庭用ソフト、家庭用ハードの合算の合計は10年間で約半分になっていて、ここから増える見込みはあまり考えられない。
一方で、スマートフォンのゲーム市場もある程度天井に近い状態になっている。
スマートフォンゲームの市場規模は大きいが、これもここから増える見込みも今のところ大きく考えられない。
(つまり、競争は激しくなっていく)

現在の日本の市場規模でいうと、家庭用ソフト:スマホアプリ、PCゲーム=2:8。
ユーザ数でいうと家庭用ゲーム:PCゲーム:スマホゲーム=20:10:35 くらいである。

2・世界のゲーム市場について

世界のゲーム市場は10兆円近く。
日本全体と比べると約10倍近い市場規模がある。
日本はゲーム市場として大きいが、中国に抜かれている。(とはいえ、それほど差が大きくない)

ゲームの事情は国によって大きく異なっている。

北米

北米市場は、専用ゲーム機が人気で全体の約半数を占めている。
つまり、PS4やXboxOneや任天堂のゲーム機である。
スマートフォンの市場は全体の15%程度しかない。
ゲーム市場の中でPCゲーム市場が25%程度ある。

中国

中国は全体の7割近くがPCゲーム市場である。
これは政府が海外の専用機のゲームの販売を禁止していたことに起因すうr.
スマートフォンゲームの市場は全体の2割程度である。
家庭用専用機の市場は1割程度しかない。

3・世界のゲーム市場の動向

ゲーム市場を考える上での考え方としての主なポイントは「ゲームをプレイされるハードの種類」「国別・地域別」でどのように市場の大きさが推移していくかということである。

まず、ハードの種類は主に「スマートフォン」「家庭用ゲーム専用機」「PC」という区分に大きく分けることができ、この3つのカテゴリーはそれぞれ推移こそしてもなくなることはほとんど考えられない。
ただ、その割合はある程度変化しつつ推移していくことが予想される。
世界のゲーム市場は今度も成長することが予想されるが、主に成長する市場はスマートフォン市場である。

また、現在主要となっている地域の勢力が今後どのように推移していくかということに注目される。
この15年くらいで起きた変化で一番大きなものは「中国」という国の市場が大きくなり世界最大となったことだろうが、今後どうなるのかということを考えると、まずは多くの人口を抱えているインドだろう。
それ以外にも、人口を多く抱えているアジアがどうなっていくかというところに注目が集まる。
アジアは世界全体の60%の人口が住んでいるが、現在も全体の50%程度の市場規模を持っている。
ただし、これはほとんどが中国、日本、そして韓国で構成されていて(あと少し台湾、インド)それらの構成がどう変化していくか。

2017年のスマホゲームの注目ゲーム

2017年の半分が終わりましたが、下半期にリリースされるスマホゲーム(iOS/Android)で、注目のゲームについてまとめてみました。

テラバトル2(夏)

ミストウォーカーの発売したパルズゲーム「テラバトル」の続編に当たる作品。

予想DL数:150万

テラバトル2 公式トレイラー

ドラゴンクエストライバルズ(未定)

人気ゲーム「ドラゴンクエスト」をモチーフにした本格的なカードゲーム。
ゲームシステムは「ハースストーン」や「シャドウバース」を彷彿とさせる。

公式サイト

予想DL数:1000万

『ドラゴンクエストライバルズ』ティザー映像

どうぶつの森

任天堂とDeNAが共同で開発している人気ゲーム「どうぶつの森」のスマホアプリ。
2017年度後半リリースの予定。

予想DL数:1000万

ファイナルファンタジー エクスプローラーズ フォース

ファイナルファンタジーシリーズのスマートフォンアプリ。
3DSで発売された作品の系列で、ジャンルはハンティングアクション。

予想DL数:200万

公式サイト

アークザラッド

プレイステーションの人気ゲーム「アークザラッド」の続編アプリ。
どういったゲームシステムなのかなど、詳細は現段階では不明。

予想DL数:200万

妖怪ウォッチ

3DSでの人気作品「妖怪ウォッチ」のスマートフォンアプリ。
ゲーム内容は3DSの妖怪ウォッチと近い。

予想DL数:500万

【プレイ映像】『妖怪ウォッチforスマートフォン』

2018年発売の専用ゲームの注目ゲームと販売本数予想

2018年に専用ゲーム機発売予定での個人的に注目のゲームと、販売本数の予想についてまとめました。

モンスターハンターワールド(上半期・PS4)

PS4でのモンスターハンターの最新作。
大幅に進化したリアリティのあるグラフィックが最大の特徴。

予想販売本数: 日本:150万本 海外:150万本

ディシディアファイナルファンタジー NT(上半期・PS4)

ディシディアファイナルファンタジーのPS4での最新作。

予想販売本数: 日本:50万本 海外:100万本

シェンムー3(下半期・PS4)

クラウドファンディングで制作が決定したシェンムーの最新作。

予想販売本数: 日本:20万本 海外:100万本

エースコンバット7(未定:PS4)

PS4で発売予定のエースコンバットの最新作。

予想販売本数: 日本:20万本 海外:100万本

2017年の専用ゲーム機での注目ゲームと売上予想

2017年も残り半年となりましたが、2017年に専用ゲーム機での、個人的に注目の発売ゲームスケジュールについてまとめています。

7月

ファイナルファンタジー12 ゾディアックエイジ(7/13/PS4)

ファイナルファンタジー12のPS4でのリマスター作品。
FF12のHDリマスターでありながら、ジョブシステムなど新要素が追加されている。

売上予想:日本40〜50万本 世界100万本くらい?

スプラトゥーン2(7/21/Switch)

人気を博したスプラトゥーンの続編に当たる作品。
売上予想:日本 100万本 世界:250万本 合計350万本

ドラゴンクエスト11(7/29/PS4・3DS)

国民的RPGドラゴンクエストのナンバリングタイトルに当たる作品。

売上予想:日本 250万本 世界:150万本 合計 350万本

8月

モンスターハンターダブルクロス Switch Ver(8/25/Switch)

ニンテンドースイッチでのモンスターハンターダブルクロス。
高精細な画質でダブルクロスをプレイできる。

売上予想:日本:30万本

NEW みんなのGOLF(8/31/PS4)

PS4で発売するみんなのGOLF。
売上予想:日本:80万本 世界:100万本

9月

アンチャーテッド 古代神の秘宝(9/14/PS4)

PS4で発売されるアンチャーテッドシリーズの作品。
売上予想:日本:10万本 世界:400万本

ファイアーエムブレム無双(9/28/Switch)

Switchで発売されるファイアーエムブレムの無双系の作品。
売上予想:日本:5万本 世界:50万本

英雄伝説 閃の軌跡Ⅲ(9/28/PS4)

英雄伝説、閃の軌跡の続編シリーズ。
売上予想:日本:15万本 海外:15万本

10月

スーパーマリオオデッセイ(10/27/Switch)

スーパーマリオのオープンワールド系のゲーム。
売上予想:日本:100万本 海外:500万本

11月

二ノ国Ⅱ レヴァナントキングダム(11/10・PS4/PC)

レベル5の二ノ国の続編に当たる作品。
スタジオジブリとのコラボではないが、元ジブリの百瀬義行氏とのコラボ作品。
作曲は久石譲氏。

売上予想: 日本:20万本 海外:100万本

ポケットモンスター ウルトラサン・ウルトラムーン(11/17/3DS)

ポケットモンスターの3DSの新作。
売上予想: 日本:300万本 海外:500万本

発売日未定

グランツーリスモ SPORT(秋頃・PS4)

PS4で発売されるグランツーリスモシリーズの新作。
売上予想: 日本:80万本 海外:600万本

ゼノブレイド2(冬/Switch)

Switchでのゼノブレイドの新作。
売上予想: 日本:20万本 海外:80万本

iPhone,iPadでスイッチコントロールが解除できなくなった場合の対処法

iPhone、iPadには「スイッチコントロール」という機能があり、使用することで、特定の入力を繰り返してくれたり、あるいは入力の補助に使えたりしてくれてます。

ただし、何かバグのようなものがあるようで、通常であればホームボタンをトリプルクリックすることで解除できるのですが、解除できなくなる場合があります。

その場合、通常の操作に戻れなくなり、例えば電源を長押しにして一旦再起動をかけようと思っても「電源オフにする場合は横にスライド」のところで詰まってしまい再起動できなくなってしまいます。

その場合の対処法についてなのですが、「ホームボタン+電源ボタンを長押し」で強制再起動をかけることができ、この方法で再起動をかけることで直すことができました。

Yahooショップの在庫なし商品を一括で非表示にする方法

Yahooショップの在庫なし商品を一括で非表示にする方法についてです。

Yahooショップは、ユーザ側在庫がない商品を商品一覧でチェックを入れることで非表示にすることができるのですが、チェックを入れない場合在庫なし商品でもずっと商品一覧に表示されたままになってしまうので、あまり見栄えが良い状態にはなりません。

また、その状態で管理画面から一括で商品を非表示にすることができないので、基本的には一つ一つ商品を非表示にしていくしかない、数が多い場合は対応が大変になります。

そこで、CSVを使うことで一括で非表示にする方法について調べてみました。

1.在庫なし商品一覧をダウンロードする

ストアエディタの「在庫管理」から、左下のほうにある「在庫切れの商品データ」の「ダウンロード」でデータをダウンロードします。
在庫なし商品のcsvファイルがダウンロードできます。
また、もう1つの在庫がある商品も含めての商品データのダウンロード(在庫の商品データのダウンロード)も合わせて行います。

2.商品データをダウンロードする

ストアエディタの「商品管理」から、左下の商品データの「ダウンロード」で商品データをダウンロードします。
このときに、事前に上にある「CSVダウンロード項目の選択」で、必要なもの以外のチェックを外します。
必須項目以外は全てチェックを外して下のほうにある「display/ページ公開」にチェックを入れて保存します。
CSVダウンロードには時間がかかる場合があるので、その場合は一度ダウンロードをして、少し時間が立ってからもう一度実行するとダウンロードできます。

3.CSVファイルを1つのエクセルシートに開く

ダウンロードした3つCSVファイル(全在庫商品データ、在庫切れ商品データ、全商品データ)をエクセルファイルで3つのシートにそれぞれ開きます。
この場合、普通にエクセルファイルを開くと先頭の0が消えたりとおかしくなるので、データインポートを行います。
エクセルの「データ」→「外部データの取り込み」→「テキストファイルのインポート」からインポートします。
データのファイル形式:区切り記号付き、元のファイルで適切なのを選んで「次へ」→区切り文字が「コンマ」のみにチェックで「次へ」→列のデータ形式「文字列」で、データのプレビューで全選択(一番右までスクロールしてシフト+クリック)で「完了」→既存のワークシートで「OK」

なお、エクセルがない場合はGoogleスプレッドシートでもできると思いますが、ここではエクセルで調べていますので、おそらく同様のことはスプレッドシートでもできると思います。

4.CSVファイルの編集

CSVファイルの中で、商品データが入ったシートを編集します。

まずは、「全商品の在庫」が入っているシートを編集します。
ここで、「quantity」の列をフィルタで「0」、「」(空)のセルのみをフィルタして、フィルタされた行を全て削除します。
これで、全商品の在庫のシートでなく、在庫がある商品のみのシートになります。

次に、全商品のシートを編集します。
は、「display」の列の右の列に、次の数式を入れます。

これがどういう式かというと、商品コードを比較して、在庫なしシートに商品コードが存在した商品の場合は0にして、存在しなかった場合は1にしています。
つまり、在庫なし商品に商品があった=0、なかった=1で値が入ります。
この数式を一番下までコピーします。
(一番下までコピーするのは数式セルを選択して、右下の小さい四角をダブルクリック)

次に、さらにその右側の列に次の数式を入れます。

これはどういう式かというと、在庫のある商品の場合は1を表示し、それ以外は0を表示しています。
この数式を一番下までコピーします。

最後に、その右の列に次の数式を入れます。

これがどういう式かというと、もともと0の場合は0(もともと非表示の商品は非表示のまま)で、
そうでない場合(1で表示商品の場合)で、在庫がある場合も1で(在庫がある商品場合は1のまま)
そうでない場合で、在庫がない商品の場合は0にしています。
この数式を一番下までコピーします。

こうすることで、もともと0:非表示、1:表示

なのですが、現在表示になっている商品で、在庫なしの非表示にしたい商品は0になります。
何故こんな複雑な方法をとっているかというと、同じ商品コードでも複数の商品がある場合があり、ある商品コードが在庫が0でも、同じ商品コードで在庫がある場合があり、その場合は表示にする必要があるからです。
これで、もともと表示している商品の中から、本当に在庫がない商品は0になります。

5.CSVファイルの作成

上記のシートが完成したら、まずCSVを編集する専用のソフトで、最初にダウンロードして、もともとの全商品のデータファイルを開きます。
そして、displayの列を、4の手順で最後に作成した列で置き換えます。
その後、CSVを保存します。
このときに項目ごとの引用符などは最初にダウンロードした状態の設定と合わせて保存します。
何故CSVを編集できるソフトで保存するかというと、エクセルがCSVを作成する専用のソフトではなくデータが変更されていると困るからです・・・。

6.CSVファイルのアップロード

最後にCSVファイルのアップロードを行います。
アップロードはYahooストアエディタの「商品管理」から行います。

アップロードする前に「バックアップ」で全データのバックアップを念のためとっておきます。(これも商品数によっては時間がかかります)
また、今回更新するデータは商品データなので「商品データ」→「ダウンロード」でもバックアップをとっておくとよいです。
バックアップをすることで、もしアップロードでデータの更新に失敗した場合でもあとで巻き戻せます。

「商品データ」→「アップロード」から「項目指定」にチェックを入れ、「ファイルを選択」で、5の手順で編集したCSVファイルを選択し、アップロードします。

アップロードが完了したら「反映管理」からサイト全体に反映を行います。
反映には15分ほど時間がかかるので、サイトを確認して正しく更新ができていれば作業完了で、万が一失敗した場合にはバックアップからデータを巻き戻すことも可能です。

WordPressサイトのサイト全体SSL手順(Cloudflare使用)

とあるWordPressで管理しているサイトを、世の中の流れでサイト全体をSSL化して、何箇所か苦労した箇所があるので手順を残しておきます。

1.Cloudlareで対象サイトをSSL化

まず、SSL証明書をCloudflare経由で無料で入手し、適用されるのを待ちます。

手順は簡単で、まずはCloudflareを導入して、対象のサイトを管理します。

対象サイトのDNS設定が完了したら、上メニューの「Crypt」を選択し、SSLのメニューの選択メニューで「Flexible」を選択します。
時間が経つと「Status:Active Certificate」となり、サイトにhttpsでアクセスできるようになります。

なお、この手順で使用できるようになるSSLは通常のSSL証明書とは異なるので、一部のブラウザでは挙動に問題が起こる場合もあるので、企業サイトなどきちんとしたサイトでの使用は推奨できませんが、個人サイトレベルであればほぼ問題無いと思います。
(一般に使用されるようなブラウザでは問題なく表示されます)

2.WordpressサイトをSSL化する

まず、私の場合はWordPressのサイトをSSL化するのに、プラグイン「Really Simple SSL」プラグインを使用しました。
プラグインを導入後、WordPress管理画面にhttpsでアクセスし、プラグインを有効化して設定を適用させることで反映されます。
なお、このプラグインはデータベース設定をhttp→httpsに置換するので、適用前にデータベースのバックアップを取っておいたほうが良いようです。

その後、管理画面からログアウトしてから再度管理画面にアクセスすると、リダイレクトループが発生してしまいました。
この問題は、wp-config.phpに以下の記述を追記することで解決しました。

次に、もともとのサイトがhttpで検索エンジンに認識されていたので、301リダイレクトをhttpからhttpsにかけました。
.htaccessに以下の記述を追記しました。
最初はリダイレクトループしてしまったのですが、WordPressには最初から.htaccessに記述があるのですが、その記述の
上に書いておくと動作しました。

WordPressの管理画面とサイトでそれぞれリダイレクトループが発生したのですが、上記の方法でそれぞれ対処できて問題なくhttpsでの動作確認ができました。

3.Google Analyticsの設定変更

Google AnalyticsのサイトURLもhttp→httpsに変更します。
プロパティ設定、ビュー設定のhttpをhttpsにそれぞれ変更します。

4.ウェブマスターツールの再登録

ウェブマスターツールにhttpのサイトを登録していた場合、httpsのサイトは別サイトとして登録する必要があります。
httpsからはじまるURLで登録をしておきます。
2の手順でhttp→httpsにリダイレクトをかけているので、サイトの評価はそのまま引き継がれます。

phpmyadminのCSVエクスポートで日本語が文字化けする場合の対処法

phpmyadminのCSVエクスポートで日本語が文字化けする場合の対処法についてです

エクスポートの「エクスポート方法」で「詳細」の項目をチェックを入れます。

下に表示される項目に
「出力をファイルに保存する」→「ファイルの文字セット」の項目がああるので、ここを「Shift-JIS」に変更してから出力します。
これで、フォーマットをCSVに設定してファイルを出力すると日本語が正しく出力されます。

キャプチャ画面

楽天の検索での文字化けの対応について

楽天goldに検索窓を設置して検索をしたところ、gold領域のサイトをUTF-8で作成していた場合文字化けを起こします。
原因としては、楽天のサイトがEUC-JPだからです。

以前は以下の方法で対応していたのですが、原因はよくわかりませんが再び文字化けを起こすようになっていました。

以前は、検索フォームの検索ボタンに以下のコードを追記することで動いていました。

それが、理由はよくわかりませんが、先日再び文字化けを起こすようになっていました。
formタグに以下のコードに挿入することで動くようになりました。
frmは、該当formのname属性です。

楽天の仕様が変わったのか、ブラウザのバージョンが上がって対応しなくなったのかはよく分かりません・・・。

ウェブマスターツールのfetch as googleでエラーが発生。解決までの経緯

この記事を書いているのが2017/4/20の夕方なのですが、4/20の朝からgoogleウェブマスターツールの「fetch as google」がエラーになっていました。

具体的な現象としては、ウェブマスターツールのfetch as googleで、ページURLの取得は可能なのですが、インデックスに送信をするとポップアップがでてきて「このURLのみをクロールする」にすると、「エラーが発生しました」と表示されて登録できない情況。

どうやって解決したかというと、結論から言うとGoogleのシステム側の不具合だったようで、朝やってみるとエラーになって、夕方には解決していました。

何故Googleのシステムの不具合だったと思うかというと、Twitterで検索をしてみると同様の現象があると同じ日時で書き込みをしていた人がいたからです。

上記の不具合とは異なるのですが、以前には「fetch as google」で「インデックスに送信」を押すと「取得できませんでした」のエラーが発生したことがあったのですが、このときも結局時間経過で解決しました。

いずれのケースも結論としては、サイトがペナルティを受けているというような話ではなく、単なるGoogleのシステム不具合だったので、もどかしいと思いますが待つとなおると思います。
ちなみに1日以上たっても治らなかったケースはいずれもありませんでした。

hhvmのログローテーションの設定方法

運用しているとあるサイトのサーバが低速化していたので、原因を調べてみるとhhvmのログサイズが肥大化していた。

ちなみに、linuxでどのフォルダが肥大化しているかを調べるには以下のコマンドが便利

容量を使っているディレクトリ上から30個表示
du / | sort -nr | head -30

調べてみたところ、hhvmのエラーログが肥大化していた。

/var/log/hhvmd/error.log

これがサーバ全体を圧迫するほど巨大化して容量を占有していた

該当ディレクトリまで移動し、このコマンドでとりあえず空にする

: > error.log

hhvmのログファイルのローテーションだが、以下のファイルで編集できる

/etc/logrotate.d/hhvmd

編集すると、初期設定では以下のようになっていた

/var/log/hhvmd/*log {
daily
rotate 52
missingok
notifempty
compress
delaycompress
sharedscripts
copytruncate
}

デイリーでログをローテーションし、52世代まで残す設定となっていた。
ファイルの上限がなかったので、ファイルサイズを追記しておいた。

/var/log/hhvmd/*log {
daily
rotate 52
size 5M
missingok
notifempty
compress
delaycompress
sharedscripts
copytruncate
}

上記の設定では5Mを超えるとローテーションされるので、最大でも 5M×52で250M程度しか容量を圧迫することはない。

設定後、Apacheの再起動を行って反映させた。

【FFBE】クラウド狙いガチャ挑戦結果・・・

FFBEでついにクラウドが参戦しましたね。

クラウド自体の性能は優秀なアタッカーではありますが、チートレベルの性能というわけではないようです。
ただ、歴代のFFファンの方では思い入れもあるので是非入手したいという方も多いのではないかと思います。

私もかねてから貯めていたレアガチャチケット(50枚近く)と、ラピス10000を全て消費して、クラウド狙いのガチャに挑戦してみました。

<ガチャ回数>
70回

<ガチャ結果>
ピックアップ対象

ウィリアム×3

コンラッド×11

ピックアップ対象外

ルーネス

その他☆6キャラ
シャイン×2
天風のヴェリアス×3
メリアドール
ナイン
エリア
グレイス

はい、というわけでまあまあ爆死でしたね。
クラウドは出なかったですが、代わりに虹から「ルーネス」が出ました。

まあ、ルーネスは若干強さとか役割がクラウドと被ってはいますけどねw
クラウドの代わりにルーネスを使えということでしょうか・・・

もうラピスとレアチケットをほぼ使い果たしてしまったので、期間中に半額ガチャをほそぼそと回していこうと思います。

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

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

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

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

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

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

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

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

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

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

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

【FFBE】常闇のヴェリアスの「暗黒の罪科」と「暗黒の刃」はどっちが強いか

FFBEのキャラクター「常闇のヴェリアス」の攻撃パターン「暗黒の罪科」と、「暗黒の刃」はどちらが強いかについての考察です。

まず、常闇のヴェリアスですが、FFBEで強力なユニットの1体です。
「暗黒の罪科」と「暗黒の刃」はどちらも消費MPが45の強力な攻撃ですが、どちらがダメージ効率が良いのかを検証してみました。

まず、基本的な性能は以下の通りです。

暗黒の罪科
消費MP45
実質倍率400%ダメージ
闇耐性-50%

暗黒の刃
消費MP45
実質倍率400%ダメージ
攻撃に闇属性付与

まず基本的なことですが、上記の2つの攻撃は片方だけ使うだけでなく併用すると強いです。

暗黒の罪科は敵の闇耐性を下げるので暗黒の刃のダメージ(闇属性)を底上げしますし、暗黒の刃は攻撃に闇属性を付与するので、暗黒の罪科のダメージをアップします。

調べてみたところでは、

ダメージ倍率が同じというだけあって、単発で使用した場合の総ダメージはどちらも同じ

でした。

また、2つのアビリティはどちらも消費MPは同じですが、ヒット数は暗黒の罪化のほうが多くチェインを稼ぎやすく、暗黒の刃はヒット数は少ないですが、闇属性なので他の闇属性の攻撃とエレメントチェインを稼ぐことができます。

これらのことを踏まえて状況に応じて使い分けると良いでしょう

結論

  • どちらの技もダメージ倍率は同じ
  • 相乗効果があるので、併用が基本
  • 常闇のヴェリアスの武器が闇属性の場合、攻撃に闇属性を与える「暗黒の刃」の追加効果は意味ないので「暗黒の罪科」が基本でOK。
  • 「暗黒の罪科」はヒット数が多くチェインを稼ぎやすい。チェインを稼げる場合「暗黒の罪科」はダメージを稼ぎやすい

【FFBE】ライトニングの絶影とエレキブラストはどっちがダメージが出るか

スマホゲームでやっているFFBEに関する話題ですが、ライトニングの「絶影」と「エレキブラスト」はどちらがダメージが出るかを計算してみました。

まず、絶影は+2までアビリティ覚醒させているという前提での話です

絶影+2
・単体物理350%
・雷耐性3ターン-75%

エレキブラスト
・物理200%雷ダメージ

ということで、何でこの計算をするかっていうのは、要するに

絶影で雷耐性が下がった状態でのエレキブラストと、絶影はどちらがダメージが出るのかよく分からない

からですね。
ダメージを観測しても、絶影はヒット数が多いのでトータルでのダメージ量がよくわからない

そこで検証してみたところ、結論としては
雷耐性低下状態でも絶影のほうがダメージ量が少しだけ上

でした。

雷耐性が下がってない状態でのダメージ量が絶影のほうが上なのはいうまでもないですが、雷耐性が75%下がっている状態でも、絶影のほうが僅かにトータルのダメージ量が上でした。

しかし、それほどダメージ量に差があるわけではないので、絶影が消費MPが45なのに対してエレキブラストは23と絶影のほうが消費MPが多いので、MPが少ないときはエレキブラストでも遜色ないダメージは与えられるかと思います。

また、これに加えて絶影は通常のヒット数でのチェインを稼ぎやすいのに対して、絶影は他のキャラが雷属性の攻撃を使用したときにエレメントチェインになるという違いがあるので、上記をふまえてダメージを与えやすいアクションを選択すると良いと思います。

Laravel勉強メモ

PHPのフレームワークの「Laravel」の勉強メモです。

Laravelとは

PHPのフレームワーク。
日本でも人気が上がってきているが、海外で特に人気がある。
モダンな要素が取り入れられている?

フレームワークを勉強するに渡って有名な「Cake PHP」も良いと思ったのですが、最近人気があるというLaravelについて学習してみることにしました。

Laravelを使用するにあたって

PHPの5.4以上が必要で、「mcrypt」のライブラリをインストール必要がある。

インストールするために「Composer」が必要になる。
ComposerとはPHPのライブラリの依存関係を管理するためのもの。
通常はライブラリはPHP全体に影響するため依存関係の管理が大変だが、コンポーザーの場合プロジェクトごとにライブラリを管理するため依存関係について対処しやすい。

Laravelのインストールと初期設定

インストール時してプロジェクトを作成する。
プロジェクト名のフォルダができ、その中にLaravelの必要なファイル一式がダウンロードされる。

最初にやること

プロジェクトで必要となるデータベースとデータベースユーザを作成する。
データベースが必要ない場合は必要なし。

データベースを作った場合はプロジェクト内のコンフィグファイル内にデータベースへの接続情報を追記する。

「.env 」が環境ファイルなので開いてデータベース情報を追記する。

artisan(アルチザン)のマイグレーションコマンドを使って、テーブルを作成する。
アルチザンというのは、Laravelに予め準備されたシェルスクリプトのようなもので、コマンドラインで様々な処理を実行することができる。

php artisan make:migration マイグレーション名 –create=テーブル名

上記のコマンドを実行することで、/database/migrations/ 内にマイグレーション用のPHPファイルが作成される。

作成されたマイグレーションファイルを開いて、テーブルのカラム名などを追記する。
デフォルトでは主キーと、タイムスタンプのカラムが設定されている。

php artisan migrate

コマンドで、マイグレーションが実行され、上記マイグレーションフォルダ内に入ったマイグレーションPHPファイルが実行される。

一般的な方法であれば、phpmyadminからテーブルを作成したり管理するが、Laravelではマイグレーションコマンドと設定ファイルでテーブル構造を管理できるかんじといったところ。

しかし、見た感じややこしい。
こんなマイグレーションを使ってコマンドラインでどうこうするより、phpmyadminを使って管理するほうが簡単な気がしてならない。
このあたりはLaravel使う恩恵は微妙といったところかな…。
いろいろやってると「php artisan migrate」実行時によく分からないエラーが

Base table or view not found:

なんだこれ

php artisan migrate:refresh

これで全部解決しました。すべてのマイグレーションを再実行するかんじかな。

php artisan migrate:rollback

上記はロールバック用のコマンドで、最後に行ったマイグレーションをロールバックする

php artisan migrate:reset

すべてのマイグレーションをロールバックする
まあいずれにしてもややこしい。phpmyadminがシンプルでいいです・・・。

モデルの作成

php artisan make:model モデル名
これでモデルを作成

これで app ディレクトリ以下に、作成したモデル名のPHPファイルができている。

tinkerコマンドでモデルのオブジェクトを作成して、コマンド形式を使ってテーブルに値を挿入できる。

php artisan tinker

このあたりの命名規則やらなんやらで完全に混乱状態・・・。

ルーティング

このあたりからようやく面白くなってきた。

ルーティングとは、指定したURLに対してどういった動作をするかをphpファイルの中に書き込んでいくこと。

設定方法はLaravelのバージョンによって異なってくる。
自分の環境はlaravelのバージョンが5.3系なので、サイトのルーティングは

/routes/web.php

に行う。
ここに指定したURLに対しての処理を書き込んでいくと、URLにアクセスしたときに指定した処理を行う。
テンプレートを読み込ます場合は、viewファイルを読み込む。

ここで、URLにIDなどの動的なパラメータ(変数)を渡すこともできるのだが、テスト環境(Mac、Appache)では動作しなかった。
確認してみると、 /private/etc/apache2/httpd.conf の AllowOverride All にすべて変更すると
動作するようになった。(.htaccessはLaraberl上にあるので、サーバの設定が許可する設定になっていないといけない)

view

viewというのは要はテンプレートファイルのこと。

/resources/views/

以下に追加していく。

このテンプレートファイルにhtmlやphpのロジック部分を基本は記述していき、ルーティングファイルから読み込むという流れ。

共通部分のviewファイルは別に作成しておき、個別ページごとのテンプレートファイルから読み込んで変数や動的な部分を埋め込んでいくイメージにしていくと効率が良い。

コントローラー

コントローラーは、サイトの処理を担当する部分。
viewでHTMLのテンプレートを担当し、コントローラーでは処理を担当する。

artisan make:controller コントローラー名

でコントローラーを作成することで、 app/Http/Controllers

以下にファイルが生成されるので、編集することで処理を追加できる。

laravel5.3系の場合、web.phpで、ルーティングでURLで指定した処理で呼び出すコントローラを指定する。

viewとコントローラーを切り分けることで、デザイン(デザイナ担当)の部分と処理の部分(プログラマ担当)を切り分けることができる。

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

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

php artisan –version

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

Could not open input file: artisan

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

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

FF15がもうすぐ発売

  • 2016年11月27日 6:56 AM
  • PS4

かつて国民的RPGであったFF15がもうすぐ発売されます。

昔は、国民的RPGといえばドラクエ、FFの2大巨頭で、スクウェアとエニックスが合併したときにはみんなびっくりしたもんです。

時代は流れ(といったら大げさ?)、今はゲームといえばスマートフォンのゲームで、あまりコアでないゲーマーのライトユーザは
スマートフォンに流れてしまっているかんじがしますね。

今のスマートフォンのゲームを除く国民的RPGといえばモンスターハンターはぱっと思いつきますが、それ以外には何かあるでしょうか。
どちらかというとFFよりはドラクエの方が多くの層のユーザにプレイされているかんじがします。
ただ、海外で人気がありトータルで多く売れているのはドラクエではなくFFのほうです。

事前情報によると、FF13と比較すると予約本数が大幅に落ち込んでいるということで、国内は100万本売れるかどうかといったところのようです。

発売されるハードのPS4やXBOX ONE自体が国内ではあまり売れていないかんじがするので、それが一番大きい原因であるかなとは思います。

また、最近はダウンロード版で購入する人も増えていると思いますので、それが小売店の予約にカウントされていないことも
考慮しても厳しいかもしれません。

体験版をプレイしたところ本作はスタッフの方がかなり頑張って作り込んでいるようなので、
是非ヒットして次回作につながっていって欲しいものです。

海外ではすでにフラゲ勢によりストーリーがネタバレし、酷評を受けているとかいう噂も流れてきました。
最近の海外のゲームはクオリティが高いので、目が肥えている海外勢から見ると残念といった
評価がつくのかもしれません。

ゲームを進めていくにあたってFF15の攻略サイトはこちらをみて進めていく予定です。

FF15攻略データベース

B木とB+木の違い

情報処理技術者試験の勉強をしていたら「B+木インデックス」というのが出てきていて、調べていたところ「B木」との違いがよくわからなかったので、メモ。

そもそもB木とは

自分的な解釈。
基本的に、データの検索性を高めるための多分木の木構造でのデータ格納方法。

B木とB+木の違いとは

B+木にはB木と違い以下のような要素があるようです。

・データ格納先のアドレスを末端の葉(リーフ)のみに格納する
・リーフ(葉)とリーフ(葉)を結ぶポインタを設ける

B+木
↑B+木の図

逆に言うと、通常のB木はノード(節点)にもデータが格納され、葉と葉と結ぶポインタはないということですね。

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

ホーム

フィード
リンク集

ページの上部に戻る