Memorandum

普段の生活の覚え書き。主に技術録

Pythonインストール方法

AIとは

最近、AIという単語をネットやテレビ、様々な場面で聞く機会が多いと思います。 AIとはArtificial Intelligenceの略で人工知能という意味です。 人間の知能をコンピュータ上で実現しようというのが人工知能です。

このAIを実現している手法の一つが機械学習という手法です。 機械学習は読んで字のごとく、機会に人間のような学習機能を持たせようというという方法です。

機械学習を深く理解するためには数学の力が必要になりますが、機械学習を使ってみたいという目的ではそこまでの知識は求められません。 また、後述するPythonでは先駆者たちのライブラリがあるのでそれを流用可能です。

Python

その機械学習によく使われるプログラミング言語Pythonというのがあります。 科学計算分野ではPythonコミュニティが活発で、科学計算を効率的に行うライブラリが充実しています。

Pythonの特徴としてコードがシンプルで読みやすく、コード行数を抑えて書けるといった特徴があります。 そのため比較的初学者にとって学習しやすく、効率の良い開発ができると思います。

また1991年の登場から年々バージョンアップをしており信頼性や安全性など成熟している言語だと思われます。

AIで何ができるのか?

AIを利用したプログラミングでどのようなことができるのか、調べてみました。

  • 予測
    • 仮想通貨の価格予測・自動取引
      • 仮想通貨が賑わっていますがそのような仮想通貨の価格予測して、自動的に取引を行うようなプログラムを実装することが出来ます。
    • 株価予測
      • 仮想通貨と同じく株についても予測出来ます。
    • 競馬予測
  • 分類・分析
    • ファイル整理
      • ファイルの内容を学習して自動分類するシステム
    • データ分析
  • 自動化
    • 自動運転
      • 最近話題になっている自動運転もAIの技術を応用して研究されています。
  • 認識
    • 画像認識
    • 顔認識
      • カメラの顔認識技術や写真に写っている人の分類などが行なえます

Pythonのインストール

PythonやAIについて少し興味を出てきたでしょうか? Pythonをインストールして環境構築するのは簡単なのでご紹介したいと思います。

Mac

macOSPythonをインストールするにはHomebrewという有名なパッケージマネージャーを利用するのが簡単です。

HomebrewをインストールするにはMacでターミナルを開き、下記のコマンドを実行することでインストール出来ます。

$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrewがインストールできたら次にPythonをインストールします。 現時点でのHomebrewでは下記コマンドでPythonのバージョン3がインストールされます。

brew install python

これでPython3のインストールができると思いますが、私の環境では既にPythonの2系が入っていたので、下記コマンドでバージョンを確認すると古いバージョンが表示されてししまいました。なので、python3というコマンドを使用して明示的にPython3を使うことにしました。

$python --version
Python 2.7.10

$python3 --version
Python 3.7.0

Windows

Windowsでインストールするには公式サイトインストーラーをダウンロードするのが良いと思います。 Download Windows x86-64 executable installerというリンクからダウンロードしてexeファイルを実行してインストールしていきます。

デフォルトのインストールではインストールする場所が気になったので、Customize Installを選び"Customize install location"を"C:\Python\Python37"にしました。

インストール確認するにはコマンドプロンプトを開き、pythonをインストールしたフォルダをカレントディレクトリで指定して確認します。 ※10/24追記:インストール実行画面で「Add Python 3.7 to PATH」にチェックを入れておけば、カレントディレクトリを移動しなくても確認できます。

$ cd C:\Python\Python37
$ python --version
Python 3.7.0

Python実行

Pythonをインストールすることができたら、簡単なプログラムを実行して確認しましょう。 下記のプログラムを作成して実行します。

print("Hello World")
print(3+2)

プログラムをhelloworld.pyなどのファイル名で保存して下記コマンドで実行します。

# macOSの場合
$ python3 helloworld.py

# windowsの場合
$ python helloworld.py

# 実行結果
Hello World
5

後記

近頃AIや機械学習の話題が世間を騒がせていると思い、私もやってみようと少しずつ学習しています。 面白そうなサービスの構想はあるので、制作過程やサービスの紹介などをこのブログですることを目標に作りたいと思います。

Vimの使い方

CUIとは

私が契約しているVPSCentOSが入っています。サーバ用のOSはLinuxが多く、またCUI(Character User Interface)という文字だけの画面で操作する場合が多いです(通称:黒い画面)

一部Windows ServerなどはGUI(Graphical User Interface)と通常使っているようなWindowsの画面で操作できるOSもありますが、ほとんどがCUIです。

CUIのメリットとして 1. キーボードのみで操作できる 2. マシンリソースをあまり消費しない 3. 繰り返しや条件分岐などの複雑な操作がしやすい

などが挙げられます。 なんとなくキーボードのみで操作しているとコンピュータ上級者みたいに見えてかっこいいです。

私もVPS上ではCUIを使って操作していますが、コマンドなどが覚えづらくココらへんは慣れが必要かと思います。

テキストエディタ

CUI上でサーバの設定やプログラムを書くときに使用するツールでテキストエディタというのがあります。 Windowsだとノートパッドやサクラエディタなどがあります。 しかし、ノートパッドやサクラエディタGUIで使うことを前提としているため、サーバ上では使えないことが多いです。(サーバでもGUIを導入してこれらのテキストエディタが使える場合もありますが、画面描画にマシンリソースを消費してしまいます))

そのためCUIでは別のテキストエディタを使います。 CUIでのテキストエディタの例として

などがあります。 それぞれのエディタに特徴があり、どれがいいとは決められませんが、私はVimというテキストエディタを主に使っています。

Vimとは

Vimとはviと呼ばれるテキストエディタから発展したもので、Linuxには標準でインストールされている場合も多いです。 なのでVimが使えるようになっていて損はないと思います。

操作方法が特徴的で初めのうちは使いにくいものですが、慣れてくれば普通のテキストエディタより早く入力することができるようになるそうです。

Vimには「コマンドモード」と「入力モード」がありそれぞれを切り替えて使います。 コマンドは色々あり私も全てを使いこなせていませんが、最低限文字を書いて保存することができればいいと思います。

よく使うコマンドは以下のようになっています。

コマンド 機能 補足
i 入力モードにする カーソルの位置から文字を入力
a 入力モードにする カーソルの次の位置から文字を入力
[Esc] コマンドモードにする 入力モードのとき
h カーソルを左へ コマンドモードのとき
j カーソルを下へ コマンドモードのとき
k カーソルを上へ コマンドモードのとき
l カーソルを右へ コマンドモードのとき
:w[Enter] ファイルの保存 コマンドモードのとき
:wq[Enter] ファイルを保存して終了 コマンドモードのとき
:ZZ[Enter] ファイルを保存して終了 コマンドモードのとき
:q[Enter] vimの終了 コマンドモードのとき(ファイルを保存していないと終了できません)
:q![Enter] vimの終了 コマンドモードのとき(ファイルを保存していなくても終了できます)

上記のコマンドを覚えれば最低限ファイルの編集を行うことができると思います。特にhjklでカーソル移動が独特で初めはカーソル移動だけでも慣れないと思います。(普通のカーソルキーでも動かすことが出来ますが、ホームポジションでカーソルが動かせるのでhjklのが早いです)

更に他にも色々なコマンドあるので、使いこなせれば普通のテキストエディタよりも早く楽に編集することができるようになると思います。 私もまだまだ使いこなせていませんので、練習や慣れが必要です。

VIM-Adventures

vimの特徴的の操作方法をゲームでわかりやすく学べる「VIM-Adventures」というのがあります。 全て英語なのでとっつきにくいかも知れませんが、基本的なカーソル移動が学べると思います。

https://vim-adventures.com/

Level1~3まであり、Level1では迷路のコースをhjklキーで移動していきます。(カーソルキーを使うと怒られます) 海の上ではjkの移動で現在行の位置と同じ縦移動ができるのでそれで超えていけます。

Level2では新たなコマンドを取得しながら、文字間の移動方法を学べます。 「w」コマンドは前方の単語の先頭にカーソル移動が出来ます。「b」コマンドは後方の単語の先頭にカーソルを移動させます。「e」コマンドは単語の末尾にカーソル移動します。

単語は一連の文字、数字及び下線、または空白で区切られた文字列を指しています。

Level3では文字間の移動の確認をして、文章の訂正コマンドを使っていきます。 文章の訂正コマンドは文字間の移動コマンドを駆使して、制限時間内に「x」コマンドを取得しなければなりません。

「x」コマンドはカーソル位置にある文字を1字削除します。 最後にスタート地点近くの宝箱を取るととりあえずクリアです。

Level1~3をすべてクリアすると更に多くのコマンドを使ったレベルがあるみたいですが、それにはライセンス購入が必要らしいので、この先は興味ある方がやってみてください。(ちなみに25$らしいです)

Let's Enjoy Vim

サーバなどCUI画面でファイル編集する際にお世話になるだろうと思いますので、Vimの基本操作は知っていて損はないと思います。

また、ブラウザのFirefoxGoogle ChromeVimのコマンドを使ってブラウジングができる拡張機能もありますので、キーボードのみのブラウジングに興味がある方は使ってみるのもいいかも知れません。

https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb?hl=ja

ちなみにあの有名なキーボード、Happy Hacking Keyboard(HHKB)の英字配列モデルにはカーソルキーがないそうです。vimのために作られたキーボードなのかは分かりませんが、vim使い(通称:vimmer)なら使いこなせるかも知れませんね。

【Splatoon2】stat.inkを利用した戦績データの分析

皆さんSplatoon2、やっていますか? 私は以前書いた記事から順調にプレイ時間が増えて1000時間超えました。

しかし、未だに最高ランクのXに到達出来ずに、S~S+帯を行ったり来たりしてます。 日々プレイヤースキルを磨いていますが、なかなか上達出来てません。

そこで、過去の戦績を分析して自分の行動を俯瞰してみたいと思いました。

イカリング

Splatoon2にはスマホ用のアプリ(Nintendo Switch Online)のイカリング2というサービスで過去50戦の対戦データが閲覧できるのですが、試合1戦1戦しか確認できなくて、累計データの分析があまり出来ないです。また、一つの試合ごとタップする必要があるので操作性が良いとは言えないです。

そこで、以前の記事で紹介したPCで閲覧する方法を応用して、更に細かく分析できるサービスを利用してみました。

stat.ink

Splatoonの戦績データを収集して保存・解析を行ってくれるサイトstat.inkを利用させていただきました。

WiiUSplatoonのときから存在は知っていたのですが、キャプチャボードがなく利用を断念しておりました。 Splatoon2ではキャプチャボードが不要で、アプリのみで戦績の登録が行なえます。

戦績の登録を行う方法は主に2通りあり、GUIで視覚的に登録するSquidTracksを利用する方法と、サーバなどで自動的に実行させるsplatnet2statinkを利用する方法があります。

今回はSquidTracksを利用して、登録する方法を解説したいと思います。

SquidTracks

SquidTracksはWindowsMacLinux用のものが配布されていてそれぞれインストールして使用します。 私は今回、Windows版を利用したのでWindows版の解説を行いますが、他のOSでも手順は変わらないと思います。

まず、Windows版をインストールして実行するとログイン画面が表示され、通常のログインとiksm_sessionを使ったログインの2種類が選択できます。

以前は通常のログインでログインが出来たみたいですが、私が行った時点では通常のログインでは使用できなかったのでiksm_sessionを利用したログインを行いました。 iksm_sessionの取得方法は前回記事に書いた方法で分かるのですが、新し目のAndroidだとこの方法は使えなくなっているみたいです。

※注意:iksm_sessionを取得して行う方法はいわゆるセッションハイジャックと呼ばれる行為です。この値が漏れてしまうと不正アクセスをされる恐れがありますので、十分に気をつけてください。

https://memoran.net/splatoon2-ikaring2-onpc/

なので、今回は別の方法を使用してiksm_sessionの取得を行いました。

手元にiOS端末がないので、iOS端末だと上記の記事の方法で取得できるかもしれないです。

※SquidTracksでもプロキシサーバを起動して取得する方法が用意されていますが、記事の内容と同じような方法なので記事内の方法で出来なければこちらでも出来ないと思います。

root化したAndroidを利用

下記のサイトでroot化したAndroid端末なら/data/user/0/com.nintendo.znca/app_webview/Cookiesにiksm_sessionが保存されていると書かれていました。

https://github.com/eliboa/iksm_rooted

しかし、私はroot化したAndroid端末を持っていないのでまた別の記事であった、AndroidエミュレータのNoxappplayerを使用した方法を行いました。 https://s.webry.info/sp/tryfreesoft.at.webry.info/201709/article_1.html

上記のサイトで紹介している手順で無事にiksm_sessionを取得することが出来ました。 しかし、若干不安な点がありまして、NoxappplayerやES ファイルエクスプローラーにroot権限を与えて本当に大丈夫なのかということです。

ES ファイルエクスプローラーにroot権限を与える時間などを指定できるので、最低限だけ与えて後はアプリを終了しておくなどの措置で大丈夫と思いますが、一応警戒しています。

もしくは、Noxappplayerは利用してiksm_sessionは上記のGitHubのコードで取得するのがいいかもしれません。

sessionログイン

無事にiksm_sessionが取得できれば、SquidTracksに入力してログインできます。

ログインすると、バトルの記録などがグラフ化されていたり、過去50戦の傾向などを見ることが出来ます。 SquidTracksだけでは過去50戦のデータしか分析できませんが、随時stat.inkに登録していけば、対戦データが溜まっていき更に深い分析が可能になっていきます。

Splatoonで対戦を行って、戦績データが溜まったらSquidTracksを開いてstat.inkに登録していきましょう。

また、splatnet2statinkをサーバなどに構築すれば登録作業の自動化も出来ます。 私も運用しているサーバで構築してみました。 サーバでの構築手順も以下のサイトあったので、挑戦してみるのもいいかもしれません。

https://archive.fo/td52p

※iksm_sessionは有効期限があり、一定の期間で使えなくなるので再取得する必要があるので、ログインできなくなったらiksm_sessionの再取得を行いましょう。

まとめ

これでSplatoon2の戦績データを溜めて分析することが出来ました。 stat.inkでは累計の勝率や、キルレシオなどを見ることができるので自分の傾向などの発見につながると思います。

stat.inkを使って、すべてのルールでウデマエXに到達できるよう精進していきます。 10/21追記:ガチエリアで初ウデマエX到達出来ました!

[amazon asin="B072J2J26T" kw="Splatoon 2 (スプラトゥーン2) - Switch"]

apacheからnginxへの移行検討

現在このブログではApacheを使っていますが、もう一つ有名なwebサーバとしてNginxというのがあります。

Nginxのサーバがどのようなものか気になったので、今回はwebサーバについての解説と、apacheからNginxへサーバ変更してみたのでご紹介します。

Webサーバとは

WebサーバはHTTPに則り、ウェブブラウザを使用して接続する(リクエスト)に対して、HTMLや画像などを提供する(レスポンス)機能やプログラムのことである。

代表的な例としてApacheやNginx、IISなどがある。 シェア率としてはApacheが優勢だが、近年Nginxが伸びてきており拮抗している。

Apacheとは

Apache(アパッチ)とは1995年から開発が続けられており、現在世界中で最も多く使われているソフトウェアである。 モジュールによって機能追加を実現している。

macOSの標準のWebサーバとなっており、私のMacBook Proでも以下のコマンドで起動できた。

$ php -v
$ httpd -v
$ sudo apachectl start
# 起動後、localhost:80にブラウザからアクセスできる。

Nginxとは

Nginx(エンジンエックス)は2004年に開発がスタートし、高い処理性能・並行性に焦点を当てて開発されている。 初期からHTTP、HTTPSSMTPPOP3IMAPのリバースプロキシの機能などを持っている。

Apache vs Nginx

Apacheはマルチプロセスのプロセス駆動アーキテクチャになっている。 そのため大量のリクエストが来た場合、プロセスが同時に起動するためメモリ消費量などの負荷が大きくなりやすい。

Nginxはシングルスレッドモデルのイベント駆動アーキテクチャとなっており、リクエストが大量に来ても、少量のプロセスだけでループ処理するため負荷がかかりにくい。

逆にApacheのメリットとしては開発年数が長く実績が多いので、バグが出にくかったり技術情報が手に入れやすいことが挙げられます。またWebサーバに特化しているので、Webサーバに必要な機能を豊富です。

Nginxのデメリットとしては、NginxだけではPHPなどのスクリプト言語を処理する機能がついていません。またCPUリソースを多く消費する処理ではApacheに比べ分が悪いかもしれません。

ApacheからNginxへ

今回は前回EC-CUBEをインストールしたMac上のvagrantを使って、ApacheからNginxにしてみようと思います。

実行環境

apacheの停止

$ systemctl stop httpd.service
# 完全に不要な方は以下を実行
$ yum remove -y httpd

nginxの環境を作る

最新の安定版ngninxをインストールするためにリポジトリを追加します。 以下のコマンドでファイルを作成し、リポジトリ情報を書きます。

$ vim /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

リポジトリを追加したら以下のコマンドでインストール・起動します。

$ yum -y --enablerepo=nginx install nginx
$ systemctl start nginx.service

これでブラウザから接続するとnginxの初期ページが表示されると思います。

php環境の設定

そのままだとphpを実行することが出来ないので、php-fpmをインストールします。 php-fpmとはFPM (FastCGI Process Manager) の略でPHPFastCGI実装のひとつです。 CGI(Common Gateway Interface)というWeb上でPHPを動作させるための仕組みです。 FastCGICGIの問題を解決しプログラム動作速度の向上や、サーバの負荷の低減が可能です。

php-fpmは使用するphpのバージョンに合わせてインストールする必要があるため、私はphp7.2に合わせてインストールしました。

$ yum install php72-php-fpm

インストール後php-fpmの設定ファイルを編集します。 デフォルトではapache向けの設定になっているので、nginx向けの設定に変更します。

$ vim /etc/opt/remi/php72/php-fpm.d/www.conf

# user = nginx
# group = nginx
# listen.owner = nginx
# listen.group = nginx
# listen.mode = 0666

次にnginx側の設定を編集します。下記の部分がコメントアウトされていますので、コメントを外して編集します。

$ /etc/nginx/conf.d/default.conf

location ~ \.php$ {
    #root html;
    root /usr/share/nginx/html;
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    #fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

設定できたらルートディレクトリにphpファイルを置いてphpが実行できるか確認します。

$ vim index.php
# index.phpの中身
<? php
    phpinfo();
>

EC-CUBEの設定

ここまで出来たら後はルートディレクトリをEC-CUBEがある場所に設定するだけなんですけど、私の場合すぐに表示されなくて色々手間がかかったので、これからやるやり方はおすすめできません。 できるなら、もう一度初めからインストールするほうが楽だと思いました。

私が行った方法はエラーが出るたびにログファイルを確認してトライ&エラーで一つずつ修正していったので、詳細な説明は難しいです。(すいません...)

まず、ApacheSSLの設定を行っていたので、nginxでも設定しました。 nginxの設定ファイル(default.conf)に下記の記述を追加しました。

ssl          on;
ssl_certificate /etc/pki/CA/...; #サーバ証明書ファイル
ssl_certificate_key /etc/pki/CA/...; #サーバ秘密鍵ファイル

SSL接続できることを確認したところ、データベース接続エラーが表示されました。 apacheでは接続できていたのですが、nginxだと出来ませんでした。

そのため別途PHPライブラリを導入しました。

$ yum install php72-php-pdo
$ yum install php72-php-mysqlnd

その後、何度もエラーメッセージが表示されたので、ログを確認しながら一つずつ修正しました。

流れとしては

  1. ログファイルを確認
    • nginxのログ(access.log error.log)
    • ec-cubeのログ(app/log)
    • phpのログ(php.iniのdisplay_errors をon)
  2. 必要なフォルダの権限を変更する

というのを繰り返してどうにかEC-CUBEのトップページが表示できるのを確認できました。

後記

ほとんど手をつけていないEC-CUBEのサーバでもこれだけ手がかかったので、色々プラグインや商品を登録していた場合は色々不具合が出ていたかもしれません。

サーバを構築するときは、今後必要になりそうな機能を決めておいて、それに見合うWebサーバを選定しておいたほうがいいと思いました。

このブログのWebサーバをnginxにするのはしばらく考えたいと思います。 Webサーバを入れ替えるのではなく、サーバ構築時にnginxにするのが楽かなと思います。

おまけ

ついでにphpのバージョンアップで行ったApache Benchで処理性能を測ってみました。 Requests per secondの値で比較するとapacheに比べnginxが約1.1倍性能が上がっているみたいです。

(クリックで開きます)

apache

# ab -n 10 -c 10 https://localhost/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done


Server Software:        Apache/2.4.6
Server Hostname:        localhost
Server Port:            443
SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256

Document Path:          /
Document Length:        18165 bytes

Concurrency Level:      10
Time taken for tests:   2.149 seconds
Complete requests:      10
Failed requests:        0
Write errors:           0
Total transferred:      185110 bytes
HTML transferred:       181650 bytes
Requests per second:    4.65 [#/sec] (mean)
Time per request:       2149.263 [ms] (mean)
Time per request:       214.926 [ms] (mean, across all concurrent requests)
Transfer rate:          84.11 [Kbytes/sec] received

Connection Times (ms)
             min  mean[+/-sd] median   max
Connect:        4  443 571.2     57    1239
Processing:   260  941 325.1   1125    1230
Waiting:      205  920 328.5   1119    1208
Total:        264 1385 516.2   1241    1940

Percentage of the requests served within a certain time (ms)
 50%   1241
 66%   1683
 75%   1933
 80%   1935
 90%   1940
 95%   1940
 98%   1940
 99%   1940
100%   1940 (longest request)

nginx

# ab -n 10 -c 10 https://localhost/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient).....done


Server Software:        nginx/1.14.0
Server Hostname:        localhost
Server Port:            443
SSL/TLS Protocol:       TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256

Document Path:          /
Document Length:        18165 bytes

Concurrency Level:      10
Time taken for tests:   1.940 seconds
Complete requests:      10
Failed requests:        0
Write errors:           0
Total transferred:      184730 bytes
HTML transferred:       181650 bytes
Requests per second:    5.16 [#/sec] (mean)
Time per request:       1939.769 [ms] (mean)
Time per request:       193.977 [ms] (mean, across all concurrent requests)
Transfer rate:          93.00 [Kbytes/sec] received

Connection Times (ms)
             min  mean[+/-sd] median   max
Connect:        3   21   6.2     23      23
Processing:   199 1271 421.3   1270    1716
Waiting:      197 1271 421.8   1270    1716
Total:        202 1292 426.7   1293    1738

Percentage of the requests served within a certain time (ms)
 50%   1293
 66%   1309
 75%   1524
 80%   1734
 90%   1738
 95%   1738
 98%   1738
 99%   1738
100%   1738 (longest request)

【WordPress】Cocoonでのページネーション変更

このサイトのトップページの下部にページ番号のリンクがあります。

このページ番号のリンクがその上の「次のページ」のボタンの幅より短かったので、なんとなくデザイン的に不満でした。

なので今回はこのページ番号のリンクの省略表示の処理を変更して多くのページ番号を表示するようにします。

paginate_links

ページ番号リンクの生成を調べたところ、下記のページが参考になりました。

https://elearn.jp/wpman/function/paginate_links.html

上記によるとWordPressにはじめから用意されているファイル/wp-includes/general-template.phpにpaginate_linksというページ番号表示(ページネーションというらしいです)という機能で生成されているそうです。

早速上記のファイルを編集してmid_sizeの値を変更しました。 mid_sizeは自ページ除いて何ページ分のページリンクを表示するかを設定する値です。

デフォルトでは2ページ分の表示なので、現在の表示と同じでした。この値を5に変えて保存してページをリロードしたところ、表示は変わっていませんでした。

Cocoon-master

なぜ変わらないのか考えてみたところ、現在Cocoonのテーマを使用しているのでテーマ自体の設定が上書きされて、設定した値が反映されていないのではないかと思いました。

なので、サーバに接続してgreppaginate_linksの値をテーマで使っている箇所がないか探しました。

root@152bc757f38d:/var/www/html/wp-includes# grep paginate_links -rl /var/www/html/
/var/www/html/wp-content/themes/cocoon-master/tmp/pagination.php
/var/www/html/wp-content/themes/cocoon-master/pagination.php
/var/www/html/wp-includes/link-template.php
/var/www/html/wp-includes/general-template.php
/var/www/html/wp-admin/includes/deprecated.php
/var/www/html/wp-admin/includes/media.php
/var/www/html/wp-admin/includes/nav-menu.php
/var/www/html/wp-admin/css/list-tables.css
/var/www/html/wp-admin/css/list-tables-rtl.css

すると、予想通りcocoon-masterのテーマでpagination.phpのファイルがありました。 このままファイルを編集することもできますが、テーマ内のファイルなのでWordPressの設定から編集することもできます。 ダッシュボードから「外観」→「テーマの編集」を選び、「編集するテーマを選択」を「Cocoon」にして、pagination.phpを選択します。 (pagination.phpは2つありますが、tmp/pagination.phpを変更しました)

pagination.phpの中にmid_sizeの項目があるので、この値を変更しました。(とりあえず私は5に設定しました)

確認

値を変更・保存してトップページを確認すると、1~5のページ番号が表示されていました。 しかし、現在はまだ記事数が少ないので最大でも5ページ分しかありません。

きちんと設定した項目が反映されているか確認するために、1ページあたりの表示記事数を少なくしてページ数を増やしてみました。

ダッシュボードから「設定」→「表示設定」を選び、「1ページに表示する最大投稿数」がデフォルトで10になっているので、これより少ない値にすると総ページ数が増えます。

すると無事に設定されているページ数が表示され、それ以降は省略表示されていることが確認できました。

後記

実はこの編集を行うのに、直接phpファイルを設定する必要があると思い、前回vimの導入などをしたのですが、結果的にvimがなくても設定することができました。

今回は自分の環境なのでいいですが、実務ではソフトを導入できなかったりする場面もあるので、今使える方法で出来ないのか確認することも必要だと思いました。

※追記:今回の修正方法はCocoonの親テーマを変更するので、親テーマの更新を適用するたびにもとに戻ってしまいます。 修正箇所は少ないので楽なのですが、更新があるたびに修正する手間がかかってしまいます。

子テーマの修正でページネーションの変更を実現できればいいのですが、方法が不明なのでご教授頂ければ嬉しいです。

WordPressコンテナへのVim導入

前回作成したDockerでのWordPressイメージにファイルアクセスしたんですが、テキストエディタが見つからなかった、使い慣れているvimを入れてみました。

Rloginでのログイン

前回はPowerShellを使ってログインを行ったのですが、今回はRloginというツールを使ってログインを行いました。

RloginとはWindows用の端末シミュレータ(ターミナル)ソフトです。

http://nanno.dip.jp/softlib/man/rlogin/

rlogin、telnetSSHなど、シリアル接続など幅広くサポートしていて色々な場面で使えます。 また1998年の開発から始まる20年来のソフトウェアで、長く開発が続けられていて信頼できると思います。

他の有名な端末シミュレータとしてTeraTermPuttyなどがありますが、Rloginはタブや画面分割もサポートしていて使いやすいソフトに仕上がっています。

会社でTeraTermを使ったことがあるのですが、接続先を入力したら接続先を一覧として保存しているのですが、パスワードや設定などを入力し直す必要がありました。 RLoginでは接続先ごとに設定を保存していて選択するだけで接続できます。

さて、PowerShellvagrant upをして、仮想環境を立ち上げると、以下のように出力されます。

==> vagrant: A new version of Vagrant is available: 2.1.4!
==> vagrant: To upgrade visit: https://www.vagrantup.com/downloads.html

Bringing machine 'core-01' up with 'virtualbox' provider...
==> core-01: Checking if box 'coreos-alpha' is up to date...
==> core-01: Clearing any previously set forwarded ports...
==> core-01: Clearing any previously set network interfaces...
==> core-01: Preparing network interfaces based on configuration...
    core-01: Adapter 1: nat
    core-01: Adapter 2: hostonly
==> core-01: Forwarding ports...
    core-01: 22 (guest) => 2222 (host) (adapter 1)
==> core-01: Running 'pre-boot' VM customizations...
==> core-01: Booting VM...
==> core-01: Waiting for machine to boot. This may take a few minutes...
    core-01: SSH address: 127.0.0.1:2222
    core-01: SSH username: core
    core-01: SSH auth method: private key
==> core-01: Machine booted and ready!
==> core-01: Setting hostname...
==> core-01: Configuring and enabling network interfaces...
==> core-01: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> core-01: flag to force provisioning. Provisioners marked to run always will still run.

またはvagrant ssh-config

Host core-01
  HostName 127.0.0.1
  User core
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile C:/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL
  ForwardAgent yes

ログインに必要な情報を取得します。 必要なのはUserIdentityFileの項目です。

その後、RLoginを立ち上げ新規の接続先サーバ画面に以下のように入力します。

ログインユーザ名にUserの項目、SSH認証鍵にIdentityFileのパスを入力してOKボタンで保存します。 保存後、作成したサーバ接続先を選びOKボタンを押すと、初回に接続先サーバの情報を保存するかどうかの確認画面が出ます。 その後、立ち上げた仮想環境にログインできます。

vimインストール

ログインを行った後、コンテナが起動していることを確認します。 docker psで現在起動しているコンテナの一覧が表示されます。

私は前回起動してから一度PCを再起動しているので、もう一度保存しているコンテナから起動しました。

# mysqlのコンテナ起動
$ docker start mysite_db
# wordpressのコンテナ起動
$ docker start mysite

前回の記事でファイルアクセスを行うには$ docker exec -it mysite /bin/bashでアクセスできるところまでは確認したのですが、vimやnano、emacsなどが使えなかったので、使い慣れているvimをインストールすることにしました。

まず、コンテナ内にアクセスしてapt-getコマンドでインストールしました。

core@core-01 ~ $ docker exec -it mysite /bin/bash
root@152bc757f38d:/var/www/html# apt-get update
root@152bc757f38d:/var/www/html# apt-get install vim

apt-getコマンドを実行したときに以下のようなエラーが表示されました。

E:The package lists or status file could not be parsed or opened.

前回コンテナを起動した後PCをスリープ状態にしていたのが原因だと思います。 一度PCを再起動して再度仮想環境とコンテナを立ち上げることで解決しました。

後記

Linuxのテキストファイルをいじるのに、エディタがなかったのは初めてだったので、色々調べてしまいました。 最低限の環境のみ用意されているLinuxでは自分でエディタを入れてくる必要があるみたいですね。

これでWordPressの環境を色々いじれるので、テスト環境として実験してみようと思います。

dockerでローカルにwordpress環境を作る

wordpressで色々いじっていると、404エラーが表示されるときやgoogle先生がアクセスできない場合などがあり、テスト環境が欲しいなと思っていました。

なので今回は、以前導入したDockerを使ってwordpressをインストールをしました。

https://memoran.net/introduction-docker/

事前環境

今回はWindowsマシンでやってみます。 WindowsマシンにはVirtual Boxをインストールしているので、仮想環境上にLinuxを立ち上げて、さらにそのLinux上でDockerを起動しwordpressをインストールしてみます。 N予備校WindowsマシンにVirtualboxvagrantの導入手順を説明してあるので、そちらを参考に導入を済ませてあります。

  • Windows 10 Pro 64bit
  • Virtual Box 5.2.18 r124319 (Qt5.6.2)
  • Vagrant 2.0.2

CoreOSの起動

初めにCoreOSというLinux Distributionの一つであり、Container Linuxとも呼ばれその名の通りコンテナ仮想化(≒Docker)に特化したOSを設定します。 必要最低限の構成となっており、最初からDockerを使えます。

最初にhttps://github.com/coreos/coreos-vagrant.gitからcoreOSのイメージダウンロードしてきます。 gitを導入している場合はgit clone https://github.com/coreos/coreos-vagrant.gitこれでクローンできます。

私の環境のWindowsではvagrantを使用するのにPowerShellを使用しています。 PowerShellを管理者権限で実行して下記のコマンドを実行します。

# coreOSのVagrantfileがあるディレクトリに移動
$ vagrant up

暫く待つと、coreOSが立ち上がります。 起動後、ログインしDockerのバージョンを確認します。

$ vagrant ssh
core@core-01 ~ $ docker -v
Docker version 18.06.1-ce, build e68fc7a

各公式イメージをpull

wordpressを構築するのに必要なイメージファイルを取得してきます。 導入のときの手順では直接docker runで起動していましたが、一旦docker pullでイメージファイルをダウンロードします。

必要なイメージファイルはwordpressMySQLです。

# wordpressの公式イメージ
$ sudo docker pull wordpress
# MySQLの公式イメージ
$ sudo docker pull mysql

イメージのダウンロードが終わった後、docker imagesでダウンロードされたイメージが確認できます。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
wordpress           latest              14be4544f181        7 hours ago         408MB
mysql               latest              6a834f03bd02        26 hours ago        484MB

wordpressサイトの立ち上げ

ではいよいよwordpressのサイトを立ち上げます。 docker runすることで各イメージファイルからコンテナを作成し、それらを連携してwordpressのサイトを構築できます。

$ sudo docker run --name mysite_db -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=mysite -d mysql
$ sudo docker run --name mysite --link mysite_db:mysql -p 80:80 -e $ WORDPRESS_DB_PASSWORD=password -d wordpress

上記のコマンドは--nameでコンテナの名前をつけて-eでコンテナの環境変数を設定しています。 -dでバックグラウンドでの起動をさせ、--linkでは他コンテナへのリンクを設定します。 -pでポートを指定すれば準備完了です。

docker psで稼働中のDockerコンテナを確認できます。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                 NAMES
152bc757f38d        wordpress           "docker-entrypoint.s…"   7 seconds ago       Up 6 seconds        0.0.0.0:80->80/tcp    mysite
8e14af89edff        mysql               "docker-entrypoint.s…"   19 seconds ago      Up 18 seconds       3306/tcp, 33060/tcp   mysite_db

サイトへアクセス

サイトへアクセスするにはifconfigでローカルIPを調べて、そのIPでアクセスできます。

$ ifconfig
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.8.101  netmask 255.255.0.0  broadcast 172.17.255.255

私の場合は172.17.8.101だったのでブラウザでこれにアクセスします。

wordpressの初期画面が表示されれば完了です。

ファイルアクセス

直接wordpress内のファイルにアクセスする場合は以下のコマンドを使います。

$ docker exec -it mysite /bin/bash
root@152bc757f38d:/var/www/html#

そうするとLinuxのコマンドで対話的に操作することできます。

気軽にテスト環境

dockerを使うと、wordpressの環境が簡単に作れました。 ローカルに環境を構築しようとすると、xamppなどで環境を整える必要があったり、削除しようにも面倒な作業が必要になります。 それがdockerならコマンドだけで環境構築ができ、不要になったらすぐ削除することもできて気軽にwordpressが初められると思います。(Webへ公開するにはまた別手順が必要ですが)

私もローカル環境構築できたので、ローカルでテストを行ったから問題がないことを確認して、本番環境へ反映させようと思います。