AOPのadvisorでエラー

spring-aopで宣言的トランザクションを行う際に記述方法でエラーが出たため、備忘録。

発生したエラー
java.lang.IllegalArgumentException: warning no match for this type name: ru.sbt.filial.cards.aspect.SomeBean [Xlint:invalidAbsoluteTypeName]

エラーが発生した宣言

修正後の記述

executionのパッケージ最後に.をつけることで修正できた。

struts2のアクションでワイルドカード

struts2.1からは、UrlRewriteFilterを利用しなくても綺麗なURLが利用できる。
以下備忘録。

まず、struts2の設定を変更する。

次に、アクションを書く。

1.struts.xmlの場合

2.annotationの場合

参考サイト

http://stackoverflow.com/questions/14411736/passing-parameters-in-url-without-query-string-in-struts-2

http://struts.apache.org/docs/wildcard-mappings.html#WildcardMappings-Parametersaftertheactionname

http://stackoverflow.com/questions/5484392/struts2-wildcard-action-mapping-with-dummy-data

jettyを利用した開発でcssが保存できない

jettyを利用して開発していると、jettyがcssなどのファイルを掴んでしまいエディタで保存ができなくなる問題がある。これは、web.xmlに以下を記載することで対応できる。

gitlabを8.3にアップグレード

omnibusのgitlabを8.3にアップグレードした。
redmineとのOAuth認証を行っているため、callbackの部分で少しはまった。

まず、RedmineのOAuthで認証したところ、callback先がexteral_urlになってしまった。ただ、この変数を変更すると、そもそものnginxからの接続に失敗してしまった。そこで、initializers/omniauth.rbのOmniAuth.config.full_hostをgitlabホストのフルパスにしたところ、正常に動作した。

また、redmineのOmniAuthのStrategiesとして、以下のファイルをinitializers以下に追加した。

vagrant+dockerが便利

windows環境でdockerを利用のは結構面倒。
boot2dockerが定番だけど、最近ではdocker-toolsがでてきて少しは改善されてきた。しかし、プロジェクト事にコンテナーをまとめたり、まとめてビルドしたり
macの場合には、docker-composeが利用できるからよいけれど、windowsはそうもいかない。

そこで、vagrantのproviderを使うことで、自動化できるみたいなので、試してみた。

vagrantでは、dockerを利用するために2種類の方法があるみたい。一つは先ほどのproviderともう一つは、Provisionerである。ここでは、providerを利用してみる。

例えば、以下のようなvagrantファイルを作成する。

細かいところは割愛するが、まず/host/vagrant以下でdocker buildを実行し、作成されたコンテナーを起動している。

詳細は、以下の公式ドキュメントを参照。まだ少ししか触っていないが、ansibleなどと絡めて色々できそうでな感じがする。

https://www.qoosky.net/references/200/

https://docs.vagrantup.com/v2/docker/basics.html

https://docs.vagrantup.com/v2/provisioning/docker.html

Dockerで開発環境を構築する

今まで、vagrant+ansibleを利用していて、これはこれで満足していたけど、流行りもあって、Dockerを試してみた。

環境

MAC+boot2docker+dockerである。
それぞれのバージョンは、
docker 1.4.1
boot2docker 1.4.1
である。

行いたいこと

プログラムはMAC側でエディターを利用して書きたい。コンテナー側はプログラムの実行環境と必要なミドルウェアを一つにまとめる。
MACのホスト側とコンテナー側はボリュームを共有し、ホスト側での変更はリアルタイムにコンテナー側に反映される。

コンテナー側で動作するミドルウェア

以下のミドルウェアを動作させる。

  • apache
  • mysql
  • sshd
  • phpmyadmin

ベースイメージの作成

開発環境は、複数のプロジェクトで利用する。そのため、上記環境のベースになるイメージを作成する。
Dockerfile等は以下の通り。

ここまでファイルが揃った時点で、Dockerのコンテナーをビルドする。

各プロジェクトのDockerfile

各プロジェクトのrootディレクトリーにも以下のようなファイルを作成し、プロジェクト毎にコンテナーをビルドする。
各プロジェクトの依存環境は、このDockerfileに集約する形になる。

ここまでファイルが揃った時点で、Dockerのコンテナーをビルドする。

コンテナーの起動

まず、ttyを利用した起動方法。これは、コンテナーを作成している時に便利である。コンテナーから抜けた段階で自動的に消滅する。
コンテナーが安定するまでは、こちらで作成と廃棄を繰り返すことになる。

–rm コンテナー終了時に自動的に破棄する。
-it 標準入力(-i)とtty(-t)を利用可能にする。/bin/bashを利用するのに必要。-itとまとめて設定している。
-p ポートフォワードの設定
-v 共有ボリュームの設定。[host]:[container]:[permission]で指定する。

コンテナーをデーモンとして実行する

ハマったところ

まず、Dockerはコンテナー毎にフォアグランドでサービスが起動するため、通常の方法では、デーモンを実行した場合には、すぐにコンテナー自体が終了してしまう。最初はこれが不可解な動作であり、Dockerfileの途中で例えば、service httpd onとかした場合にも
コンテナーを起動した祭にhttpdは起動していないのである。httpdをDockerで起動するためには、フォアグランドで実行する必要があり、httpd -D FOREGROUND等とする必要がある。しかし、これでは、他のサービスが起動できなくなる。そこで、supervisorを利用してこの問題を解決した。

感想

とりあえず、触って見た状態のため、まだまだ勉強する必要がある。もし、開発環境の構築等でより良い方法があれば、
コメントを頂ければ幸いである。

不要なコンテナーを一括で消す方法

例えば、コンテナーを作成している途中で名前をつけない場合に、コンテナーはとなります。コンテナー作成中には、途中でこのコンテナーが増えるため、一括削除できるととても便利です。以下のコマンドで一括削除ができます。

Vagrantで共有ディレクトリーの静的ファイルが更新されない

Vagrantを利用して、共有ディレクトリーのファイルを更新しても、Apache側に反映されない問題が起きた。
以下の設定をApacheの設定ファイルのDirectoryセクションに書くことで更新が反映するようになったのでメモ。

fuelphpでフォームのrequiredを出力しない方法

fuelphpでtinymceを利用した際にchromeでan invalid form control with name is not focusableなエラーが表示されて、フォームのsubmitが機能しなくなった。調べたところ、textareaにつくrequired属性がダメな感じ。

まあ、各フォームにnovalidateを付けてもいいんだけど、面倒なので、fuelphpのcoreのfieldを拡張することで対応させた。
問題の箇所は、Fieldset_Fieldクラスのadd_ruleメソッド内でrequiredを付与していた。この部分を書き換え、以下のようなクラスを作成した。

このままだと、利用されないので、bootstrap.phpで読み込むようにした。
以下の表をAutoloader::register();の後あたりに追加。

これで、requiredが挿入されなくなり、tinymceが正常に動作した。