GCE上にワードプレスを移行しました


もともとロリポップのホスティングサービスを利用していましたが、
GCEの無料枠で運用できないかと思いまして、やってみました。

GCEでインスタンス作成

まずはGCPのコンソールにログインし、Compute Engineをクリックします。
インスタンスを作成します。

ゾーン:us-west1-b(us-から始まるものを選択します。)
マシンタイプ:micro
ブートディスク:CentOS 7
ブートディスクの種類:標準の永続ディスク、30GB
ファイアウォール:
下記2つを有効にする。
HTTP トラフィックを許可する
HTTPS トラフィックを許可する

作成ボタンをクリックし、インスタンスを作成します。

IPアドレスを静的に変更

VPCネットワーク – 外部IPアドレスを選択します。
GCEのインスタンスに紐付いているIPアドレスがあるので、タイプを「静的」に変更します。

sshの設定

Cloud SDKをインストールし、gcloudコマンドでログインすることもできますが、
sshクライアントから入れるようにします。
Compute Engineを選択し、インスタンスの名前をクリック、編集画面に移動します。
編集をクリックします。
下の方にSSHキーを登録するボタンがあるのでクリックし、公開鍵を貼り付けます。
保存ボタンをクリックします。

ssh ユーザ名@外部IPアドレス
でログインできます。

タイムゾーンの変更

GCEインスタンス起動した後はタイムゾーンを日本に変更します。
$ sudo cp /usr/share/zoneinfo/Japan /etc/localtime

ワードプレスの導入

GCEのインスタンスが起動でき、sshでログインできるようになれば、必要なソフトウェアをインストールしていきます。

Apache2.4のインストール

とりあえずyumのアップデートをしておきます。
$ sudo yum update

インストールしていきます。
$ sudo yum install httpd
$ httpd -version
Server version: Apache/2.4.6 (CentOS)
Server built: Apr 20 2018 18:10:38
こんな感じでバージョンが出ます。

自動起動を有効にしておきます。
$ sudo systemctl enable httpd.service

Apacheの起動や停止は下記のコマンドです。
起動
$ sudo systemctl start httpd.service
停止
$ sudo systemctl stop httpd.service
再起動
$ sudo systemctl restart httpd.service

PHPのインストール

PHP7系を入れ他方が良いのですが、yumで入れられる5系にしておきます。
$ sudo yum -y install php-mysql php php-gd php-mbstring
$ php –version
PHP 5.4.16 (cli) (built: Apr 12 2018 19:02:01)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

MariaDBのインストール

MySQLですが、CentOS7ではMariaDBが標準になったのでMariaDBを入れます。

$ sudo yum -y install mariadb mariadb-server
$ mysql –version
mysql Ver 15.1 Distrib 5.5.56-MariaDB, for Linux (x86_64) using readline 5.1

自動起動を有効にします。
$ sudo systemctl enable mariadb.service

起動
$ sudo systemctl start mariadb.service
停止
$ sudo systemctl stop mariadb.service

MariaDBの設定ファイルを適用する

一旦止めます。
$ sudo systemctl stop mariadb.service

今回は個人サイトなのでスモールを使用します。
$ sudo cp -p /usr/share/mysql/my-small.cnf /etc/my.cnf.d/server.cnf
$ sudo vi /etc/my.cnf.d/server.cnf
[client]に下記を追記
default-character-set = utf8

起動します。
$ sudo systemctl start mariadb.service

MariaDBの初期設定

初期設定用のコマンドがあるので実行します。
いろいろ質問されるので入れて行きます。

$ sudo mysql_secure_installation
MariaDBのrootパスワードを設定します。
Set root password? [Y/n] Y
New password:
Re-enter new password:
Password updated successfully!

anonymousユーザを削除します。
Remove anonymous users? [Y/n] Y
… Success!

リモートからのrootログインを許可しません。
Disallow root login remotely? [Y/n] Y
… Success!

テスト用DBを削除します。
Remove test database and access to it? [Y/n] Y
– Dropping test database…
… Success!
– Removing privileges on test database…
… Success!

ユーザ権限が保存されているテーブルを読み直します。
Reload privilege tables now? [Y/n] Y
… Success!

DBにアクセスするユーザを作成する

rootで作業したくないのでDBへアクセスするユーザを作成します。
$ mysql -uroot -p

MariaDBのプロンプトで、下記を実行します。
アクセス元を制限していないので、パスワードの後ろが%になっています。

> create user ‘ユーザ名’@’%’ identified by ‘パスワード’;
> grant all privileges on wordpress.* to ‘パスワード’@’%’;

できているか確認します。
> select host, user from mysql.user;

データベースを作成します。
> create database wordpress;

ワードプレスをインストール

ワードプレスの公式サイトからtarボールをダウンロードします。
まずは、wgetを入れておきます。
$ sudo yum install wget

ホームディレクトリにワードプレスをダウンロードしておきます。
$ cd ~/
$ wget https://ja.wordpress.org/wordpress-4.9.6-ja.tar.gz

ダウンロードしたtarボールを展開し、DocumentRootの方へ移動します。
$ tar zxf wordpress-4.9.6-ja.tar.gz
$ sudo mv ~/展開したディレクトリ /var/www/任意のワードプレスのディレクトリ名

ワードプレスのディレクトリ名や所有者を変更します。
$ sudo chown -R apache:apache 任意のワードプレスのディレクトリ名

VirtualHostでApacheを設定します。
$ sudo vi /etc/httpd/conf.d/任意のワードプレスのディレクトリ名.conf

下記のような内容を記述します。

Apacheをリロードして設定を有効にします。
$ sudo systemctl reload httpd

SELinuxの設定

CentOS7ではSELinuxが有効です。
無効化する方法もありますが、有効のままで動くように設定をしてみます。

Apacheを再起動します。
$ sudo systemctl restart httpd.service

スワップの作成

Apacheを再起動しても起動してこない現象が発生しました。
ログを調べてみると、
$ sudo grep oom-killer /var/log/messages*
May 23 16:48:08 wordpress kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0

メモリ不足でoom-killerが発動していました。

メモリも少ないインスタンスなのでスワップを作成します。
$ sudo dd if=/dev/zero of=/swapfile bs=1024K count=1024
$ sudo mkswap /swapfile
$ sudo /sbin/swapon /swapfile

再起動しても有効になるように設定します。
$ sudo vi /etc/fstab
下記を記述します。
/swapfie swap swap defaults 0 0

DNSの設定

他にDNSを使っていれば不要ですが、今回はGCPを使用しました。

ネットワークサービス – Cloud DNSを選択します。
ゾーンを作成します。

ゾーン名は適当に。
ゾーン名は文字で始まり、文字または数字で終わるようにし、小文字、数字、ダッシュのみを使用してください。

DNS名:取得したドメイン。サブドメインは入れません。
DNSSEC:オフ

作成ボタンをクリックします。

お名前.comでドメインを取得したので、ネームサーバの設定をします。
お名前.comの管理画面にログインします。

ネームサーバの変更をクリックします。
ドメインをクリックします。
Cloud DNSのデータを入れます。

Cloud DNSに戻ってきて、レコードセットを作成します。
レコードセットを追加をクリックします。
DNS名にwwwを追加します。
リソースレコードのタイプ:A
TTL:5
TTLユニット:分
IPv4:GCEのIPアドレス
作成ボタンをクリックします。

.htaccessを有効にする

VirtualHostの設定に追加します。

$ sudo vi /etc/httpd/conf.d/任意のワードプレスのディレクトリ名.conf

macchan-dev.comからリダイレクトさせる

もともとwwwなしで作っていたので、wwwへリダイレクトさせます。
これもVirtualHostで設定します。

RewriteEngine on
RewriteCond %{HTTP_HOST} ^macchan-dev\.com$
RewriteRule ^/(.*) http://www.macchan-dev.com/$1 [R=301,L]

Let’s Encrypt

SSL接続を有効にするためLet’s Encryptを導入します。
今回の移行の目的の1つです。ホスティングサービスでSSL化させると高いので。。。

$ sudo yum install epel-release
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirror.web-ster.com
* epel: mirrors.cat.pdx.edu
* extras: mirror.keystealth.org
* updates: mirrors.cmich.edu
Package epel-release-7-11.noarch already installed and latest version
Nothing to do
すでに設定されています。

インストールです。
$ sudo yum install certbot python-certbot-apache

certbotを実行します。
$ sudo certbot
いろいろ聞かれるので入力していきます。

  • メールアドレス
  • 利用規約に同意
  • Electronic Frontier Foundationにメールアドレスの共有するか
  • SSL化するドメイン
  • HTTPでアクセスされた場合、HTTPSへリダイレクトするか

1枚の証明書で両方のドメインをSSL対応させます。
$ sudo certbot –expand -d macchan-dev.com -d www.macchan-dev.com
サブドメインがない方を先に書きます。

HTTPSへのリダイレクト設定を行うと自動でApacheの設定ファイルが追加されます。

Let’s Encryptを自動更新するようにcronの設定をします。
$ sudo crontab -e
root権限で設定します。
例えば下記のように入力します。
25 3 10 * * sudo certbot renew –post-hook “sudo systemctl restart httpd.service”
–post-hookオプションで更新後にコマンドを実行できます。

以上です。


Zenfone4(ZE554KL)を買いました


周りがiPhone Xで騒いでいる中、Zenfone4を購入しました。

今まで使用していたNexus5Xが再起動ループを発症してしまい、復旧の見込みはないので新しいのを探していました。
つなぎに更に前に使用していたXperiaAでなんとかしのぎつつ、Pixel2を待ってみたものの日本の発売はなし。。。
もうどうにもならないので新調した次第です。
ファーウェイのP10 liteも候補にしましたがバックドア問題がまだ気になるのでASUSのZenfone4にしました。
Android8にも上がる予定になっているので楽しみですね。

箱の中身を全部出しました。

左上から

  • 充電器
  • USB Type-Cケーブル
  • イヤホン
  • イヤーピース
  • SIMピン
  • 外箱
  • 本体
  • スマホケース

スマホケースがついてくるなんて珍しいですね。

Zenfone4は、Snapdragon660・メモリが6GBのモデルとSnapdragon630・メモリ4GBの2つモデルがあります。
購入したのは前者のSnapdragon660・メモリが6GBです。
性能が良いのでしばらくは使えそうです。
手に持った感じはでかいですね。親指がバックキーに届かないですw
最近のスマホは大きいサイズばかりなので慣れるしかないですね。

すこし使った感じではキビキビ動いています。タップしたらすぐ動く感じです。
ゆったりとアニメーションして動くというよりかはすぐ、キビキビと動くイメージです。

スマホ交換と一緒にMVNOも変更しました。
iijmioを使っていましたが、スマホセットで購入すると安くなるのとキャッシュバックにひかれてBIGLOBEモバイルです。
ググった感じではまぁ悪くはなさそうなのかなと。すごい回線速度が早いわけではないけど、極端に遅くもならないのかなぁと。
それよりはキャッシュバック額の影響が大きいです。

以上です。


JavaでGoogleスプレッドシートを使う


最初に

Javaプログラムで処理した結果をスプレッドシートに出力したかったので、まずクイックスタートをやってみました。

公式ページ

使うのに必要なもの

スプレッドシートを使うにあたって必要な要件です。

  • Java1.7以上
  • Gradle2.3以上
  • インターネットとWebブラウザ
  • Googleアカウント

APIを有効にする

Step1のthis wizardのリンクをクリックする。
「APIを有効にする」の画面が表示される。
「プロジェクトを選択」をクリックする。
「+」アイコンをクリックする。
「新しいプロジェクト」画面に遷移。
「プロジェクト名」を入れ、「作成」ボタンをクリックする。

最初の「APIを有効にする」画面に戻るので、「プロジェクトを選択」から作成したプロジェクトを選ぶ。
G Suite APIsのSheets APIを選ぶ。
有効にするをクリックする。
Google Sheets APIのダッシュボード画面にある「認証情報を作成」をクリックする。

左ペインの認証情報をクリックする。
「OAuth同意画面」のタブを選択する。
メールアドレス、ユーザーに表示するサービス名を入力し、保存ボタンをクリックする。
「認証情報」タブを選択する。
認証情報を作成をクリックし、OAuth クライアントIDをクリックする。
アプリケーションの種類でその他を選択し、作成をクリックする。
「名前」に名称を入れる。
OKボタンをクリックし、ダイアログを閉じる。
JSONをダウンロードするアイコンをクリックしダウンロードする。
ファイルに適当な名前を付けて、Javaプロジェクトのディレクトリに置く。
例)client_secret.json

GradleでJavaプロジェクトを作成

公式ページにはgradleコマンドでプロジェクトを作成していますが、IntelliJ IDEAで作成しました。
Gradleで普通に作れば大丈夫です。

build.gradleのdependenciesに下記を追加します。
compile ‘com.google.api-client:google-api-client:1.22.0’
compile ‘com.google.oauth-client:google-oauth-client-jetty:1.22.0’
compile ‘com.google.apis:google-api-services-sheets:v4-rev478-1.22.0’

次にclient_secret.jsonをsrc/main/resources/に置きます。

実行

公式ページにあるサンプルソースをコピペして実行します。
初回起動時にはブラウザで認証が必要になります。
認証を行えば実行結果を得られます。

以上です。


IntelliJ IDEAでGradleのJavaプロジェクトを始める


IntelliJ IDEAを使ってGradleのJavaプロジェクトを始めるときの備忘録。

プロジェクトの作成

IntelliJ IDEAを起動し、「Create New Project」をクリック。

「Gradle」、「Java」を選択し、Next。

「GroupId」、「ArtifactId」を入れて、Next。
GroupId・・・パッケージ名
ArtifactId・・・プロジェクト名

下記にチェックを入れる。
「Use auto-import」
「Crate directories for empty content roots automatically」
下記チェックは外す。これを外す理由
「Crate separate module per source set」
それで、Next。

「Project name」、「Project location」は適宜入れて、Finish。

Gradleのディレクトリ構成のプロジェクトができる。

ソースの追加

Projectのディレクトリ構成から、
Gradle – src – main – java まで開き、右クリックで、New – Packageを選択。
パッケージ名を入れる。

できたパッケージを右クリックし、New – Java Classを選択。
クラス名を入れる。

適当にプログラムを書く。

クラスの横に実行マークが付いているのクリックする。

さらにダイアログが出て来るのでRunをクリックする。

ビルドが始まり、実行される。
実行結果は、画面下のRunのウィンドウに表示される。

ライブラリ追加

「Project Structure」のアイコンをクリックし、ダイアログを開く。

Libraries – + – From Maven…をクリックする。

コマンドライン引数のパーサをするライブラリargs4jを入れてみます。
開いたダイアログでargs4jを検索します。
テキストボックスにargs4jを入れて、虫眼鏡アイコンをクリックする。
いろんなバージョンが表示されますが、新しいバージョンを選んで、OKをクリックする。

Choose Modulesダイアログで1つだけGradleSampleと出てくるので、OKをクリックする。

Modules – GradleSample – Dependenciesタブにargs4jのライブラリが入っていることを確認する。
OKをクリックする。

args4jを使ってみる

上記手順でライブラリを使えるようになったので使ってみます。
ざっくり書いてみます。

コマンドラインで-fオプションを指定すれば、フィールドhogeに入ります。
IntelliJ IDEAから引数を指定するためにRun Configurationsのダイアログを開きます。
「Program arguments」に「-f」の後、文字列を入れます。

実行すると、オプションに指定した文字列が表示されます。

とりあえず、以上です。


headless Chromeの起動


Chrome59からheadlessで起動できると話題なので試しました。

Google公式に詳しく記載されています。

cliで起動とかはうまくいったのですが、LighthouseのChromeLauncherを使おうとするとエラーが発生しました。

Lighthouseが2.0から変わったようです。
上記のエラーではないのですが、似たようなIssueがありました。
内容を抜粋すると下記のようにすると起動できます。

requireするファイル、起動用の関数やオプションの指定の仕方も変わったようです。
サンプルのGitHubです。

以上です。


node.jsでMySQLを使う


node.jsでMySQLを使う場合、ググるといっぱい出てきます。

クラスメソッドのブログ

Qiitaの記事

npmにMySQLのライブラリがありますので、それを使用します。
MySQLのnpm
READMEによると下記のように使用します。

ライブラリのインストール

$ npm install mysql

接続情報とクエリーの実行

createConnection関数でMySQLのホスト名、ユーザー名、パスワードなどを定義し、
query関数でSQLを実行、コールバック関数で結果を受け取ります。

もうちょっと使いやすく

1ファイルに記述するのは上記のやり方で十分ですが、
実際には、接続情報は1箇所に記述したいですし、コネクションプールも使いたいかなと。
下記サイトが参考になりました。

How To Use MySQL With Node & Express

一部抜粋します。

本番用、テスト用のモードを指定し、使用するデータベースを分けています。
また、createPool関数でコネクションプールを使うようになっています。

以上です。


スクレイピング-SpookyJS編-


前回 CasperJSでスクレイピングしましたが、node.jsからは使用できなかったので、
node.jsから使用できるSpookyJSでスクレピングしてみました。

SpookyJS公式

SpookyJSはnode.jsからCasperJSを起動するようにしたライブラリです。
casperjsコマンドを内部で実行しているようです。

簡単なサンプルを作りました。GitHub

SpookyJSのインストール

CasperJS、PhantomJSのインストールも必要です。
SpookyJS自体はnpmでインストールできます。

$ npm install spooky

SpookyJSでスクレイピングする処理を書く

googleで”スクレイピング”を検索し、結果を表示します。

spooky.then内で定義している関数がPhantomJS内で実行されるJavaScriptになります。
‘load’イベントを作成し、その引数にCSSセレクタで指定した要素からhref属性を取得し、そのhrefを返します。
spooky.on(‘load’・・・で定義したところでイベントを受信します。
この動作自体はCasperJSと同じですが、SpookyJSなら受け取った値をmysqlのライブラリを使ってDBへ登録など、
node.jsのライブラリをも使うことができます。
CasperJSのwaitTimeoutやstepTimeoutも指定することができるので、Ajaxのページでも値が取ることができます。

以上です。


スクレイピング-CasperJS編-


目的

CasperJSを使ってスクレイピングしてみます。

CasperJS公式

CasperJSは、PhantomJSを使いやすくラッピングしたJavaScriptです。
最初は、node.jsのライブラリと思ってましたが、使ってみたらそうではなく、
casperjsというコマンドで実行します。
そのためnode.jsの他のライブラリを使うことはできませんでした。

CasperJS、PhantomJSのインストール

最初はPhantomJSからインストールします。

PhantomJSのダウンロードページ

各OS毎にバイナリが用意されています。
今回はMac OS X版をダウンロードし、zipを展開します。
展開するとバイナリが出てきますので、適当にパスが通ったところに置きます。
例)
mv ~/Download/phantomjs-2.1.1-macosx /usr/local/

次にCasperJSをインストールします。npmで簡単にインストールできます。

npm install casperjs

CasperJSでスクレイピングする処理を書く

CasperJSの実行

casperjsコマンドで実行します。

$ casperjs casperjs_sample.js

下記のようにログ出力されました。

/url?q=https://ja.wikipedia.org/wiki/%25E3%2582%25A6%25E3%2582%25A7%25E3%2583%2596%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AC%25E3%2582%25A4%25E3%2583%2594%25E3%2583%25B3%25E3%2582%25B0&sa=U&ved=0ahUKEwjH7s223I3SAhUMbbwKHWkWAroQFggYMAE&usg=AFQjCNHZAORThLyskf3nDxY9SlIMZY3Mvg
/url?q=https://ja.wikipedia.org/wiki/%25E3%2582%25A6%25E3%2582%25A7%25E3%2583%2596%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AC%25E3%2582%25A4%25E3%2583%2594%25E3%2583%25B3%25E3%2582%25B0&sa=U&ved=0ahUKEwjH7s223I3SAhUMbbwKHWkWAroQFggcMAI&usg=AFQjCNHZAORThLyskf3nDxY9SlIMZY3Mvg

期待するものは、httpsから始まるURLですが、最初に”/url?q=”という文字がついています。
どうもユーザエージェントの指定で結果が変わるようです。
CasperJSのデフォルトのユーザエージェントは下記のものでした。

Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) CasperJS/1.1.3+PhantomJS/2.1.1 Safari/538.1

ユーザエージェントをChromeのものに変えると期待するURLを得ることができました。

casper.userAgent(“Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36”);

スクレピングするならbotらしいユーザエージェントが良いのだと思います。

以上です。