WordPressをローカル環境にコピーした際の覚え書き

WordPress themes を作成していると、ローカル環境でファイルやデータベースを予め作成し、それをアップロードしてサーバー上に同じものを再現することが良くあります。

その反対にサーバー上に既に公開されている古いテンプレートをダウンロードして、ローカル環境に再現することも稀にあります。

こうした再現方法は様々なところで既に紹介されているのですが、自分で実行してみると予想外のエラーが生じて説明通りに行かないことも多々あります。

私が困ったことは、以下のようなブラウザの警告文が生じてフロントページにアクセスできない現象です。

This page isn’t working
localhost didn’t send any data.
ERR_EMPTY_RESPONSE

データベースには正常に接続できているらしく、ログイン画面などにはアクセスできるのですが、静的なフロントと自作の幾つかのページにだけはアクセスができません。

行なったことは (1) ローカル環境の workspace に WordPress をダウンロードして展開し、データベースを新規に作成したこと。

その後、(2) サーバー上の mysqldump を使用して WordPress データベースを SQL ファイルに出力したこと。

$ mysqldump -u yourName -p wp_project > wp_project.sql

最後に (3) サーバー上にて出力した SQL ファイルと古いテンプレートファイルをダウンロードして、ローカル環境で展開した WordPress ファイルと作成したデータベースをそれぞれ上書きしたことです。

$ /Applications/MAMP/Library/bin/mysql --host=localhost -uroot -proot -p wordpressProject < wp_project.sql

この状態でブラウザを立ち上げて、localhost の WordPress プロジェクトにアクセスしてみたのですが、フロントページが表示されずに ERR_EMPTY_RESPONSE というエラーメッセージが出力されてしまいます。




原因が分からないのでエラーログを参照してみましたが、特にエラーらしきものは記録されていません。

$ cat /Applications/MAMP/logs/mysql_error_log.err

あまりの不明さに .htaccess ファイルを編集したりと的外れなことを一通り検証して、ふと未設定な項目を埋めていけば動くのではないかと wp-config.php ファイルを開いて WP_HOME と WP_SITEURL に localhost を指定してやりました。

define('WP_HOME','http://localhost:8888/wordpressProject');
define('WP_SITEURL','http://localhost:8888/wordpressProject');

この変数を設定してようやくローカル環境でもフロントページが表示されるようになりました。
全く私が悩み苦しんだ数時間は何であったのでしょう。

同じようにデータベースの接続が正常、ログイン画面などには問題なくアクセスできるのに、フロントページが表示されない場合は wp-config を見直すと問題が解決するかもしれません。

ZXing で二次元バーコードを作成した際の覚書

スタンドアローンで動作する二次元バーコード作成ソフトを探したところ、文字コードや余白やマスク処理について指定できそうな適当なものが見つかりませんでした。

探し続ければ良いものがあるのかもしれません。

しかし限られた時間中に見つけられる保証もなかったので Java で作成してしまうことに決めました。

なぜ Java なのかは — 単純に Android で用いられることから、最新の状態で整備されているバーコード作成ライブラリが簡単に見つかるような気がしたからです。




検索してみたところ、実際に ZXing Project というプロジェクトが見つかります。

今回はこのプロジェクトを こちら から zip 形式でダウンロードした後、Apache Maven を使用してビルドして使用します。

$ unzip zxing-master.zip
$ cd zxing-master
$ mvn package

私の場合はエラーを出力してビルドに失敗してしまいました。

[WARNING] Rule 4: org.apache.maven.plugins.enforcer.RequireMavenVersion failed with message:
Detected Maven Version: 3.1.1 is not in the allowed range 3.2.5.

このようなエラーメッセージが現れた場合、Maven のバージョンが合致していない事が示されていますので、該当のバージョンをインストールしてやると大体はうまくいきます。

うまくビルドに成功した場合、 core ディレクトリ直下に tagert ディレクトリが作成されます。

使用したいのはその中にある core-3.3.1-SNAPSHOT.jar というファイルです。

パスで示すと次のような具合になります。

zxing-master/core/target/core-3.3.1-SNAPSHOT.jar

この jar ファイルにパスを通して com.google.zxing パッケージとそれに属する必要なクラスを参照すると、二次元バーコードを簡単に作成できるようになります。

import com.google.zxing.*;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

入出力の必要に応じて java.awt 等の他パッケージのクラスもインポートしてください。

インポートができたら QRCodeWriter の encode メソッドを使用して BitMatrix を生成します。

この際に予め Map < EncodeHintType, Object > hintMap を作成しておくと引数として文字コードや余白を指定できます。

/* hintMap を作成して引数を指定 */
Map  hintMap = new EnumMap (EncodeHintType.class);
hintMap.put(EncodeHintType.MARGIN, 1);
// EncodeHintType.QR_VERSION , EncodeHintType.CHARACTER_SET , EncodeHintType.ERROR_CORRECTION などの設定項目をキー、設定をバリューとして hintMap の引数に与えることで他の具体的な設定もできます
/* BitMatrix を生成 */
BitMatrix matrix = new QRCodeWriter().encode("入力文字列", BarcodeFormat.QR_CODE, 横サイズ, 縦サイズ, hintMap);
// WriterException を吐きます
// 引数の横サイズと縦サイズは int 型の数字を入れてください

上で作成した BitMatrix を使ってグラフィカルイメージを作成します。

BufferedImage image = new BufferedImage(matrix.getWidth(), matrix.getWidth(), BufferedImage.TYPE_INT_RGB);
image.createGraphics();

あとは他の画像編集などと同様に、Graphics / Graphics2D クラスなど使用して作成した image を編集したり、出力したりしてください。

これに例えばテキストファイルの読み込みを組み合わせれば、エラーの原因ともなる煩わしいコピー&ペーストから解放されるので、とても便利に使えます。

私はこの分野にあまり詳しくなかったのですが、コードを読み込んでいくうちにバージョン、マスク、誤り訂正など基本的な機能を勉強することもでき、なるほどと思わず関心してしまいました。

はじめてのAndroidプログラミング

私にとってモバイルや通信は全くの専門外ですが、勉強も兼ねてボランティアで日本語学習者を対象とした Android OS 向けの辞書アプリを作成しています。その際に利用した最初かつ唯一の入門書が本書になります。


超初心者でも大丈夫! はじめてのAndroidプログラミング Android Studio 2対応

取り敢えずのJavaの基礎さえあれば、これ一冊で導入から短期間でアプリケーションの開発ができてしまうのですから驚きという他にありません。

もちろん、私自身は全くの初心者という訳ではなく、学部生の時分にはアルバイトで分散リアルタイム解析を行っていたぐらいのJavaの知識はあります。

冒頭の写真にある参考書の内容ぐらいは把握していますので、その程度の知識と経験を持った上での感想である事をご了承ください。



本書の構成は章ごとに独立したアプリケーションの作成を通して新しい内容を学ぶ事に一貫されており、まずは開発環境のAndroid Studioの導入と設定に始まり、画面の作成、画面の遷移、ダイアログ表示やカレンダー、センサーの利用と進み、最終的に OR Mapper や外部の Web API を用いたアプリケーション開発までの範囲を網羅しています。

これだけ幅広い内容を取り扱いながら、文字コードの設定 (日本語入力に必須) やエディタの行数表示などの細かい部分にまで気が配られている事に好感を覚えます。

『はじめに』に記述されている「プログラミングの初心者でもつまづかないよう」にとの配慮でしょうが、それだけにエラーメッセージについての項目がなく「ツールウィンドウがある」という表記に留まっているのが少し気に掛かりました。

詳しくは後述しますが、プログラミングでつまづいた際に解決する手掛かりとなるのがエラーメッセージなので、ググり方を知らない本当の初心者だけでなく「ある程度の経験がある」読者のためにもあっても良いのではないかと思われました (私は最初の頃はエラーで苦労しました)。

それというのも本書のコードを見ながらメソッドを穴埋めしていくとビルドに失敗したり、クラッシュしたりする事が何度かあったのです。

そこでエラーメッセージを見直してみると次のような警告がなされていたりします。

error: no suitable method found for show(android.app.FragmentManager,String) method

このエラーが出る原因は android.app.DialogFragment を読み込むべきところに自動インポートで android.support.v4.app.DialogFragment を読み込んでいる事にあります。

本文の説明やサンプルコードには android.app.DialogFragment をインポートするとしっかり書いてありますが、(自動インポートだけに) コード解説部分では省略されているので気が付かないと何処が間違っているのか分からずに立ち往生します (インポート部分だけはサンプルコードからコピー&ペーストした方が確実です)。



さらに困った事には、現行の Android Studio 2.2.2 でボタンの OnClick 動作を行うとプログラムが落ちてしまう事があります。

これは Android Studio のバグかもしれません が、Android入門者には何が起こっているのか見当もつきません。

Javaの開発経験で養った勘を活かして次のようなエラーメッセージを確認する事で、初めて何が起こっているのかを把握する事ができます。

java.lang.IllegalStateException: Could not find method methodName (MainActivity)(View) in a parent or ancestor Context for android:onClick attribute...

これを見るとメソッドを見つける事ができない事が原因となっているので、activity_main.xml を編集して手動でメソッド名を追加してしまえば何とかなるのではないかと対処方法を考える事ができるようになります※。

換言すれば、若干、不足気味と感じられたのは問題発生時の対処程度であり、入門書で扱う範囲については過不足なくまとめられている良書であると思われました。

さすがにGradleによるビルド等には触れられていませんが、この一冊だけでAndroidアプリケーションの構成からGUIとイベント処理、ミドルウェアの取り扱いについて不安がなくなった事は事実です。

章ごとに独立したプロジェクトを立ち上げるのでアプリケーションが乱立気味にはなりますが、その分、繰り返す事により後半に進むに連れて展開が予想できる程にAndroid開発に慣れてきます。

この章ごとに独立した構成から最初の4章までを除いて、以降は興味のある内容を扱った章のみを摘み食いしても差し支える事はおそらくありません。

総評すると最初の一冊としての選択として間違いのない内容であったと思われました。




※ この問題については Layout の編集において”Text”タブをクリックし、

android:onClick="methodName (MainActivity)"

上の部分を次のように書き換えると無事に参照できるようになります。専門外なので原因は分かりません。

    android:onClick="methodName"

余談

プログラミング初心者の方の為に追記しますが、第2章のレイアウトXML編集 (レイアウトエディタ) では本書で紹介されている LargeText が存在しない為、自己判断で Plain Text で代用しました。

変数の参照さえ合っていれば、部品は何を使っていてもプログラムとしては問題ありません。

同じく第4章では、ボタンクリック後の遷移先の画面に空の (画像を指定しない) ImageViewを作成できなかったので Drawable の中の適当な画像を選択して my_hand_image を作成しています。

プログラムの構造上、この変数は遷移前の画面で指定された画像に置き換わる事は自明なので、本書と同じように空の ImageView が作成できないという理由で立ち止まらず、変数だけ作成してしまって先に進んだ方が賢明です。

関連記事: