<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>イージーネット Tech Blog</title>
	<atom:link href="http://blog.eni.co.jp/tech/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.eni.co.jp/tech</link>
	<description>株式会社イージーネットのスタッフによる技術系ブログです</description>
	<lastBuildDate>Tue, 12 Jan 2010 01:46:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/feed" />
		<item>
		<title>ExtJS3.0でWebアプリケーションのテーブルをリッチにしよう（完）</title>
		<link>http://blog.eni.co.jp/tech/2010/01/extjs3_grid_table_last.html</link>
		<comments>http://blog.eni.co.jp/tech/2010/01/extjs3_grid_table_last.html#comments</comments>
		<pubDate>Tue, 12 Jan 2010 01:20:58 +0000</pubDate>
		<dc:creator>笹山 昭秀</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Ext.grid.GridPanel]]></category>
		<category><![CDATA[Ext.Template]]></category>
		<category><![CDATA[Ext.ux.form.SearchField]]></category>
		<category><![CDATA[Ext.ux.grid.RowExpander]]></category>
		<category><![CDATA[ExtJS3.0]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1760</guid>
		<description><![CDATA[
このエントリーは下記の記事の続きです。
ExtJS3.0でWebアプリケーションのテーブルをリッチにしよう（その１）
ExtJS3.0でWebアプリケーションのテーブルをリッチにしよう（その２）

遅くなりましたが、明けましておめでとうございます。
笹山です。
前回の記事から更新が滞ってしまいました。（気づいたら2010年！）
記事用の時刻表ExtJSソースは準備していたのですが更新を怠けておりました。
（怠けている間にExt JS 3.1.0がリリースされておりました）
ですので必死で思い出しながら書きます。（本当に完全に忘れている・・・やばい。）
今回はExtJS3.0を用いて時刻表を作成する完結編です。
前回は、

ページング機能
Gridの高さ変更
Grid内のツールチップ表示

について書きましたが、やはり検索機能や飛行機の情報なんかも欲しくなるわけです。
今回は検索機能、飛行機の情報表示を実装してオレオレ時刻表の作成を終わりたいと思います。

検索機能の実装
検索機能の実装も難しくはありません。
実はExt.ux.data.PagingMemoryProxyのdoRequestメソッドにはすでにfiltering機能が備わっています。
前回Ext.ux.data.PagingMemoryProxyを使用したソートで問題があったので、オーバーライドしてoverride-paging-memory-proxy.jsを作成しました。
ですからoverride-paging-memory-proxy.jsを使用して検索機能を実装します。


override-paging-memory-proxy.js（フィルタリング部分）



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Ext.override&#40;Ext.ux.data.PagingMemoryProxy,&#123;
    doRequest: function&#40;action, rs, params, reader, callback, scope, options&#41;&#123;
&#160;
～　省略　～
&#160;
        // filtering
        if &#40;params.filter !== undefined&#41; &#123;
            result.records = result.records.filter&#40;function&#40;el&#41;&#123;
       [...]]]></description>
			<content:encoded><![CDATA[<div class="update">
このエントリーは下記の記事の続きです。</p>
<p><a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part1.html">ExtJS3.0でWebアプリケーションのテーブルをリッチにしよう（その１）</a><br />
<a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part2.html">ExtJS3.0でWebアプリケーションのテーブルをリッチにしよう（その２）</a>
</div>
<p>遅くなりましたが、明けましておめでとうございます。<br />
笹山です。</p>
<p><a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part2.html" target="_blank">前回</a>の記事から更新が滞ってしまいました。（気づいたら2010年！）<br />
記事用の時刻表ExtJSソースは準備していたのですが更新を怠けておりました。<br />
（怠けている間に<a href="http://extjs.co.jp/products/extjs/download.php" target="_blank">Ext JS 3.1.0</a>がリリースされておりました）<br />
ですので必死で思い出しながら書きます。（本当に完全に忘れている・・・やばい。）</p>
<p>今回はExtJS3.0を用いて時刻表を作成する完結編です。<br />
<a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part2.html" target="_blank">前回</a>は、</p>
<ul>
<li>ページング機能</li>
<li>Gridの高さ変更</li>
<li>Grid内のツールチップ表示</li>
</ul>
<p>について書きましたが、やはり検索機能や飛行機の情報なんかも欲しくなるわけです。<br />
今回は検索機能、飛行機の情報表示を実装してオレオレ時刻表の作成を終わりたいと思います。</p>
<p><span id="more-1760"></span></p>
<h3>検索機能の実装</h3>
<p>検索機能の実装も難しくはありません。<br />
実はExt.ux.data.PagingMemoryProxyのdoRequestメソッドにはすでにfiltering機能が備わっています。<br />
<a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part2.html" target="_blank">前回</a>Ext.ux.data.PagingMemoryProxyを使用したソートで問題があったので、オーバーライドして<a href="http://blog.eni.co.jp/tech/misc/extjs/part2/override-paging-memory-proxy.js" target="_blank">override-paging-memory-proxy.js</a>を作成しました。<br />
ですから<a href="http://blog.eni.co.jp/tech/misc/extjs/part2/override-paging-memory-proxy.js" target="_blank">override-paging-memory-proxy.js</a>を使用して検索機能を実装します。</p>
<ul>
<li>
override-paging-memory-proxy.js（フィルタリング部分）
</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr id="p17607"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code" id="p1760code7"><pre class="javascript" style="font-family:monospace;">Ext.<span style="color: #660066;">override</span><span style="color: #009900;">&#40;</span>Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">data</span>.<span style="color: #660066;">PagingMemoryProxy</span><span style="color: #339933;">,</span><span style="color: #009900;">&#123;</span>
    doRequest<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>action<span style="color: #339933;">,</span> rs<span style="color: #339933;">,</span> params<span style="color: #339933;">,</span> reader<span style="color: #339933;">,</span> callback<span style="color: #339933;">,</span> scope<span style="color: #339933;">,</span> options<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
～　省略　～
&nbsp;
        <span style="color: #006600; font-style: italic;">// filtering</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>params.<span style="color: #660066;">filter</span> <span style="color: #339933;">!==</span> undefined<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            result.<span style="color: #660066;">records</span> <span style="color: #339933;">=</span> result.<span style="color: #660066;">records</span>.<span style="color: #660066;">filter</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>el<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span><span style="color: #009900;">&#40;</span>el<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'object'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #003366; font-weight: bold;">var</span> att <span style="color: #339933;">=</span> params.<span style="color: #660066;">filterCol</span> <span style="color: #339933;">||</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
                    <span style="color: #000066; font-weight: bold;">return</span> String<span style="color: #009900;">&#40;</span>el.<span style="color: #660066;">data</span><span style="color: #009900;">&#91;</span>att<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">match</span><span style="color: #009900;">&#40;</span>params.<span style="color: #660066;">filter</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #003366; font-weight: bold;">true</span> <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066; font-weight: bold;">return</span> String<span style="color: #009900;">&#40;</span>el<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">match</span><span style="color: #009900;">&#40;</span>params.<span style="color: #660066;">filter</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #003366; font-weight: bold;">true</span> <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            result.<span style="color: #660066;">totalRecords</span> <span style="color: #339933;">=</span> result.<span style="color: #660066;">records</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
～　省略　～</pre></td></tr></table></div>

<p>これを見るとリクエストパラメータに、「filterCol」と「filter」を指定すれば良いことが分かります。<br />
filterColでGridのカラム位置を指定して、「Gird要素内容」と「filter」をmatchメソッドを用いて検索を行っています。</p>
<p>それでは、Gridのカラムと検索文字列を指定して、Grid内のデータから検索ができるようにしてみます。<br />
「カラムを指定するためのComboBox」と「検索文字列を入力するFiled」をGridトップツールバーに作成します。<br />
<a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part2.html" target="_blank">前回</a>の<a href="http://blog.eni.co.jp/tech/misc/extjs/part2/grid-timetable.js" target="_blank">grid-timetable.js</a>を編集して追加していきます。</p>
<h4>カラム指定のためのComboBox作成（Ext.form.ComboBox）</h4>
<p>まずは「検索カラムを指定するためのComboBox」をgrid-timetable.jsに作成します。</p>
<ul>
<li>
grid-timetable.js
</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr id="p17608"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
</pre></td><td class="code" id="p1760code8"><pre class="javascript" style="font-family:monospace;">Ext.<span style="color: #660066;">onReady</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    Ext.<span style="color: #660066;">QuickTips</span>.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #006600; font-style: italic;">//</span>
    <span style="color: #006600; font-style: italic;">// カラムを指定するためのComboBox</span>
    <span style="color: #006600; font-style: italic;">//</span>
    <span style="color: #003366; font-weight: bold;">var</span> filterColCombo <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">form</span>.<span style="color: #660066;">ComboBox</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        id<span style="color: #339933;">:</span> <span style="color: #3366CC;">'filtercol_combo_id'</span><span style="color: #339933;">,</span>
        width<span style="color: #339933;">:</span> <span style="color: #CC0000;">100</span><span style="color: #339933;">,</span>
        triggerAction<span style="color: #339933;">:</span> <span style="color: #3366CC;">'all'</span><span style="color: #339933;">,</span>
        valueField<span style="color: #339933;">:</span> <span style="color: #3366CC;">'value'</span><span style="color: #339933;">,</span>
        displayField <span style="color: #339933;">:</span> <span style="color: #3366CC;">'view'</span><span style="color: #339933;">,</span>
        value<span style="color: #339933;">:</span> <span style="color: #3366CC;">'flightName'</span><span style="color: #339933;">,</span>
        editable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">,</span>
        mode<span style="color: #339933;">:</span> <span style="color: #3366CC;">'local'</span><span style="color: #339933;">,</span>
        store<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">data</span>.<span style="color: #660066;">ArrayStore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
            fields<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'view'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'value'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
            data<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
                <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'対象空港'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'destination'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'航空会社'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'airline'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'便名'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'flightName'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'機種'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'model'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'伊丹空港時間'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'itamiTime'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'対象空港時間'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'objectTime'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'出発/到着種別'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'type'</span><span style="color: #009900;">&#93;</span>
            <span style="color: #009900;">&#93;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        listeners<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #3366CC;">'select'</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
                fn<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>combo<span style="color: #339933;">,</span> record<span style="color: #339933;">,</span> index<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    store.<span style="color: #660066;">baseParams</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
                        sort<span style="color: #339933;">:</span> <span style="color: #3366CC;">'itamiTime'</span><span style="color: #339933;">,</span>
                        dir<span style="color: #339933;">:</span> <span style="color: #3366CC;">'ASC'</span><span style="color: #339933;">,</span>
                        filterCol<span style="color: #339933;">:</span> record.<span style="color: #660066;">data</span>.<span style="color: #660066;">value</span><span style="color: #339933;">,</span>
                    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #3366CC;">'afterrender'</span><span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>
                fn<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>combo<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    store.<span style="color: #660066;">baseParams</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span>
                        sort<span style="color: #339933;">:</span> <span style="color: #3366CC;">'itamiTime'</span><span style="color: #339933;">,</span>
                        dir<span style="color: #339933;">:</span> <span style="color: #3366CC;">'ASC'</span><span style="color: #339933;">,</span>
                        filterCol<span style="color: #339933;">:</span> combo.<span style="color: #660066;">value</span><span style="color: #339933;">,</span>
                    <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
                 <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
～　省略　～</pre></td></tr></table></div>

<p>詳細はExtJS3.0の<a href="http://docs.ext-japan.org/docs/" target="_blank">APIドキュメント（日本語）</a>も出たことですし、そちらを見ていただくとして、今回はポイントだけを書きます。</p>
<ul>
<li>
ComboBoxのValue値がGridカラムのdataIndex値と一致するようにComboBoxを作成します。これによりフィルタリング時にGridカラムから値を取り出すことが可能になります。
</li>
<li>
ComboBoxのイベント処理「select」で、ComboBoxが選択された後にリクエストパラメータを設定します。ComboBoxの選択値「record.data.value」をfilterColに設定、同時にソートフィールド、ソート方向も設定しています。
</li>
<li>
ComboBoxのイベント処理「afterrender」で、ComboBoxがレンダリングされた後にリクエストパラメータを設定します。ComboBoxの初期値「combo.value」をfilterColに設定、同時にソートフィールド、ソート方向も設定しています。
</li>
</ul>
<h4>検索文字列を入力するFiled作成（Ext.ux.form.SearchField）</h4>
<p>次に検索文字列を入力するFiledをgrid-timetable.jsに作成します。<br />
すでにExt.ux.form.SearchFieldという便利なコンポーネントが用意されています。</p>
<ul>
<li>
grid-timetable.js
</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr id="p17609"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code" id="p1760code9"><pre class="javascript" style="font-family:monospace;">Ext.<span style="color: #660066;">onReady</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    Ext.<span style="color: #660066;">QuickTips</span>.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> filterColCombo <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">form</span>.<span style="color: #660066;">ComboBox</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
&nbsp;
～　省略　～
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> store <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">data</span>.<span style="color: #660066;">Store</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
&nbsp;
～　省略　～
&nbsp;
    <span style="color: #006600; font-style: italic;">//</span>
　　<span style="color: #006600; font-style: italic;">//　検索文字列を入力するFiled</span>
    <span style="color: #006600; font-style: italic;">//</span>
    <span style="color: #003366; font-weight: bold;">var</span> searchField <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">form</span>.<span style="color: #660066;">SearchField</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        store<span style="color: #339933;">:</span> store<span style="color: #339933;">,</span>
        width<span style="color: #339933;">:</span> <span style="color: #CC0000;">200</span><span style="color: #339933;">,</span>
        paramName<span style="color: #339933;">:</span> <span style="color: #3366CC;">'filter'</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
～　省略　～</pre></td></tr></table></div>

<ul>
<li>
検索時のデータソースとして使用するstoreには、Gridで使用するものと同じstoreを指定します。
</li>
<li>
Ext.ux.form.SearchFieldのデフォルトのリクエストパラメータは「query」となっているため、「filter」に変更します。これでリクエストパラメータが「filter」となり、<a href="http://blog.eni.co.jp/tech/misc/extjs/part2/override-paging-memory-proxy.js" target="_blank">override-paging-memory-proxy.js</a>（フィルタリング部分）で使用できるようになります。</li>
</ul>
<h4>Gridトップツールバーへ追加</h4>
<p>先ほど作成した「カラムを指定するためのComboBox」と「検索文字列を入力するFiled」をGridトップツールバーに追加します。</p>
<ul>
<li>
grid-timetable.js
</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr id="p176010"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code" id="p1760code10"><pre class="javascript" style="font-family:monospace;">Ext.<span style="color: #660066;">onReady</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    Ext.<span style="color: #660066;">QuickTips</span>.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
～　省略　～
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> grid <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">grid</span>.<span style="color: #660066;">GridPanel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
&nbsp;
～　省略　～
&nbsp;
        <span style="color: #006600; font-style: italic;">//</span>
        <span style="color: #006600; font-style: italic;">// Gridトップツールバー</span>
        <span style="color: #006600; font-style: italic;">//</span>
        tbar<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
            filterColCombo<span style="color: #339933;">,</span>
            searchField
        <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
&nbsp;
～　省略　～</pre></td></tr></table></div>

<ul>
<li>
GridPanelのトップツールバー(tbar)に、先ほど作成したfilterColComboとsearchFieldを指定します。
</li>
</ul>
<p>たったこれだけで検索機能は完成です。</p>
<div id="attachment_1944" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/12/combo_searchfield.PNG" target="_blank"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/12/combo_searchfield-300x140.PNG" alt="検索カラム指定ComboBoxと検索文字列入力Field" title="検索カラム指定ComboBoxと検索文字列入力Field" width="300" height="140" class="size-medium wp-image-1944"/></a><p class="wp-caption-text">検索カラム指定ComboBoxと検索文字列入力Field</p></div><br />
<center>↓</center><br />
<div id="attachment_1945" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/12/search_result.PNG" target="_blank"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/12/search_result-300x139.PNG" alt="便名指定からの検索結果" title="便名指定からの検索結果" width="300" height="139" class="size-medium wp-image-1945"　 /></a><p class="wp-caption-text">便名指定からの検索結果</p></div>
<h3>Grid内に画像付きの飛行機情報を表示する</h3>
<p>Gridに表示されている機種は「どんな飛行機なんだろう？」と思ったりしませんか？<br />
それでは、Ext.ux.grid.RowExpanderを使用して画像付きの簡単な機種情報が出るようにしてみようと思います。</p>
<h4>画像付きの飛行機情報表示機能作成（Ext.ux.grid.RowExpander）</h4>
<p>Ext.ux.grid.RowExpanderを使うと、Gridの各行に[+][-]アイコンを表示して、そのアイコンで行を伸縮し、付加情報を表示／非表示にすることができます。<br />
また表示する情報はExt.Templateを用いて自由にレイアウトすることができます。</p>
<ul>
<li>
grid-timetable.js
</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr id="p176011"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code" id="p1760code11"><pre class="javascript" style="font-family:monospace;">Ext.<span style="color: #660066;">onReady</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    Ext.<span style="color: #660066;">QuickTips</span>.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
～　省略　～
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> expander <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">grid</span>.<span style="color: #660066;">RowExpander</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        tpl <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">Template</span><span style="color: #009900;">&#40;</span>
            <span style="color: #3366CC;">'&lt;table&gt;'</span><span style="color: #339933;">,</span>
            <span style="color: #3366CC;">'    &lt;tr&gt;'</span><span style="color: #339933;">,</span>
            <span style="color: #3366CC;">'        &lt;td&gt;'</span><span style="color: #339933;">,</span>
            <span style="color: #3366CC;">'            &lt;img src=&quot;../plainmodel/{airline}/{model}.jpg&quot; alt=&quot;{model}&quot;&gt;'</span><span style="color: #339933;">,</span>
            <span style="color: #3366CC;">'        &lt;/td&gt;'</span><span style="color: #339933;">,</span>
            <span style="color: #3366CC;">'        &lt;td&gt;'</span><span style="color: #339933;">,</span>
            <span style="color: #3366CC;">'            &lt;iframe src=&quot;../plainmodel/{airline}/{model}.html&quot; width=&quot;500&quot; height=&quot;100&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;'</span><span style="color: #339933;">,</span>
            <span style="color: #3366CC;">'        &lt;/td&gt;'</span><span style="color: #339933;">,</span>
            <span style="color: #3366CC;">'    &lt;/tr&gt;'</span><span style="color: #339933;">,</span>
            <span style="color: #3366CC;">'&lt;/table&gt;'</span>
        <span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
～　省略　～</pre></td></tr></table></div>

<ul>
<li>
GridのColumns配列内にexpanderを作成するため、Ext.Template を使うことにより {キー名}の箇所がGrid dataIndexから取り出された値で置き換えられます。
</li>
<li>
{キー名}から取り出された値がフォルダ名、ファイル名となるようにしています。<br />
あらかじめ画像やHTMLが表示されるようにデータを準備して配置しています。<br /><strong>（例）{airline}キーの値がANA、{model}キーの値がB7の場合</strong>
<ul>
<li>img src=&#8221;../plainmodel/ANA/B7.jpg&#8221;</li>
<li>iframe src=&#8221;../plainmodel/ANA/B7.html&#8221;</li>
</ul>
</li>
</ul>
<h4>GridのColumns配列に追加</h4>
<p>先ほど作成したexpanderをGridのColumns配列に追加します。</p>
<ul>
<li>
grid-timetable.js
</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr id="p176012"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code" id="p1760code12"><pre class="javascript" style="font-family:monospace;">Ext.<span style="color: #660066;">onReady</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    Ext.<span style="color: #660066;">QuickTips</span>.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
～　省略　～
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> grid <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">grid</span>.<span style="color: #660066;">GridPanel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        title<span style="color: #339933;">:</span> <span style="color: #3366CC;">'時刻表'</span><span style="color: #339933;">,</span>
        frame<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        height<span style="color: #339933;">:</span> <span style="color: #CC0000;">350</span><span style="color: #339933;">,</span>
        width<span style="color: #339933;">:</span> <span style="color: #CC0000;">750</span><span style="color: #339933;">,</span>
        renderTo<span style="color: #339933;">:</span> <span style="color: #3366CC;">'grid-timetable'</span><span style="color: #339933;">,</span>
        stripeRows<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        trackMouseOver<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        store<span style="color: #339933;">:</span> store<span style="color: #339933;">,</span>
            columns<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
　　　　　　　　　<span style="color: #006600; font-style: italic;">//</span>
                <span style="color: #006600; font-style: italic;">// 画像付きの飛行機情報を表示Expander</span>
                <span style="color: #006600; font-style: italic;">//</span>
                expander<span style="color: #339933;">,</span>　　<span style="color: #006600; font-style: italic;">//← ここ</span>
               <span style="color: #009900;">&#123;</span>
                  header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'対象空港'</span><span style="color: #339933;">,</span>
                  sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                  dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'destination'</span><span style="color: #339933;">,</span>
                  renderer<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>v<span style="color: #339933;">,</span> params<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                      params.<span style="color: #660066;">attr</span> <span style="color: #339933;">=</span> getQtipAttr<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;対象空港&quot;</span><span style="color: #339933;">,</span> v<span style="color: #339933;">,</span> 100<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                      <span style="color: #000066; font-weight: bold;">return</span> v<span style="color: #339933;">;</span>
                  <span style="color: #009900;">&#125;</span>
              <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
～　省略　～</pre></td></tr></table></div>

<p>たったこれだけで、こんなにリッチになります。どうですか？<br />
<div id="attachment_1964" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/12/grid_expander.PNG" target="_blank"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/12/grid_expander-300x141.PNG" alt="Grid Expander 画像付きの飛行機情報を表示する" title="Grid Expander 画像付きの飛行機情報を表示する" width="300" height="141" class="size-medium wp-image-1964" /></a><p class="wp-caption-text">Grid Expander 画像付きの飛行機情報を表示する</p></div></p>
<h3>今回のソースとデモ</h3>
<ul>
<li>
<a href="http://blog.eni.co.jp/tech/misc/extjs/part3/grid-timetable.html" target="_blank" >ExtJS3.0 Gridデモ「伊丹空港 12月時刻表」</a>
</li>
<li>
<a href="http://blog.eni.co.jp/tech/misc/extjs/part3/grid-timetable.js" target="_blank" >grid-timetable.js</a>
</li>
<li>
<a href="http://blog.eni.co.jp/tech/misc/extjs/part3/override-paging-memory-proxy.js" target="_blank" >override-paging-memory-proxy.js</a>
</li>
<li>
<a href="http://blog.eni.co.jp/tech/misc/extjs/data/timetable-data12.js" target="_blank" >timetable-data12.js</a>
</li>
</ul>
<p>※Grid中の飛行機画像は私が趣味で撮影した画像です。</p>
<h3>最後に</h3>
<p>時刻表の完成です。<br />
これでエアーバンドを聞きながら検索をかけて、しかも飛行機情報まで表示してくれます。<br />
ずいぶんと私好みの自己中心的な時刻表になってしまいました。</p>
<p>ExtJSで、ごりごり実装することもなく簡単にリッチなテーブルができることがお分かりいただけたと思います。<br />
余裕があるときに改造して「おれおれ時刻表」をパワーアップしていけたらと思っています。</p>
<h3>参考リンク</h3>
<ul>
<li>
<a href="http://www.extjs.com/">Ext</a>
</li>
<li>
<a href="http://extjs.co.jp/">Ext Japan</a>
</li>
<li>
<a href="http://www.extjs.com/deploy/dev/examples/samples.html">Ext JS 3.0 Samples</a>
</li>
<li>
<a href="http://www.extjs.com/deploy/dev/docs/">API Document</a>
</li>
<li>
<a href="http://docs.ext-japan.org/docs/" target="_blank">APIドキュメント（日本語）</a></li>
</ul>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part1.html">ExtJS3.0でWebアプリケーションのテーブルをリッチにしよう（その１）</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part2.html">ExtJS3.0でWebアプリケーションのテーブルをリッチにしよう（その２）</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2010/01/extjs3_grid_table_last.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2010/01/extjs3_grid_table_last.html" />
	</item>
		<item>
		<title>iPhoneとAndroidケータイ(HT-03A)を比べてみた</title>
		<link>http://blog.eni.co.jp/tech/2009/12/iphone_android.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/12/iphone_android.html#comments</comments>
		<pubDate>Fri, 25 Dec 2009 01:26:52 +0000</pubDate>
		<dc:creator>末田 佳和</dc:creator>
				<category><![CDATA[コラム]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[HT-03A]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[アンドロイド]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=2007</guid>
		<description><![CDATA[こんにちは。
プロダクト&#38;サービス事業部 リーダーの末田です。
以前、Androidケータイ(HT-03A)買いました という記事を書きましたが、
実は、iPhone 3GS を買ってしまいました。
１ヶ月ほどですが、iPhoneとAndroid(HT-03A)を両方使う期間がありましたので、
両方を比べてみた感想を書いてみたいと思います。
iPhoneをいつ買えばいいか、Androidにした方がよいのか等の話が聞こえてきますが、
この記事が参考になれば幸いです。

iPhoneの良い点・悪い点
良い点

みんなが持っている
やはりトレンドということで、iPhoneをもっている事自体が話のネタ、きっかけになります。
このブランド力がApple最大の強みですね。
速い
3GSからですが、速いです。フリック入力等、レスポンスが悪いと使い物にならないのですが、
快適です。スマートフォンにとって、速いことがこんなに大事なのかと再認識させられます。
遅いと、使うことそのものを躊躇してしまうこともしばしばあるのですが、
速いと逆にいつでも取り出したくなります。
かっこいい
まず、iPhoneのハードウェア自体がかっこよく、高級感があります。
持っているだけで「良いものを持っている」感じがします。
アプリケーションもAppleがデザインの指標を出しており、デザインに凝っているアプリが多いです。
アプリが豊富、わかりやすい
なんといってもiTune Storeによる、豊富なアプリと、簡単な購入につきます。
いまや一大マーケットとなっていますので、日本語の問題もほぼなく、良いアプリがなんでもそろいます。

悪い点

マルチタスク
iPhoneにはマルチタスク、という考え方がありません。1つのアプリを使ったら終了し、次のアプリを立ち上げる。
今までの作業の状態がリセットされてしまうことが多く（アプリに依存します）、
ちょっとメールやブラウザで確認して、ということができません。今後に期待です。
アプリ間の連携
マルチタスクとカブリますが、iPhoneではアプリ同士の連携、という考えがありません。
例えば、RSSリーダーの中から、URLのリンク先を見たいという場合、通常では、RSSリーダーが終了して、
ブラウザが立ち上がります。再度RSSリーダーを起動すると、状態はリセットされてしまいます。
または、RSSリーダー内で、ブラウザを実装する必要があります。
Androidでは、インテントという機能で、別々のアプリを連携して使うことができます。
デスクトップ
iPhoneのデスクトップは、ただのランチャーです。
唯一の機能は、アイコンの上に数字を表示させて、メールの未読数などを表示する機能ぐらいです。
Androidでは、ウィジェットや、ユーザーへの通知機能などがあります。
データのコピー・移動
iPhoneへ外部からデータを入れるのは、基本的にはiTuneからの同期のみです。
アプリによっては、内部にWebDAVやFTPのサーバー機能を持たせて、データを取得出来るものもありますが、
3G回線や無線LAN経由となりますので、動画等の大きなデータは非常に時間がかかります。
また、アプリ同士でデータの共有はできないので、アプリごとにデータを転送する必要があります。

Android(HT-03A)の良い点・悪い点
良い点

Googleサービスとの連携
やはりGoogleサービスとの親和性は、iPhoneより上です。
電話帳やスケジュールなど、WebからのGoogle以上に快適に使えます。
PCからとAndroidから、双方からシームレスに使えます。
アプリ間の連携（インテント）
Android最大の特徴です。
例えば、ファイルマネージャーアプリから、画像を選択して表示したいという場合、
iPhoneでは画像を表示する機能を実装る必要が有りますが、
Androidでは、インストールされている画像表示アプリがリストアップされ、利用したいアプリを選択して利用できます。
また、画像表示を終わる際も「戻る」ボタンを押せば、もとのファイルマネージャーアプリに戻ります。
画像表示アプリは、あたかもファイルマネージャーアプリの画像表示機能のように機能します。
マルチタスク
メモリがある限りどんどん起動します。使用頻度が低いものから終了します。
メールを書きながら、ブラウザで情報をチェックして、またメールに戻る、なんてことも簡単です。
通知機能の豊富さ
アプリからの通知機能、メールの着信やカレンダーの通知など、統一されたインタフェースで通知領域に通知が出ます。
デスクトップ
Androidのデスクトップは、PCのデスクトップと同じで、ウィジェットを配置することができます。
Twitterのつぶやきをリアルタイムで表示することが出来ます。
データのコピー・移動
データは、USB経由でPCとマウントできますし、microSDカードを利用することができます。
大容量データでも快適です。
また、アプリからのデータ利用も、どのディレクトリでも自由にアクセスできます。
変化のスピード
Android OS、アプリ、ともに更新頻度がすごいです。
1週間もほっておくと、更新通知で真っ赤になります。
開発の自由度
Androidの開発はGoogleからSDKを無料で落とせます。
環境はWindowsでもMacでもよいですし、開発言語も今では主流のJavaです。
実機へのインストールも簡単です。
アプリで出来ることもGoogleの審査などはないので自由です。
iPhoneは、環境はMacオンリーで、Objective Cというマイナーな言語、Appleの審査アリとなります。
実機へのインストールはAppleに開発者登録(有料)をしなければ入れられません。

悪い点

遅い
iPhoneに乗り換えた一番の原因ですが、「遅い」です。
CPU、メモリが足りないWindows PCの「遅い」と全く同じ感覚です。
スマートフォンのようないつも持ち歩く、さっと取り出して使う機器としては致命的だと思います。
ソフトウェアとしてはかなり頑張ってる感じで、タッチパネルの操作感はかなりいいんですが、
それでもつらい。root化というiPhoneでいう「脱獄」をすれば、CPUクロックを上げられるらしいのですが、
OSを1.6にしちゃうとそれもできないようです(12/21現在。かなりがんばればいけるかも？)。
ハードウェアとしての「魅力」が少ない
iPhoneは、持っているだけでいい感じの「所有欲」が満たされる、すばらしいデザインをもっています。
しかし、HT-03Aは普通のプラスチックのガワで、シンプルでいいのですが、プラスαの無い、質実剛健なデザインです。
その分安いのですが、もうちょっとがんばってほしいですね。
維持費が高い
bizホーダイ、mopera Uと、ちょっとお高め。
今回、Docomo携帯は、通話オンリーの一番安いプランに変更して、新規にiPhoneを持っていても、月々の支払は安いぐらいです。
回線の品質と相反するかもしれませんが、ちょっと他キャリアさんと比べて高いです。
アプリのマーケットがわかりにくい
アプリの数は飛躍的に増えていますが、うまく活用するのが難しいです。
スクリーンショットが表示されるようになってマシにはなりましたが、
それでもわかりにくいです。Appleのようにアプリの審査はしていないのが原因かもしれないですが、
さまざまなアプリが渾然一体となった感じです。
Googleの十八番のはずの検索の精度も低く、目的のアプリがわかっていても探すのに一苦労。
今後の改善が望まれますね。

HT-03Aとの2台持ちについて
今まで、Docomoに約8000円/月でしたが、
Softbankに約6000円/月、Docomoに約1500円/月となり、トータルでは若干安くあがる予定です。
現時点の選択では悪くないと思います。
ただ、最近は2年縛り等ややこしい仕組みがたくさんありますので、よく比較検討する必要がありますね。
ちなみに、Androidケータイ(HT-03A)は、初期設定時はSIMカードが必要ですが、それ以降はSIMカードが無くても使えます。（もちろん3Gは使えず、無線LANのみです。）
まとめ
結果的には、AndroidをやめてiPhoneを持つことになりましたが、
来年以降、新しい魅力的なAndroid端末出たら、考え直してしまうかもしれません。
Androidはソフトウェアとして非常に高機能で、今どんどん成長しています。
残念ながら、ハードウェアが追いついていなくて、せっかくのソフトウェアの魅力を
生かしきれていない気がします。
日本の大手メーカーも本気で参入して
ガラパゴスなんて言われないでほしいものです。
次期iPhoneがどうなるかわかりませんが、来年再来年はスマートフォン市場、大いに楽しみですね。
]]></description>
			<content:encoded><![CDATA[<p>こんにちは。<br />
プロダクト&amp;サービス事業部 リーダーの末田です。</p>
<div id="attachment_2032" class="wp-caption alignright" style="width: 250px"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/12/2009122422140001.jpg" alt="iPhone 3GS と Androidケータイ (HT-03A)" title="iPhone 3GS と Androidケータイ (HT-03A)" width="240" height="345" class="size-full wp-image-2032" /><p class="wp-caption-text">iPhone 3GS と Androidケータイ (HT-03A)</p></div>
<p>以前、Androidケータイ(HT-03A)買いました という記事を書きましたが、<br />
実は、iPhone 3GS を買ってしまいました。<br />
１ヶ月ほどですが、iPhoneとAndroid(HT-03A)を両方使う期間がありましたので、<br />
両方を比べてみた感想を書いてみたいと思います。<br />
iPhoneをいつ買えばいいか、Androidにした方がよいのか等の話が聞こえてきますが、<br />
この記事が参考になれば幸いです。</p>
<p><span id="more-2007"></span></p>
<h3>iPhoneの良い点・悪い点</h3>
<h4>良い点</h4>
<ul>
<li>みんなが持っている</li>
<p>やはりトレンドということで、iPhoneをもっている事自体が話のネタ、きっかけになります。<br />
このブランド力がApple最大の強みですね。</p>
<li>速い</li>
<p>3GSからですが、速いです。フリック入力等、レスポンスが悪いと使い物にならないのですが、<br />
快適です。スマートフォンにとって、速いことがこんなに大事なのかと再認識させられます。<br />
遅いと、使うことそのものを躊躇してしまうこともしばしばあるのですが、<br />
速いと逆にいつでも取り出したくなります。</p>
<li>かっこいい</li>
<p>まず、iPhoneのハードウェア自体がかっこよく、高級感があります。<br />
持っているだけで「良いものを持っている」感じがします。<br />
アプリケーションもAppleがデザインの指標を出しており、デザインに凝っているアプリが多いです。</p>
<li>アプリが豊富、わかりやすい</li>
<p>なんといってもiTune Storeによる、豊富なアプリと、簡単な購入につきます。<br />
いまや一大マーケットとなっていますので、日本語の問題もほぼなく、良いアプリがなんでもそろいます。
</ul>
<h4>悪い点</h4>
<ul>
<li>マルチタスク</li>
<p>iPhoneにはマルチタスク、という考え方がありません。1つのアプリを使ったら終了し、次のアプリを立ち上げる。<br />
今までの作業の状態がリセットされてしまうことが多く（アプリに依存します）、<br />
ちょっとメールやブラウザで確認して、ということができません。今後に期待です。</p>
<li>アプリ間の連携</li>
<p>マルチタスクとカブリますが、iPhoneではアプリ同士の連携、という考えがありません。<br />
例えば、RSSリーダーの中から、URLのリンク先を見たいという場合、通常では、RSSリーダーが終了して、<br />
ブラウザが立ち上がります。再度RSSリーダーを起動すると、状態はリセットされてしまいます。<br />
または、RSSリーダー内で、ブラウザを実装する必要があります。<br />
Androidでは、インテントという機能で、別々のアプリを連携して使うことができます。</p>
<li>デスクトップ</li>
<p>iPhoneのデスクトップは、ただのランチャーです。<br />
唯一の機能は、アイコンの上に数字を表示させて、メールの未読数などを表示する機能ぐらいです。<br />
Androidでは、ウィジェットや、ユーザーへの通知機能などがあります。</p>
<li>データのコピー・移動</li>
<p>iPhoneへ外部からデータを入れるのは、基本的にはiTuneからの同期のみです。<br />
アプリによっては、内部にWebDAVやFTPのサーバー機能を持たせて、データを取得出来るものもありますが、<br />
3G回線や無線LAN経由となりますので、動画等の大きなデータは非常に時間がかかります。<br />
また、アプリ同士でデータの共有はできないので、アプリごとにデータを転送する必要があります。</p>
</ul>
<h3>Android(HT-03A)の良い点・悪い点</h3>
<h4>良い点</h4>
<ul>
<li>Googleサービスとの連携</li>
<p>やはりGoogleサービスとの親和性は、iPhoneより上です。<br />
電話帳やスケジュールなど、WebからのGoogle以上に快適に使えます。<br />
PCからとAndroidから、双方からシームレスに使えます。</p>
<li>アプリ間の連携（インテント）</li>
<p>Android最大の特徴です。<br />
例えば、ファイルマネージャーアプリから、画像を選択して表示したいという場合、<br />
iPhoneでは画像を表示する機能を実装る必要が有りますが、<br />
Androidでは、インストールされている画像表示アプリがリストアップされ、利用したいアプリを選択して利用できます。<br />
また、画像表示を終わる際も「戻る」ボタンを押せば、もとのファイルマネージャーアプリに戻ります。<br />
画像表示アプリは、あたかもファイルマネージャーアプリの画像表示機能のように機能します。</p>
<li>マルチタスク</li>
<p>メモリがある限りどんどん起動します。使用頻度が低いものから終了します。<br />
メールを書きながら、ブラウザで情報をチェックして、またメールに戻る、なんてことも簡単です。</p>
<li>通知機能の豊富さ</li>
<p>アプリからの通知機能、メールの着信やカレンダーの通知など、統一されたインタフェースで通知領域に通知が出ます。</p>
<li>デスクトップ</li>
<p>Androidのデスクトップは、PCのデスクトップと同じで、ウィジェットを配置することができます。<br />
Twitterのつぶやきをリアルタイムで表示することが出来ます。</p>
<li>データのコピー・移動</li>
<p>データは、USB経由でPCとマウントできますし、microSDカードを利用することができます。<br />
大容量データでも快適です。<br />
また、アプリからのデータ利用も、どのディレクトリでも自由にアクセスできます。</p>
<li>変化のスピード</li>
<p>Android OS、アプリ、ともに更新頻度がすごいです。<br />
1週間もほっておくと、更新通知で真っ赤になります。</p>
<li>開発の自由度</li>
<p>Androidの開発はGoogleからSDKを無料で落とせます。<br />
環境はWindowsでもMacでもよいですし、開発言語も今では主流のJavaです。<br />
実機へのインストールも簡単です。<br />
アプリで出来ることもGoogleの審査などはないので自由です。<br />
iPhoneは、環境はMacオンリーで、Objective Cというマイナーな言語、Appleの審査アリとなります。<br />
実機へのインストールはAppleに開発者登録(有料)をしなければ入れられません。</p>
</ul>
<h4>悪い点</h4>
<ul>
<li>遅い</li>
<p>iPhoneに乗り換えた一番の原因ですが、「遅い」です。<br />
CPU、メモリが足りないWindows PCの「遅い」と全く同じ感覚です。<br />
スマートフォンのようないつも持ち歩く、さっと取り出して使う機器としては致命的だと思います。<br />
ソフトウェアとしてはかなり頑張ってる感じで、タッチパネルの操作感はかなりいいんですが、<br />
それでもつらい。root化というiPhoneでいう「脱獄」をすれば、CPUクロックを上げられるらしいのですが、<br />
OSを1.6にしちゃうとそれもできないようです(12/21現在。かなりがんばればいけるかも？)。</p>
<li>ハードウェアとしての「魅力」が少ない</li>
<p>iPhoneは、持っているだけでいい感じの「所有欲」が満たされる、すばらしいデザインをもっています。<br />
しかし、HT-03Aは普通のプラスチックのガワで、シンプルでいいのですが、プラスαの無い、質実剛健なデザインです。<br />
その分安いのですが、もうちょっとがんばってほしいですね。</p>
<li>維持費が高い</li>
<p>bizホーダイ、mopera Uと、ちょっとお高め。<br />
今回、Docomo携帯は、通話オンリーの一番安いプランに変更して、新規にiPhoneを持っていても、月々の支払は安いぐらいです。<br />
回線の品質と相反するかもしれませんが、ちょっと他キャリアさんと比べて高いです。</p>
<li>アプリのマーケットがわかりにくい</li>
<p>アプリの数は飛躍的に増えていますが、うまく活用するのが難しいです。<br />
スクリーンショットが表示されるようになってマシにはなりましたが、<br />
それでもわかりにくいです。Appleのようにアプリの審査はしていないのが原因かもしれないですが、<br />
さまざまなアプリが渾然一体となった感じです。<br />
Googleの十八番のはずの検索の精度も低く、目的のアプリがわかっていても探すのに一苦労。<br />
今後の改善が望まれますね。</p>
</ul>
<h3>HT-03Aとの2台持ちについて</h3>
<p>今まで、Docomoに約8000円/月でしたが、<br />
Softbankに約6000円/月、Docomoに約1500円/月となり、トータルでは若干安くあがる予定です。<br />
現時点の選択では悪くないと思います。<br />
ただ、最近は2年縛り等ややこしい仕組みがたくさんありますので、よく比較検討する必要がありますね。<br />
ちなみに、Androidケータイ(HT-03A)は、初期設定時はSIMカードが必要ですが、それ以降はSIMカードが無くても使えます。（もちろん3Gは使えず、無線LANのみです。）</p>
<h3>まとめ</h3>
<p>結果的には、AndroidをやめてiPhoneを持つことになりましたが、<br />
来年以降、新しい魅力的なAndroid端末出たら、考え直してしまうかもしれません。<br />
Androidはソフトウェアとして非常に高機能で、今どんどん成長しています。<br />
残念ながら、ハードウェアが追いついていなくて、せっかくのソフトウェアの魅力を<br />
生かしきれていない気がします。<br />
日本の大手メーカーも本気で参入して<br />
ガラパゴスなんて言われないでほしいものです。<br />
次期iPhoneがどうなるかわかりませんが、来年再来年はスマートフォン市場、大いに楽しみですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/12/iphone_android.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/12/iphone_android.html" />
	</item>
		<item>
		<title>easyFiLEX特設サイトオープン</title>
		<link>http://blog.eni.co.jp/tech/2009/12/easyfilex_site.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/12/easyfilex_site.html#comments</comments>
		<pubDate>Tue, 22 Dec 2009 06:29:08 +0000</pubDate>
		<dc:creator>hayasaka</dc:creator>
				<category><![CDATA[会社]]></category>
		<category><![CDATA[製品]]></category>
		<category><![CDATA[easyFiLEX]]></category>
		<category><![CDATA[FiLEX]]></category>
		<category><![CDATA[SaaS版]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[ファイル転送]]></category>
		<category><![CDATA[ファイル送信]]></category>
		<category><![CDATA[大容量]]></category>
		<category><![CDATA[簡単]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1983</guid>
		<description><![CDATA[はじめまして。早坂です。
弊社のセキュアファイル送信システム「easyFiLEX」の良さをもっと知ってもらいたい！ということで、この度easyFiLEX専用サイトがオープンしました。
弊社サイト内ではなかなか紹介しきれていなかった便利な機能や活用シーンなど分かりやすく紹介していますので、ぜひお立ち寄りいただけると幸いです。
easyFiLEXの便利な機能を一部紹介しますと、、、


「ダウンロード時認証」

easyFiLEXは、デフォルト設定ですとファイル送信時に「ダウンロードキーワード」が自動設定されるのですが、機密情報が含まれていないファ イルを送るのに、受信者にわざわざ別メールで届くダウンロードキーワードを使って認証する手間かけるのもちょっと気が引ける・・・なんて場合、ダウンロー ドキーワードを使用しないこともできます。
逆に、重要なファイルを送る場合、ダウンロードキーワードがメールで送られるのも困る！ということもあるでしょう。そんな場合は「ダウンロードキーワード」を通知しない設定にして別の方法（電話など）で伝えることもできます。または事前に合言葉を決めておいて設定することもできます。

「制限ユーザ」

easyFiLEXは、利用者（easyFiLEXではメンバと呼びます）毎に、送信先に制限かけることができます。ファイルを受信したい取引先のユーザを作成し、制限をかけたユーザ（イー ジーネットなら「eni.co.jp」のみに送れるように制限する）を作成して、そのアカウントを取引先の担当者へ渡します。そのアカウントからファイル 送信する場合、「eni.co.jp」のメールアドレス以外には送ることができないので、目的と違う使い方を避けることができます。
社内のユーザでも送信先を登録制にするなど、ポリシーを作って運用することもできます。
などなど便利な機能も紹介してますのでぜひeasyFiLEX専用サイト覗いてみてください。

私事ですが、先日兄の結婚式で沖縄へ行ってきました。12月とはいえ、大阪より気温は約10度程高いのでとても暖かく過ごしやすかったです。両親は北海道から来ていたので気温差は約20度。帰りたくなくなってしまいました。。
リンク

easyFiLEX
easyFiLEX SaaS版
イージーネット

]]></description>
			<content:encoded><![CDATA[<p>はじめまして。早坂です。</p>
<p>弊社のセキュアファイル送信システム「easyFiLEX」の良さをもっと知ってもらいたい！ということで、この度<a href="http://www.easyfilex.jp/" target="_blank"><strong>easyFiLEX専用サイト</strong></a>がオープンしました。</p>
<p>弊社サイト内ではなかなか紹介しきれていなかった便利な機能や活用シーンなど分かりやすく紹介していますので、ぜひお立ち寄りいただけると幸いです。</p>
<p>easyFiLEXの便利な機能を一部紹介しますと、、、</p>
<p><span id="more-1983"></span></p>
<ul>
<li><strong>「ダウンロード時認証」</strong></li>
</ul>
<p>easyFiLEXは、デフォルト設定ですとファイル送信時に「ダウンロードキーワード」が自動設定されるのですが、機密情報が含まれていないファ イルを送るのに、受信者にわざわざ別メールで届くダウンロードキーワードを使って認証する手間かけるのもちょっと気が引ける・・・なんて場合、ダウンロー ドキーワードを<strong>使用しない</strong>こともできます。</p>
<p>逆に、重要なファイルを送る場合、ダウンロードキーワードがメールで送られるのも困る！ということもあるでしょう。そんな場合は「ダウンロードキーワード」を<strong>通知しない</strong>設定にして別の方法（電話など）で伝えることもできます。または事前に合言葉を決めておいて設定することもできます。</p>
<ul>
<li><strong>「制限ユーザ」</strong></li>
</ul>
<p>easyFiLEXは、利用者（easyFiLEXではメンバと呼びます）毎に、送信先に制限かけることができます。ファイルを受信したい取引先のユーザを作成し、<strong>制限をかけたユーザ</strong>（イー ジーネットなら「eni.co.jp」のみに送れるように制限する）を作成して、そのアカウントを取引先の担当者へ渡します。そのアカウントからファイル 送信する場合、「eni.co.jp」のメールアドレス以外には送ることができないので、目的と違う使い方を避けることができます。</p>
<p>社内のユーザでも送信先を登録制にするなど、ポリシーを作って運用することもできます。</p>
<p>などなど便利な機能も紹介してますのでぜひ<a href="http://www.easyfilex.jp/" target="_blank">easyFiLEX専用サイト</a>覗いてみてください。</p>
<p><img class="alignnone size-medium wp-image-1991" title="サンタシーサー" src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/12/0622-225x300.jpg" alt="サンタシーサー" width="225" height="300" /></p>
<p>私事ですが、先日兄の結婚式で沖縄へ行ってきました。12月とはいえ、大阪より気温は約10度程高いのでとても暖かく過ごしやすかったです。両親は北海道から来ていたので気温差は約20度。帰りたくなくなってしまいました。。</p>
<h3>リンク</h3>
<ul>
<li><a href="http://www.easyfilex.jp/" target="_blank"><strong>easyFiLEX</strong></a></li>
<li><a href="http://www.easyfilex.jp/saas.html" target="_blank"><strong>easyFiLEX SaaS版</strong></a></li>
<li><a href="http://www.eni.co.jp/" target="_blank"><strong>イージーネット</strong></a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/12/easyfilex_site.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/12/easyfilex_site.html" />
	</item>
		<item>
		<title>easyFiLEX SaaS版 サービス開始</title>
		<link>http://blog.eni.co.jp/tech/2009/10/easyfilex_saas_release.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/10/easyfilex_saas_release.html#comments</comments>
		<pubDate>Wed, 21 Oct 2009 10:00:19 +0000</pubDate>
		<dc:creator>笹山 昭秀</dc:creator>
				<category><![CDATA[会社]]></category>
		<category><![CDATA[製品]]></category>
		<category><![CDATA[easyFiLEX]]></category>
		<category><![CDATA[FiLEX]]></category>
		<category><![CDATA[SaaS版]]></category>
		<category><![CDATA[セキュリティ]]></category>
		<category><![CDATA[ファイル転送]]></category>
		<category><![CDATA[ファイル送信]]></category>
		<category><![CDATA[大容量]]></category>
		<category><![CDATA[簡単]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1824</guid>
		<description><![CDATA[こんにちは。笹山です。
今日は弊社(株式会社イージーネット)から「easyFiLEX SaaS版がリリースされますよー！」というお知らせです。
FiLEXって何？
まず「FiLEX」って何？という方のために簡単に説明します。
正式名称は「easyFiLEX」です。
「EASY・FILE・EXPRESS」から名づけられました。
その名の通りブラウザを用いて「簡単にファイルを送信」するためのWEBアプリケーションです。しかも大容量ファイル(10GBまで)を安全、確実に届けることができます。
大容量ファイルを簡単・安全・確実に！
WEBブラウザさえあれば、あまりパソコンに詳しくない方でも流れに沿って操作するだけで、重要ファイルや機密データを簡単・安全・確実にファイル送信するとができます。
br>
「すばやくデスクトップから簡単にファイル送信したい！」という方のために「デスクトップAIRアプリケーション」もご用意しております。
送信するファイルを「ドラッグ＆ドロップ」、「右クリック-送る」で指定するだけ！
また、ファイル受信者がファイルをダウンロードする際は、ファイル送信者が指定したダウンロードキーワードがなければダウンロードすることはできません。
重要ファイルや機密データをより安全に相手先まで届けることが可能です。
私が言うのもなんですが、本当に簡単なんです！
FiLEXの詳しい製品説明はこちら。
SaaS版の特徴
現在easyFiLEX パッケージ版を販売中ですが、もっと手軽に使っていただきたいと思いeasyFiLEX SaaS版をリリースすることとなりました。
「SaaS」というのは、ソフトウェアをネットワーク経由のサービスとしてお客様に提供することです。(参考URL: SaaS &#8211; Wikipedia)
よってお客様は自社でサービスを持つことなく大容量ファイル送信サービスを利用することができます。
SaaS版の特徴は以下です。

月額制でお手頃価格
詳しくはこちらのページにありますが、10ユーザ/10GBで月額5,800円より提供しております。1ユーザあたり580円という低料金でご使用いただけます。200ユーザ/200GBですと1ユーザあたりなんと380円になります。
		(参考URL: easyFiLEX SaaS版 価格表)
	
すぐに導入可能
お申し込みから5営業日を目処にお使いいただけます。自社設置型に比べて導入までのスピードに特徴があります。
小規模導入可能
10ユーザ/10GBで月額5,800円からご使用頂けますので、例えば部門レベルでの導入にも適しています。
マシン・インストール・運用不要
サーバ不要もインストールも不要です。いつでもお使いいただけます。

部門別や部署別で使いたいけど「導入、運用やメンテナンスにコストをかけたくない」という企業様にぜひ使っていただきたいと思っています。
「easyFiLEX体験サービス」をご用意しております。まず体験サービスでFiLEXを思う存分使っていただきご検討いただければと思います。
導入・運用コストを抑えながら、「簡単操作、大容量ファイル送信、安全確実送信」が可能な「FiLEX」をぜひご検討ください！
FiLEXで使用しているソフトウェア
ここからは、当ブログ用の技術的なお話です。
FiLEXでは以下のソフトウェアが使われています。


JSF(JavaServer Faces)
Java Webアプリケーションフレームワーク


Facelets
JSFアプリケーションを作成するためのフレームワーク


Spring
Java/J2EEアプリケーションフレームワーク（JSF連携機能で使用）


iBatis
O/Rマッピングツール


YUI(Yahoo UI Library)
Ajaxライブラリ


AIR/Flex
リッチインターネットアプリケーション


SeleniumRC
Webアプリケーション自動テストツール


FiLEX開発で採用された技術情報はブログで公開しています。こちらもよろしくお願いします。

AIR/Flexでアップロード
AIR/Flexでドラッグ アンド ドロップ
リッチなAdobe AIR/Flexのツールチップをよりリッチに
Seleniumの自動テストを止めることなく、Flexを手動操作する方法
SeleniumRCで自己署名証明書使用のWEBアプリケーションをテストする際、セキュリティ警告を表示させない方法

開発に参加して
　私ごとで恐縮ですが、私も開発メンバーの一員として参加しました。
私にとってJavaフレームワークを使用したWEBアプリケーション開発はこれが初めてでした。
他のJavaフレームワークもろくに使いこなせないのに「大丈夫かな？」と不安だらけでした。
しかし不安は的中！（しょぼーん）
JSFの情報も入門程度の内容しかネットになく、書籍も古いものしかありませんでした。
すこし難しいことを実現しようとするとすぐにつまずいてしまいました。
例えばJSFだけでHtmlDataTableのページングはどうしたらいいのかとか。
くだらないところではFaceletsでEL式を含む行をコメントアウト(&#60;!- -　- -&#62;)しても、コメントアウトが有効にならず実行されてしまうとか。
あげればたくさんありますが、どれも良い経験になりました。
そんな貴重な経験を積ませてもらったFiLEXです。FiLEXはまさに私の師匠なのです。（言い過ぎか？）
FiLEXをお使いいただければ必ず師匠が良い体験をさせてくれること間違いなしです。
どうぞFiLEX SaaS版をよろしくお願いいたします。
リンク

easyFiLEX
easyFiLEX体験サービス
株式会社イージーネット

]]></description>
			<content:encoded><![CDATA[<p>こんにちは。笹山です。<br />
今日は弊社(<a href="http://www.eni.co.jp/" target="_blank">株式会社イージーネット</a>)から「easyFiLEX SaaS版がリリースされますよー！」というお知らせです。</p>
<h3>FiLEXって何？</h3>
<p>まず「FiLEX」って何？という方のために簡単に説明します。</p>
<p>正式名称は「easyFiLEX」です。<br />
「EASY・FILE・EXPRESS」から名づけられました。<br />
その名の通りブラウザを用いて「簡単にファイルを送信」するためのWEBアプリケーションです。しかも大容量ファイル(10GBまで)を安全、確実に届けることができます。</p>
<h4>大容量ファイルを簡単・安全・確実に！</h4>
<p>WEBブラウザさえあれば、あまりパソコンに詳しくない方でも流れに沿って操作するだけで、重要ファイルや機密データを簡単・安全・確実にファイル送信するとができます。<br />
<div id="attachment_1874" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/10/upload_easyfilex.gif"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/10/upload_easyfilex-300x141.gif" alt="FiLEX ファイルアップロード" title="FiLEX ファイルアップロード" width="300" height="141" class="size-medium wp-image-1874" /></a><p class="wp-caption-text">FiLEX ファイルアップロード</p></div><br />
<div id="attachment_1875" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/10/address_easyfilex.gif"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/10/address_easyfilex-300x113.gif" alt="FiLEX アドレス帳" title="FiLEX アドレス帳" width="300" height="113" class="size-medium wp-image-1875" /></a><p class="wp-caption-text">FiLEX アドレス帳</p></div></p>
<p>「すばやくデスクトップから簡単にファイル送信したい！」という方のために「デスクトップAIRアプリケーション」もご用意しております。<br />
送信するファイルを「ドラッグ＆ドロップ」、「右クリック-送る」で指定するだけ！<br />
<div id="attachment_1876" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/10/filex_apli01.gif"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/10/filex_apli01-300x143.gif" alt="easyFiLEX Application" title="easyFiLEX Application" width="300" height="143" class="size-medium wp-image-1876" /></a><p class="wp-caption-text">easyFiLEX Application</p></div></p>
<p>また、ファイル受信者がファイルをダウンロードする際は、ファイル送信者が指定したダウンロードキーワードがなければダウンロードすることはできません。<br />
重要ファイルや機密データをより安全に相手先まで届けることが可能です。</p>
<p>私が言うのもなんですが、本当に簡単なんです！<br />
FiLEXの詳しい製品説明は<a href="http://www.eni.co.jp/products/easyfilex/index.html" target="_blank">こちら</a>。</p>
<h3>SaaS版の特徴</h3>
<p>現在<a href="http://www.eni.co.jp/products/easyfilex/package.html">easyFiLEX パッケージ版</a>を販売中ですが、もっと手軽に使っていただきたいと思い<a href="http://www.eni.co.jp/products/easyfilex/saas.html">easyFiLEX SaaS版</a>をリリースすることとなりました。<br />
「SaaS」というのは、ソフトウェアをネットワーク経由のサービスとしてお客様に提供することです。(参考URL: <a href="http://ja.wikipedia.org/wiki/SaaS">SaaS &#8211; Wikipedia</a>)<br />
よってお客様は自社でサービスを持つことなく大容量ファイル送信サービスを利用することができます。</p>
<p>SaaS版の特徴は以下です。</p>
<dl>
<dt>月額制でお手頃価格</dt>
<dd><a href="http://www.eni.co.jp/products/easyfilex/price_saas.html">詳しくはこちらのページ</a>にありますが、10ユーザ/10GBで月額5,800円より提供しております。1ユーザあたり580円という低料金でご使用いただけます。200ユーザ/200GBですと1ユーザあたりなんと380円になります。<br />
		(参考URL: <a href="http://www.eni.co.jp/products/easyfilex/price_saas.html">easyFiLEX SaaS版 価格表</a>)
	</dd>
<dt>すぐに導入可能</dt>
<dd><a href="http://www.eni.co.jp/products/easyfilex/subscription_saas.html">お申し込み</a>から5営業日を目処にお使いいただけます。自社設置型に比べて導入までのスピードに特徴があります。</dd>
<dt>小規模導入可能</dt>
<dd>10ユーザ/10GBで月額5,800円からご使用頂けますので、例えば部門レベルでの導入にも適しています。</dd>
<dt>マシン・インストール・運用不要</dt>
<dd>サーバ不要もインストールも不要です。いつでもお使いいただけます。</dd>
</dl>
<p>部門別や部署別で使いたいけど「導入、運用やメンテナンスにコストをかけたくない」という企業様にぜひ使っていただきたいと思っています。</p>
<p><a href="https://www.eni.co.jp/products/easyfilex/subscription.html" target="_blank">「easyFiLEX体験サービス」</a>をご用意しております。まず体験サービスでFiLEXを思う存分使っていただきご検討いただければと思います。</p>
<p>導入・運用コストを抑えながら、「簡単操作、大容量ファイル送信、安全確実送信」が可能な「FiLEX」をぜひご検討ください！</p>
<h3>FiLEXで使用しているソフトウェア</h3>
<p>ここからは、当ブログ用の技術的なお話です。<br />
FiLEXでは以下のソフトウェアが使われています。</p>
<table class="content">
<tr>
<th>JSF(JavaServer Faces)</th>
<td>Java Webアプリケーションフレームワーク</td>
</tr>
<tr>
<th>Facelets</th>
<td>JSFアプリケーションを作成するためのフレームワーク</td>
</tr>
<tr>
<th>Spring</th>
<td>Java/J2EEアプリケーションフレームワーク（JSF連携機能で使用）</td>
</tr>
<tr>
<th>iBatis</th>
<td>O/Rマッピングツール</td>
</tr>
<tr>
<th>YUI(Yahoo UI Library)</th>
<td>Ajaxライブラリ</td>
</tr>
<tr>
<th>AIR/Flex</th>
<td>リッチインターネットアプリケーション</td>
</tr>
<tr>
<th>SeleniumRC</th>
<td>Webアプリケーション自動テストツール</td>
</tr>
</table>
<p>FiLEX開発で採用された技術情報はブログで公開しています。こちらもよろしくお願いします。</p>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/06/air_flex_upload.html" target="_blank">AIR/Flexでアップロード</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/05/air_flex_draganddrop.html" target="_blank">AIR/Flexでドラッグ アンド ドロップ</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/06/air_flex_tooltip.html" target="_blank">リッチなAdobe AIR/Flexのツールチップをよりリッチに</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/05/selenium_wait.html" target="_blank">Seleniumの自動テストを止めることなく、Flexを手動操作する方法</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/07/selenium_firefox_self_signed_ssl.html" target="_blank">SeleniumRCで自己署名証明書使用のWEBアプリケーションをテストする際、セキュリティ警告を表示させない方法</a></li>
</ul>
<h3>開発に参加して</h3>
<p>　私ごとで恐縮ですが、私も開発メンバーの一員として参加しました。<br />
私にとってJavaフレームワークを使用したWEBアプリケーション開発はこれが初めてでした。<br />
他のJavaフレームワークもろくに使いこなせないのに「大丈夫かな？」と不安だらけでした。<br />
しかし不安は的中！（しょぼーん）<br />
JSFの情報も入門程度の内容しかネットになく、書籍も古いものしかありませんでした。<br />
すこし難しいことを実現しようとするとすぐにつまずいてしまいました。<br />
例えばJSFだけでHtmlDataTableのページングはどうしたらいいのかとか。<br />
くだらないところではFaceletsでEL式を含む行をコメントアウト(&lt;!- -　- -&gt;)しても、コメントアウトが有効にならず実行されてしまうとか。<br />
あげればたくさんありますが、どれも良い経験になりました。</p>
<p>そんな貴重な経験を積ませてもらったFiLEXです。FiLEXはまさに私の師匠なのです。（言い過ぎか？）<br />
FiLEXをお使いいただければ必ず師匠が良い体験をさせてくれること間違いなしです。<br />
どうぞFiLEX SaaS版をよろしくお願いいたします。</p>
<h3>リンク</h3>
<ul>
<li><a href="http://www.eni.co.jp/products/easyfilex/index.html" target="_blank">easyFiLEX</a></li>
<li><a href="https://www.eni.co.jp/products/easyfilex/subscription.html" target="_blank">easyFiLEX体験サービス</a></li>
<li><a href="http://www.eni.co.jp/" target="_blank">株式会社イージーネット</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/10/easyfilex_saas_release.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/10/easyfilex_saas_release.html" />
	</item>
		<item>
		<title>Wicket小話その3. Wicketで確認メッセージを出すにはどうすればよいのか？(その2)</title>
		<link>http://blog.eni.co.jp/tech/2009/09/wicket_03_confirm02.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/09/wicket_03_confirm02.html#comments</comments>
		<pubDate>Tue, 29 Sep 2009 08:20:46 +0000</pubDate>
		<dc:creator>武輪 恭代</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Wicket]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1812</guid>
		<description><![CDATA[ども、武輪です。
前回のWicket小話で、Confirmメッセージを出すにはどうすればよいのか？と言った話をしたのですが、今回も引き続きConfirmメッセージの話をしたいと思います。
前回、AjaxボタンでConfirmメッセージを表示する方法として、Wicket-extensionのコンポーネントであるModalWindowを使い、独自のポップアップメッセージを表示する方法をとりました。
しかしながら、これってぶっちゃけConfirmメッセージじゃないよね…！
というわけで今回はAjaxボタンで正真正銘(?)のConfirmメッセージを表示する方法をご紹介します。

AjaxボタンでConfirmメッセージ
&#62;Ajaxで中身を入れ替える以上、onclickアトリビュートをいじるのはややこしそうなので&#8230;
と前回書いたのですが、
「confirmで確認後、OKだったら既存AjaxのJavaScriptを実行してあげて、キャンセルだったらfalseを返す」
ようなJavaScriptを書けば問題ないんじゃ…？と思いまして。
そんなわけでさらっとサンプルを書いてみました。
サンプルは前回同様、ボタンを押した時に確認メッセージを表示し、OKだったらカウントする、キャンセルだったら何もしない、といった仕様です。
Confirm2.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class Confirm2 extends WebPage&#123;
&#160;
	private int count = 0;
	private Label result;
&#160;
	/**
	 * コンストラクタ
	 */
	public Confirm2&#40;&#41; &#123;
		add&#40;result = new Label&#40;&#34;result&#34;, new PropertyModel&#60;Integer&#62;&#40;this, &#34;count&#34;&#41;&#41;&#41;;
		result.setOutputMarkupId&#40;true&#41;;
		Form&#60;?&#62; form = new Form&#60;Confirm2&#62;&#40;&#34;form&#34;&#41;;
&#160;
		form.add&#40;new AjaxButton&#40;&#34;count&#34;, new Model&#60;String&#62;&#40;&#34;カウントしますか？&#34;&#41;&#41;&#123;
&#160;
			private static final long serialVersionUID = 1L;
&#160;
			@Override
			protected void onSubmit&#40;AjaxRequestTarget target, Form&#60;?&#62; form&#41; &#123;
				count++;
				target.addComponent&#40;result&#41;;
			&#125;
&#160;
			@Override
			protected IAjaxCallDecorator getAjaxCallDecorator&#40;&#41; &#123;
				return new AjaxPreprocessingCallDecorator&#40;super.getAjaxCallDecorator&#40;&#41;&#41; &#123;
					private static final long serialVersionUID = 1L;
&#160;
					@Override
					public CharSequence preDecorateScript&#40;CharSequence [...]]]></description>
			<content:encoded><![CDATA[<p>ども、武輪です。</p>
<p><a href="http://blog.eni.co.jp/tech/2009/09/wicket_02_confirm.html">前回のWicket小話</a>で、Confirmメッセージを出すにはどうすればよいのか？と言った話をしたのですが、今回も引き続きConfirmメッセージの話をしたいと思います。</p>
<p>前回、AjaxボタンでConfirmメッセージを表示する方法として、Wicket-extensionのコンポーネントであるModalWindowを使い、独自のポップアップメッセージを表示する方法をとりました。<br />
しかしながら、これってぶっちゃけConfirmメッセージじゃないよね…！</p>
<p>というわけで今回はAjaxボタンで正真正銘(?)のConfirmメッセージを表示する方法をご紹介します。</p>
<p><!-- more --></p>
<h3>AjaxボタンでConfirmメッセージ</h3>
<p><em>&gt;Ajaxで中身を入れ替える以上、onclickアトリビュートをいじるのはややこしそうなので&#8230;</em></p>
<p>と前回書いたのですが、<br />
「confirmで確認後、OKだったら既存AjaxのJavaScriptを実行してあげて、キャンセルだったらfalseを返す」<br />
ようなJavaScriptを書けば問題ないんじゃ…？と思いまして。</p>
<p>そんなわけでさらっとサンプルを書いてみました。<br />
サンプルは前回同様、ボタンを押した時に確認メッセージを表示し、OKだったらカウントする、キャンセルだったら何もしない、といった仕様です。</p>
<p><span class="strong">Confirm2.java</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p181214"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code" id="p1812code14"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Confirm2 <span style="color: #000000; font-weight: bold;">extends</span> WebPage<span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> count <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a> result<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * コンストラクタ
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> Confirm2<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		add<span style="color: #009900;">&#40;</span>result <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;result&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> PropertyModel<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		result.<span style="color: #006633;">setOutputMarkupId</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Form<span style="color: #339933;">&lt;?&gt;</span> form <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Form<span style="color: #339933;">&lt;</span>Confirm2<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;form&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		form.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> AjaxButton<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;count&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> Model<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;カウントしますか？&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
&nbsp;
			@Override
			<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> onSubmit<span style="color: #009900;">&#40;</span>AjaxRequestTarget target, Form<span style="color: #339933;">&lt;?&gt;</span> form<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				count<span style="color: #339933;">++;</span>
				target.<span style="color: #006633;">addComponent</span><span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
			@Override
			<span style="color: #000000; font-weight: bold;">protected</span> IAjaxCallDecorator getAjaxCallDecorator<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> AjaxPreprocessingCallDecorator<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">getAjaxCallDecorator</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
&nbsp;
					@Override
					<span style="color: #000000; font-weight: bold;">public</span> CharSequence preDecorateScript<span style="color: #009900;">&#40;</span>CharSequence script<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
						<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #0000ff;">&quot;if(!confirm('&quot;</span> <span style="color: #339933;">+</span> getModelObject<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;')) return false;&quot;</span> <span style="color: #339933;">+</span> script<span style="color: #339933;">;</span>
					<span style="color: #009900;">&#125;</span>
				<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		add<span style="color: #009900;">&#40;</span>form<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>【メモ】<br />
<span class="blue">25～34行目付近</span>:<br />
AjaxButtonのgetAjaxCallDecoratorをオーバライドしてあげることで、出力されるAjax用JavaScriptに手を加えています。</p>
<p>実際に出力されるhtmlは以下のようになります。</p>
<pre lang="Html" line="none">
onclick="if(!confirm('カウントしますか？')) return false;var wcall=wicketSubmitFormById('form2', ';[長いので略]"
</pre>
<h4>まとめ</h4>
<p>というわけで、AjaxButtonでも前回みたいな似非確認ダイアログではなくちゃんとした(?)Confirmメッセージを出すことができました。<br />
AjaxButtonを記述する度にgetAjaxCallDecorator()をオーバライドするのも面倒なので、AjaxButtonを継承したサブクラスを作っておくのが便利そうです。</p>
<h3>動作環境</h3>
<p>今回のサンプルソースは以下の環境で動作させています。</p>
<table class="content">
<tr>
<th></th>
<th>バージョン</th>
</tr>
<tr>
<th style="text-align:left">JDK</th>
<td>1.6.0_13</td>
</tr>
<tr>
<th style="text-align:left">Apache Tomcat</th>
<td>6.0.16</td>
</tr>
<tr>
<th style="text-align:left">Apache Wicket</th>
<td>1.4.0</td>
</tr>
</table>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/08/wicket_01_start.html">Wicket小話その1. とりあえずWicketを始めよう</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/08/wicket_02_confirm.html">Wicket小話その2. Wicketで確認メッセージを出すにはどうすればよいのか？</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/09/wicket_03_confirm02.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/09/wicket_03_confirm02.html" />
	</item>
		<item>
		<title>ExtJS3.0でWebアプリケーションのテーブルをリッチにしよう（その２）</title>
		<link>http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part2.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part2.html#comments</comments>
		<pubDate>Tue, 08 Sep 2009 03:40:48 +0000</pubDate>
		<dc:creator>笹山 昭秀</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Ext.grid.GridPanel]]></category>
		<category><![CDATA[Ext.override]]></category>
		<category><![CDATA[Ext.ux.data.PagingMemoryProxy]]></category>
		<category><![CDATA[Ext.ux.ProgressBarPager]]></category>
		<category><![CDATA[Ext.ux.SlidingPager]]></category>
		<category><![CDATA[ExtJS3.0]]></category>
		<category><![CDATA[オーバーライド]]></category>
		<category><![CDATA[ツールチップ]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1429</guid>
		<description><![CDATA[
このエントリーは下記の記事の続きです。
ExtJS3.0でWebアプリケーションのテーブルをリッチにしよう（その１）

こんにちは。笹山です。
前回Ext.grid.GridPanelを用いてシンプルな時刻表を作成しました。
まだまだ物足りないので機能を追加していきます。
せっかくなのでExtJS3.0の新機能を用いてもっとリッチにしていこうと思います。
（前回のGridは実際のところExtJS3.0でなくても作成できます。）
今回は以下の機能追加を行います。

ページング機能を追加する
Gridの高さを自由に変更可能にする
Gridの各Cellにマウスを合わせた時、内容をツールチップに表示する

※今回は全便の時刻表データを使ってサンプルを作成します（8月時刻表全便データ）

新機能ライブラリの追加
ExtJS3.0のサンプルサイトで紹介されている新機能を使用するには、新機能用のライブラリが必要です。
新機能用のライブラリは、ExtJS3.0を展開したexmaple\uxフォルダ以下にあります。（新機能なのに何でexampleフォルダなんだろう？）
必要なファイルは以下になります。

ext-3.0.0\examples\ux\ux-all.js
ext-3.0.0\examples\ux\css\ux-all.css
ext-3.0.0\examples\ux\images以下のファイル全て

前回作成したサンプルをもとに変更を加えていきます。

grid-timetable.htmlのHEADタグ内に「新機能に必要なファイル」と「全便の時刻表データファイル」を追加します
※override-paging-memory-proxy.jsについては新規作成します

1
2
3
4
  &#60;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;path/ux-all.css&#34; /&#62;
  &#60;script type=&#34;text/javascript&#34; src=&#34;path/ux-all.js&#34;&#62;&#60;/script&#62;
  &#60;script type=&#34;text/javascript&#34; src=&#34;path/timetable-data.js&#34;&#62;&#60;/script&#62;
  &#60;script type=&#34;text/javascript&#34; src=&#34;path/override-paging-memory-proxy.js&#34;&#62;&#60;/script&#62;

※linkタグ、scriptタグ中の「path」 : ファイルを配置したディレクトリ名に変更してください


grid-timetable.html


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
&#60;!DOCTYPE HTML PUBLIC &#34;-//W3C//DTD HTML 4.01 Transitional//EN&#34;
&#34;http://www.w3.org/TR/html4/loose.dtd&#34;&#62;
&#60;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34;&#62;
    &#60;head&#62;
        &#60;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34; /&#62;
        &#60;link rel=&#34;stylesheet&#34; type=&#34;text/css&#34; href=&#34;path/ext-all.css&#34; [...]]]></description>
			<content:encoded><![CDATA[<div class="update">
このエントリーは下記の記事の続きです。</p>
<p><a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part1.html">ExtJS3.0でWebアプリケーションのテーブルをリッチにしよう（その１）</a>
</div>
<p>こんにちは。笹山です。</p>
<p><a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part1.html">前回</a>Ext.grid.GridPanelを用いてシンプルな時刻表を作成しました。</p>
<p>まだまだ物足りないので機能を追加していきます。<br />
せっかくなのでExtJS3.0の新機能を用いてもっとリッチにしていこうと思います。<br />
（<a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part1.html">前回</a>のGridは実際のところExtJS3.0でなくても作成できます。）</p>
<p>今回は以下の機能追加を行います。</p>
<ul>
<li>ページング機能を追加する</li>
<li>Gridの高さを自由に変更可能にする</li>
<li>Gridの各Cellにマウスを合わせた時、内容をツールチップに表示する</li>
</ul>
<p>※今回は全便の時刻表データを使ってサンプルを作成します（<a href="http://blog.eni.co.jp/tech/misc/extjs/data/timetable-data.js">8月時刻表全便データ</a>）</p>
<p><span id="more-1429"></span></p>
<h3>新機能ライブラリの追加</h3>
<p>ExtJS3.0のサンプルサイトで紹介されている新機能を使用するには、新機能用のライブラリが必要です。<br />
新機能用のライブラリは、ExtJS3.0を展開したexmaple\uxフォルダ以下にあります。（新機能なのに何でexampleフォルダなんだろう？）</p>
<p>必要なファイルは以下になります。</p>
<ul>
<li>ext-3.0.0\examples\ux\ux-all.js</li>
<li>ext-3.0.0\examples\ux\css\ux-all.css</li>
<li>ext-3.0.0\examples\ux\images以下のファイル全て</li>
</ul>
<p><a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part1.html">前回</a>作成したサンプルをもとに変更を加えていきます。</p>
<ul>
<li>grid-timetable.htmlのHEADタグ内に「新機能に必要なファイル」と「全便の時刻表データファイル」を追加します<br />
<span style="color: #ff0000;">※</span><a href="#override-paging-memory-proxy">override-paging-memory-proxy.jsについては新規作成します</a></p>

<div class="wp_codebox"><table width="100%" ><tr id="p142922"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p1429code22"><pre class="html" style="font-family:monospace;">  &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;path/ux-all.css&quot; /&gt;
  &lt;script type=&quot;text/javascript&quot; src=&quot;path/ux-all.js&quot;&gt;&lt;/script&gt;
  &lt;script type=&quot;text/javascript&quot; src=&quot;path/timetable-data.js&quot;&gt;&lt;/script&gt;
  &lt;script type=&quot;text/javascript&quot; src=&quot;path/override-paging-memory-proxy.js&quot;&gt;&lt;/script&gt;</pre></td></tr></table></div>

<p><span style="color: #ff0000;">※linkタグ、scriptタグ中の「path」 : ファイルを配置したディレクトリ名に変更してください</span></li>
</ul>
<ul>
<li>grid-timetable.html</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr id="p142923"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code" id="p1429code23"><pre class="html" style="font-family:monospace;">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;
&quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
    &lt;head&gt;
        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
        &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;path/ext-all.css&quot; /&gt;
        &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;path/ux-all.css&quot; /&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;path/ext-base.js&quot;&gt;&lt;/script&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;path/ext-all.js&quot;&gt;&lt;/script&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;path/ux-all.js&quot;&gt;&lt;/script&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;path/ext-lang-ja.js&quot; charset=&quot;UTF-8&quot;&gt;&lt;/script&gt;
&nbsp;
        &lt;script type=&quot;text/javascript&quot; src=&quot;path/timetable-data.js&quot;&gt;&lt;/script&gt;
	&lt;script type=&quot;text/javascript&quot; src=&quot;path/override-paging-memory-proxy.js&quot;&gt;&lt;/script&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;path/grid-timetable.js&quot;&gt;&lt;/script&gt;
        &lt;title&gt;伊丹空港 8月時刻表&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;h1&gt;伊丹空港 8月時刻表&lt;/h1&gt;
        &lt;div id=&quot;grid-timetable&quot;&gt;&lt;/div&gt;
    &lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p><a name="override-paging-memory-proxy"></a></p>
<h3>Ext.ux.data.PagingMemoryProxyのメソッドオーバーライド</h3>
<p>Ext.ux.data.PagingMemoryProxyを利用したサンプルを作成している際に以下のバグを発見しました。</p>
<ul>
<li>Gridのカラムソートの昇順、降順が逆に処理される</li>
<li>Gridのカラムソートの降順が正常に動作しない（最後のデータから表示しているだけ）</li>
</ul>
<p>これを修正するためにExt.ux.data.PagingMemoryProxyのdoRequest メソッドのオーバーライドを行います。<br />
エディタで新しいファイルoverride-paging-memory-proxy.jsを作成します。</p>
<ul>
<li>override-paging-memory-proxy.js(新規作成)</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr id="p142924"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
</pre></td><td class="code" id="p1429code24"><pre class="javascript" style="font-family:monospace;">Ext.<span style="color: #660066;">override</span><span style="color: #009900;">&#40;</span>Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">data</span>.<span style="color: #660066;">PagingMemoryProxy</span><span style="color: #339933;">,</span><span style="color: #009900;">&#123;</span>
    doRequest<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>action<span style="color: #339933;">,</span> rs<span style="color: #339933;">,</span> params<span style="color: #339933;">,</span> reader<span style="color: #339933;">,</span> callback<span style="color: #339933;">,</span> scope<span style="color: #339933;">,</span> options<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        params <span style="color: #339933;">=</span> params <span style="color: #339933;">||</span>
        <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
        <span style="color: #003366; font-weight: bold;">var</span> result<span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
            result <span style="color: #339933;">=</span> reader.<span style="color: #660066;">readRecords</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000066; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">fireEvent</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'loadexception'</span><span style="color: #339933;">,</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">,</span> options<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> e<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            callback.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>scope<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">null</span><span style="color: #339933;">,</span> options<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000066; font-weight: bold;">return</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #006600; font-style: italic;">// filtering</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>params.<span style="color: #660066;">filter</span> <span style="color: #339933;">!==</span> undefined<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            result.<span style="color: #660066;">records</span> <span style="color: #339933;">=</span> result.<span style="color: #660066;">records</span>.<span style="color: #660066;">filter</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>el<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span><span style="color: #009900;">&#40;</span>el<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'object'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #003366; font-weight: bold;">var</span> att <span style="color: #339933;">=</span> params.<span style="color: #660066;">filterCol</span> <span style="color: #339933;">||</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
                    <span style="color: #000066; font-weight: bold;">return</span> String<span style="color: #009900;">&#40;</span>el.<span style="color: #660066;">data</span><span style="color: #009900;">&#91;</span>att<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">match</span><span style="color: #009900;">&#40;</span>params.<span style="color: #660066;">filter</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #003366; font-weight: bold;">true</span> <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #000066; font-weight: bold;">return</span> String<span style="color: #009900;">&#40;</span>el<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">match</span><span style="color: #009900;">&#40;</span>params.<span style="color: #660066;">filter</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">?</span> <span style="color: #003366; font-weight: bold;">true</span> <span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            result.<span style="color: #660066;">totalRecords</span> <span style="color: #339933;">=</span> result.<span style="color: #660066;">records</span>.<span style="color: #660066;">length</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #006600; font-style: italic;">// sorting</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>params.<span style="color: #660066;">sort</span> <span style="color: #339933;">!==</span> undefined<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #006600; font-style: italic;">// use integer as params.sort to specify column, since arrays are not named</span>
            <span style="color: #006600; font-style: italic;">// params.sort=0; would also match a array without columns</span>
            <span style="color: #003366; font-weight: bold;">var</span> dir <span style="color: #339933;">=</span> String<span style="color: #009900;">&#40;</span>params.<span style="color: #660066;">dir</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toUpperCase</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'DESC'</span> <span style="color: #339933;">?</span> <span style="color: #339933;">-</span>1 <span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
            <span style="color: #003366; font-weight: bold;">var</span> fn <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>r1<span style="color: #339933;">,</span> r2<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                <span style="color: #000066; font-weight: bold;">return</span> r1 <span style="color: #339933;">==</span> r2 <span style="color: #339933;">?</span> 0 <span style="color: #339933;">:</span> r1 <span style="color: #339933;">&lt;</span> r2 <span style="color: #339933;">?</span> <span style="color: #339933;">-</span>1 <span style="color: #339933;">:</span> <span style="color: #CC0000;">1</span><span style="color: #339933;">;</span>
　　　　　　　　<span style="color: #006600; font-style: italic;">/* ↑↑↑↑↑↑↑↑↑↑↑↑ ※ux-all.jsでは、 return r1 &lt; r2; になっています */</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
            result.<span style="color: #660066;">records</span>.<span style="color: #660066;">sort</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> b<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                <span style="color: #003366; font-weight: bold;">var</span> v <span style="color: #339933;">=</span> <span style="color: #CC0000;">0</span><span style="color: #339933;">;</span>
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">typeof</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'object'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    v <span style="color: #339933;">=</span> fn<span style="color: #009900;">&#40;</span>a.<span style="color: #660066;">data</span><span style="color: #009900;">&#91;</span>params.<span style="color: #660066;">sort</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> b.<span style="color: #660066;">data</span><span style="color: #009900;">&#91;</span>params.<span style="color: #660066;">sort</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> dir<span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
                    v <span style="color: #339933;">=</span> fn<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> b<span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> dir<span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>v <span style="color: #339933;">==</span> 0<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    v <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>a.<span style="color: #660066;">index</span> <span style="color: #339933;">&lt;</span> b.<span style="color: #660066;">index</span> <span style="color: #339933;">?</span> <span style="color: #339933;">-</span>1 <span style="color: #339933;">:</span> 1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
                <span style="color: #000066; font-weight: bold;">return</span> v<span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #006600; font-style: italic;">// paging (use undefined cause start can also be 0 (thus false))</span>
        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>params.<span style="color: #660066;">start</span> <span style="color: #339933;">!==</span> undefined <span style="color: #339933;">&amp;&amp;</span> params.<span style="color: #660066;">limit</span> <span style="color: #339933;">!==</span> undefined<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            result.<span style="color: #660066;">records</span> <span style="color: #339933;">=</span> result.<span style="color: #660066;">records</span>.<span style="color: #660066;">slice</span><span style="color: #009900;">&#40;</span>params.<span style="color: #660066;">start</span><span style="color: #339933;">,</span> params.<span style="color: #660066;">start</span> <span style="color: #339933;">+</span> params.<span style="color: #660066;">limit</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        callback.<span style="color: #660066;">call</span><span style="color: #009900;">&#40;</span>scope<span style="color: #339933;">,</span> result<span style="color: #339933;">,</span> options<span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<table class="content" width="100%">
<caption style="text-align: left; "><strong>Ext<strong/></caption>
<tr>
<th width="150">
            Methods
        </th>
<th>
            説明
        </th>
</tr>
<tr>
<td>
            override
        </td>
<td>
既存クラスのメソッドをオーバーライドします<br />メソッドが存在しない場合は追加されます
        </td>
</tr>
</table>
<p>作成したoverride-paging-memory-proxy.jsをgrid-timetable.htmlに追加してください。</p>
<h3>ページング機能を追加する</h3>
<p><a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part1.html">前回</a>はExt.data.ArrayStoreを使用して配列をそのままStoreに渡していましたが、今回はExt.data.Storeのproxyを使用してデータを取得します。<br />
Storeはproxyを使用して外部データを取得します。proxyにはJSON形式でデータを取得するHttpProxyやメモリ内のデータを取得するためのExt.data.MemoryProxyがあります。<br />
今回使用するExt.ux.data.PagingMemoryProxyはExt.data.MemoryProxyが拡張されたものでメモリ内のデータのページングやソートを行うことができます。</p>
<p>それでは、<a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part1.html">前回</a>のgrid-timetable.jsにページング機能を追加してきます。</p>
<ul>
<li>「全便の時刻表データファイル」を使用しますので、ソース中に直接書いていたtimeTableData配列を削除します</li>
<li>（変更①） StoreをExt.data.ArrayStoreからExt.data.Storeへ変更しproxyからデータを取得するようにします</li>
<li>（変更②） Ext.grid.GridPanelのBottomToolbarにExt.PagingToolbarを作成します</li>
<li>（変更③） Storeへロードを行う際に、HTTPパラメータを指定してデータをロードします</li>
</ul>
<p />
<ul>
<li>grid-timetable.js</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr id="p142925"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
</pre></td><td class="code" id="p1429code25"><pre class="javascript" style="font-family:monospace;">Ext.<span style="color: #660066;">onReady</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #003366; font-weight: bold;">var</span> store <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">data</span>.<span style="color: #660066;">Store</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>                                <span style="color: #009966; font-style: italic;">/* 変更① ここから */</span>
        proxy<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">data</span>.<span style="color: #660066;">PagingMemoryProxy</span><span style="color: #009900;">&#40;</span>timeTableData<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        remoteSort<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        baseParams<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>sort<span style="color: #339933;">:</span> <span style="color: #3366CC;">'itamiTime'</span><span style="color: #339933;">,</span> dir<span style="color: #339933;">:</span> <span style="color: #3366CC;">'ASC'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span> 
        reader<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">data</span>.<span style="color: #660066;">ArrayReader</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
            fields<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
                <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'destination'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'airline'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'flightName'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'model'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'itamiTime'</span><span style="color: #339933;">,</span> type<span style="color: #339933;">:</span> <span style="color: #3366CC;">'date'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'objectTime'</span><span style="color: #339933;">,</span> type<span style="color: #339933;">:</span> <span style="color: #3366CC;">'date'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
                <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'type'</span><span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#93;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>                                                          <span style="color: #009966; font-style: italic;">/* 変更① ここまで */</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> grid <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">grid</span>.<span style="color: #660066;">GridPanel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        title<span style="color: #339933;">:</span> <span style="color: #3366CC;">'時刻表'</span><span style="color: #339933;">,</span>
        frame<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        height<span style="color: #339933;">:</span> <span style="color: #CC0000;">350</span><span style="color: #339933;">,</span>
        width<span style="color: #339933;">:</span> <span style="color: #CC0000;">750</span><span style="color: #339933;">,</span>
        renderTo<span style="color: #339933;">:</span> <span style="color: #3366CC;">'grid-timetable'</span><span style="color: #339933;">,</span>
        stripeRows<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        trackMouseOver<span style="color: #339933;">:</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        store<span style="color: #339933;">:</span> store<span style="color: #339933;">,</span>
        columns<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'対象空港'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'destination'</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'航空会社'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'airline'</span><span style="color: #339933;">,</span>
                renderer<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>v<span style="color: #339933;">,</span> params<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
                    <span style="color: #003366; font-weight: bold;">var</span> airlineColor <span style="color: #339933;">=</span> v<span style="color: #339933;">;</span>
                    <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>v <span style="color: #339933;">==</span> <span style="color: #3366CC;">'ANA'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        airlineColor <span style="color: #339933;">=</span> <span style="color: #3366CC;">'&lt;span style=&quot;color: #003399;&quot;&gt;'</span> <span style="color: #339933;">+</span> v <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;/span&gt;'</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>v <span style="color: #339933;">==</span> <span style="color: #3366CC;">'JAL'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        airlineColor <span style="color: #339933;">=</span> <span style="color: #3366CC;">'&lt;span style=&quot;color: #cc0000;&quot;&gt;'</span> <span style="color: #339933;">+</span> v <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;/span&gt;'</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>v <span style="color: #339933;">==</span> <span style="color: #3366CC;">'IBEX'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                        airlineColor <span style="color: #339933;">=</span> <span style="color: #3366CC;">'&lt;span style=&quot;color: #F552A8;&quot;&gt;'</span> <span style="color: #339933;">+</span> v <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;/span&gt;'</span><span style="color: #339933;">;</span>
                    <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
                        <span style="color: #003366; font-weight: bold;">var</span> codeShare <span style="color: #339933;">=</span> v.<span style="color: #660066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'/'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>codeShare.<span style="color: #660066;">length</span> <span style="color: #339933;">==</span> 2<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                            <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>codeShare<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'IBEX'</span> <span style="color: #339933;">&amp;&amp;</span> codeShare<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'ANA'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                                airlineColor <span style="color: #339933;">=</span> <span style="color: #3366CC;">'&lt;span style=&quot;color: #F552A8;&quot;&gt;'</span> <span style="color: #339933;">+</span> 
                                    codeShare<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;/span&gt;'</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'/'</span> <span style="color: #339933;">+</span> 
                                    <span style="color: #3366CC;">'&lt;span style=&quot;color: #003399;&quot;&gt;'</span> <span style="color: #339933;">+</span> codeShare<span style="color: #009900;">&#91;</span><span style="color: #CC0000;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;/span&gt;'</span><span style="color: #339933;">;</span>
                            <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
                                <span style="color: #006600; font-style: italic;">// 何もしない</span>
                            <span style="color: #009900;">&#125;</span>
                        <span style="color: #009900;">&#125;</span>
                    <span style="color: #009900;">&#125;</span>
                    <span style="color: #000066; font-weight: bold;">return</span> airlineColor<span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'便名'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'flightName'</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'機種'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'model'</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'伊丹空港時間'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'itamiTime'</span><span style="color: #339933;">,</span>
                renderer<span style="color: #339933;">:</span> Ext.<span style="color: #660066;">util</span>.<span style="color: #660066;">Format</span>.<span style="color: #660066;">dateRenderer</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'H:i'</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'対象空港時間'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'objectTime'</span><span style="color: #339933;">,</span>
                renderer<span style="color: #339933;">:</span> Ext.<span style="color: #660066;">util</span>.<span style="color: #660066;">Format</span>.<span style="color: #660066;">dateRenderer</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'H:i'</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'出発/到着種別'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'type'</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        bbar<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">PagingToolbar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>                            <span style="color: #009966; font-style: italic;">/* 変更② ここから */</span>
            pageSize<span style="color: #339933;">:</span> 30<span style="color: #339933;">,</span>
            store<span style="color: #339933;">:</span> store<span style="color: #339933;">,</span>
            displayInfo<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>                                                        <span style="color: #009966; font-style: italic;">/* 変更② ここまで */</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    store.<span style="color: #660066;">load</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>                                                 <span style="color: #009966; font-style: italic;">/* 変更③ ここから */</span>
        params<span style="color: #339933;">:</span><span style="color: #009900;">&#123;</span>
            start<span style="color: #339933;">:</span><span style="color: #CC0000;">0</span><span style="color: #339933;">,</span>
            limit<span style="color: #339933;">:</span><span style="color: #CC0000;">30</span><span style="color: #339933;">,</span>
            sort<span style="color: #339933;">:</span><span style="color: #3366CC;">'itamiTime'</span><span style="color: #339933;">,</span>
            dir<span style="color: #339933;">:</span> <span style="color: #3366CC;">'ASC'</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                                                          <span style="color: #009966; font-style: italic;">/* 変更③ ここまで */</span>
&nbsp;
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<ul>
<li>変更①　2行目～17行目<br />
<table class="content" width="100%">
<caption style="text-align: left; "><strong>Ext.data.Store<strong/></caption>
<tr>
<th width="150">
        	Config Options
        </th>
<th colspan="2">
        	説明
        </th>
</tr>
<tr>
<td>
        	proxy
        </td>
<td colspan="2">
        	データオブジェクトへのアクセスを提供するプロキシーオブジェクトを指定します
        </td>
</tr>
<tr>
<td>
        	remoteSort
        </td>
<td colspan="2">
        	true：並び替えをproxyに要求して処理します<br />
                false：キャッシュ中のデータ（現在Grid表示されているデータ）で並び替えを行います
        </td>
</tr>
<tr>
<td rowspan="4">
        	baseParams
        </td>
<td colspan="2">
HTTP リクエスト時に常に送られるパラメータのオブジェクトです<br />
Ext.ux.data.PagingMemoryProxyではstart,limit,sort,dir,filterのパラメータを受け取り、処理が可能です<br />
start,limitパラメータはbaseParamsを指定しなくてもページング処理の際、自動で設定されます
        </td>
</tr>
<tr>
<th width="100">
        	パラメータ
        </th>
<th>
        	説明
        </th>
</tr>
<tr>
<td>
        	sort
        </td>
<td>
ソートする項目名を指定します
        </td>
</tr>
<tr>
<td>
        	dir
        </td>
<td>
ソートする方向を指定します
        </td>
</tr>
<tr>
<td>
        	reader
        </td>
<td colspan="2">
DataReader オブジェクトを指定します
        </td>
</tr>
</table>
<p></p>
<table class="content" width="100%">
<caption style="text-align: left; "><strong>Ext.ux.data.PagingMemoryProxy<strong/></caption>
<tr>
<th width="150">
        	Config Options
        </th>
<th colspan="2">
        	説明
        </th>
</tr>
<tr>
<td>
        	-
        </td>
<td colspan="2">
ページンググリッドが可能なMemoryProxyです（メモリ内のデータから読み込みます）
        </td>
</tr>
</table>
<p></p>
<table class="content" width="100%">
<caption style="text-align: left; "><strong>Ext.data.ArrayReader<strong/></caption>
<tr>
<th width="150">
        	Config Options
        </th>
<th colspan="2">
        	説明
        </th>
</tr>
<tr>
<td rowspan="4">
        	fields
        </td>
<td colspan="2">
データをどのようにマッピングするか定義します
        </td>
</tr>
<tr>
<th width="100">
        	パラメータ
        </th>
<th>
        	説明
        </th>
</tr>
<tr>
<td>
        	name
        </td>
<td>
レコード内でfieldを参照する際に用いるnameです<br /> ColumnModelのdataIndexプロパティによって参照されます
        </td>
</tr>
<tr>
<td>
        	type
        </td>
<td>
表示できる値に変換するためのデータタイプです<br />指定しない場合は、autoとなり変換を行いません
        </td>
</tr>
</table>
</li>
<li>変更②　89行目～93行目<br />
<table class="content" width="100%">
<caption style="text-align: left; "><strong>Ext.grid.GridPanel<strong/></caption>
<tr>
<th width="150">
        	Config Options
        </th>
<th colspan="2">
        	説明
        </th>
</tr>
<tr>
<td>
        	bbar
        </td>
<td colspan="2">
Gridパネル下部のツールバーです
        </td>
</tr>
</table>
<table class="content" width="100%">
<caption style="text-align: left; "><strong>Ext.PagingToolbar<strong/></caption>
<tr>
<th width="150">
        	Config Options
        </th>
<th colspan="2">
        	説明
        </th>
</tr>
<tr>
<td>
        	pageSize
        </td>
<td colspan="2">
1ページ単位で表示するデータの数です
        </td>
</tr>
<tr>
<td>
        	store
        </td>
<td colspan="2">
ページングツールバーがデータソースとして使用するExt.data.Storeを指定します
        </td>
</tr>
<tr>
<td>
        	displayInfo
        </td>
<td colspan="2">
displayMsg(ページングステータスメッセージ)を表示します
        </td>
</tr>
</table>
</li>
<li>変更③　96行目～103行目<br />
<table class="content" width="100%">
<caption style="text-align: left; "><strong>Ext.grid.GridPanel<strong/></caption>
<tr>
<th width="150">
        	Methods
        </th>
<th colspan="2">
        	説明
        </th>
</tr>
<tr>
<td rowspan="4">
        	load
        </td>
<td colspan="2">
設定されたReaderを用いてProxyからレコードキャッシュをロードします
        </td>
</tr>
<tr>
<th width="100">
        	Options
        </th>
<th>
        	説明
        </th>
</tr>
<tr>
<td>
params
        </td>
<td>
リモートデータソースに対してHTTPパラメータとして渡すプロパティを指定します<br />
Ext.ux.data.PagingMemoryProxyでは以下のパラメータを受け取り、処理が可能です<br />
start:データ開始位置<br />
limit:1ページ当たりのデータ件数<br />
sort:ソートする項目名<br />
dir:ソートする方向
        </td>
</tr>
</table>
</li>
</ul>
<p />
<div id="attachment_1647" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/09/itm_timetable_paging.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/09/itm_timetable_paging-300x141.png" alt="Grid(時刻表)ページング機能" title="ページング機能" width="300" height="141" class="size-medium wp-image-1647" /></a><p class="wp-caption-text">Grid(時刻表)ページング機能</p></div></p>
<p>たったこれだけの変更でページング機能が実現できます。今回はメモリ内のデータでページング機能を行いました。proxyをExt.data.HttpProxyに変更すれば、サーバからXML、JSON形式でデータを取得してこれを実現することが可能です。</p>
<h3>ページング機能を拡張する</h3>
<p>ExtJS3.0の新しい機能でページングの機能を簡単に便利に、カッコ良くできます。</p>
<ul>
<li>（拡張①）スライドでページング可能にする</li>
<li>（拡張②）プログレスバーで進捗確認、ページング可能にする</li>
</ul>
<ul>
<li>grid-timetable.js</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr id="p142926"><td class="line_numbers"><pre>19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code" id="p1429code26"><pre class="javascript" style="font-family:monospace;">    <span style="color: #003366; font-weight: bold;">var</span> grid <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">grid</span>.<span style="color: #660066;">GridPanel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
&nbsp;
               <span style="color: #006600; font-style: italic;">// ～省略</span>
&nbsp;
        bbar<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">PagingToolbar</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
            pageSize<span style="color: #339933;">:</span> 30<span style="color: #339933;">,</span>
            store<span style="color: #339933;">:</span> store<span style="color: #339933;">,</span>
            displayInfo<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
            plugins<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
                <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">SlidingPager</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>          <span style="color: #009966; font-style: italic;">/* 拡張① */</span>
                <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">ProgressBarPager</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>       <span style="color: #009966; font-style: italic;">/* 拡張② */</span>
            <span style="color: #009900;">&#93;</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span>
&nbsp;
               <span style="color: #006600; font-style: italic;">// ～省略</span></pre></td></tr></table></div>

<div id="attachment_1665" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/09/itm_timetable_paging_plugin.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/09/itm_timetable_paging_plugin-300x141.png" alt="Grid(時刻表)ページング機能拡張（SlidingPager,ProgressBarPager）" title="Grid(時刻表)ページング機能拡張（SlidingPager,ProgressBarPager）" width="300" height="141" class="size-medium wp-image-1665" /></a><p class="wp-caption-text">Grid(時刻表)ページング機能拡張（SlidingPager,ProgressBarPager）</p></div>
<p>たったこれだけです。<br />
Ext.PagingToolbarのpluginsオプションに指定するだけで簡単に実現できます。</p>
<h3>Gridの高さを任意のサイズに変更可能にする</h3>
<p>ここまでのGrid(時刻表)高さは固定でした。<br />
データがサイズ内に収まらない場合は、スクロールして見る必要がありました。<br />
そこでGrid(時刻表)の高さを任意のサイズに変更できるようにします。</p>
<ul>
<li>（拡張③）Grid(時刻表)の高さを任意のサイズに変更可能にする</li>
</ul>
<ul>
<li>grid-timetable.js</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr id="p142927"><td class="line_numbers"><pre>19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code" id="p1429code27"><pre class="javascript" style="font-family:monospace;">    <span style="color: #003366; font-weight: bold;">var</span> grid <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">grid</span>.<span style="color: #660066;">GridPanel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
&nbsp;
               <span style="color: #006600; font-style: italic;">// ～省略</span>
&nbsp;
        plugins<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">ux</span>.<span style="color: #660066;">PanelResizer</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>  <span style="color: #009966; font-style: italic;">/* 拡張③ ここから */</span>
            minHeight<span style="color: #339933;">:</span> <span style="color: #CC0000;">100</span><span style="color: #339933;">,</span>
            maxHeight<span style="color: #339933;">:</span> <span style="color: #CC0000;">800</span>
        <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>                                <span style="color: #009966; font-style: italic;">/* 拡張③ ここまで */</span>
&nbsp;
               <span style="color: #006600; font-style: italic;">// ～省略</span></pre></td></tr></table></div>

<table class="content" width="100%">
<caption style="text-align: left; "><strong>Ext.ux.PanelResizer<strong/></caption>
<tr>
<th width="150">
        	Config Options
        </th>
<th>
        	説明
        </th>
</tr>
<tr>
<td>
        	minHeight
        </td>
<td>
        変更可能最小サイズ(pixel)
        </td>
</tr>
<tr>
<td>
        	maxHeight
        </td>
<td>
        変更可能最大サイズ(pixel)
        </td>
</tr>
</table>
<p />
<div id="attachment_1669" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/09/itm_timetable_paging_frame_size.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/09/itm_timetable_paging_frame_size-300x178.png" alt="Grid(時刻表)高さ変更" title="Grid(時刻表)高さ変更" width="300" height="178" class="size-medium wp-image-1669" /></a><p class="wp-caption-text">Grid(時刻表)高さ変更</p></div></p>
<p>Ext.grid.GridPanelのpluginsオプションに指定するだけでこれも簡単に実現できます。</p>
<h3>GridのCell内容をツールチップに表示する</h3>
<p>今回のGrid(時刻表)では問題ないですが、文字列が長すぎてCell内に収まりきらない場合があります。<br />
そのようなときのために、GridのCell上でマウスオーバしたときにツールチップを表示させてみます。</p>
<ul>
<li>（拡張④）GridのCell内容をツールチップに表示する</li>
</ul>
<ul>
<li>grid-timetable.js</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr id="p142928"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="code" id="p1429code28"><pre class="javascript" style="font-family:monospace;">Ext.<span style="color: #660066;">onReady</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    Ext.<span style="color: #660066;">QuickTips</span>.<span style="color: #660066;">init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>                                        <span style="color: #009966; font-style: italic;">/* 拡張④ */</span>
&nbsp;
               <span style="color: #006600; font-style: italic;">// ～省略</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> grid <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">grid</span>.<span style="color: #660066;">GridPanel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
&nbsp;
               <span style="color: #006600; font-style: italic;">// ～省略</span>
&nbsp;
        columns<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'対象空港'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'destination'</span><span style="color: #339933;">,</span>
                renderer<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>v<span style="color: #339933;">,</span> params<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>                 <span style="color: #009966; font-style: italic;">/* 拡張④ ここから */</span>
                    params.<span style="color: #660066;">attr</span> <span style="color: #339933;">=</span> 
                         <span style="color: #3366CC;">'ext:qtitle=&quot;対象空港&quot;'</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">' ext:qwidth=&quot;100&quot;'</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">' ext:qtip=&quot;'</span> <span style="color: #339933;">+</span> v <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&quot;'</span><span style="color: #339933;">;</span>
                    <span style="color: #000066; font-weight: bold;">return</span> v<span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>                                               <span style="color: #009966; font-style: italic;">/* 拡張④ ここから */</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
               <span style="color: #006600; font-style: italic;">// ～省略</span></pre></td></tr></table></div>

<ul>
<li>拡張④ 3行目<br />
<table class="content" width="100%">
<caption style="text-align: left; "><strong>Ext.QuickTips<strong/></caption>
<tr>
<th width="150">
            Methods
        </th>
<th>
            説明
        </th>
</tr>
<tr>
<td>
            init
        </td>
<td>
全体のQuickTipsのインタフェースを初期化し、QuckTipsを使用可能にします。
        </td>
</tr>
</table>
</li>
<li>拡張④ 16行目～20行目<br />
<table class="content" width="100%">
<caption style="text-align: left; "><strong>Ext.grid.GridPanel<strong/></caption>
<tr>
<th width="150">
        	Config Options
        </th>
<th>
        	説明
        </th>
</tr>
<tr>
<td>
        	renderer
        </td>
<td>
        	セルの与えられたデータ値にHTMLマークアップを生成するために使用される関数です
        </td>
</tr>
</table>
<p>rendererに使用する無名関数function(v, params)で以下のHTML属性を追加することでツールチップ表示が可能になります。</p>
<table class="content" width="100%">
<tr>
<th width="150">
        	属性
        </th>
<th>
        	説明
        </th>
</tr>
<tr>
<td>
ext:qtitle
        </td>
<td>
ツールチップのタイトルです
        </td>
</tr>
<tr>
<td>
ext:qwidth
        </td>
<td>
ツールチップの幅(pixel)です
        </td>
</tr>
<tr>
<td>
ext:qtip
        </td>
<td>
ツールチップで表示する内容です
        </td>
</tr>
</table>
<p>※一般的なHTMLタグに直接上記属性を指定することもできます。
</li>
</ul>
<div id="attachment_1696" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/09/itm_timetable_qtip.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/09/itm_timetable_qtip-300x140.png" alt="Grid(時刻表)ツールチップ表示" title="Grid(時刻表)ツールチップ表示" width="300" height="140" class="size-medium wp-image-1696" /></a><p class="wp-caption-text">Grid(時刻表)ツールチップ表示</p></div>
<p>これも簡単に実現できてしまいました。<br />
一般的なHTMLタグにも属性指定して簡単にツールチップを表示できるなんて素敵です。</p>
<h3>最後に</h3>
<p>だいぶん時刻表がカッコ良くなってきました。<br />
ほとんどコードを書くことなく機能が実現できて感動しました。<br />
次回ももう少し時刻表に機能を追加していこうと思っています。<br />
お楽しみに！</p>
<p><a href="http://blog.eni.co.jp/tech/misc/extjs/part2/grid-timetable.html">ExtJS3.0 Gridデモ　「伊丹空港　8月時刻表（全便）　その２」　</a></p>
<h3>参考リンク</h3>
<ul>
<li><a href="http://extjs.com/">Ext</a></li>
<li><a href="http://extjs.co.jp/">Ext Japan</a></li>
<li><a href="http://extjs.com/deploy/dev/examples/samples.html">ExtJS3.0 Samples &#038; Demos</a></li>
<li><a href="http://extjs.com/deploy/dev/docs/">ExtJS API Documentation</a></li>
</ul>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part1.html">ExtJS3.0でWebアプリケーションのテーブルをリッチにしよう（その１）</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part2.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part2.html" />
	</item>
		<item>
		<title>Wicket小話その2. Wicketで確認メッセージを出すにはどうすればよいのか？</title>
		<link>http://blog.eni.co.jp/tech/2009/09/wicket_02_confirm.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/09/wicket_02_confirm.html#comments</comments>
		<pubDate>Fri, 04 Sep 2009 02:35:23 +0000</pubDate>
		<dc:creator>武輪 恭代</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Wicket]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1365</guid>
		<description><![CDATA[ども、武輪です。
Webアプリケーションでは、データを登録したり編集したり削除したりといった操作が日常茶飯事です。
そして「削除ボタンを押した時にいきなり削除するのではなく、confirmメッセージを出す」というのはよくあるパターンですね。
さてWicket小話その2では、「Wicketで確認メッセージを出すにはどうすればよいのか？」について、実際のコードを踏まえて試してみようと思います。

非Ajaxボタンの場合
例えばこんなボタンがあるとします。

これはcountボタンを押すと画面上に何回クリックしたのかを表示する簡単なサンプルです。
Confirm.html

1
2
3
4
5
6
7
8
9
10
11
12
&#60;?xml version=&#34;1.0&#34; encoding=&#34;UTF-8&#34;?&#62;
&#60;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34;&#62;
&#60;head&#62;
	&#60;title&#62;Wicket Examples - confirm&#60;/title&#62;
&#60;/head&#62;
&#60;body&#62;
	&#60;span wicket:id=&#34;result&#34; /&#62; 回目
	&#60;form wicket:id=&#34;form&#34;&#62;
		&#60;input wicket:id=&#34;count&#34; type=&#34;submit&#34; value=&#34;count&#34; /&#62;
	&#60;/form&#62;
&#60;/body&#62;
&#60;/html&#62;

Confirm.java(非AjaxButton編)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Confirm extends WebPage &#123;
&#160;
	private int count = 0;
&#160;
	/**
	 * コンストラクタ
	 */
	public Confirm&#40;&#41; &#123;
		add&#40;new Label&#40;&#34;result&#34;, new PropertyModel&#60;Integer&#62;&#40;this, &#34;count&#34;&#41;&#41;&#41;;
		Form&#60;?&#62; form = new Form&#60;Confirm&#62;&#40;&#34;form&#34;&#41;;
		Button countButton;
		form.add&#40;countButton = new Button&#40;&#34;count&#34;&#41; &#123;
			private static final long serialVersionUID = 1L;
&#160;
			@Override
			public void onSubmit&#40;&#41; &#123;
				super.onSubmit&#40;&#41;;
				count++;
			&#125;
&#160;
		&#125;&#41;;
		add&#40;form&#41;;
	&#125;
&#160;
	/**
	 * countを取得します。
	 * @return [...]]]></description>
			<content:encoded><![CDATA[<p>ども、武輪です。</p>
<p>Webアプリケーションでは、データを登録したり編集したり削除したりといった操作が日常茶飯事です。<br />
そして「削除ボタンを押した時にいきなり削除するのではなく、confirmメッセージを出す」というのはよくあるパターンですね。</p>
<p>さてWicket小話その2では、「Wicketで確認メッセージを出すにはどうすればよいのか？」について、実際のコードを踏まえて試してみようと思います。</p>
<p><span id="more-1365"></span></p>
<h3>非Ajaxボタンの場合</h3>
<p>例えばこんなボタンがあるとします。<br />
<img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/09/sample011-300x214.png" alt="confirmサンプル" title="confirmサンプル" width="300" height="214" class="alignleft size-medium wp-image-1728" /><br clear="all"/><br />
これはcountボタンを押すと画面上に何回クリックしたのかを表示する簡単なサンプルです。</p>
<p><span class="strong">Confirm.html</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136541"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1365code41"><pre class="html" style="font-family:monospace;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
	&lt;title&gt;Wicket Examples - confirm&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;span wicket:id=&quot;result&quot; /&gt; 回目
	&lt;form wicket:id=&quot;form&quot;&gt;
		&lt;input wicket:id=&quot;count&quot; type=&quot;submit&quot; value=&quot;count&quot; /&gt;
	&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p><span class="strong">Confirm.java(非AjaxButton編)</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136542"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code" id="p1365code42"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Confirm <span style="color: #000000; font-weight: bold;">extends</span> WebPage <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> count <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * コンストラクタ
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> Confirm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		add<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;result&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> PropertyModel<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Form<span style="color: #339933;">&lt;?&gt;</span> form <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Form<span style="color: #339933;">&lt;</span>Confirm<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;form&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abutton+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Button</span></a> countButton<span style="color: #339933;">;</span>
		form.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>countButton <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abutton+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Button</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
&nbsp;
			@Override
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onSubmit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">onSubmit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				count<span style="color: #339933;">++;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		add<span style="color: #009900;">&#40;</span>form<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * countを取得します。
	 * @return count
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> getCount<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> count<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<h4>html側で対応</h4>
<p>html側に直接JavaScriptを埋め込むことで対応。<br />
Javaのコードには一切変更点はありません。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p136543"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p1365code43"><pre class="html" style="font-family:monospace;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
	&lt;title&gt;Wicket Examples - confirm&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;span wicket:id=&quot;result&quot; /&gt; 回目
	&lt;form wicket:id=&quot;form&quot;&gt;
		&lt;input wicket:id=&quot;count&quot; type=&quot;submit&quot; value=&quot;count&quot; onclick=&quot;return confirm('カウントしますか？')&quot; /&gt;
	&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p>【メモ】<br />
<span class="blue">9行目</span>:<br />
onclickイベントを追加しただけです。</p>
<h4>Java側で対応</h4>
<p>SimpleAttributeModifierを使うことで、任意のアトリビュートを付加することができます。<br />
htmlには一切変更点はありません。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p136544"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code" id="p1365code44"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Confirm <span style="color: #000000; font-weight: bold;">extends</span> WebPage <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> count <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * コンストラクタ
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> Confirm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		add<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;result&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> PropertyModel<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Form<span style="color: #339933;">&lt;?&gt;</span> form <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Form<span style="color: #339933;">&lt;</span>Confirm<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;form&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abutton+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Button</span></a> countButton<span style="color: #339933;">;</span>
		form.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>countButton <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Abutton+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Button</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
&nbsp;
			@Override
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onSubmit<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">super</span>.<span style="color: #006633;">onSubmit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				count<span style="color: #339933;">++;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		countButton.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> SimpleAttributeModifier<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;onclick&quot;</span>, <span style="color: #0000ff;">&quot;return confirm('カウントしますか？')&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		add<span style="color: #009900;">&#40;</span>form<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * countを取得します。
	 * @return count
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> getCount<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> count<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>【メモ】<br />
<span class="blue">22行目</span>:<br />
countButtonにSimpleAttributeModifierをadd。</p>
<p>html側で対応した場合も、Java側で対応した場合も、動作的には下図のように、countボタンをクリックすると確認ダイアログが表示されます。<br />
確認ダイアログのOKをクリックすれば、数字がインクリメントされ、キャンセルをクリックすれば数字は元のままです。<br />
<img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/09/sample02-300x215.png" alt="Confirmサンプル" title="Confirmサンプル" width="300" height="215" class="alignleft size-medium wp-image-1733" /><br clear="all"/></p>
<p><br clear="all"/></p>
<h3>Ajaxボタンの場合</h3>
<p>続きましてAjaxボタンの場合。<br />
動作的には変わらないのですが、先ほどのサンプルコードを下記のように、ButtonではなくAjaxButtonを使用するように変更します。<br />
html側には変更はありません。(Wicketってこういうとこ便利ですよね)</p>
<p><span class="strong">Confirm.java(AjaxButton編)</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136545"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code" id="p1365code45"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Confirm <span style="color: #000000; font-weight: bold;">extends</span> WebPage <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> count <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * コンストラクタ
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> Confirm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a> result<span style="color: #339933;">;</span>
		add<span style="color: #009900;">&#40;</span>result <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;result&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> PropertyModel<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		result.<span style="color: #006633;">setOutputMarkupId</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Form<span style="color: #339933;">&lt;?&gt;</span> form <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Form<span style="color: #339933;">&lt;</span>Confirm<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;form&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		AjaxButton countButton<span style="color: #339933;">;</span>
		form.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>countButton <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> AjaxButton<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
&nbsp;
			@Override
			<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> onSubmit<span style="color: #009900;">&#40;</span>AjaxRequestTarget target, Form<span style="color: #339933;">&lt;?&gt;</span> form<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				count<span style="color: #339933;">++;</span>
				target.<span style="color: #006633;">addComponent</span><span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		add<span style="color: #009900;">&#40;</span>form<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * countを取得します。
	 * @return count
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> getCount<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> count<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>【メモ】<br />
<span class="blue">11行目</span>:<br />
Ajaxを用いてコンポーネントを更新する場合は、setOutputMarkupIdをtrueにすることを忘れずに！</p>
<h4>こんな失敗</h4>
<p>非Ajaxボタンの時と同じように、onclickアトリビュート追加してやればいいんじゃないの？<br />
　↓<br />
html側に「onclick=&#8221;return confirm(&#8217;カウントしますか？&#8217;)&#8221;」をつけたしてみる。<br />
　↓<br />
カウントはされるが、確認ダイアログは出てこない。あれ？<br />
　↓<br />
生成されたhtmlソースを見てみる<br />
　↓</p>

<div class="wp_codebox"><table width="100%" ><tr id="p136546"><td class="code" id="p1365code46"><pre class="html" style="font-family:monospace;">&lt;input type=&quot;submit&quot; value=&quot;count&quot; onclick=&quot;var wcall=wicketSubmitFormById('ida', '?wicket:interface=:5:form:count::IActivePageBehaviorListener:0:&amp;amp;wicket:ignoreIfNotActive=true', 'count' ,null,null, function() {return Wicket.$$(this)&amp;amp;&amp;amp;Wicket.$$('ida')}.bind(this));;; return false;&quot; name=&quot;count&quot; id=&quot;idb&quot;/&gt;</pre></td></tr></table></div>

<p>　↓<br />
Ajax用のonclickになってるよーorz<br />
　↓<br />
じゃあ、SimpleAttributeModifierを使うパターンは？<br />
　↓<br />
確認ダイアログは出るけど、OKクリックしてもカウントアップされない<br />
　↓<br />
生成されたhtmlソースを見てみる<br />
　↓</p>

<div class="wp_codebox"><table width="100%" ><tr id="p136547"><td class="code" id="p1365code47"><pre class="html" style="font-family:monospace;">&lt;input type=&quot;submit&quot; value=&quot;count&quot; name=&quot;count&quot; id=&quot;id3&quot; onclick=&quot;return confirm('カウントしますか？')&quot;/&gt;</pre></td></tr></table></div>

<p>　↓<br />
見事Ajax用のonclickイベントはconfirmに置き換わってる<br />
　↓<br />
そりゃそうだorz</p>
<h4>力技で解決</h4>
<p>Ajaxで中身を入れ替える以上、onclickアトリビュートをいじるのはややこしそうなので、とっても強引に解決してみました。</p>
<p>もう独自にConfirmウィンドウ実装しちゃえばいいんじゃね？<br />
というわけで、できたのがこんな画面。</p>
<p><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/09/sample03-300x205.png" alt="Confirmサンプル" title="Confirmサンプル" width="300" height="205" class="alignleft size-medium wp-image-1746" /><br clear="all"/></p>
<p>Wicket-extensionにはいくつかの便利なAjaxコンポーネントが備わっています。<br />
そのうちの一つであるModalWindowを使って、強引に確認ダイアログのようなものを表示させてみました。</p>
<p>追加したのは下記3ファイル(ConfirmModalWindowPage.html、ConfirmModalWindowPage.java、IConfirmPage.java)。</p>
<p><span class="strong">ConfirmModalWondowPage.html</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136548"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code" id="p1365code48"><pre class="html" style="font-family:monospace;">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot; &quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html&gt;
&lt;head&gt;
	&lt;meta http-equiv=&quot;content-type&quot; content=&quot;application/xhtml+xml;charset=UTF-8&quot; /&gt;
	&lt;title&gt;ModalWindow&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;div wicket:id=&quot;info&quot;&gt;メッセージ&lt;/div&gt;
	&lt;form wicket:id=&quot;confirmForm&quot;&gt;
		&lt;div style=&quot;padding:1em; text-align:center&quot;&gt;
			&lt;input type=&quot;submit&quot; wicket:id=&quot;ok&quot; value=&quot;OK&quot; /&gt;
			&lt;input type=&quot;submit&quot; wicket:id=&quot;cancel&quot; value=&quot;キャンセル&quot; /&gt;
		&lt;/div&gt;
	&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p><span class="strong">ConfirmModalWondowPage.java</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136549"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
</pre></td><td class="code" id="p1365code49"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ConfirmModalWindowPage <span style="color: #000000; font-weight: bold;">extends</span> WebPage <span style="color: #009900;">&#123;</span>
&nbsp;
	@SuppressWarnings<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;unchecked&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">public</span> ConfirmModalWindowPage<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">final</span> IConfirmPage page, <span style="color: #000000; font-weight: bold;">final</span> ModalWindow confirmModalWindow, <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> info<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		add<span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;info&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> Model<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span>info<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		Form confirmForm<span style="color: #339933;">;</span>
		add<span style="color: #009900;">&#40;</span>confirmForm <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Form<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;confirmForm&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// OKボタン</span>
		confirmForm.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> AjaxButton<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ok&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
			@Override
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onSubmit<span style="color: #009900;">&#40;</span>AjaxRequestTarget target, Form<span style="color: #339933;">&lt;?&gt;</span> form<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000066; font-weight: bold;">boolean</span> result <span style="color: #339933;">=</span> page.<span style="color: #006633;">ok</span><span style="color: #009900;">&#40;</span>target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
					<span style="color: #666666; font-style: italic;">// 処理に成功した時の動作</span>
					confirmModalWindow.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span>target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
					<span style="color: #666666; font-style: italic;">// 処理に失敗した時の動作</span>
				<span style="color: #009900;">&#125;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #666666; font-style: italic;">// キャンセルボタン</span>
		confirmForm.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> AjaxButton<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;cancel&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
			@Override
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onSubmit<span style="color: #009900;">&#40;</span>AjaxRequestTarget target, Form<span style="color: #339933;">&lt;?&gt;</span> form<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #666666; font-style: italic;">// キャンセルボタンが押されたときの処理</span>
				confirmModalWindow.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span>target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 確認用ModalWindowを取得する.
	 * @param id
	 * @param page
	 * @return
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> ModalWindow getConfirmModalWindow<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> id, <span style="color: #000000; font-weight: bold;">final</span> IConfirmPage page, <span style="color: #000000; font-weight: bold;">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> info<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">final</span> ModalWindow modal <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> ModalWindow<span style="color: #009900;">&#40;</span>id<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		modal.<span style="color: #006633;">setCssClassName</span><span style="color: #009900;">&#40;</span>ModalWindow.<span style="color: #006633;">CSS_CLASS_GRAY</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		modal.<span style="color: #006633;">setInitialHeight</span><span style="color: #009900;">&#40;</span>150<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		modal.<span style="color: #006633;">setInitialWidth</span><span style="color: #009900;">&#40;</span>350<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		modal.<span style="color: #006633;">setResizable</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		modal.<span style="color: #006633;">setTitle</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;確認メッセージ&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		modal.<span style="color: #006633;">setCookieName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;confirm_window&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		modal.<span style="color: #006633;">setPageCreator</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ModalWindow.<span style="color: #006633;">PageCreator</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">public</span> Page createPage<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000000; font-weight: bold;">new</span> ConfirmModalWindowPage<span style="color: #009900;">&#40;</span>page, modal, info<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		modal.<span style="color: #006633;">setWindowClosedCallback</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ModalWindow.<span style="color: #006633;">WindowClosedCallback</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onClose<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				page.<span style="color: #006633;">refleshComponent</span><span style="color: #009900;">&#40;</span>target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		modal.<span style="color: #006633;">setCloseButtonCallback</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ModalWindow.<span style="color: #006633;">CloseButtonCallback</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
			<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> onCloseButtonClicked<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">return</span> modal<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>【メモ】<br />
<span class="blue">11～23行目</span>:<br />
ConfirmウィンドウのOKボタンの定義です。実際の処理は、元のPageのokメソッドに記述しています。<br />
処理の成功/失敗を返すようにしておくと、処理に失敗した場合はConfirmウィンドウ内にエラーメッセージを表示するなんて使い方もできそうです。</p>
<p><span class="blue">26～33行目</span>:<br />
Confirmウィンドウのキャンセルボタンの定義です。Confirmウィンドウを閉じているだけです。</p>
<p><span class="blue">43～73行目</span>:<br />
Confirmウィンドウ用のModalWindowを取得するメソッドです。元のPageから取得するためstaticメソッドにしています。</p>
<p><span class="blue">45～51行目</span>:<br />
ModalWindowの設定です。<br />
　setCssClassName　→　CSS_CLASS_GRAYかCSS_CLASS_BLUEを選択。デフォルトでは青色。<br />
　setInitialHeight、setInitialWidth　→　ModalWindowのサイズ指定。確認ダイアログなので小さめにしておきます。<br />
　setResizable　→　ModalWindowのリサイズを可能にするかしないか。<br />
　setTitle　→　ModalWindowのタイトル文字列。<br />
　setCookieName　→　クッキーの名前。このクッキーはModalWindowの位置などを記憶しています。</p>
<p><span class="blue">58～63行目</span>:<br />
ModalWindowが閉じられたときの処理を記述します。<br />
ここでは元画面のコンポーネントの更新を行っています。</p>
<p><span class="blue">65～70行目</span>:<br />
ModalWindowの×ボタンで閉じられたときの処理を記述します。<br />
ここでは特に何も行っていません。</p>
<p><span class="strong">IConfirmPage.java</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136550"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code" id="p1365code50"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">interface</span> IConfirmPage <span style="color: #009900;">&#123;</span>
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 画面の更新
	 * @param target
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> refleshComponent<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * OKボタンを押した時の処理
	 * @param target
	 * @return 処理が成功したかどうか true:成功 false:失敗
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> ok<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * キャンセルボタンを押した時の処理
	 * @param target
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> cancel<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>【メモ】<br />
Confirmウィンドウを表示するPageでこのインターフェースを実装します。</p>
<p>このインターフェースを実装するようにConfirm.javaを以下のように修正しました。<br />
<span class="strong">Confirm.java(修正後)</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136551"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
</pre></td><td class="code" id="p1365code51"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Confirm <span style="color: #000000; font-weight: bold;">extends</span> WebPage <span style="color: #000000; font-weight: bold;">implements</span> IConfirmPage<span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">int</span> count <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a> result<span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * コンストラクタ
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> Confirm<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		add<span style="color: #009900;">&#40;</span>result <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Alabel+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Label</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;result&quot;</span>, <span style="color: #000000; font-weight: bold;">new</span> PropertyModel<span style="color: #339933;">&lt;</span>Integer<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		result.<span style="color: #006633;">setOutputMarkupId</span><span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		Form<span style="color: #339933;">&lt;?&gt;</span> form <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Form<span style="color: #339933;">&lt;</span>Confirm<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;form&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		<span style="color: #000000; font-weight: bold;">final</span> ModalWindow confirmModalWindow <span style="color: #339933;">=</span> ConfirmModalWindowPage.<span style="color: #006633;">getConfirmModalWindow</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;confirmModalWindow&quot;</span>,
				Confirm.<span style="color: #000000; font-weight: bold;">this</span>, <span style="color: #0000ff;">&quot;カウントしますか？&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		form.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>confirmModalWindow<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		AjaxButton countButton<span style="color: #339933;">;</span>
		form.<span style="color: #006633;">add</span><span style="color: #009900;">&#40;</span>countButton <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> AjaxButton<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;count&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #000066; font-weight: bold;">long</span> serialVersionUID <span style="color: #339933;">=</span> 1L<span style="color: #339933;">;</span>
&nbsp;
			@Override
			<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000066; font-weight: bold;">void</span> onSubmit<span style="color: #009900;">&#40;</span>AjaxRequestTarget target, Form<span style="color: #339933;">&lt;?&gt;</span> form<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				confirmModalWindow.<span style="color: #006633;">show</span><span style="color: #009900;">&#40;</span>target<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
&nbsp;
		<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
		add<span style="color: #009900;">&#40;</span>form<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * countを取得します。
	 * @return count
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">int</span> getCount<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">return</span> count<span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * Confirmウィンドウでキャンセルが押されたときの処理
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> cancel<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #666666; font-style: italic;">// キャンセル時の処理</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * ConfirmウィンドウでOKが押されたときの処理
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">boolean</span> ok<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		count<span style="color: #339933;">++;</span>
		<span style="color: #000000; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">true</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #008000; font-style: italic; font-weight: bold;">/**
	 * 画面上のコンポーネントの更新
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> refleshComponent<span style="color: #009900;">&#40;</span>AjaxRequestTarget target<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		target.<span style="color: #006633;">addComponent</span><span style="color: #009900;">&#40;</span>result<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>【メモ】<br />
<span class="blue">14～16行目</span>:<br />
Confirmウィンドウ用のModalWindowを取得します。</p>
<p><span class="blue">23～25行目</span>:<br />
countボタンがクリックされたときの処理。ModalWindowを表示します。</p>
<p><span class="blue">40～45行目</span>:<br />
Confirmウィンドウでキャンセルボタンを押されたときの実処理を記述します。ここでは特に何もしていません。</p>
<p><span class="blue">50～53行目</span>:<br />
ConfirmウィンドでOKボタンが押されたときの実処理を記述します。ここではcountをインクリメントしています。</p>
<p><span class="blue">58～60行目</span>:<br />
Ajaxで画面の更新を行います。ここではresultラベルの表示を更新しています。</p>
<p><span class="strong">Confirm.html(変更後)</span></p>

<div class="wp_codebox"><table width="100%" ><tr id="p136552"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p1365code52"><pre class="html" style="font-family:monospace;">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
	&lt;title&gt;Wicket Examples - confirm&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;span wicket:id=&quot;result&quot; /&gt; 回目
	&lt;form wicket:id=&quot;form&quot;&gt;
		&lt;input wicket:id=&quot;count&quot; type=&quot;submit&quot; value=&quot;count&quot;/&gt;
		&lt;div wicket:id=&quot;confirmModalWindow&quot;&gt;削除ConfirmModalWindow&lt;/div&gt;
	&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<p>【メモ】<br />
<span class="blue">10行目</span>:<br />
Confirmウィンドウ表示領域の確保。</p>
<h4>まとめ</h4>
<p>とりあえずこんな感じの実装で、AjaxButtonの場合でも確認ダイアログっぽいものは出すことができました。</p>
<p>もっともこのままだと、1つの画面でOK、キャンセルが押されたときの処理が1つしか記述できないので、実際汎用的に使おうと思えば、さらなる改造が必要ですけどね:）</p>
<h3>動作環境</h3>
<p>今回のサンプルソースは以下の環境で動作させています。</p>
<table class="content">
<tr>
<th></th>
<th>バージョン</th>
</tr>
<tr>
<th style="text-align:left">JDK</th>
<td>1.6.0_13</td>
</tr>
<tr>
<th style="text-align:left">Apache Tomcat</th>
<td>6.0.16</td>
</tr>
<tr>
<th style="text-align:left">Apache Wicket</th>
<td>1.4.0</td>
</tr>
</table>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/08/wicket_01_start.html">Wicket小話その1. とりあえずWicketを始めよう</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/09/wicket_03_confirm02.html">Wicket小話その3. Wicketで確認メッセージを出すにはどうすればよいのか？(その2) </a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/09/wicket_02_confirm.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/09/wicket_02_confirm.html" />
	</item>
		<item>
		<title>ExtJS3.0でWebアプリケーションのテーブルをリッチにしよう（その１）</title>
		<link>http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part1.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part1.html#comments</comments>
		<pubDate>Wed, 02 Sep 2009 01:14:34 +0000</pubDate>
		<dc:creator>笹山 昭秀</dc:creator>
				<category><![CDATA[ExtJS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Ext.grid.GridPanel]]></category>
		<category><![CDATA[ExtJS3.0]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1190</guid>
		<description><![CDATA[こんにちは。笹山です。
WebアプリケーションでDBなどからデータを取得して一覧表示させる方法は、HTMLのTABLEタグで書かれたものが多いと思います。
もちろんスタイルシートを駆使すればカッコよくはなるのでしょうが、今回はこれをもう少し手軽にリッチにしようとExtJSを使ってみました。
余談ですが今回のExtJSサンプルは、私自身の趣味のために作成しました。
趣味でよく伊丹空港に飛行機を撮影に行きます。エアーバンドで便名を聞いて、その飛行機が
「どこ行き？どこから来た？機種は何？」
というのが知りたいことがよくあります。（私だけか？）
これから数回に渡り、ExtJSで伊丹空港の8月の時刻表を私好みにしていこうと思います。

ExtJSとは
インターネットで検索すればすぐに分かると思いますので簡単に紹介します。
まず、ExtJSとは、リッチなWEBアプリケーション開発のためのJavaScriptライブラリです。
コンポーネントも揃っており、拡張も簡単にできます。
また、ドキュメントやサンプルも揃っていますので、比較的簡単にリッチなUIが実現できます。
一般的なテーブル
時刻表をHTMLのTABLEタグで作成するとこんな感じでしょうか。



対象空港
航空会社
便名
機種
伊丹空港時間
対象空港時間
出発/到着種別


札幌（千歳）
JAL
3911
B6
8:00
9:50
Departure


札幌（千歳）
JAL
2001
B7
8:35
10:25
Departure


札幌（千歳）
ANA
771
B6
8:55
10:45
Departure


札幌（千歳）
ANA
775
A32
11:45
13:35
Departure


札幌（千歳）
ANA
777
B6
14:15
16:05
Departure


札幌（千歳）
JAL
2019
CRJ
18:30
20:20
Departure


札幌（千歳）
JAL
2000
CRJ
10:25
8:30
Arrival


札幌（千歳）
JAL
3912
CRJ
13:00
11:05
Arrival


札幌（千歳）
ANA
774
B6
14:15
12:25
Arrival


札幌（千歳）
ANA
776
A32
16:00
14:10
Arrival


札幌（千歳）
JAL
2016
B7
19:25
17:30
Arrival


札幌（千歳）
ANA
778
B6
19:30
17:40
Arrival



一覧の表示だけで何もできません。
例えば、時間の降順に一覧を表示したい場合、プログラムでデータをSortし、その結果で一覧を作成し直す必要があります。
一覧のカラム順番を変えたい場合（例えば、出発/到着種別カラムを一番前のカラムにしたい）、一覧表示後はカラム順番を変えることはできません。
ExtJSを使うと簡単に実現できてしまいます。
ExtJSのインストール

ExtJS3.0をダウンロードして適当な場所に展開します
ExtJSに必要なファイルは以下になります

ext-3.0.0/resources/css/ext-all.css （ExtJSのスタイルシート）
ext-3.0.0/adapter/ext/ext-base.js （ExtJSのcore utilitiesとfunctions）
ext-3.0.0/ext-all.js （ExtJSの全ての機能）
ext-3.0.0/src/locale/ext-lang-ja.js （ExtJSのリソースを日本語化）


ExtJSを使用するHTML（以降grid-timetable.htmlとします）のHEADタグ内に必要なファイルを指定します

1
2
3
  &#60;script type=&#34;text/javascript&#34; src=&#34;path/ext-base.js&#34;&#62;&#60;/script&#62;
  &#60;script type=&#34;text/javascript&#34; src=&#34;path/ext-all.js&#34;&#62;&#60;/script&#62;
  &#60;script type=&#34;text/javascript&#34; src=&#34;path/ext-lang-ja.js&#34; charset=&#34;UTF-8&#34;&#62;&#60;/script&#62;

※linkタグ、scriptタグ中の「path」 : ファイルを配置したディレクトリ名に変更してください

これでExtJSが使用できるようになります。
Ext.grid.GridPanelで時刻表を作成
先ほどのgrid-timetable.htmlに以下を追加します

HEADタグ内にSCRIPTタグを追加して今回ExtJSで作成する外部ファイル（以降 grid-timetable.jsとします）を指定します
BODYタグ内に、DIVタグを追加してidにgrid-timetableを指定し、時刻表を配置する場所を指定します


grid-timetable.html（※linkタグ、scriptタグ中の「path」 : ファイルを配置したディレクトリ名に変更してください）


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
&#60;!DOCTYPE HTML PUBLIC &#34;-//W3C//DTD HTML 4.01 Transitional//EN&#34;
&#34;http://www.w3.org/TR/html4/loose.dtd&#34;&#62;
&#60;html xmlns=&#34;http://www.w3.org/1999/xhtml&#34;&#62;
    &#60;head&#62;
        &#60;meta http-equiv=&#34;Content-Type&#34; content=&#34;text/html; charset=utf-8&#34; /&#62;
        &#60;link [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちは。笹山です。</p>
<p>WebアプリケーションでDBなどからデータを取得して一覧表示させる方法は、HTMLのTABLEタグで書かれたものが多いと思います。<br />
もちろんスタイルシートを駆使すればカッコよくはなるのでしょうが、今回はこれをもう少し手軽にリッチにしようとExtJSを使ってみました。</p>
<p>余談ですが今回のExtJSサンプルは、私自身の趣味のために作成しました。<br />
趣味でよく伊丹空港に飛行機を撮影に行きます。エアーバンドで便名を聞いて、その飛行機が<br />
「どこ行き？どこから来た？機種は何？」<br />
というのが知りたいことがよくあります。（私だけか？）<br />
これから数回に渡り、ExtJSで伊丹空港の8月の時刻表を私好みにしていこうと思います。</p>
<p><span id="more-1190"></span></p>
<h3>ExtJSとは</h3>
<p>インターネットで検索すればすぐに分かると思いますので簡単に紹介します。<br />
まず、ExtJSとは、リッチなWEBアプリケーション開発のためのJavaScriptライブラリです。<br />
コンポーネントも揃っており、拡張も簡単にできます。<br />
また、ドキュメントやサンプルも揃っていますので、比較的簡単にリッチなUIが実現できます。</p>
<h3>一般的なテーブル</h3>
<p>時刻表をHTMLのTABLEタグで作成するとこんな感じでしょうか。</p>
<table class="content" border="0">
<tbody>
<tr style="background-color: #deecfd;">
<th>対象空港</th>
<th>航空会社</th>
<th>便名</th>
<th>機種</th>
<th>伊丹空港時間</th>
<th>対象空港時間</th>
<th>出発/到着種別</th>
</tr>
<tr>
<td style="text-align: center">札幌（千歳）</td>
<td style="text-align: center"><span style="color: #cc0000;">JAL</span></td>
<td style="text-align: center">3911</td>
<td style="text-align: center">B6</td>
<td style="text-align: center">8:00</td>
<td style="text-align: center">9:50</td>
<td style="text-align: center">Departure</td>
</tr>
<tr>
<td style="text-align: center">札幌（千歳）</td>
<td style="text-align: center"><span style="color: #cc0000;">JAL</span></td>
<td style="text-align: center">2001</td>
<td style="text-align: center">B7</td>
<td style="text-align: center">8:35</td>
<td style="text-align: center">10:25</td>
<td style="text-align: center">Departure</td>
</tr>
<tr>
<td style="text-align: center">札幌（千歳）</td>
<td style="text-align: center"><span style="color: #003399;">ANA</span></td>
<td style="text-align: center">771</td>
<td style="text-align: center">B6</td>
<td style="text-align: center">8:55</td>
<td style="text-align: center">10:45</td>
<td style="text-align: center">Departure</td>
</tr>
<tr>
<td style="text-align: center">札幌（千歳）</td>
<td style="text-align: center"><span style="color: #003399;">ANA</span></td>
<td style="text-align: center">775</td>
<td style="text-align: center">A32</td>
<td style="text-align: center">11:45</td>
<td style="text-align: center">13:35</td>
<td style="text-align: center">Departure</td>
</tr>
<tr>
<td style="text-align: center">札幌（千歳）</td>
<td style="text-align: center"><span style="color: #003399;">ANA</span></td>
<td style="text-align: center">777</td>
<td style="text-align: center">B6</td>
<td style="text-align: center">14:15</td>
<td style="text-align: center">16:05</td>
<td style="text-align: center">Departure</td>
</tr>
<tr>
<td style="text-align: center">札幌（千歳）</td>
<td style="text-align: center"><span style="color: #cc0000;">JAL</span></td>
<td style="text-align: center">2019</td>
<td style="text-align: center">CRJ</td>
<td style="text-align: center">18:30</td>
<td style="text-align: center">20:20</td>
<td style="text-align: center">Departure</td>
</tr>
<tr>
<td style="text-align: center">札幌（千歳）</td>
<td style="text-align: center"><span style="color: #cc0000;">JAL</span></td>
<td style="text-align: center">2000</td>
<td style="text-align: center">CRJ</td>
<td style="text-align: center">10:25</td>
<td style="text-align: center">8:30</td>
<td style="text-align: center">Arrival</td>
</tr>
<tr>
<td style="text-align: center">札幌（千歳）</td>
<td style="text-align: center"><span style="color: #cc0000;">JAL</span></td>
<td style="text-align: center">3912</td>
<td style="text-align: center">CRJ</td>
<td style="text-align: center">13:00</td>
<td style="text-align: center">11:05</td>
<td style="text-align: center">Arrival</td>
</tr>
<tr>
<td style="text-align: center">札幌（千歳）</td>
<td style="text-align: center"><span style="color: #003399;">ANA</span></td>
<td style="text-align: center">774</td>
<td style="text-align: center">B6</td>
<td style="text-align: center">14:15</td>
<td style="text-align: center">12:25</td>
<td style="text-align: center">Arrival</td>
</tr>
<tr>
<td style="text-align: center">札幌（千歳）</td>
<td style="text-align: center"><span style="color: #003399;">ANA</span></td>
<td style="text-align: center">776</td>
<td style="text-align: center">A32</td>
<td style="text-align: center">16:00</td>
<td style="text-align: center">14:10</td>
<td style="text-align: center">Arrival</td>
</tr>
<tr>
<td style="text-align: center">札幌（千歳）</td>
<td style="text-align: center"><span style="color: #cc0000;">JAL</span></td>
<td style="text-align: center">2016</td>
<td style="text-align: center">B7</td>
<td style="text-align: center">19:25</td>
<td style="text-align: center">17:30</td>
<td style="text-align: center">Arrival</td>
</tr>
<tr>
<td style="text-align: center">札幌（千歳）</td>
<td style="text-align: center"><span style="color: #003399;">ANA</span></td>
<td style="text-align: center">778</td>
<td style="text-align: center">B6</td>
<td style="text-align: center">19:30</td>
<td style="text-align: center">17:40</td>
<td style="text-align: center">Arrival</td>
</tr>
</tbody>
</table>
<p>一覧の表示だけで何もできません。<br />
例えば、時間の降順に一覧を表示したい場合、プログラムでデータをSortし、その結果で一覧を作成し直す必要があります。<br />
一覧のカラム順番を変えたい場合（例えば、出発/到着種別カラムを一番前のカラムにしたい）、一覧表示後はカラム順番を変えることはできません。</p>
<p>ExtJSを使うと簡単に実現できてしまいます。</p>
<h3>ExtJSのインストール</h3>
<ol>
<li><a href="http://extjs.com/products/extjs/download.php">ExtJS3.0をダウンロード</a>して適当な場所に展開します</li>
<li>ExtJSに必要なファイルは以下になります
<ul>
<li>ext-3.0.0/resources/css/ext-all.css （ExtJSのスタイルシート）</li>
<li>ext-3.0.0/adapter/ext/ext-base.js （ExtJSのcore utilitiesとfunctions）</li>
<li>ext-3.0.0/ext-all.js （ExtJSの全ての機能）</li>
<li>ext-3.0.0/src/locale/ext-lang-ja.js （ExtJSのリソースを日本語化）</li>
</ul>
</li>
<li>ExtJSを使用するHTML（以降grid-timetable.htmlとします）のHEADタグ内に必要なファイルを指定します

<div class="wp_codebox"><table width="100%" ><tr id="p119057"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p1190code57"><pre class="html" style="font-family:monospace;">  &lt;script type=&quot;text/javascript&quot; src=&quot;path/ext-base.js&quot;&gt;&lt;/script&gt;
  &lt;script type=&quot;text/javascript&quot; src=&quot;path/ext-all.js&quot;&gt;&lt;/script&gt;
  &lt;script type=&quot;text/javascript&quot; src=&quot;path/ext-lang-ja.js&quot; charset=&quot;UTF-8&quot;&gt;&lt;/script&gt;</pre></td></tr></table></div>

<p><span style="color: #ff0000;">※linkタグ、scriptタグ中の「path」 : ファイルを配置したディレクトリ名に変更してください</span></li>
</ol>
<p>これでExtJSが使用できるようになります。</p>
<h3>Ext.grid.GridPanelで時刻表を作成</h3>
<p>先ほどのgrid-timetable.htmlに以下を追加します</p>
<ol>
<li>HEADタグ内にSCRIPTタグを追加して今回ExtJSで作成する外部ファイル（以降 grid-timetable.jsとします）を指定します</li>
<li>BODYタグ内に、DIVタグを追加してidにgrid-timetableを指定し、時刻表を配置する場所を指定します</li>
</ol>
<ul>
<li>grid-timetable.html<span style="color: #ff0000;">（※linkタグ、scriptタグ中の「path」 : ファイルを配置したディレクトリ名に変更してください）</span></li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr id="p119058"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code" id="p1190code58"><pre class="html" style="font-family:monospace;">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;
&quot;http://www.w3.org/TR/html4/loose.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
    &lt;head&gt;
        &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
        &lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; href=&quot;path/ext-all.css&quot; /&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;path/ext-base.js&quot;&gt;&lt;/script&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;path/ext-all.js&quot;&gt;&lt;/script&gt;
        &lt;script type=&quot;text/javascript&quot; src=&quot;path/ext-lang-ja.js&quot; charset=&quot;UTF-8&quot;&gt;&lt;/script&gt;
&nbsp;
        &lt;script type=&quot;text/javascript&quot; src=&quot;path/grid-timetable.js&quot;&gt;&lt;/script&gt;
        &lt;title&gt;伊丹空港 8月時刻表&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;h1&gt;伊丹空港 8月時刻表&lt;/h1&gt;
        &lt;div id=&quot;grid-timetable&quot;&gt;&lt;/div&gt;
    &lt;/body&gt;
&lt;/html&gt;</pre></td></tr></table></div>

<table class="content">
<tr>
<th>
        	行番号
        </th>
<th>
        	説明
        </th>
</tr>
<tr>
<td>
        	11行目
        </td>
<td>
        	ExtJSで作成する外部ファイルを指定します
        </td>
</tr>
<tr>
<td>
        	16行目
        </td>
<td>
        	時刻表を配置する場所を指定します
        </td>
</tr>
</table>
<p>　<br />
</p>
<ul>
<li>grid-timetable.js</li>
</ul>

<div class="wp_codebox"><table width="100%" ><tr id="p119059"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
</pre></td><td class="code" id="p1190code59"><pre class="javascript" style="font-family:monospace;">Ext.<span style="color: #660066;">onReady</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> timeTableData <span style="color: #339933;">=</span> <span style="color: #009900;">&#91;</span>
        <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'札幌（千歳）'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'JAL'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'3911'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'B6'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 8:00:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 9:50:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'Departure'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'札幌（千歳）'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'JAL'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2001'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'B7'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 8:35:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 10:25:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'Departure'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'札幌（千歳）'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'ANA'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'771'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'B6'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 8:55:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 10:45:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'Departure'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'札幌（千歳）'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'ANA'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'775'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'A32'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 11:45:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 13:35:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'Departure'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'札幌（千歳）'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'ANA'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'777'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'B6'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 14:15:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 16:05:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'Departure'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'札幌（千歳）'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'JAL'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2019'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'CRJ'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 18:30:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 20:20:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'Departure'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'札幌（千歳）'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'JAL'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2000'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'CRJ'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 10:25:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 8:30:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'Arrival'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'札幌（千歳）'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'JAL'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'3912'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'B6'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 13:00:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 11:05:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'Arrival'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'札幌（千歳）'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'ANA'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'774'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'B6'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 14:15:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 12:25:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'Arrival'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'札幌（千歳）'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'ANA'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'776'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'A32'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 16:00:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 14:10:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'Arrival'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'札幌（千歳）'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'JAL'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2016'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'B7'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 19:25:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 17:30:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'Arrival'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        <span style="color: #009900;">&#91;</span><span style="color: #3366CC;">'札幌（千歳）'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'ANA'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'778'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'B6'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 19:30:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'2009/08/01 17:40:00'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'Arrival'</span><span style="color: #009900;">&#93;</span>
    <span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> store <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">data</span>.<span style="color: #660066;">ArrayStore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        fields<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
            <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'destination'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'airline'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'flightName'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'model'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'itamiTime'</span><span style="color: #339933;">,</span> type<span style="color: #339933;">:</span> <span style="color: #3366CC;">'date'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'objectTime'</span><span style="color: #339933;">,</span> type<span style="color: #339933;">:</span> <span style="color: #3366CC;">'date'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'type'</span><span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#93;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> grid <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">grid</span>.<span style="color: #660066;">GridPanel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        title<span style="color: #339933;">:</span> <span style="color: #3366CC;">'時刻表'</span><span style="color: #339933;">,</span>
        height<span style="color: #339933;">:</span> 320<span style="color: #339933;">,</span>
        width<span style="color: #339933;">:</span> 750<span style="color: #339933;">,</span>
        stripeRows<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        renderTo<span style="color: #339933;">:</span> <span style="color: #3366CC;">'grid-timetable'</span><span style="color: #339933;">,</span>
        store<span style="color: #339933;">:</span> store<span style="color: #339933;">,</span>
        columns<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'対象空港'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'destination'</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'航空会社'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'airline'</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'便名'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'flightName'</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'機種'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'model'</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'伊丹空港時間'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'itamiTime'</span><span style="color: #339933;">,</span>
                renderer<span style="color: #339933;">:</span> Ext.<span style="color: #660066;">util</span>.<span style="color: #660066;">Format</span>.<span style="color: #660066;">dateRenderer</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'H:i'</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'対象空港時間'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'objectTime'</span><span style="color: #339933;">,</span>
                renderer<span style="color: #339933;">:</span> Ext.<span style="color: #660066;">util</span>.<span style="color: #660066;">Format</span>.<span style="color: #660066;">dateRenderer</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'H:i'</span><span style="color: #009900;">&#41;</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'出発/到着種別'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'type'</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#93;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    store.<span style="color: #660066;">loadData</span><span style="color: #009900;">&#40;</span>timeTableData<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<table class="content" width="100%">
<caption style="text-align: left; "><strong>Class Ext<strong/></caption>
<tr>
<th width="150">
        	Methods
        </th>
<th>
        	説明
        </th>
</tr>
<tr>
<td>
        	onReady
        </td>
<td>
        	DOMが完全に読みこまれた後に自動的に呼び出され、参照したいページの要素が利用できるようになります
        </td>
</tr>
</table>
<p>　<br />
</p>
<table class="content" width="100%">
<caption style="text-align: left; "><strong>Class Ext.data.ArrayStore（データを保持するためのデータストアを作成します ）<strong/></caption>
<tr>
<th width="150">
        	Config Options
        </th>
<th colspan="2">
        	説明
        </th>
</tr>
<tr>
<td rowspan="4">
        	fields
        </td>
<td colspan="2">
        	データをどのようにマッピングするか定義します
        </td>
</tr>
<tr>
<th width="100">
        	パラメータ
        </th>
<th>
        	説明
        </th>
</tr>
<tr>
<td>
        	name
        </td>
<td>
        	レコード内でfieldを参照する際に用いるnameです<br /> ColumnModelのdataIndexプロパティによって参照されます
        </td>
</tr>
<tr>
<td>
        	type
        </td>
<td>
        	表示できる値に変換するためのデータタイプです<br />指定しない場合は、autoとなり変換を行いません
        </td>
</tr>
<tr>
<th>
        	Methods
        </th>
<th colspan="2">
        	説明
        </th>
</tr>
<tr>
<td>
        	loadData
        </td>
<td colspan="2">
        	データをストアへロードします
        </td>
</tr>
</table>
<p>　<br />
</p>
<table class="content" width="100%">
<caption style="text-align: left; "><strong>Class Ext.grid.GridPanel（Gridパネルを作成します ）<strong/></caption>
<tr>
<th width="150">
        	Config Options
        </th>
<th colspan="2">
        	説明
        </th>
</tr>
<tr>
<td>
        	title
        </td>
<td colspan="2">
        	Gridパネルのタイトルです
        </td>
</tr>
<tr>
<td>
        	height
        </td>
<td colspan="2">
        	Gridパネルの高さ(pixel)です
        </td>
</tr>
<tr>
<td>
        	width
        </td>
<td colspan="2">
        	Gridパネルの幅(pixel)です
        </td>
</tr>
<tr>
<td>
        	stripeRows
        </td>
<td colspan="2">
        	行をストライプ表示します
        </td>
</tr>
<tr>
<td>
        	renderTo
        </td>
<td colspan="2">
        	存在するエレメントIDを指定して、コンテナエレメントへ描画します
        </td>
</tr>
<tr>
<td>
        	store
        </td>
<td colspan="2">
        	Gridがデータストアとして扱うストアを指定します
        </td>
</tr>
<tr>
<td rowspan="6">
        	columns
        </td>
<td colspan="2">
        	Gridが使うColumnModelを定義します
        </td>
</tr>
<tr>
<th width="100">
        	パラメータ
        </th>
<th>
        	説明
        </th>
</tr>
<tr>
<td>
        	header
        </td>
<td>
        	ヘッダーテキストです
        </td>
</tr>
<tr>
<td>
        	sortable
        </td>
<td>
        	カラムソートを許可します
        </td>
</tr>
<tr>
<td>
        	dataIndex
        </td>
<td>
        	Gridのデータストアで定義したnameを指定します
        </td>
</tr>
<tr>
<td>
        	renderer
        </td>
<td>
        	セルの与えられたデータ値にHTMLマークアップを生成するために使用される関数です
        </td>
</tr>
</table>
<p>これをブラウザで表示すると、ソート、カラム移動、カラム幅の変更が可能な時刻表が表示されるはずです。<br />
今回はあらかじめ用意しておいた配列でExt.data.ArrayStoreを用いてGridを作成しました。DBからデータを取得してGridを作成するにはJSON形式でレスポンスを返し、Ext.data.JsonStoreを使用してGridを作成します。</p>
<div id="attachment_1377" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/itm_timetable_sort.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/itm_timetable_sort-300x128.png" alt="ExtJS Gridのカラムソート" title="ExtJS Gridのカラムソート" width="300" height="128" class="size-medium wp-image-1377" /></a><p class="wp-caption-text">ExtJS Gridのカラムソート</p></div><br /><div id="attachment_1378" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/itm_timetable_clm_dragdrop.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/itm_timetable_clm_dragdrop-300x129.png" alt="ExtJS Gridのカラム移動" title="ExtJS Gridのカラム移動" width="300" height="129" class="size-medium wp-image-1378" /></a><p class="wp-caption-text">ExtJS Gridのカラム移動</p></div>
<h3>もう少しリッチに</h3>
<p>「シンプルGrid」で今回のブログを終わろうと思いましたが、もう少しお付き合いください。</p>
<p>あと３点追加したいと思います。</p>
<ul>
<li>（追加機能①）　伊丹空港の時刻表なので伊丹空港時間で最初から昇順表示しておく</li>
<li>（追加機能②）　Gridへ自動的に行番号を振る</li>
<li>（追加機能③）　航空会社ごとに色づけして表示</li>
</ul>
<p>先ほどのgrid-timetable.jsに以下を追加してください。</p>
<ul>
<li>追加機能①　28行目～31行目<br />
<table class="content" width="100%">
<caption style="text-align: left; "><strong>Ext.data.ArrayStore<strong/></caption>
<tr>
<th width="150">
        	Config Options
        </th>
<th colspan="2">
        	説明
        </th>
</tr>
<tr>
<td rowspan="4">
        	sortInfo
        </td>
<td colspan="2">
        	ソート順序を指定します
        </td>
</tr>
<tr>
<th width="100">
        	パラメータ
        </th>
<th>
        	説明
        </th>
</tr>
<tr>
<td>
        	field
        </td>
<td>
        	ソートを行う対象fieldを指定します
        </td>
</tr>
<tr>
<td>
        	direction
        </td>
<td>
        	ソート方向を指定します
        </td>
</tr>
</table>
</li>
<li>追加機能②　42行目<br />
<table class="content" width="100%">
<caption style="text-align: left; "><strong>Ext.grid.RowNumberer<strong/></caption>
<tr>
<th width="150">
        	Config Options
        </th>
<th colspan="2">
        	説明
        </th>
</tr>
<tr>
<td>
－
        </td>
<td colspan="2">
        	自動的にGridに行番号を表示します
        </td>
</tr>
</table>
</li>
<li>追加機能③　52行目～62行目<br />
<table class="content" width="100%">
<caption style="text-align: left; "><strong>Ext.grid.GridPanel<strong/></caption>
<tr>
<th width="150">
        	Config Options
        </th>
<th>
        	説明
        </th>
</tr>
<tr>
<td>
renderer
        </td>
<td>
セルの与えられたデータ値にHTMLマークアップを生成するために使用される関数です<br />
			文字列を比較して文字色を変えています
        </td>
</tr>
</table>
</li>
</ul>
<p></p>

<div class="wp_codebox"><table width="100%" ><tr id="p119060"><td class="line_numbers"><pre>15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
</pre></td><td class="code" id="p1190code60"><pre class="javascript" style="font-family:monospace;">&nbsp;
   ～ 省略 ～
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> store <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">data</span>.<span style="color: #660066;">ArrayStore</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        fields<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
            <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'destination'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'airline'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'flightName'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'model'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'itamiTime'</span><span style="color: #339933;">,</span> type<span style="color: #339933;">:</span> <span style="color: #3366CC;">'date'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'objectTime'</span><span style="color: #339933;">,</span> type<span style="color: #339933;">:</span> <span style="color: #3366CC;">'date'</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span><span style="color: #000066;">name</span><span style="color: #339933;">:</span> <span style="color: #3366CC;">'type'</span><span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span>
        sortInfo<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>                              <span style="color: #009966; font-style: italic;">/* 追加機能 ① ここから */</span>
           field<span style="color: #339933;">:</span> <span style="color: #3366CC;">'itamiTime'</span><span style="color: #339933;">,</span>
           direction<span style="color: #339933;">:</span> <span style="color: #3366CC;">'ASC'</span>
        <span style="color: #009900;">&#125;</span>                                        <span style="color: #009966; font-style: italic;">/* 追加機能 ① ここまで */</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #003366; font-weight: bold;">var</span> grid <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">grid</span>.<span style="color: #660066;">GridPanel</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#123;</span>
        title<span style="color: #339933;">:</span> <span style="color: #3366CC;">'時刻表'</span><span style="color: #339933;">,</span>
        height<span style="color: #339933;">:</span> 320<span style="color: #339933;">,</span>
        width<span style="color: #339933;">:</span> 750<span style="color: #339933;">,</span>
        stripeRows<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
        renderTo<span style="color: #339933;">:</span> <span style="color: #3366CC;">'grid-timetable'</span><span style="color: #339933;">,</span>
        store<span style="color: #339933;">:</span> store<span style="color: #339933;">,</span>
        columns<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span>
            <span style="color: #003366; font-weight: bold;">new</span> Ext.<span style="color: #660066;">grid</span>.<span style="color: #660066;">RowNumberer</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>         <span style="color: #009966; font-style: italic;">/* 追加機能 ② */</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'対象空港'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'destination'</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
            <span style="color: #009900;">&#123;</span>
                header<span style="color: #339933;">:</span> <span style="color: #3366CC;">'航空会社'</span><span style="color: #339933;">,</span>
                sortable<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">,</span>
                dataIndex<span style="color: #339933;">:</span> <span style="color: #3366CC;">'airline'</span>
                renderer<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>v<span style="color: #339933;">,</span> params<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>  <span style="color: #009966; font-style: italic;">/* 追加機能 ③ ここから */</span>
                    <span style="color: #003366; font-weight: bold;">var</span> airlineColor <span style="color: #339933;">=</span> v<span style="color: #339933;">;</span>
                        <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>v <span style="color: #339933;">==</span> <span style="color: #3366CC;">'ANA'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                            airlineColor <span style="color: #339933;">=</span> <span style="color: #3366CC;">'&lt;span style=&quot;color: #003399;&quot;&gt;'</span> <span style="color: #339933;">+</span> v <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;/span&gt;'</span><span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #000066; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>v <span style="color: #339933;">==</span> <span style="color: #3366CC;">'JAL'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                            airlineColor <span style="color: #339933;">=</span> <span style="color: #3366CC;">'&lt;span style=&quot;color: #cc0000;&quot;&gt;'</span> <span style="color: #339933;">+</span> v <span style="color: #339933;">+</span> <span style="color: #3366CC;">'&lt;/span&gt;'</span><span style="color: #339933;">;</span>
                        <span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
                            <span style="color: #006600; font-style: italic;">// 何もしない</span>
                        <span style="color: #009900;">&#125;</span>
                        <span style="color: #000066; font-weight: bold;">return</span> airlineColor<span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>                                 <span style="color: #009966; font-style: italic;">/* 追加機能 ③ ここまで */</span>
            <span style="color: #009900;">&#125;</span><span style="color: #339933;">,</span>
&nbsp;
   ～ 省略 ～</pre></td></tr></table></div>

<div id="attachment_1404" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/itm_timetable_no_col.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/itm_timetable_no_col-300x129.png" alt="時刻表 機能追加" title="時刻表 機能追加" width="300" height="129" class="size-medium wp-image-1404" /></a><p class="wp-caption-text">時刻表 機能追加</p></div>
<p><a href="http://blog.eni.co.jp/tech/misc/extjs/part1/grid-timetable.html">ExtJS3.0 Gridデモ　「伊丹空港　8月時刻表（全便）」</a></p>
<h3>最後に</h3>
<p>今回はExtJSのGridでシンプルな時刻表を作りました。<br />
難しいことをコーディングしなくても簡単に実現できることがお分かりいただけたと思います。<br />
次回もまだまだ機能追加していきます。お楽しみに！</p>
<h3>参考リンク</h3>
<ul>
<li><a href="http://extjs.com/">Ext</a></li>
<li><a href="http://extjs.co.jp/">Ext Japan</a></li>
<li><a href="http://extjs.com/deploy/dev/examples/samples.html">ExtJS3.0 Samples &#038; Demos</a></li>
<li><a href="http://extjs.com/deploy/dev/docs/">ExtJS API Documentation</a></li>
</ul>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part2.html">ExtJS3.0でWebアプリケーションのテーブルをリッチにしよう（その２）</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part1.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/09/extjs3_grid_table_part1.html" />
	</item>
		<item>
		<title>アンドロイダー育成日記 -Androidと仲良くなるには- その4</title>
		<link>http://blog.eni.co.jp/tech/2009/09/android_beginner_diary_04.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/09/android_beginner_diary_04.html#comments</comments>
		<pubDate>Tue, 01 Sep 2009 01:00:03 +0000</pubDate>
		<dc:creator>正木 恵二</dc:creator>
				<category><![CDATA[Google Android]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[アンドロイド]]></category>
		<category><![CDATA[リンク集]]></category>
		<category><![CDATA[作業日誌]]></category>
		<category><![CDATA[初心者]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1214</guid>
		<description><![CDATA[
このエントリーは下記の記事の続きです。
アンドロイダー育成日記 -Androidと仲良くなるには- その3

こんにちは。正木です。
大事なコトを書きそびれていたのを思い出しましたので白状します。
当方、Android1.5 + Eclipse3.5 を使って開発してます。
技術がコンセプトのブログでこのような失態を犯していた事を、深くお詫び申し上げます
丸刈り……は しません。今年の3月に剃ったトコロなんで。
それでは、本文へど～ぞ～。

（※ 記事中の役立つ凡例 =&#62; ☆：役立つ外部リンク）
前回まで（～#39）
・第2弾アプリ（『天気予報アプリ』）の開発・実装を開始。
・第2弾アプリと前作とでは全く趣向が違うので、何がどうなるのかが見えていない。
・GPSまわりを調査し始めて、前回は終了。
#40
緯度経度から地名をはじき出すには『ジオコーディング』とやらが必要…なのだが、AndroidのAPIに標準で用意されているらしい。
（android.location.GeocoderクラスのインスタンスのgetFromLocationメソッドに緯度と経度を渡すと、地名等の情報を保持しているandroid.location.Addressクラスのインスタンスが取得できる。下記リンク先を参照の事。）
APIが標準で用意されているとは、なななんとココロ優しい。
というワケで、GPSまわりに関しての「ホンマに実装できんのか？」という不安は然程無くなった、のだが、障壁がもうひとつ。
『数時間おきのお天気情報』なんて、どこでダウンロードできんねや？
そんなコトまではGoogle先生のシラバスには載ってなかったか。
☆ジオコーディングとは 「アドレスマッチング」 (Geocoding)： &#8211; IT用語辞典バイナリ
☆GPSの緯度経度から住所へ変換 &#8211; 泥縄トラップ
#41
緯度経度（簡単に）取得できませ～ん。（←あの警察映画のように。）
LocationManagerクラスからgetCurrentLocationメソッドが消えとる。はぁ～？？
（↑Android1.5では既に実装されていない。）
#42
『ライフサイクル』について、このエントリが解かりやすいんでねーか？
☆Androidのド肝 » Activityのライフサイクル
#43
DDMSに「こーゆー経路を歩きますよ」という登録をすると、実際にその経路を歩きながらAndroid端末を操作するみたいな感じで、GPS機能が働いてくれるらしい。
KMLファイルとかGPXファイルみたいな、聞き慣れない拡張子のファイルがあれば実現可能。
（結局この機能は使ってはいないし、この記事を作成する頃はこの機能の使い方を知らない。）
開発環境を提供する側も、いろいろと考えてくれてはるんやなー。感謝感謝。
あと、素晴らしい翻訳を発見。
こういう実のある事が出来るスキルがあると締まっていいんだけど……省みれば、今の自分は「緩急」の『緩』しかない。どーしよ。
☆AndroidのDDMSの使用方法のドキュメントを翻訳しました &#8211; Android(アンドロイド)情報-ブリリアントサービス
☆GMAP2GPX: Google MapでGPXファイルとMioMap地点ファイル　（←このサイトでGPXファイルが作成できる）
#44
緯度と経度を固定指定したら、ひとまず地名が取得できた。（こちらを参考に。）
あとは、くだんのデバグツール（DDMS）を用いてGPSから緯度と経度を取得するのみ。
#45
う～ん…。KMLファイルをDDMSでどーのこーの。反応しーひんかったら意味ないやんか。
（「KMLファイルをDDMSに読み込ませて、DDMSのリストに出てきた位置情報をクリックしても、エミュレータ側では何の反応もしなかった」の意。結局はそもそも自分の実装にバグがあった。）
☆八角研究所 : Android DDMSでKMLから位置情報の取得方法
☆勉強会/GPS &#8211; 日本Androidの会（日本アンドロイドの会）
#46
Tech Blogの3本目の記事を入稿。
このTech Blogの記事（「アンドロイダー日記」シリーズ）用として、Twitter的な感じで簡単な一言メモを取っている。
そのメモで、本当に「一言」の時があるのだが、そっからの 後のせサクサク やらなんやらで、結局立派な文章になってしまう。
普段、そんなオシャベリでもないんだが…。
#47
お天気情報を、RSS形式かなんかで配信しているサイトを探す。
だが、そういうサイトは、少ないように感じる。
…のだけれども、しゃーないといえばしゃーない気もする。
天気予報にプロが居たりビジネスとして成立している手前、猫も杓子も無料では配信しないだろう。
とは言うものの、素人の予報など誰も期待していないから、そこはプロの意見が必要。
Androidケータイにカメラが付いてるからって空を映しても何もならないし、写真を解析してどーこーなど、そんな仕様を採用するはずもない。
はぁ～。
そんな絶望の中で、参考にできそうなサイトを3つ。
（一番下は、MacでのAndroidアプリ開発環境の構築方法に関してのエントリ。Macは触ったコトないがいつか役立ちそうだと思ったので、ここにリンクを。）
　
☆天気予報をRSSでお届けする「ひとくち予報 in Feed」
☆Japan Weather Forecasts
☆GPL天気予報（google plus livedoor 天気）
☆flashcast：フリーで働くITエンジニア集団のブログ: Android SDK 1.5をインストールしてみる
#48
他プラットフォームとの関係について、お言葉を紹介。
◎『美学のiPhone、実用主義のandroidという印象』（直下リンク先より引用）
☆android、三日目。androidを見直したアプリ &#8211; Keep Crazy;shi3zの日記
#49
「洗濯物たとむ」の「たとむ」ってどこの方言なんや？
「たとむ」って言い慣れてる言葉なんだけども、文字面はヘンやね。
☆たとむ とは(Weblio)
#50
やっぱ、技術系の記事ってば、丁寧に書いたらアクセス数は伸びるのかな？
下記リンク先の記事が丁寧に書かれているのでそう思った次第。
☆Google Androidで画面遷移 &#8211; yamashinaの日記
#51
☆画面遷移 &#124; テックファーム
☆ブラウザや地図、ストリートビューの基、Intentとは？ (2/3) &#8211; ＠IT
前者のリンク先より引用。
◎『Androidでは「スタック」という概念があり、Activity（画面）は遷移するたびにスタックへタスクが積まれていきます。』
これが、どう厄介になるんかな。
いまんとこは想像が付かないし、そもそも厄介になるかどうかもわからない。
ただ、気ぃ付けとかなダメなんだなー、と。
#52
◎画像とかのリソースファイルのファイル名に大文字が入っていたら、Androidではそのファイルを正しく読み込んでくれない。
#53
◎Androidアプリからインターネットに接続するときは、マニフェストファイルにパーミッションの宣言をする必要がある。
☆Androidアプリでインターネット接続する為に必要な設定（android.permission.INTERNET） &#8211; WillFeed
どうも『マニフェストファイルに宣言』が最も重要な規約の一つ、らしい。
#54
過日に実装した画面において、表示されている文字が小さすぎるか？と疑念に駆られたが…実機が手元にない。確認したくても出来ない。
結局、『実機をどう調達するか？』に頭をひねらす事もなく、自分のケータイで試してみた。
今回使用する“エセAndroid端末”は、docomoのSH-04A。
スマートフォンのようでスマートフォンでない、ベンベン、というような、所謂『ガラパゴス携帯』。
エミュレータのハードコピーを取って、エミュレータアプリの端末画面部分の箇所だけ切り取って、その画像ファイルをメールでエセAndroid端末に送る。
…割と見えるではないか。
不可はなさそうだが可も全くない、という感じ。
レイアウトに味気がなさすぎるからだが…これは端末のせいじゃないな。設計者の感覚の問題だぁ…悲しいかな。
Android端末（HT-03Aを思い浮かべた）の解像度は、QVGAかVGAでなく「ハーフVGA」なんだな。
SA-04Aの解像度はVGAだったはず…調べてみると「フルワイドVGA」ですって。
「フルワイドVGA」だの「VGA＋」だの「ハーフVGA」だの…どんなユーザの重箱の隅を突こうとしているのだ？
#55
VBさんは、Javaの列挙型の使い方がいまさらやっとわかってきた、だとさ☆
#56
解からない事だらけの状態で、それらをまんべんなく調査していってると [...]]]></description>
			<content:encoded><![CDATA[<div class="update">
このエントリーは下記の記事の続きです。</p>
<p><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_03.html">アンドロイダー育成日記 -Androidと仲良くなるには- その3</a></p>
</div>
<p>こんにちは。正木です。</p>
<p>大事なコトを書きそびれていたのを思い出しましたので白状します。</p>
<p>当方、Android1.5 + Eclipse3.5 を使って開発してます。</p>
<p>技術がコンセプトのブログでこのような失態を犯していた事を、深くお詫び申し上げます<(_ _)><br />
丸刈り……は しません。今年の3月に剃ったトコロなんで。</p>
<p>それでは、本文へど～ぞ～。<br />
<span id="more-1214"></span><br />
（※ 記事中の役立つ凡例 =&gt; ☆：役立つ外部リンク）</p>
<h4>前回まで（～#39）</h4>
<p>・第2弾アプリ（『天気予報アプリ』）の開発・実装を開始。<br />
・第2弾アプリと前作とでは全く趣向が違うので、何がどうなるのかが見えていない。<br />
・GPSまわりを調査し始めて、前回は終了。</p>
<h4>#40</h4>
<p>緯度経度から地名をはじき出すには『ジオコーディング』とやらが必要…なのだが、AndroidのAPIに標準で用意されているらしい。<br />
（android.location.GeocoderクラスのインスタンスのgetFromLocationメソッドに緯度と経度を渡すと、地名等の情報を保持しているandroid.location.Addressクラスのインスタンスが取得できる。下記リンク先を参照の事。）<br />
APIが標準で用意されているとは、なななんとココロ優しい。</p>
<p>というワケで、GPSまわりに関しての「ホンマに実装できんのか？」という不安は然程無くなった、のだが、障壁がもうひとつ。</p>
<p>『数時間おきのお天気情報』なんて、どこでダウンロードできんねや？<br />
そんなコトまではGoogle先生のシラバスには載ってなかったか。</p>
<p>☆<a href="http://www.sophia-it.com/content/ジオコーディング">ジオコーディングとは 「アドレスマッチング」 (Geocoding)： &#8211; IT用語辞典バイナリ</a><br />
☆<a href="http://d.hatena.ne.jp/oldfish/20081214/1229257066">GPSの緯度経度から住所へ変換 &#8211; 泥縄トラップ</a></p>
<h4>#41</h4>
<p>緯度経度（簡単に）取得できませ～ん。（←<a href="http://ja.wikipedia.org/wiki/踊る大捜査線_THE_MOVIE_2_レインボーブリッジを封鎖せよ!">あの警察映画</a>のように。）</p>
<p>LocationManagerクラスからgetCurrentLocationメソッドが消えとる。はぁ～？？<br />
（↑Android1.5では既に実装されていない。）</p>
<h4>#42</h4>
<p>『ライフサイクル』について、このエントリが解かりやすいんでねーか？</p>
<p>☆<a href="http://blog.haw.co.jp/android/?p=52">Androidのド肝 » Activityのライフサイクル</a></p>
<h4>#43</h4>
<p>DDMSに「こーゆー経路を歩きますよ」という登録をすると、実際にその経路を歩きながらAndroid端末を操作するみたいな感じで、GPS機能が働いてくれるらしい。<br />
KMLファイルとかGPXファイルみたいな、聞き慣れない拡張子のファイルがあれば実現可能。<br />
（結局この機能は使ってはいないし、この記事を作成する頃はこの機能の使い方を知らない。）</p>
<p>開発環境を提供する側も、いろいろと考えてくれてはるんやなー。感謝感謝。</p>
<p>あと、素晴らしい翻訳を発見。<br />
こういう実のある事が出来るスキルがあると締まっていいんだけど……省みれば、今の自分は「緩急」の『緩』しかない。どーしよ。</p>
<p>☆<a href="http://d.hatena.ne.jp/bs-android/20090203/1233675390">AndroidのDDMSの使用方法のドキュメントを翻訳しました &#8211; Android(アンドロイド)情報-ブリリアントサービス</a><br />
☆<a href="http://etrexer.web.infoseek.co.jp/googlemap/gmap2gpx/">GMAP2GPX: Google MapでGPXファイルとMioMap地点ファイル</a>　（←このサイトでGPXファイルが作成できる）</p>
<h4>#44</h4>
<p>緯度と経度を固定指定したら、ひとまず地名が取得できた。（<a href="http://d.hatena.ne.jp/oldfish/20081214/1229257066">こちら</a>を参考に。）<br />
あとは、くだんのデバグツール（DDMS）を用いてGPSから緯度と経度を取得するのみ。</p>
<h4>#45</h4>
<p>う～ん…。KMLファイルをDDMSでどーのこーの。反応しーひんかったら意味ないやんか。<br />
（「KMLファイルをDDMSに読み込ませて、DDMSのリストに出てきた位置情報をクリックしても、エミュレータ側では何の反応もしなかった」の意。結局はそもそも自分の実装にバグがあった。）</p>
<p>☆<a href="http://www.hakkaku.net/hakkaker_blog/20090727-556">八角研究所 : Android DDMSでKMLから位置情報の取得方法</a><br />
☆<a href="http://www.android-group.jp/index.php?%CA%D9%B6%AF%B2%F1%2FGPS">勉強会/GPS &#8211; 日本Androidの会（日本アンドロイドの会）</a></p>
<h4>#46</h4>
<p><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_03.html">Tech Blogの3本目</a>の記事を入稿。</p>
<p>このTech Blogの記事（「アンドロイダー日記」シリーズ）用として、<a href="http://twitter.com/">Twitter</a>的な感じで簡単な一言メモを取っている。<br />
そのメモで、本当に「一言」の時があるのだが、そっからの 後のせサクサク やらなんやらで、結局立派な文章になってしまう。</p>
<p>普段、そんなオシャベリでもないんだが…。</p>
<h4>#47</h4>
<p>お天気情報を、RSS形式かなんかで配信しているサイトを探す。</p>
<p>だが、そういうサイトは、少ないように感じる。</p>
<p>…のだけれども、しゃーないといえばしゃーない気もする。<br />
天気予報にプロが居たりビジネスとして成立している手前、猫も杓子も無料では配信しないだろう。<br />
とは言うものの、素人の予報など誰も期待していないから、そこはプロの意見が必要。<br />
Androidケータイにカメラが付いてるからって空を映しても何もならないし、写真を解析してどーこーなど、そんな仕様を採用するはずもない。</p>
<p>はぁ～。</p>
<p>そんな絶望の中で、参考にできそうなサイトを3つ。<br />
（一番下は、MacでのAndroidアプリ開発環境の構築方法に関してのエントリ。Macは触ったコトないがいつか役立ちそうだと思ったので、ここにリンクを。）<br />
　<br />
☆<a href="http://www.weathermap.co.jp/hitokuchi_rss/">天気予報をRSSでお届けする「ひとくち予報 in Feed」</a><br />
☆<a href="http://www.rssweather.com/dir/Asia/Japan">Japan Weather Forecasts</a><br />
☆<a href="http://bellks.com/google/">GPL天気予報（google plus livedoor 天気）</a><br />
☆<a href="http://blog.flashcast.jp/2009/05/android-sdk-15.html">flashcast：フリーで働くITエンジニア集団のブログ: Android SDK 1.5をインストールしてみる</a></p>
<h4>#48</h4>
<p>他プラットフォームとの関係について、お言葉を紹介。</p>
<p>◎『美学のiPhone、実用主義のandroidという印象』（直下リンク先より引用）<br />
☆<a href="http://d.hatena.ne.jp/shi3z/20090712/1247365501">android、三日目。androidを見直したアプリ &#8211; Keep Crazy;shi3zの日記</a></p>
<h4>#49</h4>
<p>「洗濯物たとむ」の「たとむ」ってどこの方言なんや？</p>
<p>「たとむ」って言い慣れてる言葉なんだけども、文字面はヘンやね。</p>
<p>☆<a href="http://www.weblio.jp/content/たとむ">たとむ とは(Weblio)</a></p>
<h4>#50</h4>
<p>やっぱ、技術系の記事ってば、丁寧に書いたらアクセス数は伸びるのかな？<br />
下記リンク先の記事が丁寧に書かれているのでそう思った次第。</p>
<p>☆<a href="http://d.hatena.ne.jp/yamashina/20090806/1249575250">Google Androidで画面遷移 &#8211; yamashinaの日記</a></p>
<h4>#51</h4>
<p>☆<a href="http://www.techfirm.co.jp/lab/android/transition.html">画面遷移 | テックファーム</a><br />
☆<a href="http://www.atmarkit.co.jp/fjava/rensai4/android03/android03_2.html">ブラウザや地図、ストリートビューの基、Intentとは？ (2/3) &#8211; ＠IT</a></p>
<p>前者のリンク先より引用。<br />
◎『Androidでは「スタック」という概念があり、Activity（画面）は遷移するたびにスタックへタスクが積まれていきます。』</p>
<p>これが、どう厄介になるんかな。<br />
いまんとこは想像が付かないし、そもそも厄介になるかどうかもわからない。<br />
ただ、気ぃ付けとかなダメなんだなー、と。</p>
<h4>#52</h4>
<p>◎画像とかのリソースファイルのファイル名に大文字が入っていたら、Androidではそのファイルを正しく読み込んでくれない。</p>
<h4>#53</h4>
<p>◎Androidアプリからインターネットに接続するときは、マニフェストファイルにパーミッションの宣言をする必要がある。<br />
☆<a href="http://feedyomi.blog32.fc2.com/blog-entry-181.html">Androidアプリでインターネット接続する為に必要な設定（android.permission.INTERNET） &#8211; WillFeed</a></p>
<p>どうも『マニフェストファイルに宣言』が最も重要な規約の一つ、らしい。</p>
<h4>#54</h4>
<p>過日に実装した画面において、表示されている文字が小さすぎるか？と疑念に駆られたが…実機が手元にない。確認したくても出来ない。</p>
<p>結局、『実機をどう調達するか？』に頭をひねらす事もなく、自分のケータイで試してみた。</p>
<p>今回使用する“エセAndroid端末”は、<a href="http://www.nttdocomo.co.jp/product/foma/pro/sh04a/">docomoのSH-04A</a>。<br />
スマートフォンのようでスマートフォンでない、ベンベン、というような、所謂『ガラパゴス携帯』。</p>
<p>エミュレータのハードコピーを取って、エミュレータアプリの端末画面部分の箇所だけ切り取って、その画像ファイルをメールでエセAndroid端末に送る。</p>
<p>…割と見えるではないか。</p>
<p>不可はなさそうだが可も全くない、という感じ。<br />
レイアウトに味気がなさすぎるからだが…これは端末のせいじゃないな。設計者の感覚の問題だぁ…悲しいかな。</p>
<p>Android端末（HT-03Aを思い浮かべた）の解像度は、QVGAかVGAでなく「ハーフVGA」なんだな。</p>
<p>SA-04Aの解像度はVGAだったはず…調べてみると「フルワイドVGA」ですって。</p>
<p>「フルワイドVGA」だの「VGA＋」だの「ハーフVGA」だの…どんなユーザの重箱の隅を突こうとしているのだ？</p>
<h4>#55</h4>
<p>VBさんは、Javaの列挙型の使い方がいまさらやっとわかってきた、だとさ☆</p>
<h4>#56</h4>
<p>解からない事だらけの状態で、それらをまんべんなく調査していってると </p>
<p>あっ!!!!!!!!!</p>
<p>と言う間に時間が無くなる。</p>
<p>というか、ここまで上手くいかないものなんて思ってなかった。</p>
<h4>#57</h4>
<p>今度は、Javaの『シリアライズ』とかいうのを憶えた。</p>
<p>もうね、勤勉さで言うと、私と二宮金次郎が双璧を成してるはず（誇張</p>
<h4>#58</h4>
<p>◎android.content.IntentクラスのインスタンスにputExtraメソッドで値を突っ込んだあと、遷移後の画面でintentを操作しようとしたとき、Extraに存在しないキーを参照しても例外にならない。ただ単にNullが返ってくるだけ。</p>
<p>例外になるもんだと思ってたから拍子抜け。<br />
例外にならないのがスタンダードなんかな。よくわからん。</p>
<h4>#59</h4>
<p>観てみたかった。</p>
<p>☆<a href="http://blog.haw.co.jp/android/?p=170">Androidのド肝 » 今村 謙之さんのAndroidの講演会に行ってきました。</a></p>
<h4>#60</h4>
<p>【GPSの電波から緯度経度を取得して、そっから住所を取得する】という一連の流れが実現できました。</p>
<p>やっとかぁ。3作業日ぐらいかかったっけ(?_?)</p>
<h4>次回予告</h4>
<p>次回も自作アプリ第2弾の実装の続きを綴ります。まだまだお付き合いください。<br />
ありがとうございました。</p>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_01.html">アンドロイダー育成日記 -Androidと仲良くなるには- その1</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_02.html">アンドロイダー育成日記 -Androidと仲良くなるには- その2</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_03.html">アンドロイダー育成日記 -Androidと仲良くなるには- その3</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/08/bought_android_ht-03a.html">Androidケータイ(HT-03A)買いました</a></li>
<li>アンドロイダー育成日記 -Androidと仲良くなるには- その4(本記事)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/09/android_beginner_diary_04.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/09/android_beginner_diary_04.html" />
	</item>
		<item>
		<title>Wicket小話その1. とりあえずWicketを始めよう</title>
		<link>http://blog.eni.co.jp/tech/2009/08/wicket_01_start.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/08/wicket_01_start.html#comments</comments>
		<pubDate>Mon, 31 Aug 2009 08:35:02 +0000</pubDate>
		<dc:creator>武輪 恭代</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Wicket]]></category>
		<category><![CDATA[フレームワーク]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1108</guid>
		<description><![CDATA[ども、武輪です。
Wicket小話と題しまして、Wicket初心者の私がWicketを使ってみて、

これちょっと便利な機能だなー
こんなコンポーネントを使ってみたよ！
こんな実装やってみたよ！

などなど。
そんなちょっとしたメモ書きを徒然と残していこうと思います。
基本的に情報はWebと書籍「オープンソース徹底活用 WicketによるWebアプリケーション開発」(矢野勉さん著)から得ています。
あとはWicketのソースとか。
さてWicket小話その1として、「とりあえずWicketを始めよう」という副題で徒然と書いていきます。

はじめに
そもそもWicketって何よって方に簡単に。
Wicketとは、Webアプリケーションフレームワークの1つです。
HtmlとJavaでWebアプリケーションが作れちゃいます。
設定ファイルはほとんど必要ありません。(そりゃweb.xmlは必須ですけども)
2009年8月現在Wicketは1.4がリリースされています。
Wicket小話では特に注意書きがない限り、この最新リリースのWicket1.4で試したことを書いていこうと思います。
開発環境などは以下の通り。



バージョン


JDK
1.6.0_13


Apache Tomcat
6.0.16


Apache Wicket
1.4.0


さてここまで書いたところで、ショックな出来事が1つ。
ちょ…、Wicket1.4.1もう出てるじゃんorz
ま、まぁいっか。
準備
Apache Maven2 のインストール手順
Maven2を使うことで簡単にWicketプロジェクトを開始することができます。
(事前に1.5以上のJDKがインストールされている前提で話を進めていきます。)

1. ダウンロード
Apache Maven Projectより、アーカイブをダウンロードします。
私は2.1.0を使用していますが、2.2.1が既に出ているようです。


2. 環境変数の設定
適当なディレクトリ(MAVEN_HOME)にダウンロードしてきたアーカイブを展開してください。
環境変数PATHに%MAVEN_HOME%binを追加。
(環境変数はシステムのプロパティ→詳細設定→環境変数から変更できます。既存のPATHの値を消してしまわないように気を付けてください。)
※JAVA_HOMEを設定していないとMaven2は動かないので注意。


3. インストール確認
コマンドプロンプトでmvn &#8211;versionを実行することでインストールを確認することができます。

C:>mvn --version
Apache Maven 2.1.0 (r755702; 2009-03-19 04:10:27+0900)
Java version: 1.6.0_06
Java home: C:javajdk1.6.0_06jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"


早速Wicketを始めよう
Moven2のインストールが完了したら、早速Wicketを開始してみましょう。
サンプルアプリケーションを動かしてみよう！

1. ダウンロード
http://wicket.apache.org/ から1.4系のアーカイブをダウンロードしてきます。
適当なディレクトリでアーカイブを展開します。
libディレクトリにはwicketの各種ライブラリーの他に、サンプルアプリケーションのwar(wicket-examples-1.4.x.war)も入っています。
このwarファイルをローカルのTomcatのwebappディレクトリに放り込んでTomcatを再起動してあげれば、とりあえずサンプルを動かすことができるんですが、このwarにはソースが含まれていないので動作を見るだけになってしまいます。
折角なのでEclipseで作業できるようにしましょう。


2. Eclipseにインポート
コマンドプロンプト上で、srcディレクトリ以下のwicket-examplesに移動します。
mvn eclipse:eclipse -DdownloadSources=true を実行することでEclipse用の設定ファイルが生成されます。

%展開先のディレクトリ%apache-wicket-1.4.xsrcwicket-examples>mvn eclipse:eclipse -DdownloadSources=true

あとはEclipseで「インポート」→「既存プロジェクトをワークスペースへ」からインポートすればOK。


3. サンプルを動かしてみよう
wicket-examplesパッケージにはJettyというJAVAのWebサーバが同梱されているので、簡単にサンプルを動作させることができます。
org.apache.wicket.examples.StartExamplesクラスを実行すればJettyサーバが起動します。
そしたらあとは http://localhost:8080/wicket-examples/ にアクセスするだけでWicketのサンプルの数々を試すことができます。
勿論Tomcatで動かしても全然問題ありません。

新規プロジェクトのスタート

サンプルアプリケーションは、既に1つの完成されたアプリケーションです。
新規プロジェクトをスタートさせる時には、ブランクのプロジェクトがあれば便利だなーって思いませんか？
というわけでブランクプロジェクトの作り方です。

Maven2の使い方なんかわかんないよーって人にも簡単！
WicketのQuickStartのページからコマンドラインを作成することができます。
上記サイトにアクセスすると、こんな入力欄があります。
各入力欄の意味は、
　GroupId:　パッケージとして使用される
　ArtifactId:　プロジェクト名として使用される
　Version:　Wicketのバージョン
こんな感じです。
これらを入力していくと、勝手にCommand Line欄にコマンドが組み立てられていくって寸法です。なんて便利！
次にコマンドプロンプト上でプロジェクトを作成したいディレクトリに移動し、先ほど生成したコマンドラインをコピペして実行します。
(※Proxyの設定などはこちらを参考に。→Maven2のTipsを集めるwiki#固有の環境設定)

C:test>mvn archetype:create -DarchetypeGroupId=org.apache.wicket -DarchetypeArtifactId=wicket-archetype-quickstart -DarchetypeVersion=1.4.1 -DgroupId=jp.co.eni.wicket -DartifactId=sample
[INFO] Scanning [...]]]></description>
			<content:encoded><![CDATA[<p>ども、武輪です。</p>
<p>Wicket小話と題しまして、Wicket初心者の私がWicketを使ってみて、</p>
<ul>
<li>これちょっと便利な機能だなー</li>
<li>こんなコンポーネントを使ってみたよ！</li>
<li>こんな実装やってみたよ！</li>
</ul>
<p>などなど。<br />
そんなちょっとしたメモ書きを徒然と残していこうと思います。</p>
<p>基本的に情報はWebと書籍「<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798022217/enieni-22/ref=nosim/" name="amazletlink" target="_blank">オープンソース徹底活用 WicketによるWebアプリケーション開発</a>」(矢野勉さん著)から得ています。<br />
あとはWicketのソースとか。</p>
<p>さてWicket小話その1として、「とりあえずWicketを始めよう」という副題で徒然と書いていきます。</p>
<p><span id="more-1108"></span></p>
<h3>はじめに</h3>
<p>そもそもWicketって何よって方に簡単に。<br />
<b>Wicketとは、Webアプリケーションフレームワークの1つです。</b><br />
HtmlとJavaでWebアプリケーションが作れちゃいます。<br />
設定ファイルはほとんど必要ありません。(そりゃweb.xmlは必須ですけども)</p>
<p>2009年8月現在Wicketは1.4がリリースされています。<br />
Wicket小話では特に注意書きがない限り、この最新リリースのWicket1.4で試したことを書いていこうと思います。</p>
<p>開発環境などは以下の通り。</p>
<table class="content">
<tr>
<th></th>
<th>バージョン</th>
</tr>
<tr>
<th style="text-align:left">JDK</th>
<td>1.6.0_13</td>
</tr>
<tr>
<th style="text-align:left">Apache Tomcat</th>
<td>6.0.16</td>
</tr>
<tr>
<th style="text-align:left">Apache Wicket</th>
<td>1.4.0</td>
</tr>
</table>
<p>さてここまで書いたところで、ショックな出来事が1つ。<br />
ちょ…、Wicket1.4.1もう出てるじゃんorz</p>
<p>ま、まぁいっか。</p>
<h3>準備</h3>
<h4>Apache Maven2 のインストール手順</h4>
<p>Maven2を使うことで簡単にWicketプロジェクトを開始することができます。<br />
(事前に1.5以上のJDKがインストールされている前提で話を進めていきます。)</p>
<p>
<span class="entry">1. ダウンロード</span><br />
<a href="http://maven.apache.org/download.html">Apache Maven Project</a>より、アーカイブをダウンロードします。<br />
私は2.1.0を使用していますが、2.2.1が既に出ているようです。
</p>
<p>
<span class="entry">2. 環境変数の設定</span><br />
適当なディレクトリ(MAVEN_HOME)にダウンロードしてきたアーカイブを展開してください。<br />
環境変数PATHに%MAVEN_HOME%binを追加。<br />
(環境変数はシステムのプロパティ→詳細設定→環境変数から変更できます。既存のPATHの値を消してしまわないように気を付けてください。)</p>
<p>※JAVA_HOMEを設定していないとMaven2は動かないので注意。
</p>
<p>
<span class="entry">3. インストール確認</span><br />
コマンドプロンプトでmvn &#8211;versionを実行することでインストールを確認することができます。</p>
<pre style="background-color:black; color:white">
C:>mvn --version
Apache Maven 2.1.0 (r755702; 2009-03-19 04:10:27+0900)
Java version: 1.6.0_06
Java home: C:javajdk1.6.0_06jre
Default locale: ja_JP, platform encoding: MS932
OS name: "windows xp" version: "5.1" arch: "x86" Family: "windows"
</pre>
</p>
<h3>早速Wicketを始めよう</h3>
<p>Moven2のインストールが完了したら、早速Wicketを開始してみましょう。</p>
<h4>サンプルアプリケーションを動かしてみよう！</h4>
<p>
<span class="entry">1. ダウンロード</span><br />
<a href="http://wicket.apache.org/">http://wicket.apache.org/</a> から1.4系のアーカイブをダウンロードしてきます。</p>
<p>適当なディレクトリでアーカイブを展開します。<br />
libディレクトリにはwicketの各種ライブラリーの他に、サンプルアプリケーションのwar(wicket-examples-1.4.x.war)も入っています。<br />
このwarファイルをローカルのTomcatのwebappディレクトリに放り込んでTomcatを再起動してあげれば、とりあえずサンプルを動かすことができるんですが、このwarにはソースが含まれていないので動作を見るだけになってしまいます。<br />
折角なのでEclipseで作業できるようにしましょう。
</p>
<p>
<span class="entry">2. Eclipseにインポート</span><br />
コマンドプロンプト上で、srcディレクトリ以下のwicket-examplesに移動します。<br />
mvn eclipse:eclipse -DdownloadSources=true を実行することでEclipse用の設定ファイルが生成されます。</p>
<pre style="background-color:black; color:white">
%展開先のディレクトリ%apache-wicket-1.4.xsrcwicket-examples>mvn eclipse:eclipse -DdownloadSources=true
</pre>
<p>あとはEclipseで「インポート」→「既存プロジェクトをワークスペースへ」からインポートすればOK。
</p>
<p>
<span class="entry">3. サンプルを動かしてみよう</span><br />
wicket-examplesパッケージにはJettyというJAVAのWebサーバが同梱されているので、簡単にサンプルを動作させることができます。<br />
org.apache.wicket.examples.StartExamplesクラスを実行すればJettyサーバが起動します。<br />
そしたらあとは <a href="http://localhost:8080/wicket-examples/">http://localhost:8080/wicket-examples/</a> にアクセスするだけでWicketのサンプルの数々を試すことができます。<br />
勿論Tomcatで動かしても全然問題ありません。
</p>
<h4>新規プロジェクトのスタート</h4>
<p>
サンプルアプリケーションは、既に1つの完成されたアプリケーションです。<br />
新規プロジェクトをスタートさせる時には、ブランクのプロジェクトがあれば便利だなーって思いませんか？<br />
というわけでブランクプロジェクトの作り方です。
</p>
<p>Maven2の使い方なんかわかんないよーって人にも簡単！<br />
<a href="http://wicket.apache.org/quickstart.html">WicketのQuickStartのページ</a>からコマンドラインを作成することができます。</p>
<p>上記サイトにアクセスすると、こんな入力欄があります。<br />
<div id="attachment_1323" class="wp-caption aligncenter" style="width: 645px"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/quickstart.png" alt="quickstart" title="quickstart" width="635" height="283" class="aligncenter size-full wp-image-1323" /><p class="wp-caption-text">QuickStartページ</p></div></p>
<p>各入力欄の意味は、<br />
　GroupId:　パッケージとして使用される<br />
　ArtifactId:　プロジェクト名として使用される<br />
　Version:　Wicketのバージョン<br />
こんな感じです。<br />
これらを入力していくと、勝手にCommand Line欄にコマンドが組み立てられていくって寸法です。なんて便利！</p>
<p>次にコマンドプロンプト上でプロジェクトを作成したいディレクトリに移動し、先ほど生成したコマンドラインをコピペして実行します。<br />
(※Proxyの設定などはこちらを参考に。→<a href="http://wiki.fdiary.net/maven2/?CookBook#l41">Maven2のTipsを集めるwiki#固有の環境設定</a>)</p>
<pre class="wp_codebox" style="background-color:black; color:white">
C:test>mvn archetype:create -DarchetypeGroupId=org.apache.wicket -DarchetypeArtifactId=wicket-archetype-quickstart -DarchetypeVersion=1.4.1 -DgroupId=jp.co.eni.wicket -DartifactId=sample
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'archetype'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Default Project
[INFO]    task-segment: [archetype:create] (aggregator-style)
[INFO] ------------------------------------------------------------------------
[INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'.
[INFO] Setting property: velocimacro.messages.on => 'false'.
[INFO] Setting property: resource.loader => 'classpath'.
[INFO] Setting property: resource.manager.logwhenfound => 'false'.
[INFO] [archetype:create]
[WARNING] This goal is deprecated. Please use mvn archetype:generate instead
[INFO] Defaulting package to group ID: jp.co.eni.wicket
Downloading: http://repo1.maven.org/maven2/org/apache/wicket/wicket-archetype-quickstart/1.4.1/wicket-archetype-quickstart-1.4.1.jar
13K downloaded  (wicket-archetype-quickstart-1.4.1.jar)
[INFO] ----------------------------------------------------------------------------
[INFO] Using following parameters for creating OldArchetype: wicket-archetype-quickstart:1.4.1
[INFO] ----------------------------------------------------------------------------
[INFO] Parameter: groupId, Value: jp.co.eni.wicket
[INFO] Parameter: packageName, Value: jp.co.eni.wicket
[INFO] Parameter: package, Value: jp.co.eni.wicket
[INFO] Parameter: artifactId, Value: sample
[INFO] Parameter: basedir, Value: C:test
[INFO] Parameter: version, Value: 1.0-SNAPSHOT
[INFO] ********************* End of debug info from resources from generated POM ***********************
[INFO] OldArchetype created in dir: C:testsample
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9 seconds
[INFO] Finished at: Wed Aug 26 11:11:43 JST 2009
[INFO] Final Memory: 7M/14M
[INFO] ------------------------------------------------------------------------
</pre>
<p>最後に「<b>[INFO] BUILD SUCCESSFUL</b>」が出てればOK。</p>
<p>
さて、実はもうこれだけで実行可能な状態なんです。<br />
上記例では、C:testにsampleというディレクトリが作成されています。<br />
コマンドプロンプト上でこのsampleディレクトリに移動し、以下のコマンドを実行します。</p>
<pre style="background-color:black; color:white">
C:testsample>mvn jetty:run
</pre>
<p>http://localhost:8080/sample にアクセスしてみてください。</p>
<pre>
Wicket Quickstart Archetype Homepage 

If you see this message wicket is properly configured and running
</pre>
<p>と表示されていれば成功です。
</p>
<p>
さらにEclipseで開発するには、sampleディレクトリ上で</p>
<pre style="background-color:black; color:white">
C:testsample>mvn eclipse:eclipse -DdownloadSources=true
</pre>
<p>を実行してEclipse用の設定ファイルが生成して、Eclipseで既存プロジェクトのインポートをすればOKです。
</p>
<h3>リンク集</h3>
<p><a href="http://wicket.apache.org/">Apache Wicket</a><br />
Apache Wicketの本家サイト</p>
<p><a href="http://www.wicket-ja.org/">Wicket-ja</a><br />
日本Wicketユーザーグループ(wicket-ja)の公式サイト。<br />
過去のメーリングリストの内容などが参照できます。<br />
ちなみに「うぃけっと　じぇーえー」ではなく「うぃけっとじゃ」と読むらしいです。</p>
<p><a href="http://d.hatena.ne.jp/t_yano/">矢野勉のはてな日記</a><br />
Wicket-ja創設者のブログ。<br />
著書の「<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798022217/enieni-22/ref=nosim/" name="amazletlink" target="_blank">オープンソース徹底活用 WicketによるWebアプリケーション開発</a>」には大変お世話になっております。</p>
<p><a href="http://wicket-study.seesaa.net/">Wicket学習帳</a><br />
最終更新が2008年08月19日で止まっていて、Ｗｉｃｋｅｔ1.3ベースまでの話が多いですが、参考になります。</p>
<h3>最後に</h3>
<p>さて、「とりあえずWicketを始めよう」という目的は達成できたでしょうか。<br />
次回以降のWicket小話では、具体的なコンポーネントの使い方とかを載せていければ、と思っております。</p>
<p>それでは、また。</p>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/09/wicket_02_confirm.html">Wicket小話その2. Wicketで確認メッセージを出すにはどうすればよいのか？</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/08/wicket_01_start.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/08/wicket_01_start.html" />
	</item>
		<item>
		<title>Androidケータイ(HT-03A)買いました</title>
		<link>http://blog.eni.co.jp/tech/2009/08/bought_android_ht-03a.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/08/bought_android_ht-03a.html#comments</comments>
		<pubDate>Thu, 20 Aug 2009 04:13:09 +0000</pubDate>
		<dc:creator>末田 佳和</dc:creator>
				<category><![CDATA[Google Android]]></category>
		<category><![CDATA[コラム]]></category>
		<category><![CDATA[HT-03A]]></category>
		<category><![CDATA[アンドロイド]]></category>
		<category><![CDATA[ケータイ]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1175</guid>
		<description><![CDATA[こんにちは。
プロダクト&#38;サービス事業部 リーダーの末田です。
突然ですが、Android携帯 docomo HT-03Aを買ってしまいました。

メインケータイとしてのAndroid(HT-03A)
もともとdocomoユーザな上に、経済的にケータイ2台持ちはキツイので、
iPhoneは泣く泣く見送り(iPod touchは買ったけど)、docomoからAndroid携帯が出るという情報を聞きつけ、心待ちにしておりました。
docomo的にはスマートフォンは2台目という位置づけらしいのですが、
私としては、おもいっきり1台のメイン携帯として利用してます。
ですが、

iモードが使いたい
おサイフケータイが使いたい

という人は、2台目として利用するしかありません。
iモードメールは、ビミョーです。
iモード.netというWebメールサービスで利用できるし、
新着iっていうよくできたアプリがあるので利用可能ですが、
iモード対応携帯で定期的にメール受信しないと、10MBたまると使えなくなる等、いろいろあるみたいです。(iモード.netでメールを消しても、サーバ上からは消えないみたいです。)
私の場合、まだ10MBにいってないのでいけてるのかもしれませんが、検証できてません。
電話としてのAndroid(HT-03A)
メールやアプリなどスマートフォンとしての機能については、良くレビューされてるのですが、ケータイとして、つまり「電話」についての情報はあまりないので、ここでちょっと説明を。
電話

「電話」は、「電話」というアプリを起動します
通話履歴はありますが、発信と着信はごちゃ混ぜです。（アイコンで区別）
通話履歴から電話をかけることはできます

連絡先

電話帳は「連絡先」という名前で管理されます
「連絡先」のデータは、GMailの「連絡先」と同期されます
グループ設定はできません。PCでGMailのグループ設定をすると、グループを選ぶことができるようになります。
普通の携帯の場合、あかさたな・・・等でのタブでの切り替えができることが多いですが、できません。

着信音・バイブ

一般的な「ジリリリ」等の音はデフォルトで入ってます。
着メロは、Androidで再生できる形式の音楽データを設定できます
iモード等で配布されている着メロ、着うたは使えません
「連絡先」の人毎に着信音の設定ができます
「連絡先」のグループ毎に着信音の設定はできません
バイブは、着信時にON/OFFを指定することができます
バイブは、人毎、グループ毎の設定、バイブパターンの設定はできません
マナーモード、サイレントの設定はできます

その他

他のアプリが重かったりすると、「電話」アプリのレスポンスも悪くなります。つまり、ケータイだからといって「電話」が特別扱いされてたりしません。他のアプリと同じ扱いです。

上記の説明は、標準のアプリの話です。
連絡先アプリ等出ていますので、いろいろカスタマイズできます。
電話の機能としては、最低限基本的な機能しかないので、
電話としてガシガシ使う人はやっぱりちょっとキビシイかもしれません。
私のように「帰るコール」するぐらいしか電話しない人は問題ないです。
次は
さて、docomoでは「ケータイするGoogle」として売ってますが、
技術者的には、GoogleというよりAndroid OSというところが、ヒジョーに注目度高いですので、
次回は、Androidアプリを作ってみました話をしようと思います。
それでは！
あわせて読みたい

アンドロイダー育成日記 -Androidと仲良くなるには- その1
アンドロイダー育成日記 -Androidと仲良くなるには- その2
アンドロイダー育成日記 -Androidと仲良くなるには- その3

]]></description>
			<content:encoded><![CDATA[<p>こんにちは。<br />
プロダクト&amp;サービス事業部 リーダーの末田です。</p>
<p>突然ですが、Android携帯 <a href="http://www.nttdocomo.co.jp/product/foma/pro/ht03a/">docomo HT-03A</a>を買ってしまいました。</p>
<p><span id="more-1175"></span></p>
<h3>メインケータイとしてのAndroid(HT-03A)</h3>
<p>もともとdocomoユーザな上に、経済的にケータイ2台持ちはキツイので、<br />
iPhoneは泣く泣く見送り(iPod touchは買ったけど)、docomoからAndroid携帯が出るという情報を聞きつけ、心待ちにしておりました。</p>
<p>docomo的にはスマートフォンは2台目という位置づけらしいのですが、<br />
私としては、おもいっきり1台のメイン携帯として利用してます。<br />
ですが、</p>
<ul>
<li>iモードが使いたい</li>
<li>おサイフケータイが使いたい</li>
</ul>
<p>という人は、2台目として利用するしかありません。<br />
iモードメールは、ビミョーです。<br />
iモード.netというWebメールサービスで利用できるし、<a href="http://jp.androlib.com/android.application.jp-cane-checki-jAnq.aspx"><br />
新着i</a>っていうよくできたアプリがあるので利用可能ですが、<br />
iモード対応携帯で定期的にメール受信しないと、10MBたまると使えなくなる等、いろいろあるみたいです。(iモード.netでメールを消しても、サーバ上からは消えないみたいです。)<br />
私の場合、まだ10MBにいってないのでいけてるのかもしれませんが、検証できてません。</p>
<h3>電話としてのAndroid(HT-03A)</h3>
<p>メールやアプリなどスマートフォンとしての機能については、良くレビューされてるのですが、ケータイとして、つまり「電話」についての情報はあまりないので、ここでちょっと説明を。</p>
<p>電話</p>
<ul>
<li>「電話」は、「電話」というアプリを起動します</li>
<li>通話履歴はありますが、発信と着信はごちゃ混ぜです。（アイコンで区別）</li>
<li>通話履歴から電話をかけることはできます</li>
</ul>
<p>連絡先</p>
<ul>
<li>電話帳は「連絡先」という名前で管理されます</li>
<li>「連絡先」のデータは、GMailの「連絡先」と同期されます</li>
<li>グループ設定はできません。PCでGMailのグループ設定をすると、グループを選ぶことができるようになります。</li>
<li>普通の携帯の場合、あかさたな・・・等でのタブでの切り替えができることが多いですが、できません。</li>
</ul>
<p>着信音・バイブ</p>
<ul>
<li>一般的な「ジリリリ」等の音はデフォルトで入ってます。</li>
<li>着メロは、Androidで再生できる形式の音楽データを設定できます</li>
<li>iモード等で配布されている着メロ、着うたは使えません</li>
<li>「連絡先」の人毎に着信音の設定ができます</li>
<li>「連絡先」のグループ毎に着信音の設定はできません</li>
<li>バイブは、着信時にON/OFFを指定することができます</li>
<li>バイブは、人毎、グループ毎の設定、バイブパターンの設定はできません</li>
<li>マナーモード、サイレントの設定はできます</li>
</ul>
<p>その他</p>
<ul>
<li>他のアプリが重かったりすると、「電話」アプリのレスポンスも悪くなります。つまり、ケータイだからといって「電話」が特別扱いされてたりしません。他のアプリと同じ扱いです。</li>
</ul>
<p>上記の説明は、標準のアプリの話です。<br />
連絡先アプリ等出ていますので、いろいろカスタマイズできます。</p>
<p>電話の機能としては、最低限基本的な機能しかないので、<br />
電話としてガシガシ使う人はやっぱりちょっとキビシイかもしれません。<br />
私のように「帰るコール」するぐらいしか電話しない人は問題ないです。</p>
<h3>次は</h3>
<p>さて、docomoでは「ケータイするGoogle」として売ってますが、<br />
技術者的には、GoogleというよりAndroid OSというところが、ヒジョーに注目度高いですので、<br />
次回は、Androidアプリを作ってみました話をしようと思います。<br />
それでは！</p>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_01.html">アンドロイダー育成日記 -Androidと仲良くなるには- その1</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_02.html">アンドロイダー育成日記 -Androidと仲良くなるには- その2</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_03.html">アンドロイダー育成日記 -Androidと仲良くなるには- その3</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/08/bought_android_ht-03a.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/08/bought_android_ht-03a.html" />
	</item>
		<item>
		<title>アンドロイダー育成日記 -Androidと仲良くなるには- その3</title>
		<link>http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_03.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_03.html#comments</comments>
		<pubDate>Thu, 20 Aug 2009 01:15:02 +0000</pubDate>
		<dc:creator>正木 恵二</dc:creator>
				<category><![CDATA[Google Android]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[アンドロイド]]></category>
		<category><![CDATA[リンク集]]></category>
		<category><![CDATA[作業日誌]]></category>
		<category><![CDATA[初心者]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1111</guid>
		<description><![CDATA[
このエントリーは下記の記事の続きです。
アンドロイダー育成日記 -Androidと仲良くなるには- その2

こんにちは。正木です。
今回は読者の方々から応援メッセージをたくさんいただいておりますので、そちらの方を少しご紹介したいと思います。

アンドロイダーとして成長する姿を見ていると、とても清々しい気分になります！　がんばってください！
実機もなくエミュレータだけで開発されているのでしょうが、そんな困難を恐れず立ち向かっている事に好感が持てます！
空腹も眠気も吹き飛ばして、いっぱしのアンドロイダーを目指してください！

温かい、励ましのコメント、本当にありがとうございます！
今回ご紹介させていただいた方々には、番組オリジナル『見習いアンドロイダーTシャツ』をお送りいたします。
まだまだ応援メッセージの方は受け付けておりますので、どしどしお寄せください！
…というワケで、以上のくだりはフィクションですんで、軽く右から左へ受け流してください。
それでは、本編をご覧あれ～。

（※ 記事中の役立つ凡例 =&#62; ☆：役立つ外部リンク）
前回まで（～#28）
・Google Android向けアプリが1つ完成したが、「インターネット等の通信」や「GPS」といったものを全く活用していないアプリになった。
・アプリを作成する際の超基本的な考え方は身についたように感じている。だが、応用はまだまだ。
#29
第1弾アプリが辛くも完成したので、第2弾アプリの製作に取り掛かりたいと思う。
それに先立って、Android端末ユーザの先輩から要望をいただいた。
テーマは『天気予報』で、
必要な機能としては『数時間ごとの予報が見たい』とのこと。
この【数時間ごと】というのがミソだったりする。
「日ごと」の天気予報はヨシとして、「数時間ごと」の予報だと配信されていない事が多い、らしい。
たしかに、数時間ごとの天気予報を配信しているサイトってば、ほんの一握りのように感じられる。
気付かなかった。
何から調査すればよいのか？？？　…まずは落ち着こう。
#30
このTech Blog用の記事（Android日記①や②）を書き終えたので、Blog管理者の方へ入稿。空腹の極み。
#31
第2弾アプリ作成にあたり……しっかし、何から手を付けていけばよいものか。
どうやら「単に天気予報を出す、というのがどうも…」という点が、自分の中で引っ掛かっている気がする。
#32
先日の帰りしなあたりに先輩からいただいたアイディアを元に、アプリの設計図を書いてみる。
なんとなくできた…が、ほどよい量の調査事項もでてきた。どーなるやら。
#33
あー、夏休み。
なので4、5日間ほど手を止める。
手を止めたのは、ちょいと泳ぎ疲れたからではない。
#34
このTech Blogの管理者の方から「記事をリリースする前に、ちょっとレイアウトを修正してほしい」との依頼をいただいたので対応する。
Tech Blog用記事を入稿すると、リリース前に多少のチェック（「内容が適切か」「話の筋が通ってるか」「レイアウトは整っているか」程度の一般的なもの）が入るのだが、今の今まで「内容」に対してはほとんどおトガメがない。
会社の人間の声が外部に、これだけストレートに響き渡るこの場で、こんな砕けた文章を書いてていいのか？という疑問はあるのだけども、しばしば杞憂で終わったりする。
これこそが言論の自由、表現の自由かと。
考えてみれば、著作物を拝見した際に「これ、すごいな」と衝撃を受けずにはいられなかったという作家さんが、2名ほど居りまして。
スタパ斎藤氏と西原理恵子氏。
その方々から勝手に影響を受けて、いまの自分はこんな文体になっているんだな、という自己分析もあったりします。
…文体だけの問題ではないか。
#35
Android向けアプリの動作に必要なファイルってば『1つだけ』なんだな。APKとかいう拡張子のファイルが1つだけ。
構造が簡潔すぎて驚いた。
でも、例えばiPhone向けのアプリもこんな感じなんだろうか…。この形式がスタンダードになってたりする、とか。
あと、Androidアプリは『JavaであってJavaでない』らしい。
（カギカッコ内の語句、下記リンク先より引用）
☆Android Market配布を目指しEclipseでHelloWorld！ (1/3) &#8211; ＠IT

#36
SpinnerというViewにAdapter（ArrayAdapterオブジェクト）をセットする方法がわからん。例外しか出ないんですが…。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.example.weatherTest;
&#160;
public class WeatherTest extends Activity &#123;
    @Override
    public void onCreate&#40;Bundle savedInstanceState&#41; &#123;
        // 省略
&#160;
        final String&#91;&#93; ITEMS = &#123;&#34;テスト項目A&#34;, &#34;テスト項目B&#34;, &#34;テスト項目C&#34;&#125;;
 [...]]]></description>
			<content:encoded><![CDATA[<div class="update">
このエントリーは下記の記事の続きです。</p>
<p><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_02.html">アンドロイダー育成日記 -Androidと仲良くなるには- その2</a></p>
</div>
<p>こんにちは。正木です。</p>
<p>今回は読者の方々から応援メッセージをたくさんいただいておりますので、そちらの方を少しご紹介したいと思います。</p>
<ul>
<li>アンドロイダーとして成長する姿を見ていると、とても清々しい気分になります！　がんばってください！</li>
<li>実機もなくエミュレータだけで開発されているのでしょうが、そんな困難を恐れず立ち向かっている事に好感が持てます！</li>
<li>空腹も眠気も吹き飛ばして、いっぱしのアンドロイダーを目指してください！</li>
</ul>
<p>温かい、励ましのコメント、本当にありがとうございます！<br />
今回ご紹介させていただいた方々には、番組オリジナル『見習いアンドロイダーTシャツ』をお送りいたします。<br />
まだまだ応援メッセージの方は受け付けておりますので、どしどしお寄せください！</p>
<p>…というワケで、以上のくだりはフィクションですんで、軽く右から左へ受け流してください。<br />
それでは、本編をご覧あれ～。<br />
<span id="more-1111"></span><br />
（※ 記事中の役立つ凡例 =&gt; ☆：役立つ外部リンク）</p>
<h4>前回まで（～#28）</h4>
<p>・Google Android向けアプリが1つ完成したが、「インターネット等の通信」や「GPS」といったものを全く活用していないアプリになった。<br />
・アプリを作成する際の超基本的な考え方は身についたように感じている。だが、応用はまだまだ。</p>
<h4>#29</h4>
<p>第1弾アプリが辛くも完成したので、第2弾アプリの製作に取り掛かりたいと思う。</p>
<p>それに先立って、Android端末ユーザの先輩から要望をいただいた。<br />
テーマは『天気予報』で、<br />
必要な機能としては『数時間ごとの予報が見たい』とのこと。</p>
<p>この【数時間ごと】というのがミソだったりする。<br />
「日ごと」の天気予報はヨシとして、「数時間ごと」の予報だと配信されていない事が多い、らしい。<br />
たしかに、数時間ごとの天気予報を配信しているサイトってば、ほんの一握りのように感じられる。<br />
気付かなかった。</p>
<p>何から調査すればよいのか？？？　…まずは落ち着こう。</p>
<h4>#30</h4>
<p>このTech Blog用の記事（<a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_01.html">Android日記①</a>や<a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_02.html">②</a>）を書き終えたので、Blog管理者の方へ入稿。空腹の極み。</p>
<h4>#31</h4>
<p>第2弾アプリ作成にあたり……しっかし、何から手を付けていけばよいものか。</p>
<p>どうやら「単に天気予報を出す、というのがどうも…」という点が、自分の中で引っ掛かっている気がする。</p>
<h4>#32</h4>
<p>先日の帰りしなあたりに先輩からいただいたアイディアを元に、アプリの設計図を書いてみる。</p>
<p>なんとなくできた…が、ほどよい量の調査事項もでてきた。どーなるやら。</p>
<h4>#33</h4>
<p>あー、夏休み。</p>
<p>なので4、5日間ほど手を止める。<br />
手を止めたのは、ちょいと泳ぎ疲れたからではない。</p>
<h4>#34</h4>
<p>このTech Blogの管理者の方から「記事をリリースする前に、ちょっとレイアウトを修正してほしい」との依頼をいただいたので対応する。</p>
<p>Tech Blog用記事を入稿すると、リリース前に多少のチェック（「内容が適切か」「話の筋が通ってるか」「レイアウトは整っているか」程度の一般的なもの）が入るのだが、今の今まで「内容」に対してはほとんどおトガメがない。<br />
会社の人間の声が外部に、これだけストレートに響き渡るこの場で、こんな砕けた文章を書いてていいのか？という疑問はあるのだけども、しばしば杞憂で終わったりする。</p>
<p>これこそが言論の自由、表現の自由かと。</p>
<p>考えてみれば、著作物を拝見した際に「これ、すごいな」と衝撃を受けずにはいられなかったという作家さんが、2名ほど居りまして。<br />
<a href="http://ja.wikipedia.org/wiki/スタパ齋藤">スタパ斎藤</a>氏と<a href="http://ja.wikipedia.org/wiki/西原理恵子">西原理恵子</a>氏。<br />
その方々から勝手に影響を受けて、いまの自分はこんな文体になっているんだな、という自己分析もあったりします。</p>
<p>…文体だけの問題ではないか。</p>
<h4>#35</h4>
<p>Android向けアプリの動作に必要なファイルってば『1つだけ』なんだな。APKとかいう拡張子のファイルが1つだけ。</p>
<p>構造が簡潔すぎて驚いた。<br />
でも、例えばiPhone向けのアプリもこんな感じなんだろうか…。この形式がスタンダードになってたりする、とか。</p>
<p>あと、Androidアプリは『JavaであってJavaでない』らしい。<br />
（カギカッコ内の語句、下記リンク先より引用）</p>
<p>☆<a href="http://www.atmarkit.co.jp/fjava/rensai4/android01/android01_1.html">Android Market配布を目指しEclipseでHelloWorld！ (1/3) &#8211; ＠IT</a><br />
<a name="story36"></a></p>
<h4>#36</h4>
<p>SpinnerというViewにAdapter（ArrayAdapterオブジェクト）をセットする方法がわからん。例外しか出ないんですが…。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p111163"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code" id="p1111code63"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.example.weatherTest</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> WeatherTest <span style="color: #000000; font-weight: bold;">extends</span> Activity <span style="color: #009900;">&#123;</span>
    @Override
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> onCreate<span style="color: #009900;">&#40;</span>Bundle savedInstanceState<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #666666; font-style: italic;">// 省略</span>
&nbsp;
        <span style="color: #000000; font-weight: bold;">final</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> ITEMS <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span><span style="color: #0000ff;">&quot;テスト項目A&quot;</span>, <span style="color: #0000ff;">&quot;テスト項目B&quot;</span>, <span style="color: #0000ff;">&quot;テスト項目C&quot;</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
        Spinner someSpinner <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>Spinner<span style="color: #009900;">&#41;</span>findViewById<span style="color: #009900;">&#40;</span>R.<span style="color: #006633;">id</span>.<span style="color: #006633;">someSpinner</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        someSpinner.<span style="color: #006633;">setAdapter</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ArrayAdapter<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, R.<span style="color: #006633;">layout</span>.<span style="color: #006633;">main</span>, ITEMS<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #666666; font-style: italic;">// 省略</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>何が間違ってんだか……あー、もぉ。</p>
<h4>#37</h4>
<p><a href="#story36">#36</a>の不具合の原因がわかった。</p>
<p>Rクラスが複数個あるとは知らず、「(当プロジェクトのパッケージ).R.layout」クラスの定数を渡していたのがダメだった。</p>
<p>どういうコトかと言えば、下記に具体例（改善案）を示す。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p111164"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p1111code64"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// #36のソースの10行目</span>
<span style="color: #666666; font-style: italic;">// ArrayAdapterのコンストラクタの第2引数には「android.R.layout」クラスの定数を設定するべき</span>
someSpinner.<span style="color: #006633;">setAdapter</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> ArrayAdapter<span style="color: #339933;">&lt;</span>String<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">this</span>, android.<span style="color: #006633;">R</span>.<span style="color: #006633;">layout</span>.<span style="color: #006633;">simple_spinner_item</span>, ITEMS<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>androidパッケージの中にもRクラスってば存在したんやね。その存在を知らなかった…。</p>
<p>解決するまで、時計の短針が2周していきよった。</p>
<p>…次だ！　次！</p>
<h4>#38</h4>
<p>なんだかんだで、天気予報と言えば、やっぱ『ヤン坊マー坊』ではなかろうか。</p>
<p>この方々は気象予報士ではないよね。</p>
<p>でも、プライムタイム辺りで冠番組持ってはるし、気象予報士じゃないけど天気予報系番組の代名詞的な存在やし。</p>
<p>イロイロとすごいな。</p>
<h4>#39</h4>
<p>1つ目の画面（今回のアプリは画面遷移がある）のイメージがなんとなく具現化できたので、いよいよ内部的な実装に突入する。</p>
<p>GPS。</p>
<p>ほげぇ～。</p>
<p>プログラマになりたての時、技術バリバリの先輩から、「hoge（ほげ）」という言葉の由来について『hogeってのは、昔、【ホーグ】という戦艦が云々』みたく、あからさまな冗談を吹っ掛けられた憶えがある。<br />
その【ホーグ】とやらが戦艦だったかどうかは（冗談を聴く私の姿勢が、先輩の冗談以上にテキトーだったので）定かじゃないけど、冗談の規模としては異例な大きさだったはず。</p>
<p>一寸のホラにも五分の魂？</p>
<p>☆<a href="http://android.siprop.org/index.php?%CA%D9%B6%AF%B2%F1%2FGPS">勉強会/GPS &#8211; 日本Androidの会（日本アンドロイドの会）</a><br />
☆<a href="http://www.adamrocker.com/blog/169/how_to_get_gps_location_with_android.html">throw Life &#8211; AndroidでGPSを使って現在地を取得する方法</a></p>
<h4>次回予告</h4>
<p>次回は、自作アプリ第2弾の実装の続きを綴ります。<br />
ありがとうございました。</p>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_01.html">アンドロイダー育成日記 -Androidと仲良くなるには- その1</a></li>
<li><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_02.html">アンドロイダー育成日記 -Androidと仲良くなるには- その2</a></li>
<li>アンドロイダー育成日記 -Androidと仲良くなるには- その3(本記事)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_03.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_03.html" />
	</item>
		<item>
		<title>Ubuntu 9.04 + GCC 4.4.1でC++0xを試してみた</title>
		<link>http://blog.eni.co.jp/tech/2009/08/ubuntu-gcc-cpp0x-getting-started.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/08/ubuntu-gcc-cpp0x-getting-started.html#comments</comments>
		<pubDate>Wed, 19 Aug 2009 02:00:57 +0000</pubDate>
		<dc:creator>青野 和仁</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[auto]]></category>
		<category><![CDATA[C++0x]]></category>
		<category><![CDATA[GCC]]></category>
		<category><![CDATA[N2914]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=990</guid>
		<description><![CDATA[こんにちは。
プロダクト&#038;サービス事業部の青野です。
C++0xの一部の機能はGCC 4.3から使用することが可能になっています。そこで今回はC++0xで少し遊んでみようと思います。
C++0xとGCCの対応状況について

C++0xの概要(Faith and Brave &#8211; C++で遊ぼう)
C++0xの言語仕様(ドラフト)
GCCのC++0x対応状況


コンパイル環境の準備
Ubuntu 9.04で配布されているGCC(g++)は4.3系の為、autoがまだ実装されていません。とりあえずautoを試してみたいので7月22日にリリースされた4.4.1をソースからコンパイルしてインストールします。

GCCのダウンロードと展開

$ mkdir ~/src
$ cd ~/src
$ wget ftp://ftp.dti.ad.jp/pub/lang/gcc/releases/gcc-4.4.1/gcc-4.4.1.tar.gz
$ tar xvzf gcc-4.4.1.tar.gz


GMPのダウンロードと展開

$ cd ~/src
$ wget ftp://ftp.gmplib.org/pub/gmp-4.3.1/gmp-4.3.1.tar.gz
$ tar xvzf gmp-4.3.1.tar.gz
$ mv gmp-4.3.1 gcc-4.4.1/gmp


MPFRのダウンロードと展開

$ cd ~/src
$ wget http://www.mpfr.org/mpfr-current/mpfr-2.4.1.tar.gz
$ tar xvzf mpfr-2.4.1.tar.gz
$ mv mpfr-2.4.1 gcc-4.4.1/mpfr


ビルドとインストール

$ mkdir ~/src/gccobj
$ cd ~/src/gccobj
$ ../gcc-4.4.1/configure
$ make bootstrap
$ sudo make install



C++0xソースのコンパイルと実行
Initializer Listとautoを試してみた

サンプルソース(sample.cpp)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include &#60;iostream&#62;
#include &#60;vector&#62;
&#160;
void print&#40;const std::vector&#60;int&#62;&#38; v&#41; &#123;
   [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちは。<br />
プロダクト&#038;サービス事業部の青野です。</p>
<p>C++0xの一部の機能はGCC 4.3から使用することが可能になっています。そこで今回はC++0xで少し遊んでみようと思います。</p>
<h3>C++0xとGCCの対応状況について</h3>
<ul>
<li><a href="http://d.hatena.ne.jp/faith_and_brave/20080725/1216976661">C++0xの概要(Faith and Brave &#8211; C++で遊ぼう)</a></li>
<li><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/projects#14882">C++0xの言語仕様(ドラフト)</a></li>
<li><a href="http://gcc.gnu.org/projects/cxx0x.html">GCCのC++0x対応状況</a></li>
</ul>
<p><span id="more-990"></span></p>
<h3>コンパイル環境の準備</h3>
<p>Ubuntu 9.04で配布されているGCC(g++)は4.3系の為、autoがまだ実装されていません。とりあえずautoを試してみたいので7月22日にリリースされた4.4.1をソースからコンパイルしてインストールします。</p>
<ol>
<li>GCCのダウンロードと展開

<div class="wp_codebox"><table width="100%" ><tr id="p99072"><td class="code" id="p990code72"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">mkdir</span> ~<span style="color: #000000; font-weight: bold;">/</span>src
$ <span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>src
$ <span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #c20cb9; font-weight: bold;">ftp</span>:<span style="color: #000000; font-weight: bold;">//</span>ftp.dti.ad.jp<span style="color: #000000; font-weight: bold;">/</span>pub<span style="color: #000000; font-weight: bold;">/</span>lang<span style="color: #000000; font-weight: bold;">/</span>gcc<span style="color: #000000; font-weight: bold;">/</span>releases<span style="color: #000000; font-weight: bold;">/</span>gcc-4.4.1<span style="color: #000000; font-weight: bold;">/</span>gcc-4.4.1.tar.gz
$ <span style="color: #c20cb9; font-weight: bold;">tar</span> xvzf gcc-4.4.1.tar.gz</pre></td></tr></table></div>

</li>
<li>GMPのダウンロードと展開

<div class="wp_codebox"><table width="100%" ><tr id="p99073"><td class="code" id="p990code73"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>src
$ <span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #c20cb9; font-weight: bold;">ftp</span>:<span style="color: #000000; font-weight: bold;">//</span>ftp.gmplib.org<span style="color: #000000; font-weight: bold;">/</span>pub<span style="color: #000000; font-weight: bold;">/</span>gmp-4.3.1<span style="color: #000000; font-weight: bold;">/</span>gmp-4.3.1.tar.gz
$ <span style="color: #c20cb9; font-weight: bold;">tar</span> xvzf gmp-4.3.1.tar.gz
$ <span style="color: #c20cb9; font-weight: bold;">mv</span> gmp-4.3.1 gcc-4.4.1<span style="color: #000000; font-weight: bold;">/</span>gmp</pre></td></tr></table></div>

</li>
<li>MPFRのダウンロードと展開

<div class="wp_codebox"><table width="100%" ><tr id="p99074"><td class="code" id="p990code74"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>src
$ <span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>www.mpfr.org<span style="color: #000000; font-weight: bold;">/</span>mpfr-current<span style="color: #000000; font-weight: bold;">/</span>mpfr-2.4.1.tar.gz
$ <span style="color: #c20cb9; font-weight: bold;">tar</span> xvzf mpfr-2.4.1.tar.gz
$ <span style="color: #c20cb9; font-weight: bold;">mv</span> mpfr-2.4.1 gcc-4.4.1<span style="color: #000000; font-weight: bold;">/</span>mpfr</pre></td></tr></table></div>

</li>
<li>ビルドとインストール

<div class="wp_codebox"><table width="100%" ><tr id="p99075"><td class="code" id="p990code75"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">mkdir</span> ~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>gccobj
$ <span style="color: #7a0874; font-weight: bold;">cd</span> ~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>gccobj
$ ..<span style="color: #000000; font-weight: bold;">/</span>gcc-4.4.1<span style="color: #000000; font-weight: bold;">/</span>configure
$ <span style="color: #c20cb9; font-weight: bold;">make</span> bootstrap
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></td></tr></table></div>

</li>
</ol>
<h3>C++0xソースのコンパイルと実行</h3>
<h4>Initializer Listとautoを試してみた</h4>
<ol>
<li>サンプルソース(sample.cpp)

<div class="wp_codebox"><table width="100%" ><tr id="p99076"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
</pre></td><td class="code" id="p990code76"><pre class="cpp" style="font-family:monospace;"><span style="color: #339900;">#include &lt;iostream&gt;</span>
<span style="color: #339900;">#include &lt;vector&gt;</span>
&nbsp;
<span style="color: #0000ff;">void</span> print<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">vector</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span> v<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;[print]&quot;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// std::vector&lt;int&gt;::const_iteratorだってautoでOK</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">auto</span> it <span style="color: #000080;">=</span> v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>it<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">*</span>it <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">void</span> rprint<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">const</span> std<span style="color: #008080;">::</span><span style="color: #007788;">vector</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span><span style="color: #000040;">&amp;</span> v<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #FF0000;">&quot;[rprint]&quot;</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// std::vector&lt;int&gt;::const_reverse_iteratorだってautoでOK!</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">auto</span> it <span style="color: #000080;">=</span> v.<span style="color: #007788;">rbegin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> v.<span style="color: #007788;">rend</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>it<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">*</span>it <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span>
&nbsp;
<span style="color: #0000ff;">int</span> main<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
    std<span style="color: #008080;">::</span><span style="color: #007788;">vector</span><span style="color: #000080;">&lt;</span><span style="color: #0000ff;">int</span><span style="color: #000080;">&gt;</span> v <span style="color: #000080;">=</span> <span style="color: #008000;">&#123;</span>1, 5, 10<span style="color: #008000;">&#125;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #666666;">// std::vector&lt;int&gt;::iteratorだってautoでOK!</span>
    <span style="color: #0000ff;">for</span> <span style="color: #008000;">&#40;</span><span style="color: #0000ff;">auto</span> it <span style="color: #000080;">=</span> v.<span style="color: #007788;">begin</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> it <span style="color: #000040;">!</span><span style="color: #000080;">=</span> v.<span style="color: #007788;">end</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span> <span style="color: #000040;">++</span>it<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#123;</span>
        std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> <span style="color: #000040;">*</span>it <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
    <span style="color: #008000;">&#125;</span>
    std<span style="color: #008080;">::</span><span style="color: #0000dd;">cout</span> <span style="color: #000080;">&lt;&lt;</span> std<span style="color: #008080;">::</span><span style="color: #007788;">endl</span><span style="color: #008080;">;</span>
&nbsp;
    print<span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
    rprint<span style="color: #008000;">&#40;</span>v<span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #0000dd;">0</span><span style="color: #008080;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

</li>
<li>コンパイル<br />
コンパイル時にC++0xの機能を使用する場合、コンパイル時に-std=gnu++0xオプションを指定する必要があります。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p99077"><td class="code" id="p990code77"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">g++</span> <span style="color: #660033;">-std</span>=gnu++0x sample.cpp</pre></td></tr></table></div>

</li>
<li>実行結果

<div class="wp_codebox"><table width="100%" ><tr id="p99078"><td class="code" id="p990code78"><pre class="bash" style="font-family:monospace;">$ .<span style="color: #000000; font-weight: bold;">/</span>a.out
<span style="color: #000000;">1</span>
<span style="color: #000000;">5</span>
<span style="color: #000000;">10</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#91;</span>print<span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000;">1</span>
<span style="color: #000000;">5</span>
<span style="color: #000000;">10</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">&#91;</span>rprint<span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000;">10</span>
<span style="color: #000000;">5</span>
<span style="color: #000000;">1</span></pre></td></tr></table></div>

</li>
</ol>
<p>autoに関しては多用すると可読性を損なう可能性がありますが、STLのコンテナクラスをイテレートする場合には可読性が上がっていい感じかなと思います。</p>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/05/cpp0x_date_extended_manipulators.html">C++0xでの日付の書式付入出力の仕組み</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/08/ubuntu-gcc-cpp0x-getting-started.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/08/ubuntu-gcc-cpp0x-getting-started.html" />
	</item>
		<item>
		<title>アンドロイダー育成日記 -Androidと仲良くなるには- その2</title>
		<link>http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_02.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_02.html#comments</comments>
		<pubDate>Tue, 18 Aug 2009 03:00:18 +0000</pubDate>
		<dc:creator>正木 恵二</dc:creator>
				<category><![CDATA[Google Android]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[アンドロイド]]></category>
		<category><![CDATA[リンク集]]></category>
		<category><![CDATA[作業日誌]]></category>
		<category><![CDATA[初心者]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1034</guid>
		<description><![CDATA[
このエントリーは下記の記事の続きです。
アンドロイダー育成日記 -Androidと仲良くなるには- その1

こんにちは。正木です。
おまっとさんでございました。
Google Android向けアプリ作成日記の、続きでございますよ。
それでは、めしあがれ～。

（※ 記事中の役立つ凡例 =&#62; ◎：役立つ教訓 &#124; ☆：役立つ外部リンク）
前回まで（～#11）
・Google Android向けアプリの開発環境を作った。
・雑誌『SoftwareDesign』を見ながら、アプリ作成の『いろは』の『い』を見ていった。
・そのほか、コーディングの方法や挙動などを確認した。
#12
アプレットの『DroidDraw』が、案外使いづらい、のではないか？？
デザインが思い通りいかない事があるんだ。
適当なレイアウトのコンテナみたいなLayoutに、適当なViewを包含させると、
子になっているViewが、マウスでクリックしてもアクティブにならなかったりする（そうなるとViewのプロパティがレイアウト画面から設定できない）。
Visual Studioで、カスタムコントロールのレイアウトをデザインしてる時に顔を出す、
あの「いーっとなる」感じを思い出す。
親コンテナと子コントロールのAnchor プロパティやDockプロパティを適宜設定したけど、
期待していないサイズ変わり方しよるぞ、コイツ、みたいな。
…VSのくだりに何の共通点があるかわかんないけど、とにかくめんどくさい。
「まぁ、ベータ版だしな…」と自分に言い聞かせる。
#13
オリジナルアプリの作成を始める事にする。
まずは設計書…のようなものを作る。
テキトーな裏紙に、機能とレイアウトの概要を、嵐のような勢いで書けばハイできあがり♪
（個人的には）面白そうなアプリだと思うのだが…そもそも実現できるのかどうか。
（アプリの概要は「あとがき」を参照のこと。）

#14
なんとなくではあるが、画面レイアウトは構想に近付いてきた。
一部（たとえばEditTextのBackColorやTextColorプロパティを変えたりとかしたり）の設定を除けば、イイ感じ。たぶん。
今後の実装にあたり、気付いた点・不安な点を挙げる。

Eclipseの画面レイアウト機能にあるプロパティからでは、ViewのBackColorやTextColorは設定できないのでは？
イメージのリソースは、どこにどうやって持たせるのだ？
おなかへった。
Android端末に、どれだけの負荷をかける事が許されるのか。実機が無くても検証する方法ってないんかな？
自分が作りたいアプリの仕様的に、問題データを簡単に追加したいのだが…。どうやってもたせようか？　ダウンロードとかやっちゃう？
画面レイアウトを作るのは『DroidDraw』だけではしんどい。そもそも、『DroidDraw』のXMLが表示されるエリアは、あれはエディタではないんだな。よくわからないがカーソルキーが死んでしまう時がある。きっかけもわかんない。いきなりお亡くなりになる。なので、『DroidDraw』だけでなく、Eclipseでのレイアウト機能も併用した方がよい。
おなかへってたけど、コーヒー飲んだからちょっとはマシになったかな。

※後日談として、上記の疑問点の見解を書いておく。

調査せず。今回はソースの中で指定した（ViewのsetTextColorメソッドなどに、android.graphics.Colorクラスの定数を渡す）。
画像ファイル自体は専用のフォルダに保持。ただ、その画像の参照は「パス指定」でなく「画像に割り振られたint型の定数」でやる。
お昼休憩までがんばりましょう。
これを使えばOKかと。
結局、今回は対応しなかったのでパス。
（上記の意見に変わりなし）
ごはんはちゃんと食べましょう。

#15
久しぶりに、食事してて「あきらめ」と「敗北感」を悟った。
自分で大盛りをオーダーしときながら…。
パスタは怖い。もーしばらく要らん。
つべこべ言わず作業再開。
#16
AndroidのスタートアップJavaクラス（src\(任意のパッケージ)\(一番最初に生成されるクラス).java）のonCreateメソッドは、
WicketのJavaクラスのコンストラクタメソッドみたいに、
ボタン押下時に何度も何度も呼び出されることはない。
期待通りでちょっと安心。
#17
各Viewの可視状態は、boolean値でなくint値で設定しなくちゃならん。
（setVisibilityメソッド とかのパラメータのこと。左記メソッドだと、android.view.Viewクラスの定数（int）を渡す必要がある。）
なんというか、わかりづらい…のは固定観念のせいか！？
#18
ねむいでございます。
#19
秒変わりきっかけのイベントもフックできた…が、これでいいのか？
タイマーのスタートはできたけど、
「タイマーをストップしてから、再スタートする」というアクションが、これでは実現できないっぽい。
（※ この時点ではandroid.os.Handlerクラスを用いて実装していた。結局は#25のような実装になったが、Handlerクラスを使っても「タイマーをストップしてから、再スタートする」のは実現可能であると思われる。）
それ以外の疑問（#14で挙げた項目たち）はほとんど解消できた。
ただ新しい疑問も出現したが…それは進捗の証としてヨシとしよう（甘いね）。
あと1日ぐらいで、なんとか使用できるぐらいまでもっていこう。
たかが自己満足のために、
未経験のものに対してここまでコーディングできるものかと、我ながら感心してます。
本日の作業は終了！！
☆5.4 タイマーイベント ‎(Android Docs(初級編))‎
☆八角研究所 : Android で再開する Java プログラミング（3） &#8211; モグラ叩き
☆デジモノ狂想曲！: Android で タイマー処理 を考えてみた
#20
おはようございます。
#21
今日はなんだか手がよく動く。マリオでいうところの「無敵状態」。
#22
無敵状態が終わった。ものの1時間だったですけど。
#23
タイマー制御が難しい。thread.sleepが期待通り動いてくれない。
（※ 後日談だが、thread.sleepは実装しなかった。）
☆勝手にAndroidブログ &#8211; PukiWiki
#24
並列処理が大事！
☆Androidで学ぶ並列処理とGUI &#8211; やさしいデスマーチ

#25
秒刻みのイベントをフックするのが難しかったので、
ChronometerとかいうViewのChronometerTickイベントをフックするようにした。
なんか…違うよなぁ。
コーディング量は少なくて済んでるし、やりたい事も全部実現できてるんだけど、
これが最適解だって気がしない。
でも、今回はこれでいこう。
あと、クラス変数の宣言の時点で、「(Viewクラス)this.findViewById(R.id&#8230;)」を代入するとコケる。
当然と言えば当然、なのか？
とにかくVBでも似たようなミスをした憶えがあるので、記念に書き留めておく。
☆クロノメーター(Chronometer)を使用するには &#8211; 逆引きAndroid入門
#26
問題をアプリの外部から追加したいんだけど…無理かなぁ。
いろいろ考えたけど、何とも難しそうなのでその対応はやめておこう。
知恵が生まれるほどの知識が蓄えられたら、改めて考えようかしら。
進捗としては、もうゴールの手前ぐらいまで来ている感じがする。
「負けないで」が聞こえてもおかしくないぐらいゴールに近い。
大きなタマネギはすぐそこ。
なんというか、アプリの雰囲気的に『マジカル頭脳パワー』になってきた。
…どーせなら、もっと似せようか。
#27
◎TextViewのsetTextメソッドに、数値（intとかlongとか）を渡すと例外が発生する。
もーちょっとで完成なのに…。
#28
ソース中にコメントも入れ終わったし、ひとまず完成！！

あとがき
どんなアプリを作ったのかを簡単に書いておこうと思う。
【イメージ】

【概要】

『Mosaics』（モザイクス）というゲームアプリ。
『「何か」が25枚のモザイクによって隠されているので、それを制限時間内に当てる』のが目的。
モザイクは数秒おきに1枚ずつはがされていく。残り時間が少なくなると、モザイクの はがれ方も速くなる。
問題がスタートしてから正解するまでが早いほど高得点。得点は100点から減っていき、最低で-50点。
答えがわかれば、回答エリアのすぐ右にある白いボタンを押す。押すと回答モードに入り、タイマーが止まる。ボタンを押さなくても回答は入力できる。
判定ボタンを押すと、入力された回答がチェックされる。正解ならばモザイクが全部はずれて正解用メッセージが表示される。不正解ならばタイマーが再スタート。
こたえボタンを押すと問題終了（「制限時間内に正解できなかった」扱いになる）。

【対応していない事】

インターネットを用いた機能（逆に言えば、圏外でもアプリの動作は可能、なはず）
問題の追加（動的な問題データの追加方法が思い浮かばなかった。特にリソースオブジェクト系の追加について）
点数のセーブ（アプリを終了すると通算の獲得得点がクリアされる）
コンフィグ機能（最高点、最低点、タイマーの開始値、モザイクがめくれる速度 などの諸々の設定が不可）
国際化、メッセージのプロパティ化
「1000点を取ればミステリーツアーにご招待」とか「正解できないから檻から出られない」みたいなもの

などなど
次回予告
次回は、自作アプリ第2弾の実装開始の場面から綴ります。
ありがとうございました。
あわせて読みたい

アンドロイダー育成日記 -Androidと仲良くなるには- その1
アンドロイダー育成日記 -Androidと仲良くなるには- その2(本記事)
アンドロイダー育成日記 -Androidと仲良くなるには- その3

]]></description>
			<content:encoded><![CDATA[<div class="update">
このエントリーは下記の記事の続きです。</p>
<p><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_01.html">アンドロイダー育成日記 -Androidと仲良くなるには- その1</a></p>
</div>
<p>こんにちは。正木です。</p>
<p>おまっとさんでございました。<br />
<a href="http://code.google.com/intl/ja/android/">Google Android</a>向けアプリ作成日記の、続きでございますよ。</p>
<p>それでは、めしあがれ～。<br />
<span id="more-1034"></span><br />
（※ 記事中の役立つ凡例 =&gt; ◎：役立つ教訓 | ☆：役立つ外部リンク）</p>
<h4>前回まで（～#11）</h4>
<p>・Google Android向けアプリの開発環境を作った。<br />
・雑誌<a href="http://gihyo.jp/magazine/SD">『SoftwareDesign』</a>を見ながら、アプリ作成の『いろは』の『い』を見ていった。<br />
・そのほか、コーディングの方法や挙動などを確認した。</p>
<h4>#12</h4>
<p>アプレットの<a href="http://www.droiddraw.org/">『DroidDraw』</a>が、案外使いづらい、のではないか？？</p>
<p>デザインが思い通りいかない事があるんだ。</p>
<p>適当なレイアウトのコンテナみたいなLayoutに、適当なViewを包含させると、<br />
子になっているViewが、マウスでクリックしてもアクティブにならなかったりする（そうなるとViewのプロパティがレイアウト画面から設定できない）。</p>
<p>Visual Studioで、カスタムコントロールのレイアウトをデザインしてる時に顔を出す、<br />
あの「いーっとなる」感じを思い出す。<br />
親コンテナと子コントロールのAnchor プロパティやDockプロパティを適宜設定したけど、<br />
期待していないサイズ変わり方しよるぞ、コイツ、みたいな。</p>
<p>…VSのくだりに何の共通点があるかわかんないけど、とにかくめんどくさい。</p>
<p>「まぁ、ベータ版だしな…」と自分に言い聞かせる。</p>
<h4>#13</h4>
<p>オリジナルアプリの作成を始める事にする。</p>
<p>まずは設計書…のようなものを作る。</p>
<p>テキトーな裏紙に、機能とレイアウトの概要を、嵐のような勢いで書けばハイできあがり♪</p>
<p>（個人的には）面白そうなアプリだと思うのだが…そもそも実現できるのかどうか。</p>
<p>（アプリの概要は<a href="#afterword">「あとがき」</a>を参照のこと。）<br />
<a name="story14"></a></p>
<h4>#14</h4>
<p>なんとなくではあるが、画面レイアウトは構想に近付いてきた。<br />
一部（たとえばEditTextのBackColorやTextColorプロパティを変えたりとかしたり）の設定を除けば、イイ感じ。たぶん。</p>
<p>今後の実装にあたり、気付いた点・不安な点を挙げる。</p>
<ol type="1">
<li>Eclipseの画面レイアウト機能にあるプロパティからでは、ViewのBackColorやTextColorは設定できないのでは？</li>
<li>イメージのリソースは、どこにどうやって持たせるのだ？</li>
<li>おなかへった。</li>
<li>Android端末に、どれだけの負荷をかける事が許されるのか。実機が無くても検証する方法ってないんかな？</li>
<li>自分が作りたいアプリの仕様的に、問題データを簡単に追加したいのだが…。どうやってもたせようか？　ダウンロードとかやっちゃう？</li>
<li>画面レイアウトを作るのは『DroidDraw』だけではしんどい。そもそも、『DroidDraw』のXMLが表示されるエリアは、あれはエディタではないんだな。よくわからないがカーソルキーが死んでしまう時がある。きっかけもわかんない。いきなりお亡くなりになる。なので、『DroidDraw』だけでなく、Eclipseでのレイアウト機能も併用した方がよい。</li>
<li>おなかへってたけど、コーヒー飲んだからちょっとはマシになったかな。</li>
</ol>
<p>※後日談として、上記の疑問点の見解を書いておく。</p>
<ol type="1">
<li>調査せず。今回はソースの中で指定した（ViewのsetTextColorメソッドなどに、android.graphics.Colorクラスの定数を渡す）。</li>
<li>画像ファイル自体は専用のフォルダに保持。ただ、その画像の参照は「パス指定」でなく「画像に割り振られたint型の定数」でやる。</li>
<li>お昼休憩までがんばりましょう。</li>
<li><a href="http://developer.android.com/intl/ja/guide/developing/tools/ddms.html">これ</a>を使えばOKかと。</li>
<li>結局、今回は対応しなかったのでパス。</li>
<li>（上記の意見に変わりなし）</li>
<li>ごはんはちゃんと食べましょう。</li>
</ol>
<h4>#15</h4>
<p>久しぶりに、食事してて「あきらめ」と「敗北感」を悟った。</p>
<p>自分で大盛りをオーダーしときながら…。</p>
<p>パスタは怖い。もーしばらく要らん。</p>
<p>つべこべ言わず作業再開。</p>
<h4>#16</h4>
<p>AndroidのスタートアップJavaクラス（src\(任意のパッケージ)\(一番最初に生成されるクラス).java）のonCreateメソッドは、<br />
<a href="http://www.wicket-ja.org/">Wicket</a>のJavaクラスのコンストラクタメソッドみたいに、<br />
ボタン押下時に何度も何度も呼び出されることはない。</p>
<p>期待通りでちょっと安心。</p>
<h4>#17</h4>
<p>各Viewの可視状態は、boolean値でなくint値で設定しなくちゃならん。<br />
（setVisibilityメソッド とかのパラメータのこと。左記メソッドだと、android.view.Viewクラスの定数（int）を渡す必要がある。）</p>
<p>なんというか、わかりづらい…のは固定観念のせいか！？</p>
<h4>#18</h4>
<p>ねむいでございます。</p>
<h4>#19</h4>
<p>秒変わりきっかけのイベントもフックできた…が、これでいいのか？<br />
タイマーのスタートはできたけど、<br />
「タイマーをストップしてから、再スタートする」というアクションが、これでは実現できないっぽい。<br />
（※ この時点ではandroid.os.Handlerクラスを用いて実装していた。結局は<a href="#story25">#25</a>のような実装になったが、Handlerクラスを使っても「タイマーをストップしてから、再スタートする」のは実現可能であると思われる。）</p>
<p>それ以外の疑問（<a href="#story14">#14で挙げた項目たち</a>）はほとんど解消できた。</p>
<p>ただ新しい疑問も出現したが…それは進捗の証としてヨシとしよう（甘いね）。</p>
<p>あと1日ぐらいで、なんとか使用できるぐらいまでもっていこう。</p>
<p>たかが自己満足のために、<br />
未経験のものに対してここまでコーディングできるものかと、我ながら感心してます。</p>
<p>本日の作業は終了！！</p>
<p>☆<a href="http://sites.google.com/a/gclue.jp/android-docs/54-タイマーイベント">5.4 タイマーイベント ‎(Android Docs(初級編))‎</a><br />
☆<a href="http://www.hakkaku.net/articles/20090212-348">八角研究所 : Android で再開する Java プログラミング（3） &#8211; モグラ叩き</a><br />
☆<a href="http://blog.altemasoft.com/article/30001195.html">デジモノ狂想曲！: Android で タイマー処理 を考えてみた</a></p>
<h4>#20</h4>
<p>おはようございます。</p>
<h4>#21</h4>
<p>今日はなんだか手がよく動く。マリオでいうところの「無敵状態」。</p>
<h4>#22</h4>
<p>無敵状態が終わった。ものの1時間だったですけど。</p>
<h4>#23</h4>
<p>タイマー制御が難しい。thread.sleepが期待通り動いてくれない。<br />
（※ 後日談だが、thread.sleepは実装しなかった。）</p>
<p>☆<a href="http://kousei-inc.com/portal/index.php?勝手にAndroidブログ#d037f76a">勝手にAndroidブログ &#8211; PukiWiki</a></p>
<h4>#24</h4>
<p>並列処理が大事！</p>
<p>☆<a href="http://d.hatena.ne.jp/shuji_w6e/20090701/1246459813">Androidで学ぶ並列処理とGUI &#8211; やさしいデスマーチ</a><br />
<a name="story25"></a></p>
<h4>#25</h4>
<p>秒刻みのイベントをフックするのが難しかったので、<br />
ChronometerとかいうViewのChronometerTickイベントをフックするようにした。</p>
<p>なんか…違うよなぁ。</p>
<p>コーディング量は少なくて済んでるし、やりたい事も全部実現できてるんだけど、<br />
これが最適解だって気がしない。</p>
<p>でも、今回はこれでいこう。</p>
<p>あと、クラス変数の宣言の時点で、「(Viewクラス)this.findViewById(R.id&#8230;)」を代入するとコケる。<br />
当然と言えば当然、なのか？<br />
とにかくVBでも似たようなミスをした憶えがあるので、記念に書き留めておく。</p>
<p>☆<a href="http://www.adakoda.com/android/000127.html">クロノメーター(Chronometer)を使用するには &#8211; 逆引きAndroid入門</a></p>
<h4>#26</h4>
<p>問題をアプリの外部から追加したいんだけど…無理かなぁ。</p>
<p>いろいろ考えたけど、何とも難しそうなのでその対応はやめておこう。</p>
<p>知恵が生まれるほどの知識が蓄えられたら、改めて考えようかしら。</p>
<p>進捗としては、もうゴールの手前ぐらいまで来ている感じがする。<br />
「負けないで」が聞こえてもおかしくないぐらいゴールに近い。<br />
大きなタマネギはすぐそこ。</p>
<p>なんというか、アプリの雰囲気的に<a href="http://ja.wikipedia.org/wiki/マジカル頭脳パワー!!">『マジカル頭脳パワー』</a>になってきた。</p>
<p>…どーせなら、もっと似せようか。</p>
<h4>#27</h4>
<p>◎TextViewのsetTextメソッドに、数値（intとかlongとか）を渡すと例外が発生する。</p>
<p>もーちょっとで完成なのに…。</p>
<h4>#28</h4>
<p>ソース中にコメントも入れ終わったし、ひとまず完成！！<br />
<a name="afterword"></a></p>
<h4>あとがき</h4>
<p>どんなアプリを作ったのかを簡単に書いておこうと思う。</p>
<p>【イメージ】<br />
<img class="size-full wp-image-1044" title="オリジナル第1弾アプリ「Mosaics」" src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/mosaics.png" alt="オリジナル第1弾アプリ「Mosaics」" width="245" height="329" /></p>
<p>【概要】</p>
<ul>
<li>『Mosaics』（モザイクス）というゲームアプリ。</li>
<li>『「何か」が25枚のモザイクによって隠されているので、それを制限時間内に当てる』のが目的。</li>
<li>モザイクは数秒おきに1枚ずつはがされていく。残り時間が少なくなると、モザイクの はがれ方も速くなる。</li>
<li>問題がスタートしてから正解するまでが早いほど高得点。得点は100点から減っていき、最低で-50点。</li>
<li>答えがわかれば、回答エリアのすぐ右にある白いボタンを押す。押すと回答モードに入り、タイマーが止まる。ボタンを押さなくても回答は入力できる。</li>
<li>判定ボタンを押すと、入力された回答がチェックされる。正解ならばモザイクが全部はずれて正解用メッセージが表示される。不正解ならばタイマーが再スタート。</li>
<li>こたえボタンを押すと問題終了（「制限時間内に正解できなかった」扱いになる）。</li>
</ul>
<p>【対応していない事】</p>
<ul>
<li>インターネットを用いた機能（逆に言えば、圏外でもアプリの動作は可能、なはず）</li>
<li>問題の追加（動的な問題データの追加方法が思い浮かばなかった。特にリソースオブジェクト系の追加について）</li>
<li>点数のセーブ（アプリを終了すると通算の獲得得点がクリアされる）</li>
<li>コンフィグ機能（最高点、最低点、タイマーの開始値、モザイクがめくれる速度 などの諸々の設定が不可）</li>
<li>国際化、メッセージのプロパティ化</li>
<li>「1000点を取ればミステリーツアーにご招待」とか「正解できないから檻から出られない」みたいなもの</li>
</ul>
<p>などなど</p>
<h4>次回予告</h4>
<p>次回は、自作アプリ第2弾の実装開始の場面から綴ります。<br />
ありがとうございました。</p>
<h3>あわせて読みたい</h3>
<ul>
<li><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_01.html">アンドロイダー育成日記 -Androidと仲良くなるには- その1</a></li>
<li>アンドロイダー育成日記 -Androidと仲良くなるには- その2(本記事)</li>
<li><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_03.html">アンドロイダー育成日記 -Androidと仲良くなるには- その3</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_02.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_02.html" />
	</item>
		<item>
		<title>アンドロイダー育成日記 -Androidと仲良くなるには- その1</title>
		<link>http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_01.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_01.html#comments</comments>
		<pubDate>Mon, 17 Aug 2009 08:00:47 +0000</pubDate>
		<dc:creator>正木 恵二</dc:creator>
				<category><![CDATA[Google Android]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[アンドロイド]]></category>
		<category><![CDATA[リンク集]]></category>
		<category><![CDATA[作業日誌]]></category>
		<category><![CDATA[初心者]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=1018</guid>
		<description><![CDATA[
このエントリーには続きがあります。
アンドロイダー育成日記 -Androidと仲良くなるには- その2

こんにちは。正木です。
GoogleがAndroidというプラットフォームを発表したのが、いまから2年近く前の2007年下旬。
その頃の私は「VBまっさかり」で、Visual Basic .NetかOracle以外の技術系の情報は、まったく無関心でした。
それから、時は過ぎました。
時流が変わり、世界の経済が変わり、日本の首相が変わり、日本の裁判が変わり、阪神タイガースの監督が変わり、私にも変化が起きて…。
手っ取り早い話が『Androidをさわりはじめた』というワケであります。最近になって。

そこで、でございます。
Android向けアプリ作成にあたり、したためていた私の作業日誌とやらを公開する次第であります。
実際のところ、現在は「これぞAndroidケータイにピッタリ！！」というようなアプリは作るコトができていません。
とか言いながら、読者ターゲットとしては、
・VBやってたんだけど、Androidにも興味がある！！
・VBもわかんないけど、Androidもわかんない！！
・Androidそこそこわかってるけど、初心に帰って学習したい！！
・僕だけ・私だけのアンドロイドを造りたい！！　　お茶の水さんのようになりたい！！
という感じで、なんだかんだで全方位に定めています。結構したたかです。
それでは、ど～ぞ～。
（※ 記事中の役立つ凡例 => ◎：役立つ教訓 &#124; ☆：役立つ外部リンク）
#1
不意に時間ができたので、Androidを触り始める事にした。
最初は、学習するなら『Ajaxとか使えるユーザビリティに優れたJavaフレームワークを使って何か作る！』と意気込んでいたが、ターゲットを探すのに時間がかかり断念した。
…正直に言えば、大事なところで優柔不断さが出た。
でもさぁ、Ajaxにそこまで深い執念がなかったから（時にはイイワケも必要）、
「どーせ時間があるんなら」と思い、漠然とカッコよく輝いて見えていたAndroidに手を出す事にした。
自作アプリで儲けてる人もいらっしゃるみたいだし、
そのうち出てくるであろうchromeOSを触る事になっても、今回の学習で多少のアドバンテージを得られるだろう、という、そんな策略もあったり。
ソースをダウンロードし、エミュレータが起動できる事を確認して、EclipseにAndroid開発用プラグインをインストールして、
Android開発用プロジェクトを作成し（Hello World的なソースが端っから実装されている）、それを実行させる手前まで完了。
「手前まで」と表現したのは、実行したけどうまくいかなかったため。
「SDKの存在が確認できません」だと。なにぃ？？
#2
『@IT』で、興味深い記事を発見。
「見えてきた!? ケータイ以外でのAndroidの適用例 － ＠IT MONOist」
　
何がすごいかって、記事中に出てくるカーナビみたいなヤツを「Androidを初めて触ったエンジニアが片手間で2週間程度で作り上げ」られるんだからすごい。
（カギカッコ内、リンク先より抜粋）
Androidを用いれば、「何を実現させたいか」と「実現方法」が『ある程度』頭に浮かぶだけで、アプリの量産体制に入るコトができるんだろうな、と。
（もっともAndroidだけではないだろうが、Android向けアプリはそういう風に持っていきやすいんだと思う。）
気分を切り替えて、引き続き「SDK失踪事件」の捜査を再開する。
#3
結果から言うと、事件は解決した。
犯人はこの中にいた。
たぶん…私。
はっきりとした理由はわからないけど、
正解を知りもせずに（お手本：Webでの解説サイトを見なかったり とか）、勘だけでやろうとしていたのが間違いだった気がする。
「Eclipse3.5」にアップデートしたり、ディレクトリ構成もWebサイトのお手本（下記リンク先参照）に倣いやってみたところ、
あっさりと「Hello, Android!!」が表示された。
上記の罪を償いながらも、
事件だの何だのと騒いだ割には、わりかし簡単に開発環境が整えられたように感じる。
◎Eclipseからエミュレータ実行コマンドを実行してから、アプリの起動が完了するまで、自分の開発環境だと20秒ぐらい要する（深く突っ込まず目安として捉えてください）。
◎エミュレータ実行時、エミュレータ画面の複数起動は不可。
☆Androidインストール &#8211; PukiWiki
☆Android開発環境のセットアップ &#8211; kariostroの日記

#4
『SoftwareDesign』を使いながら基礎を固めよう、とする。
（2009年3月号にAndroidの特集が組まれていた。2009年8月中旬現在、公式サイトによると同刊は品切れ状態。）
本に載っているサンプルゲームを、実装してみる。
そして、サンプルゲームを実装しつつ、おもしろコトバが本に載っていたのでちょっと紹介してみる。
◎『Androidアプリケーションは、ゲームであろうが何であろうが「画面に何かを表示する」プログラムであることがほとんどです。』（『SoftwareDesign』 2009年3月号より抜粋）
◎『理系の皆さんの大好きな(?)クイックソートと、理系でない皆さんの大好きな(?)バブルソート』（上記と同様）
#5
立体的に表示させる機能があるらしい。特殊なカードを使うみたい。
「なんじゃこりゃ」という驚きが、思わず声になった。
☆FrontPage &#8211; NyARToolkit
#6
「windowsキー + Break」→ 『システムのプロパティを起動』らしい。初めて知った。
#7
『SoftwareDesign』（#4 参照）に記載されていたソースを実装して、
実行させたら、期待している動きになった。
見事にうまくいってしまった。
「絶対にうまいこといくはずない」という直感を覆してまで…。
◎JavaファイルとXMLファイルの書き換えだけでうまくいった。
#8
『GeoPointAPI』のキー取得の為にやる、アカウントの登録ではまる。
「サービス名」とか「ドメイン」とか。サンプルアプリなのに、どう入力すればよいのだ！？
結局、頓挫。
☆シリウスラボのGeoPlatformAPI/GeoPointAPI
#9
暑い。
#10
AndroidアプリのGUIのデザインの定義は、XMLとして保持するらしい。
『どろいどどろう』とかいうヤツで、Visual Studioでのデザイン画面的にレイアウト用ソースの生成が可能。
☆DroidDraw : Graphical User Interface Editor for Android Cell Phone Development and Programming
（リンク先のようなアプレットではなく、クライアントアプリとしても「DroidDraw」は存在する。）
#11
VBでいうところの『テキストボックス・ラベル・ボタンをフォームに貼り付けて、ボタンを押下すると、テキストボックスへの入力値がラベルに反映される』というプログラムができた。
（AbsoluteLayoutの上にTextView・EditText・Buttonを設置して、ButtonのClickをフックする。Javaファイルに5行弱程度で実装可能。）
実現するために然程時間もかからず、またコーディング量も少なく済んで、感心している。
編集したのは、
・「デザイン用のXMLファイル」（res\layout\main.xml）
・「実処理を書いているJavaのメインクラス」（src\(任意のパッケージ)\(一番最初に生成されるクラス).java）
の2つだけ。
Javaのことだから、もっとXMLファイルがごちゃごちゃしてきたりするもんだと思っていたが、そーでもなかった。
☆Javaの学習ならJavaDriveのAndroid入門
次回予告
次回は自作アプリの実装について綴ります。
ありがとうございました。
あわせて読みたい

アンドロイダー育成日記 -Androidと仲良くなるには- その1(本記事)
アンドロイダー育成日記 -Androidと仲良くなるには- その2
アンドロイダー育成日記 -Androidと仲良くなるには- その3


]]></description>
			<content:encoded><![CDATA[<div class="update">
このエントリーには続きがあります。</p>
<p><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_02.html">アンドロイダー育成日記 -Androidと仲良くなるには- その2</a></p>
</div>
<p>こんにちは。正木です。</p>
<p>Googleが<a href="http://code.google.com/intl/ja/android/">Android</a>というプラットフォームを発表したのが、いまから2年近く前の2007年下旬。</p>
<p>その頃の私は「VBまっさかり」で、Visual Basic .NetかOracle以外の技術系の情報は、まったく無関心でした。</p>
<p>それから、時は過ぎました。<br />
時流が変わり、世界の経済が変わり、日本の首相が変わり、日本の裁判が変わり、阪神タイガースの監督が変わり、私にも変化が起きて…。</p>
<p>手っ取り早い話が『Androidをさわりはじめた』というワケであります。最近になって。<br />
<span id="more-1018"></span><br />
そこで、でございます。<br />
Android向けアプリ作成にあたり、したためていた私の作業日誌とやらを公開する次第であります。</p>
<p>実際のところ、現在は「これぞAndroidケータイにピッタリ！！」というようなアプリは作るコトができていません。</p>
<p>とか言いながら、読者ターゲットとしては、</p>
<p>・VBやってたんだけど、Androidにも興味がある！！<br />
・VBもわかんないけど、Androidもわかんない！！<br />
・Androidそこそこわかってるけど、初心に帰って学習したい！！<br />
・僕だけ・私だけのアンドロイドを造りたい！！　　お茶の水さんのようになりたい！！</p>
<p>という感じで、なんだかんだで全方位に定めています。結構したたかです。</p>
<p>それでは、ど～ぞ～。</p>
<p>（※ 記事中の役立つ凡例 => ◎：役立つ教訓 | ☆：役立つ外部リンク）</p>
<h4>#1</h4>
<p>不意に時間ができたので、Androidを触り始める事にした。</p>
<p>最初は、学習するなら『Ajaxとか使えるユーザビリティに優れたJavaフレームワークを使って何か作る！』と意気込んでいたが、ターゲットを探すのに時間がかかり断念した。</p>
<p>…正直に言えば、大事なところで優柔不断さが出た。</p>
<p>でもさぁ、Ajaxにそこまで深い執念がなかったから（時にはイイワケも必要）、<br />
「どーせ時間があるんなら」と思い、漠然とカッコよく輝いて見えていたAndroidに手を出す事にした。</p>
<p>自作アプリで儲けてる人もいらっしゃるみたいだし、<br />
そのうち出てくるであろうchromeOSを触る事になっても、今回の学習で多少のアドバンテージを得られるだろう、という、そんな策略もあったり。</p>
<p>ソースをダウンロードし、エミュレータが起動できる事を確認して、EclipseにAndroid開発用プラグインをインストールして、<br />
Android開発用プロジェクトを作成し（Hello World的なソースが端っから実装されている）、それを実行させる手前まで完了。</p>
<p>「手前まで」と表現したのは、実行したけどうまくいかなかったため。</p>
<p>「SDKの存在が確認できません」だと。なにぃ？？</p>
<h4>#2</h4>
<p>『@IT』で、興味深い記事を発見。</p>
<p><a href="http://monoist.atmarkit.co.jp/fembedded/articles/special/esec2009/report/android/esec2009_androida.html">「見えてきた!? ケータイ以外でのAndroidの適用例 － ＠IT MONOist」</a><br />
　<br />
何がすごいかって、記事中に出てくるカーナビみたいなヤツを「Androidを初めて触ったエンジニアが片手間で2週間程度で作り上げ」られるんだからすごい。<br />
（カギカッコ内、リンク先より抜粋）</p>
<p>Androidを用いれば、「何を実現させたいか」と「実現方法」が『ある程度』頭に浮かぶだけで、アプリの量産体制に入るコトができるんだろうな、と。<br />
（もっともAndroidだけではないだろうが、Android向けアプリはそういう風に持っていきやすいんだと思う。）</p>
<p>気分を切り替えて、引き続き「SDK失踪事件」の捜査を再開する。</p>
<h4>#3</h4>
<p>結果から言うと、事件は解決した。</p>
<p>犯人はこの中にいた。<br />
たぶん…私。</p>
<p>はっきりとした理由はわからないけど、<br />
正解を知りもせずに（お手本：Webでの解説サイトを見なかったり とか）、勘だけでやろうとしていたのが間違いだった気がする。</p>
<p>「Eclipse3.5」にアップデートしたり、ディレクトリ構成もWebサイトのお手本（下記リンク先参照）に倣いやってみたところ、<br />
あっさりと「Hello, Android!!」が表示された。</p>
<p>上記の罪を償いながらも、<br />
事件だの何だのと騒いだ割には、わりかし簡単に開発環境が整えられたように感じる。</p>
<p>◎Eclipseからエミュレータ実行コマンドを実行してから、アプリの起動が完了するまで、自分の開発環境だと20秒ぐらい要する（深く突っ込まず目安として捉えてください）。<br />
◎エミュレータ実行時、エミュレータ画面の複数起動は不可。<br />
☆<a href="http://kousei-inc.com/portal/index.php?Androidインストール">Androidインストール &#8211; PukiWiki</a><br />
☆<a href="http://d.hatena.ne.jp/kariostro/20090401/1238575662">Android開発環境のセットアップ &#8211; kariostroの日記</a><br />
<a name="story4"></a></p>
<h4>#4</h4>
<p>『SoftwareDesign』を使いながら基礎を固めよう、とする。<br />
（2009年3月号にAndroidの特集が組まれていた。2009年8月中旬現在、<a href="http://gihyo.jp/magazine/SD/archive/2009/200903">公式サイトによると同刊は品切れ状態</a>。）</p>
<p>本に載っているサンプルゲームを、実装してみる。</p>
<p>そして、サンプルゲームを実装しつつ、おもしろコトバが本に載っていたのでちょっと紹介してみる。</p>
<p>◎『Androidアプリケーションは、ゲームであろうが何であろうが「画面に何かを表示する」プログラムであることがほとんどです。』（『SoftwareDesign』 2009年3月号より抜粋）<br />
◎『理系の皆さんの大好きな(?)クイックソートと、理系でない皆さんの大好きな(?)バブルソート』（上記と同様）</p>
<h4>#5</h4>
<p>立体的に表示させる機能があるらしい。特殊なカードを使うみたい。</p>
<p>「なんじゃこりゃ」という驚きが、思わず声になった。</p>
<p>☆<a href="http://nyatla.jp/nyartoolkit/wiki/index.php?FrontPage">FrontPage &#8211; NyARToolkit</a></p>
<h4>#6</h4>
<p>「windowsキー + Break」→ 『システムのプロパティを起動』らしい。初めて知った。</p>
<h4>#7</h4>
<p>『SoftwareDesign』（<a href="#story4">#4</a> 参照）に記載されていたソースを実装して、<br />
実行させたら、期待している動きになった。</p>
<p>見事にうまくいってしまった。</p>
<p>「絶対にうまいこといくはずない」という直感を覆してまで…。</p>
<p>◎JavaファイルとXMLファイルの書き換えだけでうまくいった。</p>
<h4>#8</h4>
<p>『GeoPointAPI』のキー取得の為にやる、アカウントの登録ではまる。</p>
<p>「サービス名」とか「ドメイン」とか。サンプルアプリなのに、どう入力すればよいのだ！？</p>
<p>結局、頓挫。</p>
<p>☆<a href="http://lab.cirius.co.jp/">シリウスラボ</a>の<a href="http://lab.cirius.co.jp/index.php?GeoPlatformAPI/GeoPointAPI">GeoPlatformAPI/GeoPointAPI</a></p>
<h4>#9</h4>
<p>暑い。</p>
<h4>#10</h4>
<p>AndroidアプリのGUIのデザインの定義は、XMLとして保持するらしい。</p>
<p>『どろいどどろう』とかいうヤツで、Visual Studioでのデザイン画面的にレイアウト用ソースの生成が可能。</p>
<p>☆<a href="http://www.droiddraw.org/">DroidDraw : Graphical User Interface Editor for Android Cell Phone Development and Programming</a><br />
（リンク先のようなアプレットではなく、クライアントアプリとしても「DroidDraw」は存在する。）</p>
<h4>#11</h4>
<p>VBでいうところの『テキストボックス・ラベル・ボタンをフォームに貼り付けて、ボタンを押下すると、テキストボックスへの入力値がラベルに反映される』というプログラムができた。<br />
（AbsoluteLayoutの上にTextView・EditText・Buttonを設置して、ButtonのClickをフックする。Javaファイルに5行弱程度で実装可能。）</p>
<p>実現するために然程時間もかからず、またコーディング量も少なく済んで、感心している。</p>
<p>編集したのは、<br />
・「デザイン用のXMLファイル」（res\layout\main.xml）<br />
・「実処理を書いているJavaのメインクラス」（src\(任意のパッケージ)\(一番最初に生成されるクラス).java）<br />
の2つだけ。</p>
<p>Javaのことだから、もっとXMLファイルがごちゃごちゃしてきたりするもんだと思っていたが、そーでもなかった。</p>
<p>☆<a href="http://www.javadrive.jp/index.html">Javaの学習ならJavaDrive</a>の<a href="http://www.javadrive.jp/android/index.html">Android入門</a></p>
<h4>次回予告</h4>
<p>次回は自作アプリの実装について綴ります。<br />
ありがとうございました。</p>
<h3>あわせて読みたい</h3>
<ul>
<li>アンドロイダー育成日記 -Androidと仲良くなるには- その1(本記事)</li>
<li><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_02.html">アンドロイダー育成日記 -Androidと仲良くなるには- その2</a>
<li><a href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_03.html">アンドロイダー育成日記 -Androidと仲良くなるには- その3</a>
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_01.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/08/android_beginner_diary_01.html" />
	</item>
		<item>
		<title>Inspiron9400のキーボードを交換してみた</title>
		<link>http://blog.eni.co.jp/tech/2009/08/inspiron9400_keyboard_exchange.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/08/inspiron9400_keyboard_exchange.html#comments</comments>
		<pubDate>Fri, 07 Aug 2009 09:00:17 +0000</pubDate>
		<dc:creator>武輪 恭代</dc:creator>
				<category><![CDATA[コラム]]></category>
		<category><![CDATA[DELL]]></category>
		<category><![CDATA[Inspiron9400]]></category>
		<category><![CDATA[キーボード]]></category>
		<category><![CDATA[交換]]></category>
		<category><![CDATA[換装]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=950</guid>
		<description><![CDATA[こんにちは、武輪です。
私は自宅でDELLのInspiron9400というノートPCを使っていまして。
彼これ何年くらいですかね、結構長く使っているんですけども。
先日の朝ですね、寝起きに寝惚けたままで本をぽんとその上に投げてしまったわけです。
そしたらなんか引っかかったらしく…

Shiftキーが吹っ飛んだ＼(＾o＾)／

なんとかくっつけてみようとするものの、背面の爪部分が折れてて、にんともかんとも。
ざっと調べてみた感じ、ノートPCはメーカーは部品売りなどはしていなく、PC送付→修理(部品交換)な流れのようです。
キートップが壊れてしまった場合は、キーボード丸ごと交換になるそうな。
修理に出せば、キーボード交換は1万～1.5万くらいかかるみたいです。
高いよ…！
そんなわけで、ヤフオクでノートPCのキーボード単体をゲットしまして、自分で交換してみることにしました。
まずは壊れた旧キーボードを外すところからです。
一応バッテリーは外し、ケーブル類も全て外しています。
Inspiron系はキーボードの上部分のカバー右横にマイナスドライバーを挿しこめそうなとこがありますので、そこにマイナスドライバーを挿しこみ、内部の爪を折らないように少し浮かせます。

あとは端っこから内部の爪を折らないよう、慎重に外していきます。
カバーのキーボード側をよく見るとところどころ凹んでいたので、そこをマイナスドライバーでこじ開けていけば割と簡単に外せました。

カバーを外したら、キーボードを少し上にずらしながら外します。

キーボードのケーブルはこんな感じで固定されています。

ちょっと分かりにくいですが、ケーブルが挟まれてるので、それを起こしてあげると簡単に外れます。

あとは外した時の逆の手順で元に戻していきます。
新しいキーボードのケーブルをくっつけ、キーボードをはめ込み、カバーをはめ込んで、完成。

PC起動後、メモ帳などで全部のキーを押してみて軽く動作を確認。
無事交換完了です。
今回は、送料手数料こみこみで5千円ちょっとでキーボードを手に入れれたので、修理依頼に出すよりもずっと早く、リーズナブルに交換することができました。
案外簡単に交換できるので、ノートPCのキーボードが壊れてしまった場合は、自己責任ですが自分で交換することを選択肢に入れてみてもいいかもしれません。
]]></description>
			<content:encoded><![CDATA[<p>こんにちは、武輪です。</p>
<p>私は自宅でDELLのInspiron9400というノートPCを使っていまして。<br />
彼これ何年くらいですかね、結構長く使っているんですけども。</p>
<p>先日の朝ですね、寝起きに寝惚けたままで本をぽんとその上に投げてしまったわけです。<br />
そしたらなんか引っかかったらしく…</p>
<p><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/r0011107-300x225.jpg" alt="Shiftキーが吹っ飛んだ" title="Shiftキーが吹っ飛んだ" width="300" height="225" class="size-medium wp-image-952" /></p>
<p>Shiftキーが吹っ飛んだ＼(＾o＾)／</p>
<p><span id="more-950"></span><br />
なんとかくっつけてみようとするものの、背面の爪部分が折れてて、にんともかんとも。<br />
ざっと調べてみた感じ、ノートPCはメーカーは部品売りなどはしていなく、PC送付→修理(部品交換)な流れのようです。<br />
キートップが壊れてしまった場合は、キーボード丸ごと交換になるそうな。<br />
修理に出せば、キーボード交換は1万～1.5万くらいかかるみたいです。<br />
高いよ…！</p>
<p>そんなわけで、ヤフオクでノートPCのキーボード単体をゲットしまして、自分で交換してみることにしました。</p>
<p>まずは壊れた旧キーボードを外すところからです。<br />
一応バッテリーは外し、ケーブル類も全て外しています。<br />
Inspiron系はキーボードの上部分のカバー右横にマイナスドライバーを挿しこめそうなとこがありますので、そこにマイナスドライバーを挿しこみ、内部の爪を折らないように少し浮かせます。<br />
<img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/r0011108-300x225.jpg" alt="こじ開ける" title="こじ開ける" width="300" height="225" class="alignleft size-medium wp-image-954" /><br clear="all"/></p>
<p>あとは端っこから内部の爪を折らないよう、慎重に外していきます。<br />
カバーのキーボード側をよく見るとところどころ凹んでいたので、そこをマイナスドライバーでこじ開けていけば割と簡単に外せました。<br />
<img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/r0011110-300x225.jpg" alt="カバー外したところ" title="カバー外したところ" width="300" height="225" class="alignleft size-medium wp-image-956" /><br clear="all"/></p>
<p>カバーを外したら、キーボードを少し上にずらしながら外します。<br />
<img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/r0011111-300x225.jpg" alt="キーボード外したところ" title="キーボード外したところ" width="300" height="225" class="alignleft size-medium wp-image-959" /><br clear="all"/></p>
<p>キーボードのケーブルはこんな感じで固定されています。<br />
<img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/r0011115-300x225.jpg" alt="ケーブル固定している状態" title="ケーブル固定している状態" width="300" height="225" class="alignleft size-medium wp-image-961" /><br clear="all"/></p>
<p>ちょっと分かりにくいですが、ケーブルが挟まれてるので、それを起こしてあげると簡単に外れます。<br />
<img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/r0011114-300x225.jpg" alt="ケーブルの固定を外したところ" title="ケーブルの固定を外したところ" width="300" height="225" class="alignleft size-medium wp-image-962" /><br clear="all"/></p>
<p>あとは外した時の逆の手順で元に戻していきます。<br />
新しいキーボードのケーブルをくっつけ、キーボードをはめ込み、カバーをはめ込んで、完成。<br />
<img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/08/r0011116-300x225.jpg" alt="完成" title="完成" width="300" height="225" class="alignleft size-medium wp-image-964" /><br clear="all"/></p>
<p>PC起動後、メモ帳などで全部のキーを押してみて軽く動作を確認。<br />
無事交換完了です。</p>
<p>今回は、送料手数料こみこみで5千円ちょっとでキーボードを手に入れれたので、修理依頼に出すよりもずっと早く、リーズナブルに交換することができました。<br />
案外簡単に交換できるので、ノートPCのキーボードが壊れてしまった場合は、自己責任ですが自分で交換することを選択肢に入れてみてもいいかもしれません。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/08/inspiron9400_keyboard_exchange.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/08/inspiron9400_keyboard_exchange.html" />
	</item>
		<item>
		<title>コマンドを便利に切り替える update-alternatives 使いこなし講座</title>
		<link>http://blog.eni.co.jp/tech/2009/08/update-alternatives.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/08/update-alternatives.html#comments</comments>
		<pubDate>Tue, 04 Aug 2009 04:00:39 +0000</pubDate>
		<dc:creator>白石 将</dc:creator>
				<category><![CDATA[CentOS]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[alternatives]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[update-alternatives]]></category>
		<category><![CDATA[コマンド]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=968</guid>
		<description><![CDATA[こんにちは、プロダクト&#38;サービス事業部の白石です。
唐突ですが、日本はよく豊かな国だと言われることがあります。
それは、ただ単に日本人の所得が高いというわけではなく選択の幅があるからです。
いざ美味しいものを食べたいなと思った時、
日本の料理はもちろんのこと、中華料理、韓国料理、イタリア料理などすぐに見つかります。
さらにちょっと手間を掛けて、大きな街中に足を運んだりするともっと多彩な国のグルメを楽しむことが出来ます。
また、こだわりのあるバーなんかに行くと世界中のお酒が並んでたりしますよね。
こういった選択の幅がある国って他にはなかなか無いそうですよ。
このように何かしようと思った時に、
色々あるものの中から好きなものを選べるのことはとても恵まれていることだと思いませんか?
そんな選択肢を文字通りLinuxに与えてくれるのが update-alternatives というコマンドです。
今回はCentOSでの検証を基に話をしますが、
CentOSの他に、Debian、RedHat系(RHEL、Fedora)にも
この update-alternatives という
シンボリックリンクを管理してデフォルトのコマンドを決定(man参照)するコマンド
があります。
簡単に言うと、複数のバージョン(または似たような機能)を持つプログラムを切り替える(管理する)コマンドです。
CentOSにSUNの Java を入れたことがある方は、一度は使ったことがあるのではないかと思います。
今回はこの update-alternatives コマンドについて解説したいと思います。

目次

update-alternatives とは
update-alternatives の使い方

グループのプログラムを切り替える
グループにプログラムを追加する
グループの状態を表示する
グループからプログラムを削除する
RedHat系ディストリビューションでは使えないオプション

スレーブとは
update-alternatives の簡単なファイル構成

alternatives ディレクトリ ( /etc/alternatives )
管理ディレクトリ ( /var/lib/alternatives )

共通オプション
まとめ
参考ドキュメント
おまけ &#8211; SUNのJDKをCentOS 5.3にインストールする

使用したソフトウェアのバージョン
今回、使用したソフトウェアのバージョンは下記のようになります。



バージョン


CentOS
5.3 x86_64(インストール直後のもの)


update-alternatives
1.3.30.1


update-alternatives とは
長いので使い方のみを知りたい方はこの節は飛ばして、update-alternatives の使い方へどうぞ。
update-alternatives コマンドとは冒頭の通り、
複数のバージョン(または似たような機能)を持つプログラムを切り替える(管理する)コマンド
です。

# which update-alternatives
/usr/sbin/update-alternatives
# ls -l /usr/sbin/update-alternatives
lrwxrwxrwx 1 root root 12  4月 25 02:02 /usr/sbin/update-alternatives -&#62; alternatives

どうやら、update-alternatives は /usr/sbin/alternatives へのシンボリックリンクのようです。
では、/usr/sbin/alternatives を見てみましょう。

# ls -l /usr/sbin/alternatives
-rwxr-xr-x 1 root root 26384  5月 [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちは、プロダクト&amp;サービス事業部の白石です。</p>
<p>唐突ですが、日本はよく豊かな国だと言われることがあります。<br />
それは、ただ単に日本人の所得が高いというわけではなく選択の幅があるからです。</p>
<p>いざ美味しいものを食べたいなと思った時、<br />
日本の料理はもちろんのこと、中華料理、韓国料理、イタリア料理などすぐに見つかります。<br />
さらにちょっと手間を掛けて、大きな街中に足を運んだりするともっと多彩な国のグルメを楽しむことが出来ます。<br />
また、こだわりのあるバーなんかに行くと世界中のお酒が並んでたりしますよね。<br />
こういった選択の幅がある国って他にはなかなか無いそうですよ。</p>
<p>このように何かしようと思った時に、<br />
色々あるものの中から好きなものを選べるのことはとても恵まれていることだと思いませんか?</p>
<p>そんな選択肢を文字通りLinuxに与えてくれるのが <a href="http://linux.die.net/man/8/update-alternatives"><span class="strong">update-alternatives</span></a> というコマンドです。</p>
<p>今回は<a href="http://www.centos.org/">CentOS</a>での検証を基に話をしますが、<br />
CentOSの他に、<a href="http://www.debian.or.jp/">Debian</a>、RedHat系(<a href="http://www.jp.redhat.com/">RHEL</a>、<a href="http://fedoraproject.org/ja/">Fedora</a>)にも<br />
この update-alternatives という</p>
<p><span class="strong">シンボリックリンクを管理してデフォルトのコマンドを決定(man参照)するコマンド</span></p>
<p>があります。<br />
簡単に言うと、<span class="strong">複数のバージョン(または似たような機能)を持つプログラムを切り替える(管理する)コマンド</span>です。</p>
<p>CentOSに<a href="http://java.sun.com/javase/ja/6/download.html">SUNの Java </a>を入れたことがある方は、一度は使ったことがあるのではないかと思います。</p>
<p>今回はこの update-alternatives コマンドについて解説したいと思います。</p>
<p><span id="more-968"></span></p>
<h3 id="contents">目次</h3>
<ol>
<li><a href="#about_alternatives">update-alternatives とは</a></li>
<li><a href="#usage_alternatives">update-alternatives の使い方</a></li>
<ul>
<li><a href="#alternatives_config">グループのプログラムを切り替える</a></li>
<li><a href="#alternatives_install">グループにプログラムを追加する</a></li>
<li><a href="#alternatives_display">グループの状態を表示する</a></li>
<li><a href="#alternatives_remove">グループからプログラムを削除する</a></li>
<li><a href="#unusable_options">RedHat系ディストリビューションでは使えないオプション</a></li>
</ul>
<li><a href="#about_slave">スレーブとは</a></li>
<li><a href="#file_alternatives">update-alternatives の簡単なファイル構成</a></li>
<ul>
<li><a href="#alternatives_directory">alternatives ディレクトリ ( /etc/alternatives )</a></li>
<li><a href="#administration_directory">管理ディレクトリ ( /var/lib/alternatives )</a></li>
</ul>
<li><a href="#common_options">共通オプション</a></li>
<li><a href="#end">まとめ</a></li>
<li><a href="#documents">参考ドキュメント</a></li>
<li><a href="#bonus_install_jdk">おまけ &#8211; SUNのJDKをCentOS 5.3にインストールする</a></li>
</ol>
<h3 id="software_version">使用したソフトウェアのバージョン</h3>
<p>今回、使用したソフトウェアのバージョンは下記のようになります。</p>
<table class="content">
<tr>
<th></th>
<th>バージョン</th>
</tr>
<tr>
<th><a href="http://www.centos.org/">CentOS</a></th>
<td>5.3 x86_64(インストール直後のもの)</td>
</tr>
<tr>
<th><a href="http://linux.die.net/man/8/update-alternatives">update-alternatives</a></th>
<td>1.3.30.1</td>
</tr>
</table>
<h3 id="about_alternatives">update-alternatives とは</h3>
<p>長いので使い方のみを知りたい方はこの節は飛ばして、<a href="#usage_alternatives">update-alternatives の使い方</a>へどうぞ。</p>
<p>update-alternatives コマンドとは冒頭の通り、</p>
<p><span class="strong">複数のバージョン(または似たような機能)を持つプログラムを切り替える(管理する)コマンド</span></p>
<p>です。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968109"><td class="code" id="p968code109"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># which update-alternatives</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>update-alternatives
<span style="color: #666666; font-style: italic;"># ls -l /usr/sbin/update-alternatives</span>
lrwxrwxrwx <span style="color: #000000;">1</span> root root <span style="color: #000000;">12</span>  <span style="color: #000000;">4</span>月 <span style="color: #000000;">25</span> 02:02 <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>update-alternatives -<span style="color: #000000; font-weight: bold;">&gt;</span> alternatives</pre></td></tr></table></div>

<p>どうやら、update-alternatives は /usr/sbin/alternatives へのシンボリックリンクのようです。<br />
では、/usr/sbin/alternatives を見てみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968110"><td class="code" id="p968code110"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># ls -l /usr/sbin/alternatives</span>
<span style="color: #660033;">-rwxr-xr-x</span> <span style="color: #000000;">1</span> root root <span style="color: #000000;">26384</span>  <span style="color: #000000;">5</span>月 <span style="color: #000000;">24</span>  <span style="color: #000000;">2008</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>alternatives</pre></td></tr></table></div>

<p>/usr/sbin/alternatives が本体みたいですね。<br />
ということは、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968111"><td class="code" id="p968code111"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives</span></pre></td></tr></table></div>

<p>とコマンドを実行するよりも、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968112"><td class="code" id="p968code112"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># alternatives</span></pre></td></tr></table></div>

<p>と実行した方が入力の手間が省けますが、<br />
CentOSの『man alternatives』では&#8221;UPDATE-ALTERNATIVES&#8221;となっているので、<br />
本エントリでは基本的に update-alternatives として話を進めることにします。</p>
<p>さて、この update-alternatives ですが、<br />
元はDebianの機能だったのが、現在ではRedHat系のディストリビューションにも移植されています。</p>
<p>今回、update-alternatives の機能を説明をするには、<br />
Java が適しているので Java をもとに簡単にどんな機能なのか見ていきたいと思います。</p>
<p>まずは Java の確認</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968113"><td class="code" id="p968code113"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># which java</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
<span style="color: #666666; font-style: italic;"># java -version</span>
java version <span style="color: #ff0000;">&quot;1.6.0&quot;</span>
OpenJDK  Runtime Environment <span style="color: #7a0874; font-weight: bold;">&#40;</span>build 1.6.0-b09<span style="color: #7a0874; font-weight: bold;">&#41;</span>
OpenJDK <span style="color: #000000;">64</span>-Bit Server VM <span style="color: #7a0874; font-weight: bold;">&#40;</span>build 1.6.0-b09, mixed mode<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></td></tr></table></div>

<p>このことからCentOS 5.3には標準で <a href="http://openjdk.java.net/">OpenJDK</a> が入っていることが分かります。</p>
<p>けれど、実はCentOS 5.3にはデフォルトで Java が2種類入っており、<br />
update-alternatives の機能を利用して管理されています。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968114"><td class="code" id="p968code114"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --config java</span>
&nbsp;
<span style="color: #000000;">2</span> プログラムがあり <span style="color: #ff0000;">'java'</span> を提供します。
&nbsp;
  選択       コマンド
<span style="color: #660033;">-----------------------------------------------</span>
<span style="color: #000000; font-weight: bold;">*</span>+ <span style="color: #000000;">1</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
   <span style="color: #000000;">2</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
&nbsp;
Enter を押して現在の選択 <span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #7a0874; font-weight: bold;">&#93;</span> を保持するか、選択番号を入力します:</pre></td></tr></table></div>

<p>本来はステータスを参照する場合には <code>--display</code> オプションを使用するのですが、<br />
見やすさのため <code>--config</code> オプションを指定しました。</p>
<p>上記の結果から、</p>
<ol>
<li>update-alternatives で管理されている Java グループには OpenJDK と GCJ の2種類がある</li>
<li>プログラムは OpenJDK の方が選択されているっぽい</li>
</ol>
<p>ということが何となく分かると思います。</p>
<p>それでは update-alternatives の機能を使って Java グループのプログラムを切り替えてみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968115"><td class="code" id="p968code115"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --config java</span>
&nbsp;
<span style="color: #000000;">2</span> プログラムがあり <span style="color: #ff0000;">'java'</span> を提供します。
&nbsp;
  選択       コマンド
<span style="color: #660033;">-----------------------------------------------</span>
<span style="color: #000000; font-weight: bold;">*</span>+ <span style="color: #000000;">1</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
   <span style="color: #000000;">2</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
&nbsp;
Enter を押して現在の選択 <span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #7a0874; font-weight: bold;">&#93;</span> を保持するか、選択番号を入力します: <span style="color: #000000;">2</span>    <span style="color: #000000; font-weight: bold;">&lt;</span>---- 入力<span style="color: #000000; font-weight: bold;">!!</span></pre></td></tr></table></div>

<p>では、もう一度 Java の確認を行ってみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968116"><td class="code" id="p968code116"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># which java</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
<span style="color: #666666; font-style: italic;"># java -version</span>
java version <span style="color: #ff0000;">&quot;1.4.2&quot;</span>
gij <span style="color: #7a0874; font-weight: bold;">&#40;</span>GNU libgcj<span style="color: #7a0874; font-weight: bold;">&#41;</span> version 4.1.2 20080704 <span style="color: #7a0874; font-weight: bold;">&#40;</span>Red Hat 4.1.2-44<span style="color: #7a0874; font-weight: bold;">&#41;</span>
&nbsp;
Copyright <span style="color: #7a0874; font-weight: bold;">&#40;</span>C<span style="color: #7a0874; font-weight: bold;">&#41;</span> 2006 Free Software Foundation, Inc.
This is <span style="color: #c20cb9; font-weight: bold;">free</span> software; see the <span style="color: #7a0874; font-weight: bold;">source</span> <span style="color: #000000; font-weight: bold;">for</span> copying conditions.  There is NO
warranty; not even <span style="color: #000000; font-weight: bold;">for</span> MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.</pre></td></tr></table></div>

<p><span class="strong">同じ /usr/bin/java を実行している</span>はずなのにさっきと結果が変わりました!!</p>
<p>これは操作上では同じプログラムを実行しているようでも、<br />
実は update-alternatives が裏で頑張ってプログラムを切り替えてくれているからなんです。</p>
<p>このように</p>
<ul>
<li>複数のバージョンの同一のプログラム</li>
<li>同じジャンルに分類される複数のプログラム</li>
</ul>
<p>などを手軽に切り替えて使えるようにするのが update-alternatives の機能となります。</p>
<h3 id="usage_alternatives">update-alternatives の使い方</h3>
<p>update-alternatives の機能が何となく分かったところで使い方を見ていきましょう。</p>
<p>その前に動作モードと用語の説明をしておきます。</p>
<table class="content">
<caption>動作モード</caption>
<tr>
<th></th>
<th>解説</th>
</tr>
<tr>
<th>自動</th>
<td>update-alternatives が優先度で判断して選択肢を変更する状態。</td>
</tr>
<tr>
<th>手動</th>
<td>rootが行った設定を保持している状態</td>
</tr>
</table>
<table class="content">
<caption>用語</caption>
<tr>
<th></th>
<th>説明</th>
<th>記述例</th>
<tr>
<th>グループ名</th>
<td>update-alternatives で管理されるプログラムのグループ名</td>
<td>java</td>
</tr>
<tr>
<th>実行リンク</th>
<td>update-alternatives の機能を使ってプログラムを実行するためのパス</td>
<td>/usr/bin/java</td>
</tr>
<tr>
<th>プログラムパス</th>
<td>update-alternatives で管理するプログラム(ファイル)のパス</td>
<td>/usr/java/jdk1.6.0_14/bin/java</td>
</tr>
<tr>
<th>優先度</th>
<td>&#8220;自動モード&#8221;の場合、優先度が高いものが選択される</td>
<td>16014</td>
</tr>
</table>
<h4 id="alternatives_config">グループのプログラムを切り替える</h4>
<p>update-alternatives のグループで管理されているプログラムを切り替えます。</p>
<pre><code>update-alternatives --config グループ名
update-alternatives --auto グループ名
update-alternatives --set グループ名 プログラムパス</code></pre>
<p><a href="#about_alternatives">update-alternatives とは</a>での Java グループのプログラム切り替えと同様の手順となります。</p>
<p>では、 Java グループの選択プログラムを OpenJDK から GCJ に切り替えてみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968117"><td class="code" id="p968code117"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --config java</span>
&nbsp;
<span style="color: #000000;">2</span> プログラムがあり <span style="color: #ff0000;">'java'</span> を提供します。
&nbsp;
  選択       コマンド
<span style="color: #660033;">-----------------------------------------------</span>
<span style="color: #000000; font-weight: bold;">*</span>+ <span style="color: #000000;">1</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
   <span style="color: #000000;">2</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
&nbsp;
Enter を押して現在の選択 <span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #7a0874; font-weight: bold;">&#93;</span> を保持するか、選択番号を入力します: <span style="color: #000000;">2</span>    <span style="color: #000000; font-weight: bold;">&lt;</span>---- 入力<span style="color: #000000; font-weight: bold;">!!</span></pre></td></tr></table></div>

<p>もしくは、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968118"><td class="code" id="p968code118"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --set java /usr/lib/jvm/jre-1.4.2-gcj/bin/java</span></pre></td></tr></table></div>

<p>とすることでも切り替わります。<br />
こちらは非対話形式なので、<br />
シェルスクリプトの中でグループの選択プログラムを切り替える際に重宝しそうです。</p>
<p>ちなみに上記の2通りの方法で選択プログラムを切り替えた場合、<br />
グループの動作モードは<span class="strong">&#8220;手動&#8221;</span>に変更されます。</p>
<p>逆に次の方法では、<br />
自動モードに変更することで<span class="strong">&#8220;優先度が最も高いプログラムを選択&#8221;</span>します。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968119"><td class="code" id="p968code119"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --auto java</span></pre></td></tr></table></div>

<p>&#8220;自動&#8221;モードに設定されることにより、<br />
選択されるプログラムが自動で update-alternatives によって決められることになり<span class="strong">優先度の最も高いものが選択</span>されます。</p>
<h4 id="alternatives_install">グループにプログラムを追加する</h4>
<p>指定したプログラムを update-alternatives のグループに追加します。</p>
<pre><code>update-alternatives --install 実行リンク グループ名 プログラムパス 優先度</code></pre>
<p><a href="http://java.sun.com/javase/ja/6/download.html">SUNの JDK1.6.0_update14</a>(以下jdk1.6.0_14) が /usr/java にインストール済みである状態とします。　</p>
<p><a href="#bonus_install_jdk">おまけ &#8211; SUNのJDKをCentOS 5.3にインストールする</a></p>

<div class="wp_codebox"><table width="100%" ><tr id="p968120"><td class="code" id="p968code120"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --install /usr/bin/java java /usr/java/jdk1.6.0_14/bin/java 16014</span></pre></td></tr></table></div>

<p>何も表示されなかった場合にはグループにプログラムが追加されているはずです。</p>
<p>では早速、update-alternatives で管理されている Java グループのリストを見てみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968121"><td class="code" id="p968code121"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --config java</span>
&nbsp;
<span style="color: #000000;">3</span> プログラムがあり <span style="color: #ff0000;">'java'</span> を提供します。
&nbsp;
  選択       コマンド
<span style="color: #660033;">-----------------------------------------------</span>
   <span style="color: #000000;">1</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
 + <span style="color: #000000;">2</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
<span style="color: #000000; font-weight: bold;">*</span>  <span style="color: #000000;">3</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.6.0_14<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
&nbsp;
Enter を押して現在の選択 <span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #7a0874; font-weight: bold;">&#93;</span> を保持するか、選択番号を入力します:</pre></td></tr></table></div>

<p>Java グループの中に jdk1.6.0_14 が追加されているのが確認出来ました。</p>
<h4 id="alternatives_display">グループの状態を表示する</h4>
<p>update-alternatives で管理されているプログラムの状態を表示します。</p>
<pre><code>update-alternatives --display グループ名</code></pre>
<p>Java グループの詳細を見てみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968122"><td class="code" id="p968code122"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --display java</span>
java - ステータスは手動です。
リンクは現在 <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java を指しています。
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java - 優先項目 <span style="color: #000000;">16000</span>
 スレーブ keytool: <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>keytool
    ～中略～
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java - 優先項目 <span style="color: #000000;">1420</span>
 スレーブ keytool: <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>keytool
    ～中略～
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.6.0_14<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java - 優先項目 <span style="color: #000000;">16014</span>
 スレーブ keytool: <span style="color: #7a0874; font-weight: bold;">&#40;</span>null<span style="color: #7a0874; font-weight: bold;">&#41;</span>
    ～中略～
現在の「最適」バージョンは <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.6.0_14<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java です。</pre></td></tr></table></div>

<p>以上のような詳細な状態の確認をすることができます。</p>
<p><code>--display</code> オプションで確認できる内容は、</p>
<ul>
<li>現在の動作モード</li>
<li>現在グループで選択されているプログラム</li>
<li>グループに登録されているプログラムとその優先度</li>
<li>プログラムに関連付けられているスレーブ(後述)</li>
<li>自動モード時に選択されるプログラム</li>
</ul>
<p>となります。</p>
<p>上記の実行結果から、</p>
<ul>
<li>OpenJDK と GCJ と jdk1.6.0_14 の計3種類の Java が update-alternatives で管理されている</li>
<li>OpenJDK の優先度は&#8221;16000&#8243;</li>
<li>GCJ の優先度は&#8221;1420&#8243;</li>
<li>jdk1.6.0_14 の優先度は&#8221;16014&#8243;</li>
<li>現在の動作モードは&#8221;手動&#8221;</li>
<li>現在、jdk1.6.0_14が選択されている</li>
<li>各スレーブの状態</li>
<li>自動モードにした場合、jdk1.6.0_14 が選択される(最適バージョン)</li>
</ul>
<p>ということが読み取れます。</p>
<h4 id="alternatives_remove">グループからプログラムを削除する</h4>
<p>グループに追加済みのプログラムをグループから削除します。</p>
<pre><code>update-alternatives --remove グループ名 プログラムパス</code></pre>
<p>それでは、jdk1.6.0_14 を削除してみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968123"><td class="code" id="p968code123"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --remove java /usr/java/jdk1.6.0_14/bin/java</span></pre></td></tr></table></div>

<p>きちんと削除されたか確認してみます。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968124"><td class="code" id="p968code124"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --config java</span>
&nbsp;
<span style="color: #000000;">2</span> プログラムがあり <span style="color: #ff0000;">'java'</span> を提供します。
&nbsp;
  選択       コマンド
<span style="color: #660033;">-----------------------------------------------</span>
<span style="color: #000000; font-weight: bold;">*</span>  <span style="color: #000000;">1</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
 + <span style="color: #000000;">2</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
&nbsp;
Enter を押して現在の選択 <span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #7a0874; font-weight: bold;">&#93;</span> を保持するか、選択番号を入力します:</pre></td></tr></table></div>

<p>きちんとプログラムパスで指定したものが消えていますね。</p>
<p>グループからプログラムを削除する際に、<br />
&#8220;自動&#8221;モードの場合、選択中のプログラムを削除した場合には、update-alternatives が優先度の大きいものに自動で変更します。<br />
&#8220;手動&#8221;モードの場合には、プログラム情報を削除するだけで選択情報は変更されないみたいです。<br />
また削除後に選択すべきプログラムが無い場合にはグループが削除されます。</p>
<p>ちなみに、プログラムパスを間違えると次のように怒られちゃいます。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968125"><td class="code" id="p968code125"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --remove java /usr/java/jdk1.6.0_14/</span>
<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.6.0_14<span style="color: #000000; font-weight: bold;">/</span> は java の為の互換用として設定されていません。</pre></td></tr></table></div>

<h4 id="unusable_options">RedHat系ディストリビューションでは使えないオプション</h4>
<p>Debianにはあっても、<br />
残念ながらRedHat系ディストリビューションでは使えないオプションがあるようです。</p>
<table class="content">
<caption>RedHat系ディストリビューションでは使えないオプション</caption>
<tr>
<th><code>--list</code></th>
<td>グループ内の管理プログラムを一覧表示する</td>
</tr>
<tr>
<th><code>--remove-all</code></th>
<td>グループごと削除する</td>
</tr>
<tr>
<th><code>--all</code></th>
<td>すべてのグループにたいして <code>--config</code> オプションを呼び出す</td>
</tr>
</table>
<p>使い道の思い浮かばない <code>--all</code> オプションはともかく、<br />
個人的に <code>--list</code> オプションは欲しかったように思います。<br />
<code>--display</code> オプションがありますが、<br />
グループ内のプログラムを参照するだけであれば <code>--config</code> オプションで見た方が視認性が高いかと思います。</p>
<h3 id="about_slave">スレーブとは</h3>
<p>簡単に言ってしまうと、</p>
<p><span class="strong">グループの選択プログラムが変更されると、スレーブとして登録されたプログラムも同時に変更する</span></p>
<p>機能です。</p>
<pre><code>update-alternatives --install 実行リンク グループ名 プログラムパス --slave 実行リンク グループ名 プログラムパス</code></pre>
<p>では今までの流れから、<br />
既に jdk1.6.0_14 が入ってる状態に、<br />
更に <a href="http://java.sun.com/j2se/1.5.0/ja/download.html">JDK1.5.0_update19</a>(以下jdk1.5.0_19) を入れてスレーブ機能を使ってみましょう。</p>
<p>jdk1.5.0_19 をインストールする際に、<br />
既に jdk1.6.0_14 をRPMパッケージでインストールしている場合、<br />
古いバージョンをRPMパッケージでインストール出来ないので、<br />
RPMパッケージを使わずに jdk-1_5_0_19-linux-amd64.bin を展開し /usr/java に配置します。</p>
<p>配置出来たら、jdk1.5.0_19 も update-alternatives で管理させます。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968126"><td class="code" id="p968code126"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># alternatives --install /usr/bin/java java /usr/java/jdk1.5.0_19/bin/java 15019</span></pre></td></tr></table></div>

<p>では、早速 jdk1.5.0_19 に切り替えてみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968127"><td class="code" id="p968code127"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># alternatives --config java</span>
&nbsp;
<span style="color: #000000;">4</span> プログラムがあり <span style="color: #ff0000;">'java'</span> を提供します。
&nbsp;
  選択       コマンド
<span style="color: #660033;">-----------------------------------------------</span>
   <span style="color: #000000;">1</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.6.0-openjdk.x86_64<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
   <span style="color: #000000;">2</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>jvm<span style="color: #000000; font-weight: bold;">/</span>jre-1.4.2-gcj<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
<span style="color: #000000; font-weight: bold;">*</span>+ <span style="color: #000000;">3</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.6.0_14<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
   <span style="color: #000000;">4</span>           <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
&nbsp;
Enter を押して現在の選択 <span style="color: #7a0874; font-weight: bold;">&#91;</span>+<span style="color: #7a0874; font-weight: bold;">&#93;</span> を保持するか、選択番号を入力します:<span style="color: #000000;">4</span></pre></td></tr></table></div>

<p>早速 Java のバージョンを確認。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968128"><td class="code" id="p968code128"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># java -version</span>
java version <span style="color: #ff0000;">&quot;1.5.0_19&quot;</span>
Java<span style="color: #7a0874; font-weight: bold;">&#40;</span>TM<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000;">2</span> Runtime Environment, Standard Edition <span style="color: #7a0874; font-weight: bold;">&#40;</span>build 1.5.0_19-b02<span style="color: #7a0874; font-weight: bold;">&#41;</span>
Java HotSpot<span style="color: #7a0874; font-weight: bold;">&#40;</span>TM<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000;">64</span>-Bit Server VM <span style="color: #7a0874; font-weight: bold;">&#40;</span>build 1.5.0_19-b02, mixed mode<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></td></tr></table></div>

<p>うまく切り替わっているのが確認出来ますね。</p>
<p>しかし、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968129"><td class="code" id="p968code129"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># javac -version</span>
javac 1.6.0_14</pre></td></tr></table></div>

<p>Java はうまく切り替わっていても、<br />
javac は jdk1.6.0_14 のものを使ってしまっています。</p>
<p>javac をはじめ、jar や javadoc など Java の変更に伴って同時に変更したいプログラムがいくつかあります。<br />
一つ一つを丁寧に update-alternatives に登録 &#8211;> 変更と繰り返すことで解決はしますが、<br />
Java を切り替える度にいくつものその他プログラムを切り替えるのは少々骨が折れる作業となります。</p>
<p>そんな時に活用したいのがスレーブ機能です。</p>
<p>スレーブ機能とは最初に紹介した通り、</p>
<p><span class="strong">グループの選択プログラムが変更されると、スレーブとして登録されたプログラムを同時に変更する</span></p>
<p>です。</p>
<p>なんだか今回の事例にピッタリな機能ですよね。</p>
<p>では、早速スレーブ機能を使ってみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968130"><td class="code" id="p968code130"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># alternatives --install /usr/bin/java java /usr/java/jdk1.5.0_19/bin/java 15019\</span>
      <span style="color: #660033;">--slave</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>javac javac <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>javac</pre></td></tr></table></div>

<p><code>--install</code> オプションでの追加時に <code>--slave</code> オプションを設定するだけです。<br />
(既にグループにプログラムが登録済みでも上書き出来ます。)</p>
<p>これでスレーブを保持する jdk1.5.0_19 の追加が出来ました。</p>
<p>では、早速 update-alternatives で jdk1.5.0_19 に切り替えて、<br />
javac がどうなっているか確認してみましょう。<br />
(既に jdk1.5.0_19 の場合は、他に変更後、再度 jdk1.5.0_19 に変更してください)</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968131"><td class="code" id="p968code131"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># javac -version</span>
javac 1.5.0_19</pre></td></tr></table></div>

<p>javac も Java と一緒に更新されていることが確認できました。</p>
<p>このスレーブは <code>--install</code> オプションの設定時に何個でも登録することが出来ます。<br />
複数個の登録の場合には、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968132"><td class="code" id="p968code132"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># alternatives --install /usr/bin/java java /usr/java/jdk1.5.0_19/bin/java 15019\</span>
      <span style="color: #660033;">--slave</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>jar jar <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>jar\
      <span style="color: #660033;">--slave</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>javac javac <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>javac\
      <span style="color: #660033;">--slave</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>javadoc javadoc <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>javadoc</pre></td></tr></table></div>

<p>のように実行してください。</p>
<p>自分で必要なだけスレーブを追加出来るので、<br />
記述は冗長になってしまいますが毎回1つ1つを変更していくよりもはるかに効率的ですね。</p>
<p>ちなみに、<br />
上記の javac の設定だけだと jdk1.6.0_14 に戻した際に、<br />
javac は変更されないので、<br />
jdk1.6.0_14 にも同様に javac などスレーブを設定する必要があります。</p>
<h3 id="file_alternatives">update-alternatives の簡単なファイル構成</h3>
<p>ここでは簡単な update-alternatives のファイル構成を解説したいと思います。</p>
<h4 id="alternatives_directory">alternatives ディレクトリ ( /etc/alternatives )</h4>
<p>update-alternatives の Java グループでどのJavaが選択されていても、<br />
一様に /usr/bin/java を操作すれば問題無く任意の Java を実行することが出来ました。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968133"><td class="code" id="p968code133"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># ls -l /usr/bin/java</span>
lrwxrwxrwx <span style="color: #000000;">1</span> root root <span style="color: #000000;">22</span>  <span style="color: #000000;">4</span>月 <span style="color: #000000;">25</span> 02:04 <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java -<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>alternatives<span style="color: #000000; font-weight: bold;">/</span>java</pre></td></tr></table></div>

<p>この /usr/bin/java が /etc/alternatives/java のシンボリックリンクであることが分かります。</p>
<p>では /etc/alternatives/java も見てみましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968134"><td class="code" id="p968code134"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># ls -l /etc/alternatives/java</span>
lrwxrwxrwx <span style="color: #000000;">1</span> root root <span style="color: #000000;">30</span>  <span style="color: #000000;">8</span>月  <span style="color: #000000;">3</span> 00:<span style="color: #000000;">41</span> <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>alternatives<span style="color: #000000; font-weight: bold;">/</span>java -<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java</pre></td></tr></table></div>

<p>この /etc/alternatives/java が、<br />
グループで選択されたプログラムの実体のシンボリックリンクになっていることが分かります。</p>
<p>つまり、update-alternatives は、<br />
選択したプログラムのシンボリックリンクを作り替えてプログラムを切り替えているみたいですね。</p>
<p>プログラムを実行すると、</p>
<p><span class="strong">実行リンク &#8212;-> /etc/alternatives/グループ名 &#8212;-> プログラムパス</span></p>
<p>のようにプログラム本体を参照しているということになります。</p>
<p>ちなみに /etc/alternatives 以下を参照してみると、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968135"><td class="code" id="p968code135"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># ls -l /etc/alternatives/</span>
合計 <span style="color: #000000;">80</span>
lrwxrwxrwx <span style="color: #000000;">1</span> root root <span style="color: #000000;">19</span>  <span style="color: #000000;">4</span>月 <span style="color: #000000;">25</span> 02:06 antlr -<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>antlr-java
lrwxrwxrwx <span style="color: #000000;">1</span> root root <span style="color: #000000;">30</span>  <span style="color: #000000;">8</span>月  <span style="color: #000000;">3</span> 00:<span style="color: #000000;">41</span> java -<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>java
lrwxrwxrwx <span style="color: #000000;">1</span> root root <span style="color: #000000;">31</span>  <span style="color: #000000;">8</span>月  <span style="color: #000000;">3</span> 00:<span style="color: #000000;">41</span> javac -<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>jdk1.5.0_19<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>javac
    ～後略～</pre></td></tr></table></div>

<p>スレーブで設定した javac もこちらで切り替えるためにシンボリックリンクになっているのが分かります。</p>
<p>この alternatives ディレクトリは、<br />
<code>--altdir</code> オプションにより /etc/alternatives から別のディレクトリに変更することが出来ます。</p>
<h4 id="administration_directory">管理ディレクトリ ( /var/lib/alternatives )</h4>
<p>プログラムを切り替える仕組みは alternatives ディレクトリで確認出来ますが、<br />
グループのモードやスレーブの関係などの情報は管理ディレクトリを見ることで確認することが出来ます。</p>
<p>例えば、Java グループの各情報は /var/lib/alternatives/java にテキストで格納されています。</p>
<p>この管理ファイルの細かいフォーマット形式はよく分かりませんが、<br />
中身はテキストでそのままのことが書いてあるので何となくの情報は読み取れます。</p>
<p>この管理ディレクトリをよく見ると、<br />
スレーブで設定されたグループ(本エントリでは javac)の情報ファイルは作成されていないようですね。</p>
<p>ちなみにこの 管理ディレクトリは、<br />
<code>--admindir</code> オプションにより /var/lib/alternatives から別のディレクトリに変更することが出来ます。</p>
<h3 id="common_options">共通オプション</h3>
<p>管理プログラムの操作(アクション)について一通り説明しましたが、<br />
ここでは全アクションに対応する共通オプションについて解説します。</p>
<table class="content">
<tr>
<th><code>--verbose</code></th>
<td>詳細な情報を表示します。</td>
</tr>
<tr>
<th><code>--quiet</code></th>
<td>エラー以外の情報を表示しません。<span class="red">未実装</span></td>
</tr>
<tr>
<th><code>--test</code></th>
<td>指定した操作をテストします。実際には何も更新されません。<span class="red">未実装</span></td>
</tr>
<tr>
<th><code>--help</code></th>
<td>update-alternatives に関する簡単な使用方法を表示します。</td>
</tr>
<tr>
<th><code>--altdir</code> directory</th>
<td>alternativesディレクトリ(デフォルト : /etc/alternatives(alternatives)を指定したディレクトリに変更します。</td>
</tr>
<tr>
<th><code>--admindir</code> directory</th>
<td>管理ディレクトリ(デフォルト : /var/lib/alternatives)を指定したディレクトリに変更します。</td>
</tr>
</table>
<h3 id="end">まとめ</h3>
<p>さて、ひたすら update-alternatives について説明してみましたがいかがだったでしょうか?</p>
<p>意外と簡単だけど案外知らない人も多い update-alternatives コマンド。<br />
上手に使いこなせれば良い武器になると思います。</p>
<p>ここで、僕のもっぱらの使い方を紹介しましょう。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968136"><td class="code" id="p968code136"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># update-alternatives --config 彼女</span>
&nbsp;
致命的なエラー : 何も登録されていません<span style="color: #000000; font-weight: bold;">!!!</span></pre></td></tr></table></div>

<p><span class="strong">･･･････････orz</span></p>
<h3 id="documents">参考文献</h3>
<ul>
<li><a href="http://linux.die.net/man/8/update-alternatives">update-alternatives(8) &#8211; Linux man page</a></li>
<li><a href="http://www.pinkdragon.net/DocumentsLibrary/contents/ja/Linux_man/update-alternatives.8.html">Linux man &#8211; update-alternatives</a>(Debianのmanですが日本語に翻訳されています)</li>
</ul>
<h3 id="bonus_install_jdk">おまけ &#8211; SUNのJDKをCentOS 5.3にインストールする</h3>
<p>簡単に僕がSUNのJDKをインストールする手順を紹介します。</p>
<p>jdk1.6.0_14 のファイルのURIを<a href="http://java.sun.com/javase/ja/6/download.html">SUNのサイト</a>から拾ってきます。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968137"><td class="code" id="p968code137"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># cd /usr/local/src</span>
<span style="color: #666666; font-style: italic;"># wget http://cds.sun.com/ ～中略～ /FileName=/jdk-6u14-linux-x64-rpm.bin</span>
名前が長いのでリネーム
<span style="color: #666666; font-style: italic;"># mv jdk-6u14-linux-x64-rpm.bin\ ～中略～ \jdk-6u14-linux-x64-rpm.bin jdk-6u14-linux-x64-rpm.bin</span>
<span style="color: #666666; font-style: italic;"># chmod u+x jdk-6u14-linux-x64-rpm.bin</span>
<span style="color: #666666; font-style: italic;"># ./jdk-6u14-linux-x64-rpm.bin</span></pre></td></tr></table></div>

<p>これで /usr/java に jdk1.6.0_14 がインストールされます。</p>
<p>環境変数を設定する場合は ~/.bash_profile に</p>

<div class="wp_codebox"><table width="100%" ><tr id="p968138"><td class="code" id="p968code138"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">JAVA_HOME</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>java<span style="color: #000000; font-weight: bold;">/</span>default
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #007800;">$PATH</span>:<span style="color: #007800;">$JAVA_HOME</span><span style="color: #000000; font-weight: bold;">/</span>bin
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">CLASSPATH</span>=.:<span style="color: #007800;">$JAVA_HOME</span><span style="color: #000000; font-weight: bold;">/</span>jre<span style="color: #000000; font-weight: bold;">/</span>lib:<span style="color: #007800;">$JAVA_HOME</span><span style="color: #000000; font-weight: bold;">/</span>lib:<span style="color: #007800;">$JAVA_HOME</span><span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>tools.jar</pre></td></tr></table></div>

<p>とでも記述しておくと良い感じです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/08/update-alternatives.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/08/update-alternatives.html" />
	</item>
		<item>
		<title>読書とブログ</title>
		<link>http://blog.eni.co.jp/tech/2009/07/reading_and_writing.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/07/reading_and_writing.html#comments</comments>
		<pubDate>Wed, 29 Jul 2009 11:00:46 +0000</pubDate>
		<dc:creator>正木 恵二</dc:creator>
				<category><![CDATA[コラム]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[ブクログ]]></category>
		<category><![CDATA[書評]]></category>
		<category><![CDATA[読書]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=936</guid>
		<description><![CDATA[私ごとで恐縮ではありますが、最近“ブクログ”というブログを始めました。
端的に言ってしまえば「書評」ができるブログです。
ただ、そこは“本”をメインテーマに据えているだけに、
ただの文字の羅列になっていない事が魅力だったりします。

魅力を紹介すると、
例えば「どの本についての紹介されているか」が一目で判ります。
なぜなら、個人のトップページには【本棚】が存在するから。
その本棚に置いてある本を選択すると、
そのブクログ運営者の、その本についての書評が閲覧できます。
本棚への本の並べ方も「通常の表紙」「背表紙」のどちらかを選択することができます。
「Cover Flow」なんていう、どこかで耳にしたような機能もおいおい正式に追加される予定みたいです。
（※「背表紙」…本当の背表紙ではなく、通常の表紙を細長く圧縮し“擬似”背表紙として表示している）
本は「文字の集合体から内容を読み取る」という性質を持っているだけに、
外観だけパッと見ても、探している本が見つかることはそう多くないでしょう。
しかし、ブログとしてのデザインやレイアウトという面からすると、
「表紙の集まり」にする事で、その役割を果たせるのだと思います。
記事のエントリについても、「一括投稿機能」があるので触れておきます。
通常のブログと同じように記事を1つずつエントリできるのはもちろん、
ISBNコードを用いて、複数の本を一括で投稿できるんです。
私もこの機能を使ってみましたが、これはラクですね。
ラクですし、本を読むスピードに関係なく使えるものだと思います。
この仕様を思いついた方はエラい！と思いました。
「一般のブログ」と この「ブクログ」の違いを際立たせる一つの要素になったんではないか、と。
さてさて。
「本は、読んだら読みっぱなし」という方は、やはり多いんではないでしょうか。
私も、恥ずかしながら、読了後は何もアクションを起こさない人です。
その「読書していた過去」に、どう意味を持たせるか。
確かに「本を読んだ」という、一種の満足のような快感はあるでしょうが、
果たして、それが未来の糧になりえるかどうか。快感が長持ちするのかどうか。
読書した事に意味を持たせるようとすると、
例えば、「（読書で思いついた事柄を）ノートにメモを取りながら」など、
色々な方策が（それもまた本によって）挙げられています。
（※「ノートにメモ」… 『読書は1冊のノートにまとめなさい』 奥野宣之 著）
この“ブクログ”で考えてみると、
「読んだ本(の内容)」を「見栄え良く」「万人に」「アウトプット」できることが、
過去を財産として残す一つのアプローチであると考えられるでしょう。
個人的には「twitter」より長く続けていけるような、そんな気がしていますが…どうでしょう。
以上、気になったサービス“ブクログ”の紹介でした！
参考
・ブクログ -ウェブ本棚サービス-　　(筆者のアカウント)
]]></description>
			<content:encoded><![CDATA[<p>私ごとで恐縮ではありますが、最近“ブクログ”というブログを始めました。</p>
<p>端的に言ってしまえば「書評」ができるブログです。</p>
<p>ただ、そこは“本”をメインテーマに据えているだけに、<br />
ただの文字の羅列になっていない事が魅力だったりします。<br />
<span id="more-936"></span></p>
<p>魅力を紹介すると、<br />
例えば「どの本についての紹介されているか」が一目で判ります。</p>
<p>なぜなら、個人のトップページには【本棚】が存在するから。</p>
<p>その本棚に置いてある本を選択すると、<br />
そのブクログ運営者の、その本についての書評が閲覧できます。</p>
<p>本棚への本の並べ方も「通常の表紙」「背表紙」のどちらかを選択することができます。<br />
「Cover Flow」なんていう、どこかで耳にしたような機能もおいおい正式に追加される予定みたいです。<br />
（※「背表紙」…本当の背表紙ではなく、通常の表紙を細長く圧縮し“擬似”背表紙として表示している）</p>
<p>本は「文字の集合体から内容を読み取る」という性質を持っているだけに、<br />
外観だけパッと見ても、探している本が見つかることはそう多くないでしょう。</p>
<p>しかし、ブログとしてのデザインやレイアウトという面からすると、<br />
「表紙の集まり」にする事で、その役割を果たせるのだと思います。</p>
<p>記事のエントリについても、「一括投稿機能」があるので触れておきます。</p>
<p>通常のブログと同じように記事を1つずつエントリできるのはもちろん、<br />
ISBNコードを用いて、複数の本を一括で投稿できるんです。</p>
<p>私もこの機能を使ってみましたが、これはラクですね。<br />
ラクですし、本を読むスピードに関係なく使えるものだと思います。</p>
<p>この仕様を思いついた方はエラい！と思いました。<br />
「一般のブログ」と この「ブクログ」の違いを際立たせる一つの要素になったんではないか、と。</p>
<p>さてさて。</p>
<p>「本は、読んだら読みっぱなし」という方は、やはり多いんではないでしょうか。<br />
私も、恥ずかしながら、読了後は何もアクションを起こさない人です。</p>
<p>その「読書していた過去」に、どう意味を持たせるか。</p>
<p>確かに「本を読んだ」という、一種の満足のような快感はあるでしょうが、<br />
果たして、それが未来の糧になりえるかどうか。快感が長持ちするのかどうか。</p>
<p>読書した事に意味を持たせるようとすると、<br />
例えば、「（読書で思いついた事柄を）ノートにメモを取りながら」など、<br />
色々な方策が（それもまた本によって）挙げられています。<br />
（※「ノートにメモ」… 『読書は1冊のノートにまとめなさい』 奥野宣之 著）</p>
<p>この“ブクログ”で考えてみると、<br />
「読んだ本(の内容)」を「見栄え良く」「万人に」「アウトプット」できることが、<br />
過去を財産として残す一つのアプローチであると考えられるでしょう。</p>
<p>個人的には「twitter」より長く続けていけるような、そんな気がしていますが…どうでしょう。</p>
<p>以上、気になったサービス“ブクログ”の紹介でした！</p>
<h3>参考</h3>
<p>・<a href="http://booklog.jp/">ブクログ -ウェブ本棚サービス-</a>　　(<a href="http://booklog.jp/users/kmskmskmsk">筆者のアカウント</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/07/reading_and_writing.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/07/reading_and_writing.html" />
	</item>
		<item>
		<title>SeleniumRCで自己署名証明書使用のWEBアプリケーションをテストする際、セキュリティ警告を表示させない方法</title>
		<link>http://blog.eni.co.jp/tech/2009/07/selenium_firefox_self_signed_ssl.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/07/selenium_firefox_self_signed_ssl.html#comments</comments>
		<pubDate>Thu, 23 Jul 2009 01:33:58 +0000</pubDate>
		<dc:creator>笹山 昭秀</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[テスト]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Profile]]></category>
		<category><![CDATA[自動テスト]]></category>
		<category><![CDATA[自己署名証明書]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=901</guid>
		<description><![CDATA[こんにちは。プロダクト&#38;サービス事業部の笹山です。
前回のブログ(Seleniumの自動テストを止めることなく、Flexを手動操作する方法)で「FlashSeleniumについて調査をして、このブログに公開できたら・・・」などと書きましたが、全く調査できておりません。お詫び申し上げます。
前回のブログ執筆時後、SeleniumRCのバージョンも1.0.1に上がっていますし、FlashSeleniumもSeleniumRC1.0互換のものが出ているようです。
ですから、現時点では「あっさり動いてしまう？」のかもしれません。
今回もSeleniumRCネタではありますが「SeleniumRCで自己署名証明書使用のWEBアプリケーションをテストする際、Firefoxからのセキュリティ警告を表示させない方法」について書きたいと思います。

自己署名証明書使用のWEBアプリケーションをテストする際の問題
SSL対応のWEBアプリケーションのテストを行う際に、自己署名証明書を作成してテストすることは多いと思います。
SeleniumRCで自己署名証明書使用のWEBアプリケーションのテストを行うことはもちろん可能です。
しかし、面倒くさい操作が発生してしまうのです。
サーバに接続する際に、「信頼できない接続 &#8211; 接続の安全性を確認できません」と警告が出ます。
例外として追加しても毎回警告が表示され、そのたびに例外に追加する操作を行わなければいけません。
これでは、SeleniumRCを用いての自動テストの意味がありません。
問題の解決方法
これを解決する方法が分かりました。ただしFirefoxでのみです。
FirefoxでSeleniumServer用のProfileを作成し、SeleniumServer起動時にそのProfileを指定させれば良いのです。
それでは、まず最初にFirefoxでSeleniumServer用のProfileを作成する手順について説明します。
SeleniumServer用のProfile作成手順

アクセサリ-ファイル名を指定して実行でFirefoxのProfileManagerを起動します
firefox.exe -ProfileManager

「新しいプロファイルを作成」でSelenium用のプロファイルを作成します

プロファイル作成ウィザードで順番に作成していきます
※安全のため保存先は、Selenium用のフォルダを作成し、そのフォルダを指定することをお勧めします

Selenium用のプロファイル作成後、作成したプロファイルを指定して自己署名証明書使用のサイトにアクセスします
「信頼できない接続 &#8211; 接続の安全性を確認できません」と警告が出ます

自己署名証明書使用のサイトを例外として追加し、セキュリティ例外を承認します


後にも先にも、Firefoxで自己署名証明書使用のサイトを例外として追加する操作はこの1回だけです。
次に、SeleniumServerへProfileを指定する方法を説明します。
JUnitテストソースでSeleniumServer起動時にProfileを指定させるコード
使用するProfileを指定して、SeleniumServerを起動するコードです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 自己署名証明書使用のURL
testUrl = &#34;https://localhost:8443&#34;;
&#160;
// テストを行うブラウザ
testBrowser = &#34;*firefox&#34;;
&#160;
// SeleniumServerのインスタンス化
seleniumServer = new SeleniumServer&#40;&#41;;
&#160;
// Selenium用プロファイルの指定 --------- ここから -------------
RemoteControlConfiguration config = seleniumServer.getConfiguration&#40;&#41;;
config.setFirefoxProfileTemplate&#40;new File&#40;&#34;D:\\firefox_selenium&#34;&#41;&#41;;
// Selenium用プロファイルの指定 --------- ここまで -------------
&#160;
// SeleniumServerの起動
seleniumServer.start&#40;&#41;;
&#160;
// seleniumClientを起動
selenium = new DefaultSelenium&#40;&#34;localhost&#34;, 4444, testBrowser, testUrl&#41;;
selenium.start&#40;&#41;;

selenium-server.jarファイル実行時にProfileを指定させる方法
上記のJUnitのテストケースではなく、別途SeleniumServerを起動してテストを行う場合は、以下のコマンドを実行してください。
java -jar selenium-server.jar -firefoxProfileTemplate d:\\selenium-firefox
最後に
これで通常通りSeleniumRCで自動テストを実行すると、わずらわしい警告は出なくなるはずです。
Firefoxのみの対処方法でしたが、IEやその他ブラウザでの解決方法はまだ分かっていません。
調査を続行していこうと思っています。（FlashSeleniumの調査も忘れずに！）
あわせて読みたい
Seleniumの自動テストを止めることなく、Flexを手動操作する方法
]]></description>
			<content:encoded><![CDATA[<p>こんにちは。プロダクト&amp;サービス事業部の笹山です。</p>
<p><a href="http://blog.eni.co.jp/tech/2009/05/selenium_wait.html">前回のブログ</a>(<a href="http://blog.eni.co.jp/tech/2009/05/selenium_wait.html">Seleniumの自動テストを止めることなく、Flexを手動操作する方法</a>)で「FlashSeleniumについて調査をして、このブログに公開できたら・・・」などと書きましたが、全く調査できておりません。お詫び申し上げます。</p>
<p><a href="http://blog.eni.co.jp/tech/2009/05/selenium_wait.html">前回のブログ</a>執筆時後、<a title="Selenium" href="http://seleniumhq.org/" target="_blank">SeleniumRC</a>のバージョンも1.0.1に上がっていますし、<a title="FlashSelenium" href="http://code.google.com/p/flash-selenium/downloads/list" target="_blank">FlashSelenium</a>もSeleniumRC1.0互換のものが出ているようです。<br />
ですから、現時点では「あっさり動いてしまう？」のかもしれません。</p>
<p>今回もSeleniumRCネタではありますが「SeleniumRCで自己署名証明書使用のWEBアプリケーションをテストする際、Firefoxからのセキュリティ警告を表示させない方法」について書きたいと思います。<br />
<span id="more-901"></span></p>
<h3>自己署名証明書使用のWEBアプリケーションをテストする際の問題</h3>
<p>SSL対応のWEBアプリケーションのテストを行う際に、自己署名証明書を作成してテストすることは多いと思います。</p>
<p>SeleniumRCで自己署名証明書使用のWEBアプリケーションのテストを行うことはもちろん可能です。<br />
しかし、面倒くさい操作が発生してしまうのです。</p>
<p>サーバに接続する際に、「信頼できない接続 &#8211; 接続の安全性を確認できません」と警告が出ます。<br />
<div id="attachment_895" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_warn_ssl.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_warn_ssl-300x183.png" alt="警告 - 信頼できない接続" title="警告 - 信頼できない接続" width="300" height="183" class="size-medium wp-image-895" /></a><p class="wp-caption-text">警告 - 信頼できない接続</p></div></p>
<p>例外として追加しても毎回警告が表示され、そのたびに例外に追加する操作を行わなければいけません。<br />
これでは、SeleniumRCを用いての自動テストの意味がありません。</p>
<h3 class="caption">問題の解決方法</h3>
<p>これを解決する方法が分かりました。ただしFirefoxでのみです。<br />
FirefoxでSeleniumServer用のProfileを作成し、SeleniumServer起動時にそのProfileを指定させれば良いのです。</p>
<p>それでは、まず最初にFirefoxでSeleniumServer用のProfileを作成する手順について説明します。</p>
<h3>SeleniumServer用のProfile作成手順</h3>
<ol>
<li>アクセサリ-ファイル名を指定して実行でFirefoxのProfileManagerを起動します<br />
<div id="attachment_896" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/exec_firefox_profilemanger.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/exec_firefox_profilemanger-300x178.png" alt="ファイル名を指定して実行 - ProfileManager" title="ファイル名を指定して実行 - ProfileManager" width="300" height="178" class="size-medium wp-image-896" /></a><p class="wp-caption-text">ファイル名を指定して実行 - ProfileManager</p></div></p>
<pre>firefox.exe -ProfileManager</pre>
</li>
<li>「新しいプロファイルを作成」でSelenium用のプロファイルを作成します<br />
<div id="attachment_897" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_profilemanager_add_profile.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_profilemanager_add_profile-300x173.png" alt="新しいプロファイルを作成" title="新しいプロファイルを作成" width="300" height="173" class="size-medium wp-image-897" /></a><p class="wp-caption-text">新しいプロファイルを作成</p></div>
</li>
<li>プロファイル作成ウィザードで順番に作成していきます<br />
<span style="color: #ff0000;">※安全のため保存先は、Selenium用のフォルダを作成し、そのフォルダを指定することをお勧めします</span><br />
<div id="attachment_898" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_profilemanager_wizard.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_profilemanager_wizard-300x226.png" alt="プロファイル作成ウィザード" title="プロファイル作成ウィザード" width="300" height="226" class="size-medium wp-image-898" /></a><p class="wp-caption-text">プロファイル作成ウィザード</p></div>
</li>
<li>Selenium用のプロファイル作成後、作成したプロファイルを指定して自己署名証明書使用のサイトにアクセスします<br />
「信頼できない接続 &#8211; 接続の安全性を確認できません」と警告が出ます<br />
<div id="attachment_895" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_warn_ssl.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_warn_ssl-300x183.png" alt="警告 - 信頼できない接続" title="警告 - 信頼できない接続" width="300" height="183" class="size-medium wp-image-895" /></a><p class="wp-caption-text">警告 - 信頼できない接続</p></div>
</li>
<li>自己署名証明書使用のサイトを例外として追加し、セキュリティ例外を承認します<br />
<div id="attachment_900" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_warn_exception_site.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_warn_exception_site-300x253.png" alt="例外として追加" title="例外として追加" width="300" height="253" class="size-medium wp-image-900" /></a><p class="wp-caption-text">例外として追加</p></div></p>
<p><div id="attachment_899" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_add_exception_site.png"><img src="http://blog.eni.co.jp/tech/wp-content/uploads/2009/07/firefox_add_exception_site-300x300.png" alt="セキュリティ例外を承認" title="セキュリティ例外を承認" width="300" height="300" class="size-medium wp-image-899" /></a><p class="wp-caption-text">セキュリティ例外を承認</p></div>
</li>
</ol>
<p>後にも先にも、Firefoxで自己署名証明書使用のサイトを例外として追加する操作はこの1回だけです。</p>
<p>次に、SeleniumServerへProfileを指定する方法を説明します。</p>
<h3>JUnitテストソースでSeleniumServer起動時にProfileを指定させるコード</h3>
<p>使用するProfileを指定して、SeleniumServerを起動するコードです。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p901140"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code" id="p901code140"><pre class="java" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// 自己署名証明書使用のURL</span>
testUrl <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;https://localhost:8443&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// テストを行うブラウザ</span>
testBrowser <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;*firefox&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// SeleniumServerのインスタンス化</span>
seleniumServer <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SeleniumServer<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Selenium用プロファイルの指定 --------- ここから -------------</span>
RemoteControlConfiguration config <span style="color: #339933;">=</span> seleniumServer.<span style="color: #006633;">getConfiguration</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
config.<span style="color: #006633;">setFirefoxProfileTemplate</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Afile+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">File</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;D:<span style="color: #000099; font-weight: bold;">\\</span>firefox_selenium&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// Selenium用プロファイルの指定 --------- ここまで -------------</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// SeleniumServerの起動</span>
seleniumServer.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// seleniumClientを起動</span>
selenium <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> DefaultSelenium<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;localhost&quot;</span>, 4444, testBrowser, testUrl<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
selenium.<span style="color: #006633;">start</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<h3>selenium-server.jarファイル実行時にProfileを指定させる方法</h3>
<p>上記のJUnitのテストケースではなく、別途SeleniumServerを起動してテストを行う場合は、以下のコマンドを実行してください。</p>
<pre>java -jar selenium-server.jar -firefoxProfileTemplate d:\\selenium-firefox</pre>
<h3>最後に</h3>
<p>これで通常通りSeleniumRCで自動テストを実行すると、わずらわしい警告は出なくなるはずです。</p>
<p>Firefoxのみの対処方法でしたが、IEやその他ブラウザでの解決方法はまだ分かっていません。<br />
調査を続行していこうと思っています。（FlashSeleniumの調査も忘れずに！）</p>
<h3>あわせて読みたい</h3>
<p><a href="http://blog.eni.co.jp/tech/2009/05/selenium_wait.html">Seleniumの自動テストを止めることなく、Flexを手動操作する方法</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.eni.co.jp/tech/2009/07/selenium_firefox_self_signed_ssl.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.eni.co.jp/tech/2009/07/selenium_firefox_self_signed_ssl.html" />
	</item>
		<item>
		<title>Solr/SolrJ1.3のCoreAdmin(マルチコア)機能を用いて動的にCoreを追加する方法(SolrJのバグの対処方法)</title>
		<link>http://blog.eni.co.jp/tech/2009/07/apache_solr_13_coreadmin_multicore_solved.html</link>
		<comments>http://blog.eni.co.jp/tech/2009/07/apache_solr_13_coreadmin_multicore_solved.html#comments</comments>
		<pubDate>Wed, 15 Jul 2009 06:38:05 +0000</pubDate>
		<dc:creator>kubo@eni.co.jp</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Solr]]></category>
		<category><![CDATA[プログラム]]></category>
		<category><![CDATA[全文検索]]></category>
		<category><![CDATA[CoreAdmin]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[SolrJ]]></category>
		<category><![CDATA[マルチコア]]></category>

		<guid isPermaLink="false">http://blog.eni.co.jp/tech/?p=863</guid>
		<description><![CDATA[こんにちは。
株式会社イージーネット プロダクト&#038;サービス事業部 の久保です。
前回書いたSolrの記事 全文検索サーバ: これからSolrを始める人のためのApache Solr概要と便利なリンク集 はおかげさまで沢山のアクセス/ブックマークをいただきました。
来週火曜日の7/21には、Lucene/Solrで有名なロンウイットの関口さん(参考: 関口宏司のLuceneブログ)などが参加されるSolr勉強会も開催されるようですので、Solr人気は高まっているのかもしれません。
今回は前回から変わって小さなネタになりますが、
Solr/SolrJ1.3のCoreAdmin(マルチコア)機能を用いて動的にCoreを追加する際にはまるSolrJのバグと、その対処方法について書きます。

Solr1.3のマルチコア機能とは
単純に言うと、1つのSolrアプリケーション(サーブレットアプリケーション)の上で、論理的に複数のSolrアプリケーションを動かすことができる機能です。
詳しくは前回の記事の「マルチコア構成」をご覧ください。
Coreを追加するためのURL(Query String)
Coreを追加するのに必要なURL(Query String)は次のようになります。
(参考URL: Solr Wiki &#8211; CoreAdmin)

http://server/solr/admin/cores?action=CREATE&#38;name=[name]&#38;instanceDir=[dir]&#38;config=[solrconfig]&#38;schema=[schema]

(例)

http://testserver:8080/solr/admin/cores?action=CREATE&#38;name=test&#38;instanceDir=test&#38;config=/solr/conf/solrconfig.xml&#38;schema=/solr/conf/schema.xml



[name]
coreに付ける名前(例: test)


[dir]
coreのディレクトリ名(例: test)


[solrconfig]
solrconfig.xmlファイルのパス(例: /solr/conf/solrconfig.xml)


[schema]
schema.xmlファイル(例: /solr/conf/schema.xml)


SolrJを使った場合の問題
SolrJのver1.3において、SolrCoreAdminRequestのcreateCoreメソッドを使った以下のコードは失敗します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package jp.co.eni.solr.test;
&#160;
import java.io.IOException;
import java.net.MalformedURLException;
&#160;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
import org.apache.solr.client.solrj.request.CoreAdminRequest;
import org.apache.solr.client.solrj.response.CoreAdminResponse;
&#160;
//失敗する
public class FailedCoreCreateTest &#123;
	public static void main&#40;String&#91;&#93; args&#41; &#123;
		try &#123;
			// SolrのURL
			String url = &#34;http://server/solr/&#34;;
			// coreの名前
			String coreName = &#34;failed&#34;;
			// coreのディレクトリ名
			String instanceDir = &#34;failed&#34;;
&#160;
			SolrServer server = new CommonsHttpSolrServer&#40;url&#41;;
			CoreAdminResponse response = CoreAdminRequest.createCore&#40;coreName, instanceDir, [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちは。<br />
<a href="http://www.eni.co.jp/">株式会社イージーネット</a> プロダクト&#038;サービス事業部 の久保です。</p>
<p>前回書いたSolrの記事 <a href="http://blog.eni.co.jp/tech/2009/05/apache_solr_13_overview_and_link.html">全文検索サーバ: これからSolrを始める人のためのApache Solr概要と便利なリンク集</a> はおかげさまで沢山のアクセス/ブックマークをいただきました。<br />
来週火曜日の7/21には、Lucene/Solrで有名なロンウイットの関口さん(参考: <a href="http://lucene.jugem.jp/">関口宏司のLuceneブログ</a>)などが参加される<a href="http://atnd.org/events/937">Solr勉強会</a>も開催されるようですので、Solr人気は高まっているのかもしれません。</p>
<p>今回は前回から変わって小さなネタになりますが、<br />
Solr/SolrJ1.3のCoreAdmin(マルチコア)機能を用いて動的にCoreを追加する際にはまるSolrJのバグと、その対処方法について書きます。</p>
<p><span id="more-863"></span></p>
<h3>Solr1.3のマルチコア機能とは</h3>
<p>単純に言うと、1つのSolrアプリケーション(サーブレットアプリケーション)の上で、論理的に複数のSolrアプリケーションを動かすことができる機能です。<br />
詳しくは<a href="http://blog.eni.co.jp/tech/2009/05/apache_solr_13_overview_and_link.html#multicore">前回の記事の「マルチコア構成」</a>をご覧ください。</p>
<h3>Coreを追加するためのURL(Query String)</h3>
<p>Coreを追加するのに必要なURL(Query String)は次のようになります。<br />
(参考URL: <a href="http://wiki.apache.org/solr/CoreAdmin">Solr Wiki &#8211; CoreAdmin</a>)</p>

<div class="wp_codebox"><table width="100%" ><tr id="p863149"><td class="code" id="p863code149"><pre class="java" style="font-family:monospace;">http<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">//server/solr/admin/cores?action=CREATE&amp;name=[name]&amp;instanceDir=[dir]&amp;config=[solrconfig]&amp;schema=[schema]</span></pre></td></tr></table></div>

<p>(例)</p>

<div class="wp_codebox"><table width="100%" ><tr id="p863150"><td class="code" id="p863code150"><pre class="java" style="font-family:monospace;">http<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">//testserver:8080/solr/admin/cores?action=CREATE&amp;name=test&amp;instanceDir=test&amp;config=/solr/conf/solrconfig.xml&amp;schema=/solr/conf/schema.xml</span></pre></td></tr></table></div>

<table class="content">
<tr>
<th>[name]</th>
<td>coreに付ける名前(例: test)</td>
</tr>
<tr>
<th>[dir]</th>
<td>coreのディレクトリ名(例: test)</td>
</tr>
<tr>
<th>[solrconfig]</th>
<td>solrconfig.xmlファイルのパス(例: /solr/conf/solrconfig.xml)</td>
</tr>
<tr>
<th>[schema]</th>
<td>schema.xmlファイル(例: /solr/conf/schema.xml)</td>
</tr>
</table>
<h3>SolrJを使った場合の問題</h3>
<p>SolrJのver1.3において、SolrCoreAdminRequestのcreateCoreメソッドを使った以下のコードは失敗します。</p>

<div class="wp_codebox"><table width="100%" ><tr id="p863151"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code" id="p863code151"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">jp.co.eni.solr.test</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.net.MalformedURLException</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.SolrServer</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.SolrServerException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.impl.CommonsHttpSolrServer</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.request.CoreAdminRequest</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">org.apache.solr.client.solrj.response.CoreAdminResponse</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">//失敗する</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> FailedCoreCreateTest <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000066; font-weight: bold;">void</span> main<span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> args<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">// SolrのURL</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> url <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;http://server/solr/&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// coreの名前</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> coreName <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;failed&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #666666; font-style: italic;">// coreのディレクトリ名</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Astring+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">String</span></a> instanceDir <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;failed&quot;</span><span style="color: #339933;">;</span>
&nbsp;
			SolrServer server <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> CommonsHttpSolrServer<span style="color: #009900;">&#40;</span>url<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			CoreAdminResponse response <span style="color: #339933;">=</span> CoreAdminRequest.<span style="color: #006633;">createCore</span><span style="color: #009900;">&#40;</span>coreName, instanceDir, server<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Asystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">System</span></a>.<span style="color: #006633;">out</span>.<span style="color: #006633;">println</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;qtime: &quot;</span> <span style="color: #339933;">+</span> response.<span style="color: #006633;">getQTime</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Amalformedurlexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">MalformedURLException</span></a> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span>SolrServerException e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aioexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">IOException</span></a> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>失敗の原因は、上記コードにより生成されるHTTP RequestのQuery Stringにあります。<br />
エラーのログを見ると、</p>

<div class="wp_codebox"><table width="100%" ><tr id="p863152"><td class="code" id="p863code152"><pre class="java" style="font-family:monospace;"><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aexception+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Exception</span></a> in thread <span style="color: #0000ff;">&quot;main&quot;</span> org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">solr</span>.<span style="color: #006633;">common</span>.<span style="color: #006633;">SolrException</span><span style="color: #339933;">:</span> Internal Server <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aerror+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Error</span></a>
&nbsp;
Internal Server <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3Aerror+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span style="color: #003399;">Error</span></a>
&nbsp;
request<span style="color: #339933;">:</span> http<span style="color: #339933;">:</span><span style="color: #666666; font-style: italic;">//server/solr/admin/cores?action=CREATE&amp;core=failed&amp;instanceDir=failed&amp;wt=javabin&amp;version=2.2</span>
	at org.<span style="color: #006633;">apache</span>.<span style="color: #006633;">solr</span>.<span style="color: #006633;">client</span>.<span style="color: #006633;">solrj</span>.<span style="color: #006633;">impl</sp