SetEnvIfでヘッダがない場合の条件の書き方
ApacheのSetEnvIfでヘッダがない場合の条件の書き方を調べてみました。下記のように正規表現に ^$
を指定すると、ヘッダなしにマッチしてくれます。
# x-forwarded-forヘッダがない場合、環境変数noelbを設定する SetEnvIf x-forwarded-for "^$" noelb
例えば、ELBを経由するアクセスのみ認証を有効にしたい場合は下記のように設定します。
Satisfy Any # 認証 AuthUserFile /example/.htpasswd AuthName Example AuthType Basic require valid-user # ELB経由でないアクセスは認証を外す SetEnvIf x-forwarded-for "^$" noelb Order Deny,Allow Deny from all Allow from env=noelb
なお、SetEnvIfはヘッダだけでなくリクエストURIなども書けるので、ヘルスチェックを認証から外す場合にも使えます。
Doma 2をGroovyで使用する時に気を付けること
気付いた範囲でまとめてみます。
フォルダ配置
Doma 2はAnnotation ProcessorでDAOの実装クラスを自動生成します。Doma 2のAnnotation ProcessorはJavaのコードにのみ対応しているため、DAOやエンティティはGroovyではなくJavaで書く必要があります。また、GroovyとJavaのコードが互いに参照する場合は両者を /src/main/groovy
に配置する必要があります。
具体的には以下のような配置になります。
src/main/
(4/18追記)エンティティクラスもAnnotation Processorで処理されるため、Javaで書く必要があるようです。
ビルドの設定
GroovyとJavaを /src/main/groovy
に配置した場合、GroovyコンパイラがAnnotation Processorを実行することになるため、以下のように compileGroovy
タスクに対して設定を適用します。
// build.gradle plugins { id 'groovy' } dependencies { compile 'org.seasar.doma:doma:2.16.0' } processResources.destinationDir = compileGroovy.destinationDir compileGroovy.dependsOn processResources
外部ドメインを利用する場合などAnnotation Processorの設定が必要な場合は、Groovyコンパイラに設定を渡します。
compileGroovy.options.compilerArgs = ['-Pdoma.domain.converters=example.framework.data.HelloConverter']
2.16.0からはAnnotation Processorの設定を /src/main/resources/doma.compile.config
に書けます。これにより、ビルドツールやIDEでAnnotation Processorを設定する必要がなくなります。
その他
ドメインクラスは @Immutable
や @Canonical
を使うと扱いやすいです。
Create React AppでChrome Extensionを開発する
Reactのアプリを開発するにはFacebook謹製のcreate-react-appが便利です。しかし、create-react-appはWebアプリの開発に特化しているため、Chrome Extensionの開発には使えない問題があります。スクリプトを少し変えてwatch buildを行う方法を紹介します。
Chrome Extensionの開発に必要なフロー
Chrome Extensionを開発するには以下のようなフローが必要になります。
- アプリをビルドし、
build
フォルダに出力する。 - Chromeの拡張機能を開き、デベロッパーモードで
build
フォルダを読み込む。 - Chrome Extensionを実行する。
- ソースコードを修正する。
- アプリをビルドし、
build
フォルダに出力する。 - 3に戻る。
create-react-appでnpm startを実行するとlocalhost:3000
で開発サーバが実行されます。localhost:3000
をそのまま開いても通常のWebアプリとして扱われるため、Bookmarks APIなどのChrome APIを実行できません。Chrome APIを実行するには上記の2が必要になります。
スクリプトのカスタマイズ
create-react-appは内部でWebpackの開発サーバを実行しています。これをwatchに変更します。
今回は以下の方針で修正します。
- ejectして修正するとバージョンアップに追随するのが辛いのでやりたくない。
- create-react-appが持っているWebpackの設定(
webpack.config.dev.js
)をなるべくそのまま利用したい。
まず、package.jsonを以下のように修正します。
"scripts": { "start": "node scripts/start.js", "build": "react-scripts build", "test": "react-scripts test --env=jsdom", "zip": "zip -j - build/* > build/extension.zip", "clean": "rm -fr build" }
scripts/start.jsを作成します。
process.env.NODE_ENV = 'development'; var fs = require('fs-extra'); var paths = require('react-scripts/config/paths'); var webpack = require('webpack'); var config = require('react-scripts/config/webpack.config.dev.js'); // removes react-dev-utils/webpackHotDevClient.js at first in the array config.entry.shift(); var compiler = webpack(config); compiler.watch({}, function(err, stats) { if (err) { console.error(err); } else { copyPublicFolder(); } console.error(stats.toString({ chunks: false, colors: true })); }); // as react-scripts/scripts/build.js function copyPublicFolder() { fs.copySync(paths.appPublic, paths.appBuild, { dereference: true, filter: file => file !== paths.appHtml }); }
ちょっと雑ですが、create-react-appが持っているWebpackの設定を一部改変してwatchに渡すことで継続的にビルドを実行できます。
これでChrome Extensionの開発に必要な下表のタスクが実行できるようになりました。
コマンド | やること |
---|---|
npm start |
ファイルが変更される度にdevelopmentでビルド |
npm build |
productionでビルド |
npm zip |
ビルドをZIPファイルに固める |
ご参考まで。