Heroku Pipelineでステージング環境のDBをReview Appsにコピー

現在開発が継続中のシステムがあるのだが、Heroku上で稼働している。
先日セールスフォースの阿部さんのWebinarでそのHerokuのPipelineについて知る機会があり、感動のあまり早速取り入れることにした。それと同時に開発フローをGitHubフローに変更。このあたりは、Herokuとチーム開発のおいしいレシピ~HerokuとGitHubを連携してCI/CDを実現する (1/5):CodeZine(コードジン)の記事に詳しい。実際、ボクが受けたWebinarはこの記事をベースにしたものだった。
もともとテスト環境用にappを用意していたので、それをステージング用に設定すればPipelineが完成。
ところが少し問題が。ステージング用appはもともとテスト用なのでDBが完備されている。一方、この環境をベースにしたReview Appsの方はDBが整備されていない。もちろん、Heroku Postgresのadd-onは追加され、DATABASE_URLも個別のものが設定されているが肝心の中身がないのだ。
そこで、Review Appsが作成される際に、ステージング用appからDBの中身をコピーするようにしなければならない。このことは、こちらのマニュアルの注意書きにちゃんと書かれている。
試行錯誤の結果、以下のようにしたらできた。

  • ステージング環境に環境変数STAGING_DATABASE_URLを用意し、DATABASE_URLの内容をコピー。
  • Review Appsではその内容を引き継げるようにapp.jsonに記述。これは、

    "env": {
        "STAGING_DATABASE_URL": {
          "required": true
        },

    のように記述する。


  • app.jsonのpostdeployスクリプトにDBのコピーコマンドを記述する。

    "scripts": {
       "postdeploy": "pg_dump $STAGING_DATABASE_URL | psql $DATABASE_URL"
    },


これで、ステージング環境のDBが丸ごとコピーされる。
ただ、このやり方にも少し不満がある。それは、Herokuは定期的にDATABASE_URLを値を変えるのだが、その時に手動でSTAGING_DATABASE_URLも書き換えないといけない。このあたりも自動化できないものだろうか。

Composerで環境チェックを無視

現在開発中のPHPシステムの開発環境を別のMacに作ろうとしたときに、composerコマンドで少し困った問題が発生。
システム自体はMac上でコーディングしているが、それが実際に動作しているのはVagrantで構築したLinux仮想環境。もちろん、Mac上のプロジェクトフォルダと仮想環境のドキュメントルートは同期してある。実際にシステムが動作するのがLinux仮想環境なので、PHPのバージョンなどは仮想環境の方だけ注意していれば問題ない。
はずだったのだが、Mac上のプロジェクトフォルダでcomposer installコマンドを実行するとエラーが発生する。

your PHP version (5.6.30) does not satisfy that requirement.

そう。
Mac内にはあらかじめ5系の古いPHPが入ってしまっているのだ。composerがそっちを認識してしまう。もちろん、Linux仮想環境の方からcomposerコマンドを実行すればうまくいくのだろうが、何かいい方法はないものだろうかと調べたら、オプションがあった。

composer --ignore-platform-reqs install

Macの環境の方を無視してくれる。

phpMyAdminのログインループ

phpMyAdminのログイン画面でログインしようとすると、先に進まずにずっとログイン画面が表示されてしまう。
あ、いや、MySQLへのアクセスは、コマンドかMySQL Workbenchを使うので、普段はphpMyAdminを全く使わない(除くレン鯖)のだからいいのだけど、授業で使う関係で、新しいXAMPP(7.1.4)をインストールしたら問題が発覚した。
XAMPPインストール直後のMySQL(正確にはMariaDBだが)はrootパスワードが設定されていない。しかも、phpMyAdminにアクセスすると、無条件でrootでログインした状態の画面が表示される。これは全くもって問題なので、何はともあれ

  • rootのパスワードの設定
  • phpMyAdminでオートログインの解除、つまり、ログイン画面の表示

を設定するのが定石である。今回もこれを行った。そして、phpMyAdminのログイン画面でrootでログインしようとすると、何のメッセージもなくログイン画面が表示されたままになってしまう。試しに間違ったパスワードを入力すると、ちゃんとエラーメッセージが表示される。つまり、ログイン処理は正常に行われているのだが、その後の画面へ遷移しないのだ。あーだこーだと調査して原因がはっきりした。犯人はphp.iniの

session.auto_start=1

だった。ボクは、PHP開発ではsession.auto_startはOnで行っている。なので、まずこの設定を行うのだが、これが悪さしている。この設定を

session.auto_start=0

とすると、無事ログイン後の画面が表示されるのだ。XAMPPの5.6系列ではこんな問題はなかった。
さてさて、どうするか。この時に便利なのがローカル設定。ローカル設定は、

の3種の方法がある。通常は、.user.iniを選ぶところだが、これまたXAMPPでは.user.iniが効かないのだ。しかも、.htaccessもXAMPPのphpMyAdminの設定は

AllowOverride AuthConfig

となっていて、書き換えができない。そこで最後の方法を選択するしかない。XAMPPのphpMyAdminApache設定は、httpd-xampp.confファイルに書かれている。このファイルは、

  • Windows: C:\xampp\apache\conf\extra
  • Mac: /Applications/XAMPP/xamppfiles/etc/extra/

にある。Windowsの場合は、XAMPP Control PanelのApacheのConfigボタンをクリックしても編集できるようになっている。
このファイルのWindowsなら91行目、Macなら19行目当たりにある

<Directory "…phpMyAdmin">
  AllowOverride AuthConfig
  Require local
  ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var
</Directory>

<Directory "…phpMyAdmin">
  php_flag session.auto_start Off  # ←
  AllowOverride AuthConfig
  Require local
  ErrorDocument 403 /error/XAMPP_FORBIDDEN.html.var
</Directory>

のように書き換える。矢印の1行が増えている。これで、Apacheを再起動したら、無事phpMyAdminにログインできた。

Mac版EclipseのTomcatプロジェクトでアプリルートが1文字切り詰められる件の対処法

MacEclipseTomcatプロジェクトを作成する際に、環境によってはアプリのルートディレクトリの末尾の1文字が削られることがある。

例えば、Tomcatプロジェクト作成ウィザードで「Hoge」プロジェクトを作成しようとして、第1画面ではプロジェクト名に「Hoge」と入力する。[次へ]をクリックし、の第2画面で左のように、コンテキスト名、アプリのルートともに「/hoge」と入力したとしよう。


すると、出来上がったプロジェクトは左のようにアプリのルートディレクトリが「hog」と最後の「e」が欠落した状態となっている。これは、Eclipse Tomcat Pluginのバグではないかと思うのだが、どういった環境で発生するのか掴めていない。いずれにせよ、発生した場合は手動で直す必要があるのだが、よく直し方の質問を受けるので、ここにまとめておくことにしよう。

以下の作業を行う。なお、作業中にはプロジェクトのエラーが発生するが気にせず最後まで行う。

  1. アプリのルートディレクトリ(上記例では「Hoge/hog」)を正しいディレクトリ名に変更する。上記例では、「hog」を「hoge」に変更する。
  2. パッケージエクスプローラー上で「hoge」フォルダを開くと、「hoge/WEB-INF/src」フォルダが存在するので、それを右クリックし、
    [ビルドパス]>[ソースフォルダとして使用]
    を選択。すると、パッケージエクスプローラー上に「hoge/WEB-INF/src」というソースフォルダが出現する。
  3. プロジェクトフォルダを右クリックし、
    [ビルドパス]>[ビルドパスの構成]
    を選択。[ソース]タブを選択し、
    1. 欠落しているソースフォルダ(例では「Hoge/hog/WEB-INF/src」)を選択し、[除去]ボタンをクリックする。
    2. 下にある[デフォルトの出力フォルダ]欄が現在「Hoge/hog/WEB-INF/classes」のように1文字切り詰められたフォルダになっているので、ここを「Hoge/hoge/WEB-INF/classes」のように正しく修正し、[OK]をクリック。
  4. 最後に、パッケージエクスプローラ上に残った1文字切り詰められたフォルダ(ここでは「hog」フォルダ)を削除。

これで問題が解決する。
いずれにせよ、このバグ、直してほしいものだ。

NeonにEclipse Tomcat Plugin

JavaによるWebシステム開発Eclipseを使用する場合、最近はJavaEEパースペクティブを使った動的Webプロジェクトが主流みたい。ただ、ある程度小規模のWebシステム、特にTomcatベースの場合はJavaパースペクティブTomcatプロジェクトを使用したほうが、小回りがきいて開発しやすい。現に、ボクは相変わらずTomcatプロジェクトだ。
ところが、Pleiades All in OneのNeonには、このTomcatプロジェクトを作成するためのEclipse Tomcat Pluginが含まれなくなった。Marsまでは含まれていたのに。
ということで、手動でインストールする必要がある。Eclipse Tomcat PluginのTOPページを見てもUpdateSiteへのリンクが書かれているので、これを利用すればインストールできる。さらに、最近の方法では、Eclipseマーケットプレースを利用することもできる(こちらがそのページ)。
ところが、この両方ともインストールできないのだ。やろうとすれば、エラーが出てしまう。どうも、JREのセキュリティ関係の問題らしい。こちらに報告がある。このやり取り中にあるように、セキュリティポリシのファイルを別途ダウンロードしてEclipseが起動に使用しているJREのライブラリを書き換えれば無事インストールできるのだが、これはこれで問題。
そこで、上のやり取りの一部に書かれているように、以下の方法を使用すると、セキュリティポリシを変更しなくてもインストールできる。

  1. UpdateSiteの「Download update site archive (1.5 MB)」のリンクからzipファイルをダウンロードする。
  2. Eclipse
    [ヘルプ]>[新規ソフトウェアのインストール]
    で表示されたインストール画面で、サイトの追加ボタンをクリック。
  3. 表示されたダイアログで、URLを入力するのではなく、[アーカイブ]を選択し、1でダウンロードしたzipファイルを指定し、[OK]をクリックする。

あとは、通常のUpdate Siteからのインストールと同じように、インストール画面を[次へ]、[次へ]とクリックしていけば、インストールできる。

Bootstrapのform付モーダルをiOS上で表示するには

Bootstrapのモーダルはすごく便利。
ただ、form付モーダルをiOS上で表示させる際には注意が必要。入力部品を選択し、バーチャルキーボードを表示させたが最後、画面をスクロールさせるとモーダルじゃなくて背景の画面がスクロールしてしまう。これは、Bootstrapのバグで、ちゃんと公式サイトにも記述がある。そこには解決策も書かれていて、手動でモーダルのCSSを「position: absolute 」に変更してあげればいいらしい。ということで、モーダルを表示するJavaScriptを以下のように記述すれば解決した。

$("#mymodal").on("show.bs.modal", function(e) {
	if(navigator.userAgent.match(/iPhone|iPad|iPod/i) ) {
		$(".modal").css({
			"position":"absolute",
			"marginTop": $(window).scrollTop() + "px",
			"bottom":"auto",
			"width":"95%"
		});
	}
});

Vagrant+CentOS7でネットワークの自動再起動

Vagrant+CentOS7でのネットワーク不具合 - Archit!!の続き。
ネットワークを自動再起動する方法を見つけたのでメモ。Vagrantのprovision機能を使えばいい。Vagrantfileに以下の内容を追記。

config.vm.provision "network-restart", 
	type: "shell",
	run: "always",
	inline: "sudo service network restart"

ポイントは「run: "always"」とすること。こうすることで、up時に常にinlineで記述された、コマンドが実行される。