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" },
ただ、このやり方にも少し不満がある。それは、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のphpMyAdminのApache設定は、httpd-xampp.confファイルに書かれている。このファイルは、
にある。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文字切り詰められる件の対処法
Mac版EclipseでTomcatプロジェクトを作成する際に、環境によってはアプリのルートディレクトリの末尾の1文字が削られることがある。
例えば、Tomcatプロジェクト作成ウィザードで「Hoge」プロジェクトを作成しようとして、第1画面ではプロジェクト名に「Hoge」と入力する。[次へ]をクリックし、の第2画面で左のように、コンテキスト名、アプリのルートともに「/hoge」と入力したとしよう。
すると、出来上がったプロジェクトは左のようにアプリのルートディレクトリが「hog」と最後の「e」が欠落した状態となっている。これは、Eclipse Tomcat Pluginのバグではないかと思うのだが、どういった環境で発生するのか掴めていない。いずれにせよ、発生した場合は手動で直す必要があるのだが、よく直し方の質問を受けるので、ここにまとめておくことにしよう。
以下の作業を行う。なお、作業中にはプロジェクトのエラーが発生するが気にせず最後まで行う。
- アプリのルートディレクトリ(上記例では「Hoge/hog」)を正しいディレクトリ名に変更する。上記例では、「hog」を「hoge」に変更する。
- パッケージエクスプローラー上で「hoge」フォルダを開くと、「hoge/WEB-INF/src」フォルダが存在するので、それを右クリックし、
[ビルドパス]>[ソースフォルダとして使用]
を選択。すると、パッケージエクスプローラー上に「hoge/WEB-INF/src」というソースフォルダが出現する。 - プロジェクトフォルダを右クリックし、
[ビルドパス]>[ビルドパスの構成]
を選択。[ソース]タブを選択し、 - 最後に、パッケージエクスプローラ上に残った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のライブラリを書き換えれば無事インストールできるのだが、これはこれで問題。
そこで、上のやり取りの一部に書かれているように、以下の方法を使用すると、セキュリティポリシを変更しなくてもインストールできる。
- UpdateSiteの「Download update site archive (1.5 MB)」のリンクからzipファイルをダウンロードする。
- Eclipseの
[ヘルプ]>[新規ソフトウェアのインストール]
で表示されたインストール画面で、サイトの追加ボタンをクリック。 - 表示されたダイアログで、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で記述された、コマンドが実行される。