2冊目の参考書に『基本からしっかり身につく Android アプリ開発入門』を購入

『はじめてのAndroidプログラミング』の読了後に2冊目として『基本からしっかり身につくAndroidアプリ開発入門』 (以下、本書) を購入しました。

購入理由は Android 端末のストレージ操作とカメラ撮影を用いたアプリ開発について、短時間で効率的に学習したかったためです。

時間をいくらでも費やせるのであれば、自らソースコードを読み込んで学習しても良いのですが、時間を掛けずに体系的に知識を会得するには書籍を購入して自分で手を動かしながら検証した方が確実です。



基本からしっかり身につくAndroidアプリ開発入門 Android Studio 2.x対応 プロが本気で教えるアプリ作りの基本「技」 (ヤフー黒帯シリーズ)


本書はまさに2冊目に読む参考書として適当な内容で、ある程度のアプリ開発経験を持っていた方が内容が頭に入りやすいです。

というのも第1章でアプリ開発環境に触れた後は、アプリのコンポーネントとそのライフサイクル、リソースやパーミッションの話が始まります。

少しでもアプリ開発の経験があれば、なるほどと感心するところですが、前提知識を持たずに読むと何について解説しているのか具体的なイメージが思い浮かばずに混乱するかもしれません。

さらに付け加えると Java 言語の説明はありませんので、ソースコードを読み、何をしているのか理解できることが前提となります。

とりあえず動くアプリを開発したいという目的であれば、『はじめてのAndroidプログラミング 改訂版』を本書の先に読み、コンポーネントの名称や役割をアプリを動かしながら覚えた方が早いです。

前提知識があった方が望ましい反面、本書ではどの処理で何をすべきであり、何を避けるべきであるかが理由とともに述べられているところが本書の長所です。

具体的な開発経験からくる的確な助言が、処々に述べられており、この説明部分だけでも読むだけの価値があります。




短所はプログラムのソースコードが一部おかしかったり、( 紙面が足りなかったのか ) 本来は分けて説明すべき項目を一つの章にまとめているので、書籍やプログラムの構成が煩雑で分かりにくい部分が存在することです。

また出版時期の影響から現行の AndroidStudio Version 2.3 と ConstraintLayout に対応していません。

ソースコードがおかしい部分の一例としては、Chapter 3 の MainActivity.java クラス (pp.137) が挙げられます。

本書では以下のように View.OnClickListener をインプリメントしているのですが、これでは public void onTextChanged などの一部のメソッドをオーバーライドすることはできません。

public class MainActivity extends AppCompatActivity implements View.OnClickListener

仕方がないので、いつものごとくソースコードの内容を勝手に書き換えて対応します。

public class MainActivity extends AppCompatActivity implements TextWatcher, View.OnClickListener

これが正解かどうかは分かりませんが、本書の説明どうりにアプリが起動するようになるのであれば、ソースコードを改変したところで大きな問題はないというのが私の方針です。

余談ですが、ソースコードの書き方には冗長に見える場面があったり (pp. 208)

for(String foo : bar){
   if(!check()){
      throw new Exception();
   }
}

と思いきや、その直後のページ (pp. 209) では余分な文字を省略したりという具合に書き方が安定しません。

if(!check())
   throw new Exception();

もしかしたら、それぞれ別の人が書いたか、別の時期に書かれたソースコードなのではと思えてきます。

どうでも良い余談は置いておくとして、書籍やプログラムの構成が煩雑で分かりにくくなっていることが顕著なのは Chapter 4 です。

この章ではファイルの入出力とデータベースの利用とコンテントプロバイダの利用を行うクラスを実装しているのですが、どこまでが説明のための実装例で、どこまでがアプリを動かすための要素として必要なクラスなのかが分からずに混乱します。

見方を変えれば、具体的な実装例がいくつも提示されていてありがたいとも言えるのですが、改訂版では分かりやすく整理して頂けると私のような読者は助かります。

当然ながら本書一冊で Android 開発に求められる知識を網羅しているわけではありませんが、通読したことにより具体的な実装方法のみに留まらず、気を配るべき事項や実装中に注意すべき点などを学習することができたことは大きな収穫でした。

本書は Android アプリ開発の入門書を読み終えて、少しステップアップしたい私のような読者には役立つ書籍と言えそうです。

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 を編集したり、出力したりしてください。

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

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