tag:blogger.com,1999:blog-47597300478713619472024-03-19T19:32:04.403+09:00azuki note2Unknownnoreply@blogger.comBlogger7125tag:blogger.com,1999:blog-4759730047871361947.post-31617695427766551962012-07-05T19:18:00.001+09:002012-07-05T19:18:45.366+09:00Windows Server 2008でGladinetを使う<a href="http://www.gladinet.jp/">Gladinet</a>(Gladinet Desktop)は、Amazon S3やGoogle Driveなどのオンラインストレージを、Windowsのネットワークドライブとしてマウントすることができるアプリケーションです。<br />
<br />
Gladinet はオンラインストレージへのプロキシーとなる、WebDAVサーバーとして動作する様で、ドライブとしてマウントするためには、WindowsのWeb Clientサービスが動作している必要があります。<br />
<br />
Windows 7などのクライアント系のWindowsでは標準で動作しているのではないかと思いますが、サーバー系のWindowsではインストールされていないようです。そのため、Gladinetをインストールしただけでは、マウントすることができません。<br />
<br />
WebClientサービスのインストールは、サーバーマネージャーで、「機能の追加」を実行し、「デスクトップエクスペリエンス」を選択します。ただし、デスクトップエクスペリエンスには、WebClient以外にもWindows Media PlayerなどデスクトップPC向けの機能が含まれています。<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6pfDyndeP9WN5crHVtvCVve6NbUY8hO6jXxBDzWwWS9ZVviE84vpqhWwoCd8137h6icyxEaHWI9EvTYoYQpxuQbuuikA-uExlLci1ZxOnLGAN1KZlBNcGvqMUy7WkhYWvZmsOnb0ZLCZV/s1600/2012-07-05_19h11_39.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="238" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6pfDyndeP9WN5crHVtvCVve6NbUY8hO6jXxBDzWwWS9ZVviE84vpqhWwoCd8137h6icyxEaHWI9EvTYoYQpxuQbuuikA-uExlLci1ZxOnLGAN1KZlBNcGvqMUy7WkhYWvZmsOnb0ZLCZV/s320/2012-07-05_19h11_39.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
こんな感じで、ドライブ一覧に表示されるようになります。あとは通常のドライブと同じようにアクセスできるので便利です。</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNc6AImROuoo-i13T4Py0krZutwjfiallTG1XphbW1ia3u0k-K5uTcgas7S3a1_MVKqOPO_srdSMGGZlDRyLvpHsXqCAgCpPwULEaV5Iay3dKRd4mabU1CWnMeRGsbhesk8Ovu8xtpZ3YP/s1600/2012-07-05_19h15_30.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="131" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiNc6AImROuoo-i13T4Py0krZutwjfiallTG1XphbW1ia3u0k-K5uTcgas7S3a1_MVKqOPO_srdSMGGZlDRyLvpHsXqCAgCpPwULEaV5Iay3dKRd4mabU1CWnMeRGsbhesk8Ovu8xtpZ3YP/s320/2012-07-05_19h15_30.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4759730047871361947.post-66673384452725428932012-06-06T00:00:00.002+09:002012-06-06T00:05:54.335+09:00JBoss Forgeを試してみた<p><a href="https://docs.jboss.org/author/display/FORGE/Home">Forge</a>はJava EE6を利用したWebアプリケーション(のひな形)の作成 〜 アプリケーションサーバへのディプロイまで可能なコマンドラインツールです。作成されるアプリケーションはMavenプロジェクトのため、そのままIDE等で開くことができます。</p>
<p>また、プラグインによりサポートするフレームワークやAPサーバが追加できします。自分でプラグインを作成することもできます。</p>
今回はForgeでJPAとJSFを使ったサンプルアプリケーションを作ってみます。
<p>まず、Forgeをダウンロードして展開します。</p>
<pre class="brush:bash">
$ https://repository.jboss.org/nexus/service/local/artifact/maven/redirect?r=releases&g=org.jboss.forge&a=forge-distribution&v=1.0.5.Final&e=zip
$ unzip Downloads/forge-distribution-1.0.5.Final.zip
</pre>
<p>環境変数を設定します。</p>
<pre class="brush:bash">
export FORGE_HOME=~/forge-distribution-1.0.5.Final/
export PATH=$PATH:$FORGE_HOME/bin
</pre>
<p>forgeコマンドでforgeのシェルを起動します。</p>
<p>list-commandで利用可能なコマンドを確認できます。–allを付けないと現在のコンテキストで利用可能なコマンドのみ表示されます。OSのコマンドやgit、mavenもforgeから呼び出すことができます。</p>
<pre class="brush:bash">
$ forge
_____
| ___|__ _ __ __ _ ___
| |_ / _ \| `__/ _` |/ _ \ \\
| _| (_) | | | (_| | __/ //
|_| \___/|_| \__, |\___|
|___/
[no project] kenichiro22 $ list-commands --all
[FILE & RESOURCES]
cat* cd*
edit* find*
fingerprint* grep*
list-web-resources* ls
ls* mkdir*
mv* open*
pick-up* pwd*
pwr* rm*
wc*
[OTHER]
alias* beans list-alternatives*
beans list-decorators* beans list-interceptors*
beans new-bean* beans new-conversation
beans setup* constraint AssertFalse
constraint AssertTrue constraint DecimalMax
constraint DecimalMin constraint Digits
constraint Future constraint Max
constraint Min constraint NotNull
constraint Null constraint Past
constraint Pattern constraint Size
constraint Valid ejb setup*
entity* faces new-view*
faces project-stage* faces setup*
faces* field
field boolean field custom
field int field long
field manyToMany field manyToOne
field number field oneToMany
field oneToOne field string
field temporal git clone*
git git-checkout* git setup*
i18n add-locale* i18n faces-setup*
i18n get* i18n put*
i18n remove* i18n setup*
java list-imports java new-class*
java new-enum-const java new-enum-type*
java new-field java new-method
java* jms setup*
jstl setup* jta setup*
persistence setup* persistence*
plugins new-plugin* plugins setup*
remove-constraint rest endpoint-from-entity*
rest setup* servlet setup*
servlet* soap setup*
unalias* validation setup*
[PROJECT]
build* execute-java*
maven remove-parent* maven set-artifactid*
maven set-groupid* maven set-parent*
maven set-version* mvn*
new-project* project add-dependency*
project add-known-plugin-repository* project add-known-repository*
project add-managed-dependency* project add-plugin-repository*
project add-repository* project find-dependency*
project find-managed-dependency* project install-facet*
project list-dependencies* project list-facets*
project list-managed-dependencies* project list-plugin-repositories*
project list-properties* project list-repositories*
project remove-dependency* project remove-facet*
project remove-managed-dependency* project remove-plugin-repository*
project remove-property* project remove-repository*
project set-property* project*
setup* shade exclude*
shade include* shade make-executable*
shade relocate* shade remove*
shade reset* shade setup*
test*
[SHELL ENVIRONMENT]
about* clear*
echo* exec*
exit* forge find-plugin*
forge git-plugin* forge install-plugin*
forge list-plugins* forge remove-plugin*
forge restart* forge source-plugin*
forge* help*
less* list-commands*
list-config* list-properties*
more* reset*
run* run-url*
set* version*
wait*
[UI GENERATION & SCAFFOLDING]
list-scaffold-providers* scaffold from-entity*
scaffold indexes* scaffold setup*
scaffold templates*
[VERSION CONTROL]
git*
(* = command accessible from current context)
</pre>
<p>プロジェクトを作成します。</p>
<pre class="brush:bash">
[no project] kenichiro22 $ new-project --named try-forge --topLevelPackage com.azuki3.forge --projectFolder workspace/try-forge
***SUCCESS*** Created project [try-forge] in new working directory [/Users/kenichiro22/workspace/try-forge]
</pre>
scaffoldの設定を行います。JSFを使います。
<pre class="brush:bash">
[try-forge] try-forge $ scaffold setup --scaffoldType faces
? Scaffold provider [faces] is not installed. Install it? [Y/n] Y
? Facet [forge.maven.WebResourceFacet] requires packaging type(s) [war], but is currently [jar]. Update packaging? (Note: this could deactivate other plugins in your project.) [Y/n] Y
***SUCCESS*** Installed [forge.maven.WebResourceFacet] successfully.
</pre>
<p>JPAの設定を行います。 JPAプロバイダーとコンテナを指定します。JPAプロバイダーはHibernateをコンテナはJBoss AS7を指定してみます。</p>
<pre class="brush:bash;">
[try-forge] try-forge $ persistence setup --provider HIBERNATE --container JBOSS_AS7
***INFO*** Setting transaction-type="JTA"
***INFO*** Using example data source [java:jboss/datasources/ExampleDS]
? The JPA provider [HIBERNATE], also supplies extended APIs. Install these as well? [y/N]
***SUCCESS*** Persistence (JPA) is installed.
</pre>
<p>ここから実際のアプリケーションを作成します。</p>
<p>まず、Entityを作成します。今回はリレーションを試してみたいので、User - Blog - Tagという3つのEntityを作成します。BlogとUserがManyToOneでBlogとTagがManyToManyです。</p>
<pre class="brush:bash;">
[try-forge] try-forge $ entity --named User
? In which package you'd like to create this @Entity, or enter for default [com.azuki3.forge.model]
Created @Entity [com.azuki3.forge.model.User]
Picked up type <JavaResource>: com.azuki3.forge.model.User
[try-forge] User.java $ field string --named name
Added field to com.azuki3.forge.model.User: @Column private String name;
[try-forge] User.java $ field string --named email
Added field to com.azuki3.forge.model.User: @Column private String email;
[try-forge] User.java $ entity --named Blog
Created @Entity [com.azuki3.forge.model.Blog]
Picked up type <JavaResource>: com.azuki3.forge.model.Blog
[try-forge] Blog.java $ field string --named title
Added field to com.azuki3.forge.model.Blog: @Column private String title;
[try-forge] Blog.java $ field string --named content
Added field to com.azuki3.forge.model.Blog: @Column private String content;
[try-forge] Blog.java $ field temporal --named createdAt --type TIMESTAMP
Added field to com.azuki3.forge.model.Blog: private @Temporal(TemporalType.TIMESTAMP) Date createdAt;
[try-forge] Blog.java $ field manyToOne --named user --fieldType com.azuki3.forge.model.User
[try-forge] Blog.java $ entity --named Tag
Created @Entity [com.azuki3.forge.model.Tag]
Picked up type <JavaResource>: com.azuki3.forge.model.Tag
[try-forge] Tag.java $ field string --named name
Added field to com.azuki3.forge.model.Tag: @Column private String name;
[try-forge] User.java $ field manyToMany --named tag --fieldType com.azuki3.forge.model.Tag.java
</pre>
<p>Blogにバリデーションを追加します。</p>
<pre class="brush:bash">
[try-forge] Blog.java $ validation setup --provider JAVA_EE
***SUCCESS*** Installed [forge.spec.validation] successfully.
[try-forge] Blog.java $ constraint NotNull --onProperty title
Constraint NotNull has been successfully added on property named 'title'
[try-forge] Blog.java $ constraint NotNull --onProperty content
Constraint NotNull has been successfully added on property named 'content'
[try-forge] Blog.java $ constraint Size --onProperty title --min 1 --max 256
Constraint Size has been successfully added on property named 'title'
[try-forge] Blog.java $ constraint Size --onProperty content --min 1 --max 256
Constraint Size has been successfully added on property named 'content'
[try-forge] Blog.java $ constraint NotNull --onProperty user
Constraint NotNull has been successfully added on property named 'user'
</pre>
<p>EntityからJSFのscaffoldを作成します。</p>
<pre class="brush:bash;">
[try-forge] try-forge $ scaffold from-entity com.azuki3.forge.model.Blog.java ***INFO*** Using currently installed scaffold [faces]
? [/Users/kenichiro22/workspace/try-forge/src/main/webapp/resources/scaffold/pageTemplate.xhtml] File exists, overwrite? [Y/n]
***SUCCESS*** Generated UI for [com.azuki3.forge.model.Blog]
</pre>
<p>ビルドしてJBoss AS7にディプロイします。JBoss AS7は別途起動しておきます。</p>
<pre class="brush:bash;">
[try-forge] try-forge $ build
[try-forge] try-forge $ as7 deploy
</pre>
<p>こんな感じの画面ができます。ManyToOne, ManyToManyの関連も自動作成されます。ただ、バリデーションは動作しませんでした。もともとサポートされていないのか、私の使い方が悪いのかはわかりません。。</p>
<p>これくらいできれば、PlayやGrailsのscaffoldと同じくらいのことはできるでしょうか。</p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiME6Qj9HR8QWwM4wNkRtXy4PpWxrNfti8nwtd4G7VxGZHPQhx5jQXmVAv1Ooyl0otEGm1NRg_Uia6Lz02cyqD4gaBibhiQAikd-MJu5HbZjGe1PnwpT3I27NM6UXlMN6NEX8Kideewx_4Y/s1600/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2012-06-05+14.04.24.png" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="252" width="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiME6Qj9HR8QWwM4wNkRtXy4PpWxrNfti8nwtd4G7VxGZHPQhx5jQXmVAv1Ooyl0otEGm1NRg_Uia6Lz02cyqD4gaBibhiQAikd-MJu5HbZjGe1PnwpT3I27NM6UXlMN6NEX8Kideewx_4Y/s400/%25E3%2582%25B9%25E3%2582%25AF%25E3%2583%25AA%25E3%2583%25BC%25E3%2583%25B3%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%2583%25E3%2583%2588+2012-06-05+14.04.24.png" /></a>
<p>ついでにREST APIも作成します。</p>
<pre class="brush:bash">
[try-forge] try-forge $ rest setup --activatorType APP_CLASS
? What root path do you want to use for your resources? [/rest]
? In what package do you want to store the Application class? com.azuki3.forge.
rest
? How do you want to name the Application class? [RestApplication]
***SUCCESS*** Installed [forge.spec.jaxrs.applicationclass] successfully.
***SUCCESS*** Rest Web Services (JAX-RS) is installed.
[try-forge] try-forge $ rest endpoint-from-entity com.azuki3.forge.model.Blog.java
***SUCCESS*** Generated REST endpoint for [com.azuki3.forge.model.Blog]
</pre>
他にもi18n用のファイルの作成や、JAX-RSからEJBまでなどひと通りのJavaEE用のコマンドがあるようです。
<p>
今回使ってみた感想ですが、、コマンドの補完機能を備えているので非常に使いやすいです。Scaffoldまで使わなくても、Java EE6をサポートしたコンテナを使い場合でもpom.xmlに各APIのライブラリを追加するのは結構面倒なので、それだけでも助かります。プラグインがどんどん増えてJava EE6以外のライブラリも簡単に使えるようになるといいですね。プラグインは、"find-plugin"コマンドで検索できるようなのですが、どこかで一覧でも見られるページはないのでしょうか。
<p>あとscaffoldのテンプレートにTwitter bootstrapが使えたらいいですね。さらに、JSFの他にGWTでCRUDが作れたりすると助かるのですが。GWT用プラグインもあるので、どんなものかはそのうち試してみたいと思います。
<p>
今回のサンプルアプリケーションのコードは以下にあります。<br>
<a href="https://github.com/kenichiro22/try-forge-scaffold">https://github.com/kenichiro22/try-forge-scaffold</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4759730047871361947.post-38213242688392667932012-06-01T09:05:00.000+09:002012-06-01T09:06:49.608+09:00JBoss Erraiを試してみた<p><a href="http://www.jboss.org/errai/">JBoss Errai</a>は、GWTをベースに次のような機能を追加した、RIA開発向けのフレームワークです。最近2.0がリリースされました。</p>
<ul>
<li>独自の非同期メッセージング(Errai bus)</li>
<li>RPC(not GWT-RPC)</li>
<li>JAX-RS対応</li>
<li>Beanのマーシャリング</li>
<li>クライアントでのDIとCDI(JSR-299/JSR-330)のサポート(一部)</li>
<li>CDIベースののクライアント・サーバ間のイベント機構</li>
</ul>
<p>GWTをベースにしていますが、GWTの一部やGINを置き換えとなる多くの機能があります。</p>
<p>個人的に気になっているのはJAX-RS対応で、クライアントから直接サーバのJAX-RSのインタフェースを呼び出すことができます。また、Beanのマーシャリング機能を備えるため、GWT-RPCと同様にクライアント・サーバで同一のモデルを使用することができます。</p>
<p>GWTののRequestFactoryやAutoBeanではモデルに対してもインタフェースを定義する必要があり煩雑なので、GWT-RPCの大体として有望ではないでしょうか。ただ、同一のモデルを使用するため、GWTをの制約はかかってきますが。</p>
<p>また、JAX-RSのサービスを利用する場合、RequestBuilderとJavaScriptObjectを使用する必要がありましたが、Erraiを使うとサーバのJAX-RSインタフェースがそのまま使えるのでかなり楽になりそうです。</p>
<p>ErraiはManve archetypeがあるので(<a href="http://docs.jboss.org/errai/2.0.0.Final/errai/quickstart/html_single/">Errai Quickstart guide</a>)、サンプルとしてJAX-RSを使ったプロジェクトを作ってみました。</p>
<pre>
mvn archetype:generate \
-DarchetypeGroupId=org.jboss.errai.archetypes \
-DarchetypeArtifactId=jaxrs-quickstart \
-DarchetypeVersion=2.0.0.Final \
-DarchetypeRepository=https://repository.jboss.org/nexus/content/groups/public/
</pre>
<p>JAX-RSのサービスインタフェースとして以下のようなクラスが作成されます。</p>
<pre class="brush:java;">
@Path("customers")
public interface CustomerService {
@GET
@Produces("application/json")
public List<Customer> listAllCustomers();
@POST
@Consumes("application/json")
@Produces("text/plain")
public long createCustomer(Customer customer);
@PUT
@Path("/{id}")
@Consumes("application/json")
@Produces("application/json")
public Customer updateCustomer(@PathParam("id") long id, Customer customer);
@DELETE
@Path("/{id}")
public void deleteCustomer(@PathParam("id") long id);
@GET
@Path("/{id}")
@Produces("application/json")
public Customer retrieveCustomerById(@PathParam("id") long id);
}
</pre>
<p>JAX-RSのアノテーションのみでErraiのためのコードはありません。実装クラスの方は省略します。</p>
<p>JAX-RSでやり取りされるモデルクラスは以下のようになります。</p>
<pre class="brush:java;">
@Portable
@Entity
public class Customer implements Serializable, Comparable<Customer> {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private long id;
@NotNull
@Size(min = 1)
private String firstName;
@NotNull
@Size(min = 1)
private String lastName;
@NotNull
@Size(min = 1)
private String postalCode;
private Date lastChanged;
public Customer() {
}
// setter/getter ...
}
</pre>
<p><strong>@Portable</strong>というアノテーションがあるクラスがマーシャリングの対象になります。アノテーションを付けられないようなケースやマーシャリング方法を変更したい場合の対応方法も用意されています。</p>
<p>実際にJAX-RSにアクセスするクライアントのコードは以下のようになります。</p>
<pre class="brush:java;">
@EntryPoint
public class App {
@Inject
private Caller<CustomerService> customerService;
// ….
final RemoteCallback<Long> creationCallback = new RemoteCallback<Long>() {
@Override
public void callback(Long id) {
// レスポンスの処理
// ...
}
};
@PostConstruct
public void init() {
final Button create = new Button("Create", new ClickHandler() {
@Override
public void onClick(ClickEvent clickEvent) {
Customer customer = new Customer(custFirstName.getText(), custLastName.getText(), custPostalCode.getText());
customerService.call(creationCallback).createCustomer(customer);
}
});
// …..
}
}
</pre>
<p>サービスの呼び出しは非同期処理のためCallerというProxyを経由します。Proxyのcallメソッドに、レスポンスを処理するRemoteCallbackを渡します(サービスの戻り値が渡されます)。customerServiceは@Injectアノテーションがついているので、DI対象になります。</p>
<p>GWTのEntryPointは@EntryPointアノテーションで指定します。initメソッドには@PostConstructアノテーションが付いているので、インスタンスが生成されDIが行われた後に呼び出されます。ここでUIの初期化も行います。</p>
<p>ちょっと見た感じかなりよさそうなErraiですが、以下は2.0では提供されていないようです。MVPについてはGWTの標準もしくは、GWTPと組み合わせることになりそうです。どちらもGINを使用しているので、次はDIにErraiを使うように変更できるか試してみたいと思います。</p>
<ul>
<li>MVPパターンのサポート</li>
<li>Widget類</li>
</ul>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4759730047871361947.post-17703124993147147742012-05-31T21:16:00.000+09:002012-05-31T21:29:19.946+09:00Amazon RDS の MySQL でトランザクション分離レベルを変更するAmazon RDSのMySQLインスタンスはデフォルトで、トランザクション分離レベル(tx_isolation)が、"REPEATABLE READ"になっています。これは、RDSのMySQLはInnoDBしか選択できず、InnoDBのトランザクション分離レベルのデフォルトが"REPEATABLE READ"。<br />
今回必要があり"READ COMMITTED"に変更する手順を調べました。<br />
<br />
mysqlのクライアントから以下のコマンドを実行しても権限がないということで拒否されます。GLOBALでない場合は可能。<br />
<pre class="brush:sql;">mysql>SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
</pre>
RDSではデータベースの設定はパラメーターグループで管理されています。現在、パラメータグループはAWS Consoleから変更できないようなので、CLIを使って変更します。<br />
<br />
また、デフォルトのパラメーターグループは変更できないので、あらかじめ新しいパラメータグループを作成し、変更したいインスタンスのパラメータグループを変更しておきます。<br />
<br />
まず、RDS CLIインストールします。<br />
<a href="http://aws.amazon.com/developertools/2928">Amazon RDS Command Line Toolkit</a>をダウンロードします(今回は 1.8.002)。展開したフォルダを適当な場所に移動し、以下の環境変数を追加します。<br />
<br />
<ul>
<li>AWS_RDS_HOME : C:\RDSCli-1.8.002</li>
<li>PATH : %PATH%;%AWS_RDS_HOME%\bin</li>
</ul>
<br />
<div class="wiki-content">
認証情報は以下のいずれかの方法で指定します(証明書を使用することも可能)。<br />
<ol>
<li>環境変数AWS_CREDENTIAL_FILE でキーを記載したファイルを指定</li>
<li>--aws-credential-file オプションでキーを記載したファイルを指定</li>
<li>--I <ACCESS_KEY> --S
<SECRET_KEY> のようにオプションで直接指定</li>
</ol>
1,2で使用するファイルは以下のような形式で記載します。<br />
AWSAccessKeyId=<Write your AWS access ID>
AWSSecretKey=<Write your AWS secret key>
<br />
<br />
rds-describe-db-instancesコマンドを実行して動作確認します。<br />
<br />
<div class="preformatted panel" style="background-color: white; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; border-top-left-radius: 5px; border-top-right-radius: 5px; border: 1px solid rgb(187, 187, 187); margin: 0px 0px 10px; overflow: hidden; padding: 0px; text-align: left;">
<div class="preformattedContent panelContent" style="background-image: none; margin: 0px; padding: 0px 10px;">
<pre style="overflow: auto; padding: 0px;"><span style="color: #333333; font-family: 'Courier New', Courier, monospace; font-size: 0.95em; line-height: 1.3;">C:\> rds-describe-db-instances --region ap-northeast-1 --headers
DBINSTANCE DBInstanceId Created Class Engine Storage Master Username Status Endpoint Address Port AZ Backup Retention Multi-AZ Version License
DBINSTANCE mysql-master 2012-05-29T08:20:33.655Z db.m1.small mysql 10 user available mysql.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com 3306 ap-northeast-1a 7 n 5.5.20 general-pu
blic-license
SECGROUP Name Status
SECGROUP default active
PARAMGRP Group Name Apply Status
PARAMGRP default.mysql5.5 in-sync
OPTIONGROUP Name Status
OPTIONGROUP default:mysql-5-5 in-sync</span>
</pre>
</div>
</div>
リージョンは、--region オプションで指定しますが、環境変数AWS_REGIONで指定することも可能です。<br />
<br />
tx_isolationを変更します。gourp1の部分がパラメータグループです。method=immediateを指定すると変更は再起動を待たずすぐに反映されます。<br />
<pre class="brush: plain;">C:\> rds-modify-db-parameter-group gourp1 --region ap-northeast-1 --parameters="name=tx_isolation, value=READ-COMMITTED, method=immediate"
DBPARAMETERGROUP group1
</pre>
<br />
mysqlコマンドでtx_isolationが変更されていることを確認します。
<br />
<pre class="brush: sql;">mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
+-----------------------+----------------+
| @@GLOBAL.tx_isolation | @@tx_isolation |
+-----------------------+----------------+
| READ-COMMITTED | READ-COMMITTED |
+-----------------------+----------------+
</pre>
ただし、変更の反映は少し時間(1分未満くらい?)がかかるようです。</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4759730047871361947.post-86604569703707025932012-05-30T23:42:00.001+09:002012-05-30T23:42:41.365+09:00mod_log_sql でアクセスログをMySQLに保存するApacheの<a href="http://www.outoforder.cc/projects/apache/mod_log_sql/" target="_blank">mod_log_sql</a>モジュールを使うとアクセスログをデータベースに保存することができます。<br />
<br />
mod_authn_dbdの場合と同様にOSはubuntu serverで、MySQLはRDSのインスタンスを使用しました。<br />
<h3>
MySQLの設定</h3>
RDSのインスタンスにてログ保存用のデータベースを作成しておきます。<br />
<pre class="brush:sql;">create database logs;
create user apache identified by 'パスワード';
grant all on logs .* to apache;</pre>
<h3>
mod_log_sqlのインストール</h3>
ubuntuのapt-getでインストールされるバージョンは古いので(確か1.10?)、ソースから1.99をインストールします。まずapt-getでapxs2をインストールします。<br />
<blockquote class="tr_bq">
sudo apt-get install apache2-prefork-dev</blockquote>
mod_log_sql をインストールします。ソースとパッチをダウンロードし、makeしてインストールします。<br />
<pre class="brush:bash;">$ wget http://www.outoforder.cc/downloads/mod_log_sql/mod_log_sql-1.99.tar.gz
$ tar -xzvf mod_log_sql-1.99.tar.gz
$ cd mod_log_sql-1.99
$ wget http://www.outoforder.cc/downloads/mod_log_sql/mod_log_sql-1.99.diff
$ patch -p0 < mod_log_sql-1.99.diff
$ wget http://www.outoforder.cc/downloads/mod_log_sql/mod_log_sql-1.99-2.diff
$ patch -p0 < mod_log_sql-1.99-2.diff
$ ./configure --with-apxs=/usr/bin/apxs2
$ make
$ sudo make install</pre>
<br />
以下の内容で<b>/etc/apache2/mods-available/log_sql.load</b>を作成します。<br />
<blockquote class="tr_bq">
LoadModule log_sql_module /usr/lib/apache2/modules/mod_log_sql.so<br />
LoadModule log_sql_mysql_module /usr/lib/apache2/modules/mod_log_sql_mysql.so</blockquote>
モジュールをロードするよう設定します。<br />
<pre class="brush:bash;">$ sudo a2enmod log_sql</pre>
<h3>
ログ出力の設定</h3>
apacheの設定にて以下の記述を追加します。この設定では、<b>access_log</b>テーブルにデータを保存します。テーブルが存在しない場合には初回のアクセスログ記録時に作成されます。<br />
<blockquote class="tr_bq">
LogSQLLoginInfo mysql://apache:パスワード@RDSのエンドポイント/logs<br />
LogSQLCreateTables on<br />
LogSQLTransferLogFormat AbHhmRSsTUuv<br />
LogSQLTransferLogTable access_log<br />
LogSQLDBParam port 3306<br />
LogSQLMachineID web1 </blockquote>
LogSQLTransferLogFormatでログ出力対象の項目を指定しています。詳細は<a href="http://www.outoforder.cc/projects/apache/mod_log_sql/docs-2.0/?chapter=/3/6/3/" target="_blank">こちら</a>のドキュメントにあります。パフォーマンスへの影響が気になるようであれば、不要な項目は取得しない方がよいかもしれません。<br />
また、複数のWebサーバからログを保存する場合には、LogSQLMachineIDにてマシンごとのIDを指定することができます。<br />
<br />
この設定で作成されるaccess_logテーブルは以下のようになります。<br />
<table class="confluenceTable" style="background-color: white; background-image: none; border-collapse: collapse; clear: left; color: #333333; font-family: Arial, Helvetica, FreeSans, sans-serif; font-size: 13px; line-height: 17px; margin: 5px 0px; padding: 0px; text-align: left;"><tbody>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><th class="confluenceTh" style="background-color: #f0f0f0; border: 1px solid rgb(221, 221, 221); color: black; font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">Field</th><th class="confluenceTh" style="background-color: #f0f0f0; border: 1px solid rgb(221, 221, 221); color: black; font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">Type</th><th class="confluenceTh" style="background-color: #f0f0f0; border: 1px solid rgb(221, 221, 221); color: black; font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">Null</th><th class="confluenceTh" style="background-color: #f0f0f0; border: 1px solid rgb(221, 221, 221); color: black; font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">Key</th><th class="confluenceTh" style="background-color: #f0f0f0; border: 1px solid rgb(221, 221, 221); color: black; font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">Default</th></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">id</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">char(19)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">agent</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">varchar(255)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">bytes_sent</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">int(10) unsigned</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">child_pid</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">smallint(5) unsigned</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">cookie</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">varchar(255)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">machine_id</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">varchar(25)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">request_file</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">varchar(255)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">referer</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">varchar(255)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">remote_host</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">varchar(50)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">remote_logname</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">varchar(50)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">remote_user</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">varchar(50)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">request_duration</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">smallint(5) unsigned</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">request_line</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">varchar(255)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">request_method</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">varchar(10)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">request_protocol</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">varchar(10)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">request_time</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">char(28)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">request_uri</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">varchar(255)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">request_args</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">varchar(255)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">server_port</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">smallint(5) unsigned</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">ssl_cipher</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">varchar(25)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">ssl_keysize</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">smallint(5) unsigned</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">ssl_maxkeysize</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">smallint(5) unsigned</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">status</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">smallint(5) unsigned</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">time_stamp</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">int(10) unsigned</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
<tr style="background-image: none; font-size: 10pt; line-height: 13pt;"><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">virtual_host</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">varchar(255)</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">YES</td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;"></td><td class="confluenceTd" style="background-image: none; border: 1px solid rgb(221, 221, 221); font-size: 10pt; line-height: 13pt; min-width: 0.6em; padding: 5px; vertical-align: top;">NULL</td></tr>
</tbody></table>
当然ですが、、LogSQLTransferLogFormatにかかわらずテーブル構造は同じで、どの列に値が入るが変わります。<br />
<br />
これら以外にもCookieやHTTPヘッダを記録することもできるようです。<br />
<br />
ファイルに保存したアクセスログを取り込む手間がないはよいのですが、アクセスの都度、DBにアクセスが発生するので、パフォーマンスが求められるようなサイトで使用するのは難しいかもしれません。全くチューニングしない状態で、apache benchで簡単に測定しただけですが、実際、mod_log_sqlを使うとスループットがかなり低下しました。Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4759730047871361947.post-90065360597671503462012-05-30T00:02:00.000+09:002012-05-30T00:02:39.133+09:00mod_authn_dbd + MySQL (RDS) でBasic認証MySQLに保存したユーザ情報を使用して、ApacheでBasic認証を行う方法です。<br />
<br />
データベースに格納したユーザー情報を使って認証を行うためのモジュールは、Apacheの1.3系と2系でも違いますし、いろいろあってどれを使うべきなのかわかりづらいです。はじめに、<a href="http://www.amazon.co.jp/Apache%E3%82%AF%E3%83%83%E3%82%AF%E3%83%96%E3%83%83%E3%82%AF-%E7%AC%AC2%E7%89%88-%E2%80%95Web%E3%82%B5%E3%83%BC%E3%83%90%E7%AE%A1%E7%90%86%E8%80%85%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E3%83%AC%E3%82%B7%E3%83%94%E9%9B%86-Ken-Coar/dp/4873113814">Apacheクックブック 第2版</a>に載っていたmod_authn_dbiを使おうとしたのですが、全く情報がなく<a href="http://httpd.apache.org/docs/2.2/mod/mod_authn_dbd.html" target="_blank">mod_authn_dbd</a>にたどり着きました。<br />
<br />
サーバはubuntu server、DBは<a href="http://aws.amazon.com/jp/rds/" target="_blank">Amazon RDS(Relational Database Service)</a>のMySQLで試しました。RDS上のMySQLを使うからといって特別なことはなく、mysqlコマンドでリモート接続して、データベースおよび接続するユーザーを作成し、権限を付与しておきます。<br />
<br />
mod_authn_dbdは標準でインストールされていたのですが、MySQL用dbdドライバーがインストールされていなかったので、apt-getでインストールします。<br />
<div>
<blockquote class="tr_bq">
sudo apt-get install libaprutil1-dbd-mysql</blockquote>
a2enmodでauthn_dbdを有効にします。<br />
<blockquote class="tr_bq">
sudo a2enmod authn_dbd</blockquote>
Apacheの設定ファイルにて、認証の設定を行います。<br />
<blockquote class="tr_bq">
DBDriver mysql<br />
<b>DBDParams host=<RDSエンドポイント>,user=<ユーザーID>,pass=<パスワード>,dbname=<DB名></b><br />
<b>DBDPersist On</b><br />
DBDKeep 5<br />
DBDMax 10<br />
DBDMin 3<br />
DBDExptime 600<br />
<Directory /var/www><br />
AuthBasicProvider dbd<br />
<b> AuthDBDUserPWQuery "SELECT encrypt(password) FROM users WHERE user = %s"</b><br />
AuthName "Please Enter Your Password"<br />
Authtype Basic<br />
require valid-user<br />
</Directory></blockquote>
DBDParamsで接続先DBを指定し、AuthDBDUserPWQueryで認証時にユーザのパスワードを取得するSQLを指定します。%sの部分にユーザIDが入ります。また、DBDPersist をOnにするとコネクションをプールします。<br />
<br />
注意点というほどのことではありませんが、"DB***"というディレクティブは<Directory>のなかにはかけません。<br />
<br />
Apacheを再起動して、認証が正しく行われることを確認します。Internal Server Errorが発生するなど問題がある場合にはApacheのエラーログを確認します。</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4759730047871361947.post-83709435607098155002012-05-29T20:49:00.000+09:002012-05-29T20:49:05.439+09:00引っ越しました<a href="http://d.hatena.ne.jp/w650/">http://d.hatena.ne.jp/w650/</a> から引っ越してきました。Unknownnoreply@blogger.com0