<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7079435250629241522</id><updated>2011-11-28T10:16:44.715+09:00</updated><category term='Flex'/><category term='その他'/><category term='Webサービス'/><category term='jQueryMobile'/><category term='JavaScript'/><category term='Chrome'/><category term='Android'/><category term='データベース'/><category term='Java'/><category term='Ruby'/><category term='HTML5'/><category term='ExtJS'/><title type='text'>「しゃむ」のメモ書き程度</title><subtitle type='html'>「しゃむ」がメモ書きに使ってるブログだじぇ。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>66</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-3737436383175488930</id><published>2011-07-31T12:41:00.000+09:00</published><updated>2011-07-31T12:41:11.157+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Androidアプリ入門～メニュー編～だじぇ</title><content type='html'>Androidアプリのメニューには大きく分けて「オプションメニュー」「コンテキストメニュー」「サブメニュー」の3つがあるそうです。&lt;br /&gt;&lt;br /&gt;オプションメニューは、メニューボタンを押すと大体のアプリで画面下部に出てくるボタンです。&lt;br /&gt;&lt;br /&gt;次にコンテキストメニュー。Androidのスマートフォン初心者の私はまず「コンテキストメニュー？PCのあれっぽいやつ？そんなのあったの？」って思いました。特定のビューを長めにタップすればいいんだそうです。ちょっとスマフォレベルが上がりました。&lt;br /&gt;&lt;br /&gt;最後にサブメニュー。まあ、メニューの入れ子状態です。親・子の2世代まで可能っぽい。&lt;br /&gt;一番右側の画像の状態。これはオプションメニューの親メニューを押しています。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="float:left;"&gt;&lt;a href="http://1.bp.blogspot.com/-NRGxgEF1Jj4/TjTCUwyftjI/AAAAAAAAAME/Gts4c36ZVyM/s1600/option_menu.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="320" width="192" src="http://1.bp.blogspot.com/-NRGxgEF1Jj4/TjTCUwyftjI/AAAAAAAAAME/Gts4c36ZVyM/s320/option_menu.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="float:left;"&gt;&lt;a href="http://4.bp.blogspot.com/-6FoX0_q32CM/TjTC2dWc2MI/AAAAAAAAAMM/9trIhjcnf70/s1600/context_menu.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="320" width="192" src="http://4.bp.blogspot.com/-6FoX0_q32CM/TjTC2dWc2MI/AAAAAAAAAMM/9trIhjcnf70/s320/context_menu.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="float:left;"&gt;&lt;a href="http://2.bp.blogspot.com/-EN3cW8f4Mh0/TjTDGfuyz-I/AAAAAAAAAMU/lB35OaiTq_4/s1600/sub_menu.png" imageanchor="1" style="clear:left; float:left;margin-right:1em; margin-bottom:1em"&gt;&lt;img border="0" height="320" width="192" src="http://2.bp.blogspot.com/-EN3cW8f4Mh0/TjTDGfuyz-I/AAAAAAAAAMU/lB35OaiTq_4/s320/sub_menu.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;br /&gt;メニューを作成するには、XMLファイルで定義してそれを読み込ませるか、コード内でガリガリ書くのどちらかになります。&lt;br /&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;XMLファイル&lt;/div&gt;まあこんな感じです。&lt;br /&gt;ファイルはres/xmlディレクトリに配置します（ディレクトリが無ければ作りましょう）。&lt;br /&gt;これはオプションメニューのXMLファイルです。コンテキストメニューも同じように作ればおｋ。&lt;br /&gt;checkableBehaviorを使うとチェック可能なUIにしてくれます。&lt;br /&gt;コンテキストメニューの場合はステートレスなので、自分で状態管理が必要になります。&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&amp;lt;?xml&amp;nbsp;version=&amp;quot;1.0&amp;quot;&amp;nbsp;encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;menu&amp;nbsp;xmlns:android=&amp;quot;http://schemas.android.com/apk/res/android&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/user&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:icon=&amp;quot;@drawable/user&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:title=&amp;quot;@string/user&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/group&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:icon=&amp;quot;@drawable/group&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:title=&amp;quot;@string/group&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/parent2&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:title=&amp;quot;親メニュー&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;menu&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;group&amp;nbsp;android:checkableBehavior=&amp;quot;single&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/red&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:title=&amp;quot;赤&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/blue&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:title=&amp;quot;青&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/group&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/menu&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/item&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/mob1&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:title=&amp;quot;モブ&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/mob2&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:title=&amp;quot;モブ&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/mob3&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:title=&amp;quot;モブ&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/mob4&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:title=&amp;quot;モブ&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;item&amp;nbsp;android:id=&amp;quot;@+id/mob5&amp;quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:title=&amp;quot;モブ&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;lt;/menu&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;Javaコード&lt;/div&gt;&lt;br /&gt;&lt;pre class="code"&gt;public class MenuSampleActivity extends Activity {&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    protected void onCreate(Bundle savedInstanceState) {&lt;br /&gt;        super.onCreate(savedInstanceState);&lt;br /&gt;        this.setContentView(R.layout.menu_sample);&lt;br /&gt;&lt;br /&gt;        &lt;span class="emphasis"&gt;// ボタンにコンテキストメニューを登録。&lt;br /&gt;        // これで長めタップでコンテキストメニューを出せるようになる。&lt;/span&gt;&lt;br /&gt;        Button button1 = (Button) this.findViewById(R.id.button1);&lt;br /&gt;        registerForContextMenu(button1);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="emphasis"&gt;// オプションメニュー生成&lt;/span&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public boolean onCreateOptionsMenu(Menu menu) {&lt;br /&gt;        MenuInflater inflater = this.getMenuInflater();&lt;br /&gt;        inflater.inflate(R.menu.option_menu , menu);&lt;br /&gt;&lt;br /&gt;        return true;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="emphasis"&gt;// オプションメニュー選択時の処理振り分け&lt;/span&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public boolean onOptionsItemSelected(MenuItem item) {&lt;br /&gt;        switch(item.getItemId()) {&lt;br /&gt;            case R.id.user:&lt;br /&gt;                debug("selected user menu");&lt;br /&gt;                return true;&lt;br /&gt;            case R.id.group:&lt;br /&gt;                debug("selected group menu");&lt;br /&gt;                return true;&lt;br /&gt;            case R.id.red:&lt;br /&gt;            case R.id.blue:&lt;br /&gt;                item.setChecked(!item.isChecked());&lt;br /&gt;                return true;&lt;br /&gt;            default:&lt;br /&gt;                return super.onOptionsItemSelected(item);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="emphasis"&gt;// コンテキストメニュー生成&lt;/span&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public void onCreateContextMenu(ContextMenu menu, View v,&lt;br /&gt;            ContextMenuInfo menuInfo) {&lt;br /&gt;&lt;br /&gt;        super.onCreateContextMenu(menu, v, menuInfo);&lt;br /&gt;        MenuInflater inflater = getMenuInflater();&lt;br /&gt;&lt;br /&gt;        switch(v.getId()) {&lt;br /&gt;        case R.id.button1:&lt;br /&gt;            inflater.inflate(R.menu.context_menu, menu);&lt;br /&gt;            break;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="emphasis"&gt;// コンテキストメニュー選択時の処理振り分け&lt;/span&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public boolean onContextItemSelected(MenuItem item) {&lt;br /&gt;        debug("call onContextItemSelected");&lt;br /&gt;        switch (item.getItemId()) {&lt;br /&gt;        case R.id.edit:&lt;br /&gt;            return true;&lt;br /&gt;        case R.id.delete:&lt;br /&gt;            return true;&lt;br /&gt;        default:&lt;br /&gt;            return super.onContextItemSelected(item);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    @Override&lt;br /&gt;    public boolean onPrepareOptionsMenu(Menu menu) {&lt;br /&gt;        &lt;span class="emphasis"&gt;// Android2.3まではオプションメニューを開く度に、ここの処理が呼び出される。&lt;br /&gt;        // Android3.0からはinvalidateOptionsMenuを明示的に呼ばないと、ここの処理は呼ばれない。&lt;/span&gt;&lt;br /&gt;        debug("call onPrepareOptionsMenu");&lt;br /&gt;        return super.onPrepareOptionsMenu(menu);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private void debug(String msg) {&lt;br /&gt;        Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ﾉｼ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-3737436383175488930?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/3737436383175488930/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2011/07/android.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/3737436383175488930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/3737436383175488930'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2011/07/android.html' title='Androidアプリ入門～メニュー編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-NRGxgEF1Jj4/TjTCUwyftjI/AAAAAAAAAME/Gts4c36ZVyM/s72-c/option_menu.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-6385020394791954739</id><published>2011-07-05T01:13:00.000+09:00</published><updated>2011-07-05T01:13:56.190+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQueryMobile'/><title type='text'>jQuery Mobileのテーマを変えてみるじぇ</title><content type='html'>jQuery Mobileのテーマは、デフォルトでa～eパターンが用意されています。&lt;br /&gt;data-role="page"を指定したDOMにdata-theme属性としてaとかbを設定すれば、ツールバーやパネルの色が変わります。&lt;br /&gt;実際のcssを見ると、パターンごとに大きく区切って記述してありました。&lt;br /&gt;それに習って、f、gといったパターンを自分で作れば独自のテーマを作れそうです。&lt;br /&gt;&lt;br /&gt;ただ色の値は同じものを使っていることが多かったので、Compassで変数としました。&lt;br /&gt;分からないセレクタもあったので、それは放置しています。&lt;br /&gt;jQuery Mobileのスタイルを生成するサイトとか作ろうと思えばベースにできるかも（やんないけど）。&lt;br /&gt;&lt;br /&gt;試しに作ってみました。&lt;br /&gt;&lt;a href="http://sham-memo.appspot.com/html/jquery_mobile/page06/sample2.jsp" target="_blank"&gt;[ サンプル ]&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;@charset "UTF-8";&lt;br /&gt;&lt;br /&gt;@import 'compass/css3';&lt;br /&gt;&lt;br /&gt;// メニューバー&lt;br /&gt;$bar-border-color: #8B0000;&lt;br /&gt;$bar-bgcolor-top: #CD5C5C;&lt;br /&gt;$bar-bgcolor-bottom: #A52A2A;&lt;br /&gt;$bar-text-color: #ffffff;&lt;br /&gt;$bar-text-color-shadow: #000000;&lt;br /&gt;// ボディ&lt;br /&gt;$body-bgcolor-top: #FFE4E1;&lt;br /&gt;$body-bgcolor-bottom: #FFECEC;&lt;br /&gt;$body-text-color: #696969;&lt;br /&gt;$body-text-color-shadow: #000;&lt;br /&gt;// ボタン&lt;br /&gt;$btn-up-border: #222;&lt;br /&gt;$btn-up-bgcolor-top: #A52A2A;&lt;br /&gt;$btn-up-bgcolor-bottom: #B22222;&lt;br /&gt;$btn-up-text: #fff;&lt;br /&gt;$btn-up-text-shadow: #000;&lt;br /&gt;$btn-down-border: #000;&lt;br /&gt;$btn-down-bgcolor-top: #A52A2A;&lt;br /&gt;$btn-down-bgcolor-bottom: #B22222;&lt;br /&gt;$btn-down-text: #fff;&lt;br /&gt;$btn-down-text-shadow: #000;&lt;br /&gt;$btn-hover-border: #000;&lt;br /&gt;$btn-hover-bgcolor-top: #800000;&lt;br /&gt;$btn-hover-bgcolor-bottom: #A52A2A;&lt;br /&gt;$btn-hover-text: #fff;&lt;br /&gt;$btn-hover-text-shadow: #000;&lt;br /&gt;// リンク&lt;br /&gt;$link-text: #8B4513;&lt;br /&gt;&lt;br /&gt;.ui-bar-f {&lt;br /&gt;  border: 1px solid $bar-border-color;&lt;br /&gt;  @include background($bar-bgcolor-bottom);&lt;br /&gt;  color: $bar-text-color;&lt;br /&gt;  font-weight: bold;&lt;br /&gt;  text-shadow: 0 -1px 1px $bar-text-color-shadow;&lt;br /&gt;  @include background-image(linear-gradient(top, $bar-bgcolor-top, $bar-bgcolor-bottom));&lt;br /&gt;}&lt;br /&gt;.ui-bar-f,&lt;br /&gt;.ui-bar-f input,&lt;br /&gt;.ui-bar-f select,&lt;br /&gt;.ui-bar-f textarea,&lt;br /&gt;.ui-bar-f button {&lt;br /&gt;  font-family: Helvetica, Arial, sans-serif;&lt;br /&gt;}&lt;br /&gt;.ui-bar-f .ui-link-inherit {&lt;br /&gt;  color: #fff;&lt;br /&gt;}&lt;br /&gt;.ui-bar-f .ui-link {&lt;br /&gt;  color: #7cc4e7;&lt;br /&gt;  font-weight: bold;&lt;br /&gt;}&lt;br /&gt;.ui-body-f {&lt;br /&gt;  border: 1px solid $bar-border-color;&lt;br /&gt;  @include background($body-bgcolor-bottom);&lt;br /&gt;  color: $body-text-color;&lt;br /&gt;  text-shadow: 0 1px 0 $body-text-color-shadow;&lt;br /&gt;  font-weight: normal;&lt;br /&gt;  @include background-image(linear-gradient(top, $body-bgcolor-top, $body-bgcolor-bottom));&lt;br /&gt;}&lt;br /&gt;.ui-body-f,&lt;br /&gt;.ui-body-f input,&lt;br /&gt;.ui-body-f select,&lt;br /&gt;.ui-body-f textarea,&lt;br /&gt;.ui-body-f button {&lt;br /&gt;  font-family: Helvetica, Arial, sans-serif;&lt;br /&gt;}&lt;br /&gt;.ui-body-f .ui-link-inherit {&lt;br /&gt;  color: #fff;&lt;br /&gt;}&lt;br /&gt;.ui-body-f .ui-link {&lt;br /&gt;  color: $link-text;&lt;br /&gt;  font-weight: bold;&lt;br /&gt;}&lt;br /&gt;.ui-br {&lt;br /&gt;  border-bottom: rgb(130,130,130);&lt;br /&gt;  border-bottom: rgba(130,130,130,.3);&lt;br /&gt;  border-bottom-width: 1px;&lt;br /&gt;  border-bottom-style: solid;&lt;br /&gt;}&lt;br /&gt;.ui-btn-up-f {&lt;br /&gt;  border: 1px solid $btn-up-border;&lt;br /&gt;  @include background($btn-up-bgcolor-bottom);&lt;br /&gt;  font-weight: bold;&lt;br /&gt;  color: $btn-up-text;&lt;br /&gt;  text-shadow: 0 -1px 1px $btn-up-text-shadow;&lt;br /&gt;  @include background-image(linear-gradient(top, $btn-up-bgcolor-top, $btn-up-bgcolor-bottom));&lt;br /&gt;}&lt;br /&gt;.ui-btn-up-f a.ui-link-inherit {&lt;br /&gt;  color: #fff;&lt;br /&gt;}&lt;br /&gt;.ui-btn-hover-f {&lt;br /&gt;  border: 1px solid $btn-hover-border;&lt;br /&gt;  @include background($btn-hover-bgcolor-bottom);&lt;br /&gt;  font-weight: bold;&lt;br /&gt;  color: $btn-hover-text;&lt;br /&gt;  text-shadow: 0 -1px 1px $btn-hover-text-shadow;&lt;br /&gt;  @include background-image(linear-gradient(top, $btn-hover-bgcolor-top, $btn-hover-bgcolor-bottom));&lt;br /&gt;}&lt;br /&gt;.ui-btn-hover-f a.ui-link-inherit {&lt;br /&gt;  color: #fff;&lt;br /&gt;}&lt;br /&gt;.ui-btn-down-f {&lt;br /&gt;  border: 1px solid $btn-down-border;&lt;br /&gt;  @include background($btn-down-bgcolor-bottom);&lt;br /&gt;  font-weight: bold;&lt;br /&gt;  color: $btn-down-text;&lt;br /&gt;  text-shadow: 0 -1px 1px $btn-down-text-shadow;&lt;br /&gt;  @include background-image(linear-gradient(top, $btn-down-bgcolor-top, $btn-down-bgcolor-bottom));&lt;br /&gt;}&lt;br /&gt;.ui-btn-down-f a.ui-link-inherit {&lt;br /&gt;  color: #fff;&lt;br /&gt;}&lt;br /&gt;.ui-btn-up-f,&lt;br /&gt;.ui-btn-hover-f,&lt;br /&gt;.ui-btn-down-f {&lt;br /&gt;  font-family: Helvetica, Arial, sans-serif;&lt;br /&gt;  text-decoration: none;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-6385020394791954739?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/6385020394791954739/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2011/07/jquery-mobile_05.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6385020394791954739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6385020394791954739'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2011/07/jquery-mobile_05.html' title='jQuery Mobileのテーマを変えてみるじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-445403267853039108</id><published>2011-07-03T22:36:00.001+09:00</published><updated>2011-07-03T23:48:18.195+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQueryMobile'/><title type='text'>jQuery Mobileで動的ページを表示するじぇ</title><content type='html'>jQuery Mobileのページ遷移はクセがあります。&lt;br /&gt;基本的にaタグをクリックすると、Ajaxでリクエストを投げて、その結果を同じ画面上にDOMを追加してから画面を切り替えるようになっています。&lt;br /&gt;そして、DOMの追加はリクエストのURLが異なると、その分だけ生成されるようになっています。&lt;br /&gt;そのためGETリクエストの場合、パラメータを含まれる場合、URLがhttp://・・・?param=○○のようになるため、違うページとしてDOMが生成されます。&lt;br /&gt;&lt;br /&gt;少しでもDOMの生成を抑えたい場合は、POSTリクエストにすると良いです。&lt;br /&gt;POSTならパラメータの内容に関わらず、URLは同じなので。&lt;br /&gt;formタグに、methodを指定していないと内部的に呼び出される$.mobile.changePage関数はgetでリクエストを送ってしまうとドキュメントに書いてありました。&lt;br /&gt;指定がないときはpostにしてよ・・・。&lt;br /&gt;&lt;br /&gt;ってことで、aタグでパラメータを変えないといけない場合は、javascriptを経由してPOSTリクエストを送るようにしたほうがDOMの数を抑えられます。&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&amp;lt;div&amp;nbsp;data-role=&amp;quot;page&amp;quot;&amp;nbsp;id=&amp;quot;top&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;nbsp;data-role=&amp;quot;header&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;トップページ&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;nbsp;data-role=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;script&amp;nbsp;type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;switchPage(param)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$.mobile.changePage({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;url:&amp;nbsp;'Dynamic.jsp',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;type:&amp;nbsp;'post',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data:&amp;nbsp;'param='&amp;nbsp;+&amp;nbsp;param&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;},&amp;nbsp;'slide',&amp;nbsp;false,&amp;nbsp;true);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href=&amp;quot;#&amp;quot;&amp;nbsp;onclick=&amp;quot;switchPage(1)&amp;quot;&amp;gt;データ1&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href=&amp;quot;#&amp;quot;&amp;nbsp;onclick=&amp;quot;switchPage(2)&amp;quot;&amp;gt;データ2&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href=&amp;quot;#&amp;quot;&amp;nbsp;onclick=&amp;quot;switchPage(3)&amp;quot;&amp;gt;データ3&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-445403267853039108?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/445403267853039108/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2011/07/jquery-mobile.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/445403267853039108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/445403267853039108'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2011/07/jquery-mobile.html' title='jQuery Mobileで動的ページを表示するじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-724901714894421790</id><published>2011-06-26T23:33:00.000+09:00</published><updated>2011-07-05T01:33:33.708+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQueryMobile'/><title type='text'>mobileinitイベントで初期処理させるじぇ</title><content type='html'>jQuery Mobile本家サイトのドキュメントを意訳してくださっている方がいらっしゃいました。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dev.screw-axis.com/doc/jquery_mobile/api/configuring_defaults/#/doc/jquery_mobile/" target="_blank"&gt;http://dev.screw-axis.com/doc/jquery_mobile/api/configuring_defaults/#/doc/jquery_mobile/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;助かります。ホントに助かります。&lt;br /&gt;&lt;br /&gt;jQuery Mobileではdoucumentoオブジェクトにmobileinitイベントっていうので共通で使う定数なんかを設定できるらしいです。&lt;br /&gt;&lt;br /&gt;例えば、ダイアログ左上の×ボタンのalt値なんかは定数になっていて、これを変更する場合はここでやったら全体に反映できます。&lt;br /&gt;どんな共通項目があるのか把握しておかないと。&lt;br /&gt;&lt;br /&gt;明らかに、jQuery Mobileが拡張・追加したイベント。&lt;br /&gt;直訳すると「モバイル初期イベント」って感じでしょうか？？&lt;br /&gt;&lt;br /&gt;こんな感じにイベント設定しろとのこと。&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;$(document).bind(&amp;quot;mobileinit&amp;quot;,&amp;nbsp;function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;//apply&amp;nbsp;overrides&amp;nbsp;here&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;注意点としては、&lt;span class="emphasis"&gt;jQuery Mobileのライブラリを読み込む前に実行すること&lt;/span&gt;です。&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&amp;lt;script&amp;nbsp;src=&amp;quot;jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;b&gt;&amp;lt;script&amp;nbsp;src=&amp;quot;custom-scripting.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;/b&gt;   ←この位置で実行&lt;br /&gt;&amp;lt;script&amp;nbsp;src=&amp;quot;jquery-mobile.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;共通の定数なんかは、$.mobileオブジェクトが保有していて、$.extend関数で上書きできるぽ。&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;$(document).bind(&amp;quot;mobileinit&amp;quot;,&amp;nbsp;function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;$.extend(&amp;nbsp;&amp;nbsp;$.mobile&amp;nbsp;,&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foo:&amp;nbsp;bar&lt;br /&gt;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;こうでもいいらしいです。&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;$(document).bind(&amp;quot;mobileinit&amp;quot;,&amp;nbsp;function(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;$.mobile.foo&amp;nbsp;=&amp;nbsp;bar;&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-724901714894421790?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/724901714894421790/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2011/06/mobileinit.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/724901714894421790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/724901714894421790'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2011/06/mobileinit.html' title='mobileinitイベントで初期処理させるじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-951037329728530151</id><published>2011-06-20T02:07:00.000+09:00</published><updated>2011-06-20T02:07:12.705+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQueryMobile'/><title type='text'>jQuery Mobileのダイアログを試してみたじぇ</title><content type='html'>ダイアログって、画面上に表示される小窓だと思うんだけど・・・&lt;br /&gt;jQuery Mobileのダイアログは元の画面上全体に被さる画面が表示されるんだねー。&lt;br /&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;方法&lt;/div&gt;aタグにdata-rel属性として値"dialog"を設定すると、href属性に指定した内容がダイアログとして表示されます。&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&amp;lt;a&amp;nbsp;href=&amp;quot;dialog.html&amp;quot;&amp;nbsp;&lt;span class="emphasis"&gt;data-rel=&amp;quot;dialog&amp;quot;&lt;/span&gt;&amp;gt;Open&amp;nbsp;Dialog&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;aタグにdata-transition属性を指定すると、ポップアップやスライドダウンの表現でダイアログを表示できます。&lt;br /&gt;&lt;pre class="code"&gt;&amp;lt;a&amp;nbsp;href=&amp;quot;dialog.html&amp;quot;&amp;nbsp;data-rel=&amp;quot;dialog&amp;quot;&amp;nbsp;&lt;span class="emphasis"&gt;data-transition=&amp;quot;slidedown&amp;quot;&lt;/span&gt;&amp;gt;&amp;quot;slidedown&amp;quot;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;サンプルソース&lt;/div&gt;&lt;pre class="code"&gt;&amp;lt;div&amp;nbsp;data-role=&amp;quot;page&amp;quot;&amp;nbsp;id=&amp;quot;foo&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;data-role=&amp;quot;header&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;h1&amp;gt;Foo&amp;lt;/h1&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;data-role=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href=&amp;quot;dialog.html&amp;quot;&amp;nbsp;data-rel=&amp;quot;dialog&amp;quot;&amp;gt;Open&amp;nbsp;Dialog（data-transition指定なし）&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href=&amp;quot;dialog.html&amp;quot;&amp;nbsp;data-rel=&amp;quot;dialog&amp;quot;&amp;nbsp;data-transition=&amp;quot;slide&amp;quot;&amp;gt;&amp;quot;slide&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href=&amp;quot;dialog.html&amp;quot;&amp;nbsp;data-rel=&amp;quot;dialog&amp;quot;&amp;nbsp;data-transition=&amp;quot;slideup&amp;quot;&amp;gt;&amp;quot;slideup&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href=&amp;quot;dialog.html&amp;quot;&amp;nbsp;data-rel=&amp;quot;dialog&amp;quot;&amp;nbsp;data-transition=&amp;quot;slidedown&amp;quot;&amp;gt;&amp;quot;slidedown&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href=&amp;quot;dialog.html&amp;quot;&amp;nbsp;data-rel=&amp;quot;dialog&amp;quot;&amp;nbsp;data-transition=&amp;quot;pop&amp;quot;&amp;gt;&amp;quot;pop&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href=&amp;quot;dialog.html&amp;quot;&amp;nbsp;data-rel=&amp;quot;dialog&amp;quot;&amp;nbsp;data-transition=&amp;quot;fade&amp;quot;&amp;gt;&amp;quot;fade&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href=&amp;quot;dialog.html&amp;quot;&amp;nbsp;data-rel=&amp;quot;dialog&amp;quot;&amp;nbsp;data-transition=&amp;quot;flip&amp;quot;&amp;gt;&amp;quot;flip&amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;data-role=&amp;quot;footer&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;h4&amp;gt;Page&amp;nbsp;Footer&amp;lt;/h4&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div&amp;nbsp;data-role=&amp;quot;page&amp;quot;&amp;nbsp;id=&amp;quot;bar&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;data-role=&amp;quot;header&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;h1&amp;gt;Bar&amp;lt;/h1&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;data-role=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;I'm&amp;nbsp;first&amp;nbsp;in&amp;nbsp;the&amp;nbsp;source&amp;nbsp;order&amp;nbsp;so&amp;nbsp;I'm&amp;nbsp;shown&amp;nbsp;as&amp;nbsp;the&amp;nbsp;page.&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href=&amp;quot;#foo&amp;quot;&amp;gt;Back&amp;nbsp;to&amp;nbsp;foo&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;data-role=&amp;quot;footer&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;h4&amp;gt;Page&amp;nbsp;Footer&amp;lt;/h4&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-951037329728530151?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/951037329728530151/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2011/06/jquery-mobile_20.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/951037329728530151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/951037329728530151'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2011/06/jquery-mobile_20.html' title='jQuery Mobileのダイアログを試してみたじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-8734851274180628184</id><published>2011-06-14T09:53:00.000+09:00</published><updated>2011-06-14T09:53:03.884+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQueryMobile'/><title type='text'>jQuery Mobileでアニメーション付きページ遷移を試してみたじぇ</title><content type='html'>スマフォなんかでお馴染みのアニメーション付きの画面遷移。&lt;br /&gt;ユーザに画面の遷移を通知する手段として、非常にクールな方法の1つです。&lt;br /&gt;jQuery Mobileではどうやるんだろう？&lt;br /&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;方法&lt;/div&gt;aタグにdata-transition属性を指定することで実現できるようになっているみたいです。&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;&amp;lt;a&amp;nbsp;href="#bar"&amp;nbsp;&lt;span class="emphasis"&gt;data-transition="slide"&lt;/span&gt;&amp;gt;スライド遷移&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;サンプルソース&lt;/div&gt;&lt;br /&gt;&lt;pre class="code"&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt; &amp;lt;meta&amp;nbsp;charset="utf-8"&amp;gt;&lt;br /&gt; &amp;lt;meta&amp;nbsp;name="viewport"&amp;nbsp;content="width=device-width,&amp;nbsp;initial-scale=1.0,&amp;nbsp;user-scalable=yes,&amp;nbsp;maximum-scale=2.0,&amp;nbsp;minimum-scale=1.0,&amp;nbsp;"&amp;gt;&lt;br /&gt; &amp;lt;link&amp;nbsp;rel="stylesheet"&amp;nbsp;type="text/css"&amp;nbsp;href="/lib/jquery_mobile/jquery.mobile.css"&amp;nbsp;charset="utf-8"&amp;gt;&lt;br /&gt; &amp;lt;script&amp;nbsp;type="text/javascript"&amp;nbsp;src="/lib/jquery/jquery.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt; &amp;lt;script&amp;nbsp;type="text/javascript"&amp;nbsp;src="/lib/jquery_mobile/jquery.mobile.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div&amp;nbsp;data-role="page"&amp;nbsp;id="foo"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;data-role="header"&amp;gt;&lt;br /&gt;  &amp;lt;h1&amp;gt;Foo&amp;lt;/h1&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;data-role="content"&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href="#bar"&amp;nbsp;data-transition="slide"&amp;gt;slide&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href="#bar"&amp;nbsp;data-transition="slideup"&amp;gt;slideup&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href="#bar"&amp;nbsp;data-transition="slidedown"&amp;gt;slidedown&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href="#bar"&amp;nbsp;data-transition="pop"&amp;gt;pop&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href="#bar"&amp;nbsp;data-transition="fade"&amp;gt;fade&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href="#bar"&amp;nbsp;data-transition="flip"&amp;gt;flip&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;data-role="footer"&amp;gt;&lt;br /&gt;  &amp;lt;h4&amp;gt;Page&amp;nbsp;Footer&amp;lt;/h4&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div&amp;nbsp;data-role="page"&amp;nbsp;id="bar"&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;data-role="header"&amp;gt;&lt;br /&gt;  &amp;lt;h1&amp;gt;Bar&amp;lt;/h1&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;data-role="content"&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;I'm&amp;nbsp;first&amp;nbsp;in&amp;nbsp;the&amp;nbsp;source&amp;nbsp;order&amp;nbsp;so&amp;nbsp;I'm&amp;nbsp;shown&amp;nbsp;as&amp;nbsp;the&amp;nbsp;page.&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href="#foo"&amp;gt;Back&amp;nbsp;to&amp;nbsp;foo&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;data-role="footer"&amp;gt;&lt;br /&gt;  &amp;lt;h4&amp;gt;Page&amp;nbsp;Footer&amp;lt;/h4&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;タグに属性付けるだけっていうのは、個人的には斬新な印象を受けます。&lt;br /&gt;こういうのはjavascriptでバリバリ書くっていうのが多かったので・・・。&lt;br /&gt;これで済むなら・・・たしかにラクチンだーね。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-8734851274180628184?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/8734851274180628184/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2011/06/jquery-mobile_14.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8734851274180628184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8734851274180628184'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2011/06/jquery-mobile_14.html' title='jQuery Mobileでアニメーション付きページ遷移を試してみたじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-404204225477358827</id><published>2011-06-12T20:42:00.000+09:00</published><updated>2011-06-12T20:42:38.579+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='jQueryMobile'/><title type='text'>jQuery Mobileをダウンロードしてみたじぇ</title><content type='html'>jQuery Mobileを試してみました。&lt;br /&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;ダウンロード&lt;/div&gt;&lt;br /&gt;jQuery Mobileの本家サイトからダウンロードします。&lt;br /&gt;&lt;a href="http://jquerymobile.com/"&gt;http://jquerymobile.com/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;ライブラリの導入&lt;/div&gt;&lt;br /&gt;ダウンロードしたらHTMLにライブラリを使うよう設定します。&lt;br /&gt;下記は本家サイトを参照するようになっていますが、実際は自分のプロジェクトにあるファイルを参照するようにします。&lt;br /&gt;&lt;pre class="code"&gt;&amp;lt;link&amp;nbsp;rel=&amp;quot;stylesheet&amp;quot;&amp;nbsp;href=&amp;quot;http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.css&amp;quot;&amp;nbsp;/&amp;gt;&lt;br /&gt;&amp;lt;script&amp;nbsp;src=&amp;quot;http://code.jquery.com/jquery-1.5.2.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script&amp;nbsp;src=&amp;quot;http://code.jquery.com/mobile/1.0a4.1/jquery.mobile-1.0a4.1.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;稼働確認&lt;/div&gt;&lt;br /&gt;次のようなHTMLで稼働確認しました。&lt;br /&gt;&lt;pre class="code"&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt; &amp;lt;meta&amp;nbsp;charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;meta&amp;nbsp;name=&amp;quot;viewport&amp;quot;&amp;nbsp;content=&amp;quot;width=device-width,&amp;nbsp;initial-scale=1.0,&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;user-scalable=yes,&amp;nbsp;maximum-scale=2.0,&amp;nbsp;minimum-scale=1.0,&amp;nbsp;&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;link&amp;nbsp;rel=&amp;quot;stylesheet&amp;quot;&amp;nbsp;type=&amp;quot;text/css&amp;quot;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;href=&amp;quot;/lib/jquery_mobile/jquery.mobile.css&amp;quot;&amp;nbsp;charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;script&amp;nbsp;type=&amp;quot;text/javascript&amp;quot;&amp;nbsp;src=&amp;quot;/lib/jquery/jquery.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt; &amp;lt;script&amp;nbsp;type=&amp;quot;text/javascript&amp;quot;&amp;nbsp;src=&amp;quot;/lib/jquery_mobile/jquery.mobile.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div&amp;nbsp;&lt;span class="emphasis"&gt;data-role=&amp;quot;page&amp;quot;&lt;/span&gt;&amp;nbsp;id=&amp;quot;foo&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;&lt;span class="emphasis"&gt;data-role=&amp;quot;header&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;h1&amp;gt;Foo&amp;lt;/h1&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;&lt;span class="emphasis"&gt;data-role=&amp;quot;content&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;I'm&amp;nbsp;first&amp;nbsp;in&amp;nbsp;the&amp;nbsp;source&amp;nbsp;order&amp;nbsp;so&amp;nbsp;I'm&amp;nbsp;shown&amp;nbsp;as&amp;nbsp;the&amp;nbsp;page.&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;View&amp;nbsp;internal&amp;nbsp;page&amp;nbsp;called&amp;nbsp;&amp;lt;a&amp;nbsp;href=&amp;quot;#bar&amp;quot;&amp;gt;bar&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;&lt;span class="emphasis"&gt;data-role=&amp;quot;footer&amp;quot;&lt;/span&gt;&amp;gt;&lt;br /&gt;  &amp;lt;h4&amp;gt;Page&amp;nbsp;Footer&amp;lt;/h4&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;div&amp;nbsp;data-role=&amp;quot;page&amp;quot;&amp;nbsp;id=&amp;quot;bar&amp;quot;&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;data-role=&amp;quot;header&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;h1&amp;gt;Bar&amp;lt;/h1&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;data-role=&amp;quot;content&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;I'm&amp;nbsp;first&amp;nbsp;in&amp;nbsp;the&amp;nbsp;source&amp;nbsp;order&amp;nbsp;so&amp;nbsp;I'm&amp;nbsp;shown&amp;nbsp;as&amp;nbsp;the&amp;nbsp;page.&amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;p&amp;gt;&amp;lt;a&amp;nbsp;href=&amp;quot;#foo&amp;quot;&amp;gt;Back&amp;nbsp;to&amp;nbsp;foo&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;div&amp;nbsp;data-role=&amp;quot;footer&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;h4&amp;gt;Page&amp;nbsp;Footer&amp;lt;/h4&amp;gt;&lt;br /&gt; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;イントロ部分だけドキュメントを見たところ、「data-role="～"」でページ構造を表現するみたいです。&lt;br /&gt;画像を見たら何を表すかなんとなくわかると思います。&lt;br /&gt;jQuery Mobileの場合、ExtJSと違って、あくまでもHTMLタグを重んじてる印象。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-JksP47zRGtg/TfSlR-oWRyI/AAAAAAAAAL8/7z77njqKhYE/s1600/jQueryMobile01.png" imageanchor="1" style=""&gt;&lt;img border="0" height="176" width="400" src="http://4.bp.blogspot.com/-JksP47zRGtg/TfSlR-oWRyI/AAAAAAAAAL8/7z77njqKhYE/s400/jQueryMobile01.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-404204225477358827?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/404204225477358827/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2011/06/jquery-mobile.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/404204225477358827'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/404204225477358827'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2011/06/jquery-mobile.html' title='jQuery Mobileをダウンロードしてみたじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-JksP47zRGtg/TfSlR-oWRyI/AAAAAAAAAL8/7z77njqKhYE/s72-c/jQueryMobile01.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-8573782436927397160</id><published>2011-01-23T16:46:00.000+09:00</published><updated>2011-01-23T16:46:28.408+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='データベース'/><title type='text'>MySQLでIN句を使うときの注意点</title><content type='html'>MySQLでIN句にサブクエリを指定した場合、内部的な処理は相関サブクエリになって発行されるらしい。&lt;br /&gt;Oracleなんかだと非相関サブクエリになるので、サブクエリの取得件数があまり多くない場合は&lt;br /&gt;インメモリで処理しきれるので高速に動作するんだけど、MySQLの場合は全く内部処理が異なってしまう。&lt;br /&gt;&lt;br /&gt;MySQLではIN (サブクエリ)より、テーブル結合にしたほうが無難っぽい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-8573782436927397160?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/8573782436927397160/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2011/01/mysqlin.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8573782436927397160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8573782436927397160'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2011/01/mysqlin.html' title='MySQLでIN句を使うときの注意点'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-4716747479317523603</id><published>2010-11-13T14:20:00.000+09:00</published><updated>2010-11-13T14:20:28.716+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='データベース'/><title type='text'>CentOS5.5は標準yumリポジトリにPostgreSQL8.4が含まれてるらしいじぇ</title><content type='html'>最近めっきり寒くなってきました((((；ﾟДﾟ)))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙ&lt;br /&gt;おかげでラーメンやら鍋やらあったかいものがおいしい(*´∀｀*)&lt;br /&gt;&lt;br /&gt;さて、自宅サーバにCentOS5.5を使ってるのですが、&lt;br /&gt;最近は標準yumリポジトリにPostgreSQL8.4が含まれているそうです。&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;yum install postgresql84-server&lt;br /&gt;yum install postgresql84-devel&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;「84」と付ければ良いみたい。&lt;br /&gt;PostgreSQL9以降も標準になるんだろうなー。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-4716747479317523603?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/4716747479317523603/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/11/centos55yumpostgresql84.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4716747479317523603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4716747479317523603'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/11/centos55yumpostgresql84.html' title='CentOS5.5は標準yumリポジトリにPostgreSQL8.4が含まれてるらしいじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-5026737286949236385</id><published>2010-08-01T17:47:00.000+09:00</published><updated>2010-08-01T17:47:01.559+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Androidアプリ入門～リストビューいろいろ編～だじぇ</title><content type='html'>今回はAndroidアプリケーションのリストビューでどんな表現ができるか試してみます。&lt;br /&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;ListView&lt;/div&gt;&lt;br /&gt;シンプルなリストビュー。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/_clRJ8KPAYVc/TFUkf-ooBcI/AAAAAAAAAKA/6pOu8uIFzO8/s1600/20100801_3.gif" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="454" src="http://3.bp.blogspot.com/_clRJ8KPAYVc/TFUkf-ooBcI/AAAAAAAAAKA/6pOu8uIFzO8/s640/20100801_3.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="code"&gt;package my.android.study;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.widget.ArrayAdapter;&lt;br /&gt;import android.widget.ListView;&lt;br /&gt;&lt;br /&gt;public class HelloWorldActivity extends Activity {&lt;br /&gt;&lt;br /&gt;  &lt;span class="comment"&gt;/** リストビュー。 */&lt;/span&gt;&lt;br /&gt;  private ListView listView = null;&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;    super.onCreate(savedInstanceState);&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// 自動生成されたR.javaの定数を指定してXMLからレイアウトを生成します。&lt;/span&gt;&lt;br /&gt;    setContentView(R.layout.main);&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// XMLで定義したandroid:idの値を指定してListViewを取得します。&lt;/span&gt;&lt;br /&gt;    listView = (ListView)findViewById(R.id.list);&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// リストビューに渡すアダプタを生成します。&lt;/span&gt;&lt;br /&gt;    ArrayAdapter&amp;lt;String&amp;gt; adapter = new ArrayAdapter&amp;lt;String&amp;gt;(&lt;br /&gt;        this,&lt;br /&gt;        android.R.layout.simple_list_item_1&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// ダミーデータを追加します。&lt;/span&gt;&lt;br /&gt;    adapter.add("データ1");&lt;br /&gt;    adapter.add("データ2");&lt;br /&gt;    adapter.add("データ3");&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// アダプタを設定します。&lt;/span&gt;&lt;br /&gt;    listView.setAdapter(adapter);&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;２段表示のリストビュー。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_clRJ8KPAYVc/TFUmzl1kvAI/AAAAAAAAAKI/eYWYKw--1ZI/s1600/20100801_4.gif" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="454" src="http://2.bp.blogspot.com/_clRJ8KPAYVc/TFUmzl1kvAI/AAAAAAAAAKI/eYWYKw--1ZI/s640/20100801_4.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="code"&gt;package my.android.study;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.widget.ListView;&lt;br /&gt;import android.widget.SimpleAdapter;&lt;br /&gt;&lt;br /&gt;public class HelloWorldActivity extends Activity {&lt;br /&gt;&lt;br /&gt;  &lt;span class="comment"&gt;/** リストビュー。 */&lt;/span&gt;&lt;br /&gt;  private ListView listView = null;&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;    super.onCreate(savedInstanceState);&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// 自動生成されたR.javaの定数を指定してXMLからレイアウトを生成します。&lt;/span&gt;&lt;br /&gt;    setContentView(R.layout.main);&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// XMLで定義したandroid:idの値を指定してListViewを取得します。&lt;/span&gt;&lt;br /&gt;    listView = (ListView)findViewById(R.id.list);&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// ダミーデータを作成します。&lt;/span&gt;&lt;br /&gt;    List&amp;lt;Map&amp;lt;String, String&amp;gt;&amp;gt; dataList = this.createData();&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// リストビューに渡すアダプタを生成します。&lt;/span&gt;&lt;br /&gt;    SimpleAdapter adapter = new SimpleAdapter(&lt;br /&gt;        this,&lt;br /&gt;        dataList,&lt;br /&gt;        android.R.layout.simple_list_item_2,&lt;br /&gt;        new String[] { "title", "comment" },&lt;br /&gt;        new int[] { android.R.id.text1, android.R.id.text2 }&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// アダプタを設定します。&lt;/span&gt;&lt;br /&gt;    listView.setAdapter(adapter);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private List&amp;lt;Map&amp;lt;String, String&amp;gt;&amp;gt; createData() {&lt;br /&gt;    List&amp;lt;Map&amp;lt;String, String&amp;gt;&amp;gt; retDataList = new ArrayList&amp;lt;Map&amp;lt;String,String&amp;gt;&amp;gt;();&lt;br /&gt;&lt;br /&gt;    for(int n = 0; n &amp;lt; 5; n++) {&lt;br /&gt;      Map&amp;lt;String, String&amp;gt; data = new HashMap&amp;lt;String, String&amp;gt;();&lt;br /&gt;      data.put("title", "タイトル" + n);&lt;br /&gt;      data.put("comment", "コメント" + n);&lt;br /&gt;&lt;br /&gt;      retDataList.add(data);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return retDataList;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;GridView&lt;/div&gt;&lt;br /&gt;グリッド状のリストビュー。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_clRJ8KPAYVc/TFUzwBiaBVI/AAAAAAAAAKQ/u9YiwVps0io/s1600/20100801_5.gif" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="454" src="http://2.bp.blogspot.com/_clRJ8KPAYVc/TFUzwBiaBVI/AAAAAAAAAKQ/u9YiwVps0io/s640/20100801_5.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;package my.android.study;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.widget.ArrayAdapter;&lt;br /&gt;import android.widget.GridView;&lt;br /&gt;&lt;br /&gt;public class HelloWorldActivity extends Activity {&lt;br /&gt;&lt;br /&gt;  &lt;span class="comment"&gt;/** リストビュー。 */&lt;/span&gt;&lt;br /&gt;  private GridView gridView = null;&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;    super.onCreate(savedInstanceState);&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// 自動生成されたR.javaの定数を指定してXMLからレイアウトを生成します。&lt;/span&gt;&lt;br /&gt;    setContentView(R.layout.main);&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// XMLで定義したandroid:idの値を指定してGridViewを取得します。&lt;br /&gt;    // XMLでカラム数は3に設定しています。&lt;/span&gt;&lt;br /&gt;    gridView = (GridView)findViewById(R.id.list);&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// リストビューに渡すアダプタを生成します。&lt;/span&gt;&lt;br /&gt;    ArrayAdapter&amp;lt;String&amp;gt; adapter = new ArrayAdapter&amp;lt;String&amp;gt;(&lt;br /&gt;        this,&lt;br /&gt;        android.R.layout.simple_list_item_1&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// ダミーデータを作成します。&lt;/span&gt;&lt;br /&gt;    for(int n = 0; n &amp;lt; 20; n++) {&lt;br /&gt;      adapter.add("データ" + n);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// アダプタを設定します。&lt;/span&gt;&lt;br /&gt;    gridView.setAdapter(adapter);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;ExpandableListView&lt;/div&gt;&lt;br /&gt;開閉できるリストビュー。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/_clRJ8KPAYVc/TFUiAHhMhtI/AAAAAAAAAJ4/Dwr5i2th_I4/s1600/20100801_1.gif" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="340" src="http://4.bp.blogspot.com/_clRJ8KPAYVc/TFUiAHhMhtI/AAAAAAAAAJ4/Dwr5i2th_I4/s640/20100801_1.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;pre class="code"&gt;package my.android.study;&lt;br /&gt;&lt;br /&gt;import java.util.ArrayList;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.List;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.widget.ExpandableListAdapter;&lt;br /&gt;import android.widget.ExpandableListView;&lt;br /&gt;import android.widget.SimpleExpandableListAdapter;&lt;br /&gt;&lt;br /&gt;public class HelloWorldActivity extends Activity {&lt;br /&gt;&lt;br /&gt;  &lt;span class="comment"&gt;/** リストビュー。 */&lt;/span&gt;&lt;br /&gt;  private ExpandableListView listView = null;&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;    super.onCreate(savedInstanceState);&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// 自動生成されたR.javaの定数を指定してXMLからレイアウトを生成します。&lt;/span&gt;&lt;br /&gt;    setContentView(R.layout.main);&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// XMLで定義したandroid:idの値を指定してExpandableListViewを取得します。&lt;/span&gt;&lt;br /&gt;    listView = (ExpandableListView)findViewById(R.id.list);&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// ダミーデータを作成します。&lt;/span&gt;&lt;br /&gt;    List&amp;lt;Map&amp;lt;String, String&amp;gt;&amp;gt; parentDataList = this.createParentData();&lt;br /&gt;    List&amp;lt;List&amp;lt;Map&amp;lt;String, String&amp;gt;&amp;gt;&amp;gt; childDataList = this.createChildrenData();&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// リストビューに渡すアダプタを生成します。&lt;/span&gt;&lt;br /&gt;    ExpandableListAdapter adapter = new SimpleExpandableListAdapter(&lt;br /&gt;      this,&lt;br /&gt;      parentDataList,&lt;br /&gt;      android.R.layout.simple_expandable_list_item_1,&lt;br /&gt;      new String[] { "parent" },&lt;br /&gt;      new int[] { android.R.id.text1 },&lt;br /&gt;      childDataList,&lt;br /&gt;      android.R.layout.simple_expandable_list_item_2,&lt;br /&gt;      new String[] { "child", "value" },&lt;br /&gt;      new int[] { android.R.id.text1, android.R.id.text2 }&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;    &lt;span class="comment"&gt;// アダプタを設定します。&lt;/span&gt;&lt;br /&gt;    listView.setAdapter(adapter);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  &lt;span class="comment"&gt;// ダミーデータを作成&lt;/span&gt;&lt;br /&gt;  private List&amp;lt;Map&amp;lt;String, String&amp;gt;&amp;gt; createParentData() {&lt;br /&gt;    List&amp;lt;Map&amp;lt;String, String&amp;gt;&amp;gt; parentDataList = new ArrayList&amp;lt;Map&amp;lt;String,String&amp;gt;&amp;gt;();&lt;br /&gt;&lt;br /&gt;    Map&amp;lt;String, String&amp;gt; parentData = new HashMap&amp;lt;String, String&amp;gt;();&lt;br /&gt;    parentData.put("parent", "親要素１");&lt;br /&gt;&lt;br /&gt;    parentDataList.add(parentData);&lt;br /&gt;&lt;br /&gt;    return parentDataList;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private List&amp;lt;List&amp;lt;Map&amp;lt;String, String&amp;gt;&amp;gt;&amp;gt; createChildrenData() {&lt;br /&gt;    List&amp;lt;List&amp;lt;Map&amp;lt;String, String&amp;gt;&amp;gt;&amp;gt; childDataList = new ArrayList&amp;lt;List&amp;lt;Map&amp;lt;String,String&amp;gt;&amp;gt;&amp;gt;();&lt;br /&gt;&lt;br /&gt;    List&amp;lt;Map&amp;lt;String, String&amp;gt;&amp;gt; childDataSubList = new ArrayList&amp;lt;Map&amp;lt;String,String&amp;gt;&amp;gt;();&lt;br /&gt;&lt;br /&gt;    for(int n = 0; n &amp;lt; 5; n++) {&lt;br /&gt;      Map&amp;lt;String, String&amp;gt; childData = new HashMap&amp;lt;String, String&amp;gt;();&lt;br /&gt;      childData.put("child", "子要素" + n);&lt;br /&gt;      childData.put("value", "0000" + n);&lt;br /&gt;&lt;br /&gt;      childDataSubList.add(childData);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    childDataList.add(childDataSubList);&lt;br /&gt;&lt;br /&gt;    return childDataList;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;他にもあると思うけど、今回はここまで。&lt;br /&gt;ﾉｼ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-5026737286949236385?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/5026737286949236385/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/08/android.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5026737286949236385'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5026737286949236385'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/08/android.html' title='Androidアプリ入門～リストビューいろいろ編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_clRJ8KPAYVc/TFUkf-ooBcI/AAAAAAAAAKA/6pOu8uIFzO8/s72-c/20100801_3.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-3247636208853560159</id><published>2010-07-29T23:35:00.000+09:00</published><updated>2010-07-31T23:10:16.122+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Androidアプリ入門～レイアウト操作方法編～だじぇ</title><content type='html'>今回はレイアウトの設定方法を。&lt;br /&gt;res/layout/main.xmlをAndroid Layout Editorで開いてみます。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/_clRJ8KPAYVc/TFGN23YF33I/AAAAAAAAAJY/sGMmsUytdw8/s1600/20100729_1.gif" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="387" src="http://4.bp.blogspot.com/_clRJ8KPAYVc/TFGN23YF33I/AAAAAAAAAJY/sGMmsUytdw8/s640/20100729_1.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;画面の左側にコンポーネントやレイアウトの一覧が表示されています。&lt;br /&gt;中央の黒い画面はアプリケーションの画面になります。&lt;br /&gt;&lt;br /&gt;追加したいコンポーネントなどを選んで、黒い画面にドラッグ＆ドロップすることでレイアウトを設定できます。&lt;br /&gt;ただ、レイアウトを追加してその中にコンポーネントを追加しようとしたら、どうやってもレイアウトを選択できなかったので、手で調整したほうが楽な気がしました。&lt;br /&gt;&lt;br /&gt;ソースは画面下にある「main.xml」を選択すれば表示を切り替えることができます。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/_clRJ8KPAYVc/TFGPa0mS0GI/AAAAAAAAAJg/-FSxTlEAcqM/s1600/20100729_2.gif" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="366" src="http://1.bp.blogspot.com/_clRJ8KPAYVc/TFGPa0mS0GI/AAAAAAAAAJg/-FSxTlEAcqM/s640/20100729_2.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/_clRJ8KPAYVc/TFGQZG1dU6I/AAAAAAAAAJo/JWIR34ff0_0/s1600/20100729_3.gif" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="376" src="http://1.bp.blogspot.com/_clRJ8KPAYVc/TFGQZG1dU6I/AAAAAAAAAJo/JWIR34ff0_0/s640/20100729_3.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;タグのコード補完もできるので、タグを覚えればHTMLと同じ感覚で作成できそうです。覚えるのしんど･･･。&lt;br /&gt;後は頑張ってAPIリファレンスを読んでいこー。&lt;br /&gt;&lt;br /&gt;Android APIリファレンス：&lt;a href="http://developer.android.com/reference/packages.html"&gt;http://developer.android.com/reference/packages.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ﾉｼ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-3247636208853560159?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/3247636208853560159/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/07/android_29.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/3247636208853560159'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/3247636208853560159'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/07/android_29.html' title='Androidアプリ入門～レイアウト操作方法編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_clRJ8KPAYVc/TFGN23YF33I/AAAAAAAAAJY/sGMmsUytdw8/s72-c/20100729_1.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-7461098369009443867</id><published>2010-07-27T23:48:00.000+09:00</published><updated>2010-07-27T23:48:18.806+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Androidアプリ入門～開発環境構築編～だじぇ</title><content type='html'>Androidアプリの開発環境を構築してみました。&lt;br /&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;Android SDKのインストール&lt;/div&gt;まずはAndroid SDKをダウンロードします。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://developer.android.com/sdk/index.html"&gt;http://developer.android.com/sdk/index.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Platformは開発環境に合わせて選んでください。&lt;br /&gt;私はWindowsなので"android-sdk_r06-windows.zip"を選びました。&lt;br /&gt;&lt;br /&gt;ダウンロードしたファイルを好きな場所に解凍します。&lt;br /&gt;これでAndroid SDKのインストールは完了です。&lt;br /&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;EclipseにADTプラグインを追加する&lt;/div&gt;EclipseにADTプラグインを追加します。&lt;br /&gt;メニューから「ヘルプ」⇒「ソフトウェア更新」を選択します。&lt;br /&gt;「ソフトウェア更新およびアドオン」ダイアログで「サイトの追加」ボタンを選び、&lt;br /&gt;https://dl-ssl.google.com/android/eclipse/を入力します。&lt;br /&gt;追加された項目を選び「インストール」ボタンを押します。&lt;br /&gt;&lt;br /&gt;後は次へ次へと進みインストールを完了させてください。&lt;br /&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;Xperiaシミュレータのインストール&lt;/div&gt;ADTプラグインを追加したら、&lt;br /&gt;メニューから「ウィンドウ」⇒「Android SDK and AVD Manager」を選択します。&lt;br /&gt;ダイアログの左側のメニューでInstalled Packageを選択して「Update All」ボタンを押して更新しておきます。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/_clRJ8KPAYVc/TE7lqWFfNbI/AAAAAAAAAIY/DVK3PulW_pE/s1600/20100727_1.gif" imageanchor="1" style="margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="369" src="http://1.bp.blogspot.com/_clRJ8KPAYVc/TE7lqWFfNbI/AAAAAAAAAIY/DVK3PulW_pE/s640/20100727_1.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;メニューのVirtual Devicesを選んで「新規」ボタンを押します。&lt;br /&gt;AVDダイアログでこんな感じに入力します。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://3.bp.blogspot.com/_clRJ8KPAYVc/TE7oSTlN7KI/AAAAAAAAAIg/DClHQQQ9X_Y/s1600/20100727_2.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_clRJ8KPAYVc/TE7oSTlN7KI/AAAAAAAAAIg/DClHQQQ9X_Y/s400/20100727_2.gif" width="317" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_clRJ8KPAYVc/TE7o3OhhRbI/AAAAAAAAAIo/8uI6JjBJSPo/s1600/20100727_3.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="371" src="http://2.bp.blogspot.com/_clRJ8KPAYVc/TE7o3OhhRbI/AAAAAAAAAIo/8uI6JjBJSPo/s640/20100727_3.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;これでシミュレータのインストールが完了です。&lt;br /&gt;作成された項目を選んで「開始」ボタンを押すとシミュレータが起動します。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_clRJ8KPAYVc/TE7qB9uWqcI/AAAAAAAAAIw/VHbLTDwJekM/s1600/20100727_4.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="452" src="http://2.bp.blogspot.com/_clRJ8KPAYVc/TE7qB9uWqcI/AAAAAAAAAIw/VHbLTDwJekM/s640/20100727_4.gif" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;Androidプロジェクトの作成と起動&lt;/div&gt;ここまででEclipseからAndroidプロジェクトを作成できるようになっているはずです。&lt;br /&gt;プロジェクト作成で「Androidプロジェクト」を選択します。&lt;br /&gt;&lt;br /&gt;「プロジェクト名」はそのまま開発時のプロジェクト名です。&lt;br /&gt;「アプリケーション名」は実際にAndroidアプリをインストールした際に表示される名前になります。&lt;br /&gt;「パッケージ名」はJavaクラスのパッケージになります。&lt;br /&gt;「Create Activity」はアクティビティのクラス名になります。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/_clRJ8KPAYVc/TE7tlCB4HpI/AAAAAAAAAJA/9LjEW06_Fc0/s1600/20100727_5.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_clRJ8KPAYVc/TE7tlCB4HpI/AAAAAAAAAJA/9LjEW06_Fc0/s400/20100727_5.gif" width="356" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;こんな感じにプロジェクトができました。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://1.bp.blogspot.com/_clRJ8KPAYVc/TE7vPtfOvII/AAAAAAAAAJI/h2K_U5tPBtE/s1600/20100727_6.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_clRJ8KPAYVc/TE7vPtfOvII/AAAAAAAAAJI/h2K_U5tPBtE/s320/20100727_6.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;ビルドしてデバッグ開始するとシミュレータが自動的に起動してAndroidアプリが動きました。&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://2.bp.blogspot.com/_clRJ8KPAYVc/TE7wRtqTT7I/AAAAAAAAAJQ/8xAmCK5CshM/s1600/20100727_7.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="283" src="http://2.bp.blogspot.com/_clRJ8KPAYVc/TE7wRtqTT7I/AAAAAAAAAJQ/8xAmCK5CshM/s400/20100727_7.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;とりあえず今回はここまで。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-7461098369009443867?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/7461098369009443867/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/07/android.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/7461098369009443867'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/7461098369009443867'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/07/android.html' title='Androidアプリ入門～開発環境構築編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_clRJ8KPAYVc/TE7lqWFfNbI/AAAAAAAAAIY/DVK3PulW_pE/s72-c/20100727_1.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-1470645888699822576</id><published>2010-06-24T21:57:00.000+09:00</published><updated>2010-06-24T21:59:38.038+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門～チャート編～だじぇ</title><content type='html'>Flexのグラフを作成していたものを公開しようと思って、そのままになっていました。&lt;br /&gt;このぐらいのグラフは作れます。やろうと思えば印刷も出来ます。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://sky.geocities.jp/tcsmq262/chart.zip"&gt;ソースファイル&lt;/a&gt;&lt;br /&gt;&lt;embed src="http://sky.geocities.jp/tcsmq262/chart_all.swf" width="800" height="600"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-1470645888699822576?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/1470645888699822576/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/06/flex.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/1470645888699822576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/1470645888699822576'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/06/flex.html' title='Flex入門～チャート編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-8927288740577319505</id><published>2010-06-13T17:32:00.001+09:00</published><updated>2010-06-13T17:39:06.760+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門～Flex Ajax Bridge編～だじぇ</title><content type='html'>だんだん暑い日が増えてきました。(；´д｀)ゞ&lt;br /&gt;エアコンはいつまで我慢できるかな・・・&lt;br /&gt;&lt;br /&gt;Flexにある「Flex Ajax Bridge」という仕組みをを使って、FlexとJavaScriptの連携をやってみました。&lt;br /&gt;これによってFlex上の関数をJavaScript上から呼び出せるようになります。&lt;br /&gt;今回は"Flexの棒グラフに対してHTMLのボタンを押すことでグラフのデータを変更する"ということをやってみました。&lt;br /&gt;&lt;br /&gt;Flexではいろいろなチャートが用意されているので、HTML上でグラフが必要なときは、これを使うほうが楽できそう。&lt;br /&gt;iPhoneとかiPadでは動かないけどねｗ。&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://sky.geocities.jp/tcsmq262/fab02.html" width="100%" height="550" frameborder="0"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;Flexのコード&lt;/div&gt;棒グラフのチャート部分は次のように作成しました。&lt;br /&gt;Flex Ajax Bridgeを使う場合は、「&amp;lt;fab:FABridge xmlns:fab="bridge.*" /&amp;gt;」が必要らしいです。&lt;br /&gt;&lt;pre class="code"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt; &lt;span class="emphasis"&gt;&amp;lt;fab:FABridge xmlns:fab="bridge.*" /&amp;gt;&lt;/span&gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;mx:Script&amp;gt;&lt;br /&gt; &amp;lt;![CDATA[&lt;br /&gt;  import mx.collections.ArrayCollection;&lt;br /&gt;  &lt;br /&gt;  [Bindable]&lt;br /&gt;  private var dataList:ArrayCollection = new ArrayCollection();&lt;br /&gt;  &lt;br /&gt;  public function setDataList(i_dataList:Array):void {&lt;br /&gt;   dataList = new ArrayCollection(i_dataList);&lt;br /&gt;  }&lt;br /&gt; ]]&amp;gt;&lt;br /&gt; &amp;lt;/mx:Script&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;mx:SeriesSlide &lt;br /&gt;        id="slideIn" &lt;br /&gt;        duration="1500" &lt;br /&gt;        direction="up"&lt;br /&gt;    /&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;mx:Panel width="350" height="400"&amp;gt;&lt;br /&gt; &amp;lt;mx:ColumnChart id="dataChart" dataProvider="{dataList}" width="100%" height="100%"&amp;gt;&lt;br /&gt;  &amp;lt;!-- 横軸の定義 --&amp;gt;&lt;br /&gt;  &amp;lt;mx:horizontalAxis&amp;gt;&lt;br /&gt;   &amp;lt;mx:CategoryAxis dataProvider="{dataList}" categoryField="x"&amp;gt;&amp;lt;/mx:CategoryAxis&amp;gt;&lt;br /&gt;  &amp;lt;/mx:horizontalAxis&amp;gt;&lt;br /&gt;  &amp;lt;!-- 縦軸の定義 --&amp;gt;&lt;br /&gt;  &amp;lt;mx:verticalAxis&amp;gt;&lt;br /&gt;   &amp;lt;mx:LinearAxis minimum="0" maximum="1000"&amp;gt;&amp;lt;/mx:LinearAxis&amp;gt;&lt;br /&gt;  &amp;lt;/mx:verticalAxis&amp;gt;  &lt;br /&gt;  &amp;lt;!-- データの定義 --&amp;gt;&lt;br /&gt;  &amp;lt;mx:series&amp;gt;&lt;br /&gt;   &amp;lt;mx:ColumnSeries yField="y" displayName="Data" showDataEffect="slideIn"&amp;gt;&amp;lt;/mx:ColumnSeries&amp;gt;&lt;br /&gt;  &amp;lt;/mx:series&amp;gt;&lt;br /&gt; &amp;lt;/mx:ColumnChart&amp;gt;&lt;br /&gt; &amp;lt;!-- 凡例の定義 --&amp;gt;&lt;br /&gt; &amp;lt;mx:Legend dataProvider="{dataChart}" /&amp;gt;&lt;br /&gt; &amp;lt;/mx:Panel&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div class="sub_title"&gt;HTMLのコード&lt;/div&gt;HTMLのソースコードは下記の通りです。&lt;br /&gt;Flexにアクセスするためには「var flexApp = FABridge.flash.root();」でFlashアプリケーションの参照を取得し、&lt;br /&gt;そこから定義されている関数や要素にアクセスするという流れになります。&lt;br /&gt;Flexをインストールすると"FABridge.js"というファイルがあるはずなので、それをコピーして必要な場所に配置する必要があります。&lt;br /&gt;&lt;pre class="code"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt; &amp;lt;title&amp;gt;Flex Ajax Bridge Sample&amp;lt;/title&amp;gt;&lt;br /&gt; &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&amp;gt;&lt;br /&gt; &lt;span class="emphasis"&gt;&amp;lt;script type="text/javascript" src="bridge/FABridge.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;br /&gt; &amp;lt;script&amp;gt;&lt;br /&gt; &amp;lt;!--&lt;br /&gt;  function onClickHandler() {&lt;br /&gt;   changeData();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  function init() {&lt;br /&gt;   changeData();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  function changeData() {&lt;br /&gt;   &lt;span class="emphasis"&gt;var flexApp = FABridge.flash.root();&lt;/span&gt;&lt;br /&gt;   flexApp.setDataList([&lt;br /&gt;    { x: 0, y: Math.random() * 1000},&lt;br /&gt;    { x: 10, y: Math.random() * 1000 },&lt;br /&gt;    { x: 20, y: Math.random() * 1000 },&lt;br /&gt;    { x: 30, y: Math.random() * 1000 },&lt;br /&gt;    { x: 40, y: Math.random() * 1000 }&lt;br /&gt;   ]);&lt;br /&gt;  }&lt;br /&gt; // --&amp;gt;&lt;br /&gt; &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body onload="init()"&amp;gt;&lt;br /&gt; &amp;lt;embed name="" src="chart.swf" width="500" height="500" /&amp;gt;&lt;br /&gt; &amp;lt;button onclick="onClickHandler()"&amp;gt;push&amp;lt;/button&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-8927288740577319505?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/8927288740577319505/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/06/flexflex-ajax-bridge.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8927288740577319505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8927288740577319505'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/06/flexflex-ajax-bridge.html' title='Flex入門～Flex Ajax Bridge編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-8322874475597943365</id><published>2010-05-31T23:21:00.002+09:00</published><updated>2010-05-31T23:23:11.779+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Webサービス'/><title type='text'>Googleドキュメントのフォームを触ってみたじぇ</title><content type='html'>気が付いたらブログをだいぶ放置してた・・・。&lt;br /&gt;まあ、気が向いたら書くようにしてるんだけど改めるようにしよう。たぶん。&lt;br /&gt;&lt;br /&gt;Software Design6月号を読んでいたら、Google Appsの特集が組まれてました。&lt;br /&gt;パラパラ眺めていたら、フォームを作っている箇所を発見。&lt;br /&gt;そういえば以前、アンケートとか簡単に作成・集計できるようなものが無いかなー&lt;br /&gt;という話が出たのを思い出したので、ちょっと試してみました。&lt;br /&gt;Google Appsには登録してたんだけど、相当昔でドメインさえ覚えていなかったので、&lt;br /&gt;メールをあさってようやく発見。&lt;br /&gt;&lt;br /&gt;早速試したところ・・・&lt;br /&gt;アンケートのフォームは簡単に作成できた。&lt;br /&gt;メールで一斉に送信して、集計もできる。スプレッドシートにも表示できる。&lt;br /&gt;同じドメインでなくてもメールに送信できるみたい。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: auto;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href="http://1.bp.blogspot.com/_clRJ8KPAYVc/TAPGGevqjQI/AAAAAAAAAHE/GJAYKVLeeEQ/s1600/sample1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="328" src="http://1.bp.blogspot.com/_clRJ8KPAYVc/TAPGGevqjQI/AAAAAAAAAHE/GJAYKVLeeEQ/s400/sample1.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_clRJ8KPAYVc/TAPGHrT8vcI/AAAAAAAAAHM/6jRiR3IP2Ac/s1600/sample2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="338" src="http://4.bp.blogspot.com/_clRJ8KPAYVc/TAPGHrT8vcI/AAAAAAAAAHM/6jRiR3IP2Ac/s400/sample2.png" width="400" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ぜひぜひ試してみてほしい機能です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-8322874475597943365?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/8322874475597943365/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/05/google.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8322874475597943365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8322874475597943365'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/05/google.html' title='Googleドキュメントのフォームを触ってみたじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_clRJ8KPAYVc/TAPGGevqjQI/AAAAAAAAAHE/GJAYKVLeeEQ/s72-c/sample1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-4307634006835748567</id><published>2010-05-04T00:34:00.001+09:00</published><updated>2010-05-05T18:38:43.112+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><title type='text'>HTML5を試してみた～Canvas API編続き～だじぇ</title><content type='html'>とうとう買ってしまった・・・。&lt;br /&gt;無線LAN対応の複合機。&lt;br /&gt;贅沢しちゃったよー｡･ﾟ･(ﾉ∀`)･ﾟ･｡&lt;br /&gt;ただインクも一緒に買ったら本体にも付いてきてちょっとorz&lt;br /&gt;予備だと割り切ろう。&lt;br /&gt;これでまたケーブルが一本無くなりました。一緒に財布も軽くなりました。&lt;br /&gt;&lt;br /&gt;前回HTML5のCanvas APIをやってみて、すっかりはまってしまったり。&lt;br /&gt;Flexがだいぶ置き去りになってるなぁ･･･。&lt;br /&gt;さて、今回はCanvas APIで画像処理をやってみました。&lt;br /&gt;まあ、自分が知ってる限りの範囲でだけど。Web Workersはまた後回しということで。&lt;br /&gt;やってみたのは「RGBの抽出」「モノクロ」「ぼかし」「モザイク」「アンシャープ」の5つ（処理はかなり適当･･･）。&lt;br /&gt;色の成分を取得してグラフにしようとしたら、折れ線グラフに30000ぐらいプロットしようとしたら途中から描画されなくなってしまった。なんか制限とかありそう。&lt;br /&gt;&lt;iframe frameborder="0" height="715" marginheight="0" marginwidth="0" src="http://sky.geocities.jp/tcsmq262/html5_canvasSample09.html" width="600"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;※当たり前だけどIEでは動きませんよ？&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ソースコードは長くなったので、ここには書きません。&lt;br /&gt;キモの部分だけ。&lt;br /&gt;ImageDataという型のオブジェクトがあって、描画コンテキストから作成したり取得したりできます。&lt;br /&gt;&lt;pre style="background-color: black; color: white;"&gt;var imageData = cx.getImageData(0, 0, canvas.width, canvas.height);&lt;br /&gt;&lt;/pre&gt;こうすれば今描画されている内容をImageDataで取得できます。&lt;br /&gt;ImageDataにはdataプロパティがあって、これは配列になっています。&lt;br /&gt;中身は色の要素（0～255）。&lt;br /&gt;ImageData.data[0]～ImageData.data[3]は最初の座標の赤、緑、青、アルファチャンネル。&lt;br /&gt;ImageData.data[4]～ImageData.data[7]はその次の座標の赤、緑、青、アルファチャンネル。&lt;br /&gt;といった感じになっています。&lt;br /&gt;これをうまく計算して、最後に描画コンテキストのputImageData関数でImageDataを描画します。&lt;br /&gt;&lt;pre style="background-color: black; color: white;"&gt;cx.putImageData(imageData, 0, 0);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;昔、アプレットで似たことやったんだけど、もうそんなものに頼らないでもいい時代になったのです。&lt;br /&gt;でも久しぶりにやったら、結構疲れた･･･。&lt;br /&gt;次こそはWeb Workersをやってみよう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-4307634006835748567?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/4307634006835748567/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/05/html5canvas-api_04.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4307634006835748567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4307634006835748567'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/05/html5canvas-api_04.html' title='HTML5を試してみた～Canvas API編続き～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-8037875693891498270</id><published>2010-05-02T13:05:00.000+09:00</published><updated>2010-05-05T18:38:43.112+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HTML5'/><title type='text'>HTML5を試してみた～Canvas API編～だじぇ</title><content type='html'>背中の張りもボチボチといったところ。&lt;br /&gt;天気がよくて眠くなってしまいます。&lt;br /&gt;&lt;br /&gt;さて、HTML5のCanvas APIを試してみました。&lt;br /&gt;作ったものはまあ、見ての通りです。&lt;br /&gt;&lt;iframe src="http://sky.geocities.jp/tcsmq262/html5_canvasSample.html" width="320" height="320" frameborder  =0 marginwidth=0 marginheight=0&gt;&lt;/iframe&gt;&lt;br /&gt;本当は一緒にWebWorkersも試してみようと思って、いろいろやってみたけど、どうしてもcanvasのHTML要素をWorkerスレッド内でうまく操作できなかったんで、いったん諦めてsetTimeoutを代用しました。きっと何かしら方法があると思うけど・・・。&lt;br /&gt;ちらつきがあったらダブルバッファリングが必要かなと思ってたんだけど、Google Chromeで見る限りちらつきとかは気にならなかったので、とりあえず放置してます。&lt;br /&gt;以前なら画像とか使って作ってたんだけど、canvasを使えばJavaのSwingのように描画できました。&lt;br /&gt;次はWebWorkersについてちゃんと調べてやってみよう。&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;meta charset="utf-8"&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;HTML5 canvas sample&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;canvas id="canvas" width="300" height="300" style="border: 1px solid black;"&amp;gt;&amp;lt;/canvas&amp;gt;&lt;br /&gt;    &amp;lt;script&amp;gt;&lt;br /&gt;    // 始点&lt;br /&gt;    var x0 = 0;&lt;br /&gt;    var y0 = 100;&lt;br /&gt;    // 初速度&lt;br /&gt;    var vx0 = 40;&lt;br /&gt;    var vy0 = 40;&lt;br /&gt;    // 時刻&lt;br /&gt;    var t = 0;&lt;br /&gt;    var dt = 0.033;    // 刻み&lt;br /&gt;    var dmt = dt * 1000;&lt;br /&gt;&lt;br /&gt;    var pos = [x0,y0];&lt;br /&gt;&lt;br /&gt;    var cx;&lt;br /&gt;&lt;br /&gt;    // 座標を取得&lt;br /&gt;    function coordinates(x, y) {&lt;br /&gt;        return [x + vx0 * dt, y + vy0 * dt];&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function render() {&lt;br /&gt;        // 背景クリア&lt;br /&gt;        cx.clearRect(0,0,300,300);&lt;br /&gt;&lt;br /&gt;        // 描画&lt;br /&gt;        cx.fillRect(pos[0], pos[1], 50, 50);&lt;br /&gt;        &lt;br /&gt;        // 時間を進める&lt;br /&gt;        t += dt;&lt;br /&gt;&lt;br /&gt;        // 次座標を取得&lt;br /&gt;        pos = coordinates(pos[0],pos[1]);&lt;br /&gt;&lt;br /&gt;        // 端まで行ったら反転&lt;br /&gt;        if(pos[0] &amp;lt; 0 || pos[0] &amp;gt; 250) {&lt;br /&gt;            vx0 *= -1;&lt;br /&gt;        }&lt;br /&gt;        if(pos[1] &amp;lt; 0 || pos[1] &amp;gt; 250) {&lt;br /&gt;            vy0 *= -1;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        setTimeout(render, dmt);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // 初期処理&lt;br /&gt;    var canvas = document.getElementById('canvas');&lt;br /&gt;    cx = canvas.getContext('2d');&lt;br /&gt;    cx.fillStyle = 'rgb(255,0,0)';    // 赤&lt;br /&gt;&lt;br /&gt;    setTimeout(render, dmt);&lt;br /&gt;    &amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-8037875693891498270?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/8037875693891498270/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/05/html5canvas-api.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8037875693891498270'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8037875693891498270'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/05/html5canvas-api.html' title='HTML5を試してみた～Canvas API編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-3840873346178059567</id><published>2010-05-01T18:15:00.000+09:00</published><updated>2010-05-01T18:16:21.451+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Chrome'/><title type='text'>Chrome拡張を触ってみたじぇ</title><content type='html'>GWに入りましたね。&lt;br /&gt;天気も良く、皆さんどこかに出かけているのでしょうか。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;ちなみに私は背中が痛くて、シップ貼って引きこもっています。&lt;br /&gt;&lt;br /&gt;いい機会なので、溜まってきている手付かずの本を読み進めようと、とりあえず雑誌を読んでいたらChrome拡張の特集をやっていたのでいきなり停滞しました。&lt;br /&gt;とりあえず「Hello, World」でも表示させるぐらいできるようになっておこうと思いやってみました。&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: darkblue; color: white; font-weight: bold;"&gt;Chrome拡張って？&lt;/div&gt;Firefoxのアドオンみたいなものだと思えばいいです。&lt;br /&gt;考え方とか実現できる範囲とかは違いますが。&lt;br /&gt;GoogleがChrome OSってOSを出そうとしてるけど、これはGoogle Chromeブラウザのみ乗っかっているらしいです。&lt;br /&gt;普通のアプリケーションって位置づけにくるものがChrome拡張になるんじゃないかって予想されています。&lt;br /&gt;&lt;br /&gt;すでに提供されているものに「Google Mail Checker Plus」っていうのがあります。&lt;br /&gt;名前の通りGmailのチェックをしてくれます。&lt;br /&gt;&lt;a href="https://chrome.google.com/extensions/detail/gffjhibehnempbkeheiccaincokdjbfe?hl=ja"&gt;https://chrome.google.com/extensions/detail/gffjhibehnempbkeheiccaincokdjbfe?hl=ja&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;これをインストールして、アドレスバーに「chrome://extensions/」って入力すると拡張機能一覧が見れます。&lt;br /&gt;ここで無効とかアンインストとか、あと開発途中のパッケージ化していないモジュールを導入したりできます。&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_clRJ8KPAYVc/S9vv3ALHpSI/AAAAAAAAAGk/u3obCWMmI-o/s1600/chromeextensions.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="224" src="http://1.bp.blogspot.com/_clRJ8KPAYVc/S9vv3ALHpSI/AAAAAAAAAGk/u3obCWMmI-o/s640/chromeextensions.png" width="640" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: darkblue; color: white; font-weight: bold;"&gt;Hello, Worldを表示してみる&lt;/div&gt;とりあえずこの「manifest.json」が始まりらしいです。&lt;br /&gt;ここには拡張機能一覧にどのように表示するかとか、インストール時にどう表示するかとか、BrowserAction・PageActionのどっちを使うかとかを設定します。&lt;br /&gt;&lt;br /&gt;manifest.json&lt;br /&gt;&lt;pre style="background-color: black; color: white;"&gt;{&lt;br /&gt;    "name":"Hello, World",&lt;br /&gt;    "description":"「Hello, World」を表示します",&lt;br /&gt;    "browser_action": {&lt;br /&gt;        "default_icon":"icon19.png",&lt;br /&gt;        "default_title": "hello, world",&lt;br /&gt;        "popup": "helloworld.html"&lt;br /&gt;    },&lt;br /&gt;    "icons":{&lt;br /&gt;        "128":"icon128.png",&lt;br /&gt;        "48":"icon48.png"&lt;br /&gt;    },&lt;br /&gt;    "version":"0.0.1"&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;こちらが詳しいです。&lt;br /&gt;&lt;a href="http://dev.screw-axis.com/doc/chrome_extensions/ref/formats/manifest_file/" target="_blank"&gt;http://dev.screw-axis.com/doc/chrome_extensions/ref/formats/manifest_file/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;browser_actionを指定すると、アドレスバーの右側にボタンを表示してクリックするとpopupのファイルを表示してくれました。&lt;br /&gt;ちなみにhelloworld.htmlはかなり適当です。&lt;br /&gt;&lt;pre style="background-color: black; color: white;"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;meta charset="utf-8"&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Hello, World&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;h1&amp;gt;Hello, World&amp;lt;/h1&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;manifest.jsonとかhtml,アイコンのファイルなどは同一ディレクトリに配置しておけばおｋです。&lt;br /&gt;&lt;br /&gt;導入は拡張機能の画面で「パッケージ化されていない拡張機能を読み込みます」ボタンから開発したソースを配置しているディレクトリを選べばよいです。&lt;br /&gt;&lt;br /&gt;で、こんなかんじになりました。&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_clRJ8KPAYVc/S9vwBhxogBI/AAAAAAAAAGs/B2f29u1uiPg/s1600/helloworldecho.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_clRJ8KPAYVc/S9vwBhxogBI/AAAAAAAAAGs/B2f29u1uiPg/s320/helloworldecho.png" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-3840873346178059567?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/3840873346178059567/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/05/chrome.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/3840873346178059567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/3840873346178059567'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/05/chrome.html' title='Chrome拡張を触ってみたじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_clRJ8KPAYVc/S9vv3ALHpSI/AAAAAAAAAGk/u3obCWMmI-o/s72-c/chromeextensions.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-187815517593633176</id><published>2010-04-29T12:59:00.001+09:00</published><updated>2010-04-29T13:12:23.177+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='その他'/><title type='text'>JavaScript NESエミュレータを触ってみたじぇ</title><content type='html'>ひと昔前に比べてPCのスペックは本当に向上しました。&lt;br /&gt;Javaのバージョンが1.3の頃は、これからPCの処理速度が向上すればJavaが主流になっていくと言われ、まさにその通りの状況になっています。他の主要なスクリプト言語なども、きっとこれほどPCの性能が向上していなければ「絵に描いた餅」となっていたことでしょうね。&lt;br /&gt;&lt;br /&gt;最近はブラウザにおけるJavaScriptの処理系も高速化が進んできています。&lt;br /&gt;CPUの性能向上とJavaScriptエンジンの処理高速化によって、ブラウザ上でNESのエミュレートができるほどになってきたとのことです。&lt;br /&gt;&lt;a href="http://benfirshman.com/projects/jsnes/" target="_blank"&gt;http://benfirshman.com/projects/jsnes/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;びっくりするほど滑らかに動きました。&lt;br /&gt;この先どんな進化をしていくのか・・・。&lt;br /&gt;ただ、CPUの集積密度が高くなり量子効果が出始めるぐらいになっているらしいので、どこで頭打ちになるのかなぁ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-187815517593633176?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/187815517593633176/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/04/javascript-nes.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/187815517593633176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/187815517593633176'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/04/javascript-nes.html' title='JavaScript NESエミュレータを触ってみたじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-6098761149221752101</id><published>2010-04-25T20:13:00.004+09:00</published><updated>2010-04-25T20:28:21.778+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門～ツールヒント編～だじぇ</title><content type='html'>無線LANのプリンタがほしいなぁ・・・と思っている今日この頃です。&lt;br /&gt;さて、ツールヒントのセクションに入りました。&lt;br /&gt;そろそろユーザインターフェースの章が終わりそう。&lt;br /&gt;&lt;br /&gt;ツールヒントは、コンポーネントにマウスポインタを重ねたときに使い方のヒントなどをポップアップウィンドウで表示する機能です。ツールヒントでアプリケーションの操作手順を示したり、ツールヒントをカスタマイズして別の機能を実装したりできるみたい。&lt;br /&gt;&lt;br /&gt;UIComponentを継承しているコンポーネントには、toolTipプロパティをサポートしており、指定した文字列が表示されます。&lt;pre style="background-color: black; color: white;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;  &amp;lt;mx:Button label="submit" toolTip="このボタンをクリックするとデータが登録されます" /&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;span class="Apple-style-span" style="font-family: inherit;"&gt;&lt;embed src="http://sky.geocities.jp/tcsmq262/toolhint01.swf"&gt;&lt;/embed&gt;&lt;/span&gt;&lt;br /&gt;あとツールヒントのスタイルを変えてみました。&lt;br /&gt;これはスタイルシートで指定。&lt;br /&gt;&lt;pre style="background-color: black; color: white;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;  &amp;lt;mx:Style&amp;gt;&lt;br /&gt;    &amp;lt;![CDATA[&lt;br /&gt;      ToolTip { &lt;br /&gt;        fontFamily: "Arial"; &lt;br /&gt;        fontSize: 12; &lt;br /&gt;        fontWeight: bold;&lt;br /&gt;        color: #FFFFFF; &lt;br /&gt;        backgroundColor: #001459;&lt;br /&gt;       }&lt;br /&gt;    ]]&amp;gt;&lt;br /&gt;  &amp;lt;/mx:Style&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;mx:Button label="submit" toolTip="このボタンをクリックするとデータが登録されます" /&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;embed src="http://sky.geocities.jp/tcsmq262/toolhint02.swf"&gt;&lt;/embed&gt;&lt;br /&gt;「ふーん」って感じでした。&lt;br /&gt;次回はエラーヒント。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-6098761149221752101?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/6098761149221752101/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/04/flex_25.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6098761149221752101'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6098761149221752101'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/04/flex_25.html' title='Flex入門～ツールヒント編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-7320594289713646533</id><published>2010-04-22T00:11:00.000+09:00</published><updated>2010-04-22T00:11:43.783+09:00</updated><title type='text'>Flex入門～トランジション編～だじぇ</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;トランジションはビューステートが変更されるときに、どのように変化していくかを指定する機能です。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ビューステートを変更すると、トランジションを指定しない場合は一瞬で状態が切り替わりますが、トランジションを指定しておけば、ジワジワ～とかウニョウニョ～といった感じに変化していきます。&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;  &amp;lt;mx:states&amp;gt;&lt;br /&gt;    &amp;lt;!-- 登録用ビューステート --&amp;gt;&lt;br /&gt;    &amp;lt;mx:State name="Regitster"&amp;gt;&lt;br /&gt;      &amp;lt;!-- タイトルを「ユーザ情報」に変更 --&amp;gt;&lt;br /&gt;      &amp;lt;mx:SetProperty target="{loginPanel}" name="title" value="ユーザ登録" /&amp;gt;&lt;br /&gt;      &lt;br /&gt;      &amp;lt;!-- 「パスワード確認」テキストボックスを追加 --&amp;gt;&lt;br /&gt;      &amp;lt;mx:AddChild relativeTo="{loginForm}" position="lastChild"&amp;gt;&lt;br /&gt;        &amp;lt;mx:FormItem label="パスワード確認"&amp;gt;&lt;br /&gt;          &amp;lt;mx:TextInput displayAsPassword="true" width="300" /&amp;gt;&lt;br /&gt;        &amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;      &amp;lt;/mx:AddChild&amp;gt;&lt;br /&gt;      &lt;br /&gt;      &amp;lt;!-- コントロールバーのリンクとボタンを削除 --&amp;gt;&lt;br /&gt;      &amp;lt;mx:RemoveChild target="{registerLink}" /&amp;gt;&lt;br /&gt;      &amp;lt;mx:RemoveChild target="{loginBtn}" /&amp;gt;&lt;br /&gt;      &lt;br /&gt;      &amp;lt;!-- コントロールバーに「登録」「キャンセル」ボタンを追加 --&amp;gt;&lt;br /&gt;      &amp;lt;mx:AddChild relativeTo="{ctrlBar}" position="lastChild"&amp;gt;&lt;br /&gt;        &amp;lt;mx:HBox&amp;gt;&lt;br /&gt;          &amp;lt;mx:Button id="regBtn" label="登録" width="120" /&amp;gt;&lt;br /&gt;          &amp;lt;mx:Button id="cancelBtn" label="キャンセル" click="currentState=''" width="120" /&amp;gt;&lt;br /&gt;        &amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;      &amp;lt;/mx:AddChild&amp;gt;&lt;br /&gt;    &amp;lt;/mx:State&amp;gt;&lt;br /&gt;  &amp;lt;/mx:states&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;mx:transitions&amp;gt;&lt;br /&gt;    &amp;lt;!-- デフォルトビューステート⇒Registerビューステートのトランジション --&amp;gt;&lt;br /&gt;    &amp;lt;mx:Transition fromState="*" toState="Regitster"&amp;gt;&lt;br /&gt;      &amp;lt;mx:Parallel id="t1" target="{loginPanel}"&amp;gt;&lt;br /&gt;        &amp;lt;mx:Resize duration="400"&amp;gt;&amp;lt;/mx:Resize&amp;gt;&lt;br /&gt;      &amp;lt;/mx:Parallel&amp;gt;&lt;br /&gt;    &amp;lt;/mx:Transition&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;!-- Registerビューステート⇒デフォルトビューステートのトランジション --&amp;gt;&lt;br /&gt;    &amp;lt;mx:Transition fromState="Regitster" toState="*"&amp;gt;&lt;br /&gt;      &amp;lt;mx:Parallel id="t2" target="{loginPanel}"&amp;gt;&lt;br /&gt;        &amp;lt;mx:Resize duration="2000"&amp;gt;&amp;lt;/mx:Resize&amp;gt;&lt;br /&gt;      &amp;lt;/mx:Parallel&amp;gt;&lt;br /&gt;    &amp;lt;/mx:Transition&amp;gt;&lt;br /&gt;  &amp;lt;/mx:transitions&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;mx:Panel title="ログインフォーム" id="loginPanel"&amp;gt;&lt;br /&gt;    &amp;lt;mx:Form id="loginForm"&amp;gt;&lt;br /&gt;      &amp;lt;mx:FormItem label="ユーザID"&amp;gt;&lt;br /&gt;        &amp;lt;mx:TextInput width="300" /&amp;gt;&lt;br /&gt;      &amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;      &amp;lt;mx:FormItem label="パスワード"&amp;gt;&lt;br /&gt;        &amp;lt;mx:TextInput displayAsPassword="true" width="300" /&amp;gt;&lt;br /&gt;      &amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;    &amp;lt;/mx:Form&amp;gt;&lt;br /&gt;    &amp;lt;mx:ControlBar id="ctrlBar"&amp;gt;&lt;br /&gt;      &amp;lt;mx:LinkButton id="registerLink" label="ユーザ登録" textDecoration="underline" click="currentState='Regitster'" /&amp;gt;&lt;br /&gt;      &amp;lt;mx:Spacer width="100%" /&amp;gt;&lt;br /&gt;      &amp;lt;mx:Button id="loginBtn" label="ログイン" width="120" /&amp;gt;&lt;br /&gt;    &amp;lt;/mx:ControlBar&amp;gt;&lt;br /&gt;  &amp;lt;/mx:Panel&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;embed height="300" src="http://sky.geocities.jp/tcsmq262/transition01.swf" width="550"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;TransitionタグのfromStateとtoStateにビューステートの変更を記述し、合致するトランジションが使用されます。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;なので、デフォルト⇒Registerでは0.4sec、Register⇒デフォルトでは2secでリサイズしています。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ﾉｼ&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-7320594289713646533?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/7320594289713646533/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/04/flex_22.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/7320594289713646533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/7320594289713646533'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/04/flex_22.html' title='Flex入門～トランジション編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-3590918992399002843</id><published>2010-04-17T22:52:00.003+09:00</published><updated>2010-04-17T22:56:14.838+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門～ビューステート編～だじぇ</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;もう4月なのに、この寒さ((((；ﾟДﾟ)))&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;さて、今回は「ビューステート（ViewState）」のセクションでした。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ビューステートは動的に見た目を変えるための機能だそうです。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;操作中に画面の表示状態を切り替えることはよくあります。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;そこで、あらかじめいくつかの「状態」を用意して置き、マウスの操作やキー操作、&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ボタンのクリックのイベントで切り替えるようにしておきます。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;そのあらかじめ用意しておく状態が「ビューステート」です。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;と、ここまでは「ふーん」といった感じで流し読み。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ただ、ここでふと「別にvisible属性とか使えば、ビューステートとか用意しなくてもいいんでないの？これを使うと何かいいことあるのかな？」と思い、とりあえずサンプルを参考にしてソースをカキカキ。&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;  &amp;lt;mx:states&amp;gt;&lt;br /&gt;    &amp;lt;!-- 登録用ビューステート --&amp;gt;&lt;br /&gt;    &amp;lt;mx:State name="Regitster"&amp;gt;&lt;br /&gt;      &amp;lt;!-- タイトルを「ユーザ情報」に変更 --&amp;gt;&lt;br /&gt;      &amp;lt;mx:SetProperty target="{loginPanel}" name="title" value="ユーザ登録" /&amp;gt;&lt;br /&gt;      &lt;br /&gt;      &amp;lt;!-- 「パスワード確認」テキストボックスを追加 --&amp;gt;&lt;br /&gt;      &amp;lt;mx:AddChild relativeTo="{loginForm}" position="lastChild"&amp;gt;&lt;br /&gt;        &amp;lt;mx:FormItem label="パスワード確認"&amp;gt;&lt;br /&gt;          &amp;lt;mx:TextInput displayAsPassword="true" width="300" /&amp;gt;&lt;br /&gt;        &amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;      &amp;lt;/mx:AddChild&amp;gt;&lt;br /&gt;      &lt;br /&gt;      &amp;lt;!-- コントロールバーのリンクとボタンを削除 --&amp;gt;&lt;br /&gt;      &amp;lt;mx:RemoveChild target="{registerLink}" /&amp;gt;&lt;br /&gt;      &amp;lt;mx:RemoveChild target="{loginBtn}" /&amp;gt;&lt;br /&gt;      &lt;br /&gt;      &amp;lt;!-- コントロールバーに「登録」「キャンセル」ボタンを追加 --&amp;gt;&lt;br /&gt;      &amp;lt;mx:AddChild relativeTo="{ctrlBar}" position="lastChild"&amp;gt;&lt;br /&gt;        &amp;lt;mx:HBox&amp;gt;&lt;br /&gt;          &amp;lt;mx:Button id="regBtn" label="登録" width="120" /&amp;gt;&lt;br /&gt;          &amp;lt;mx:Button id="cancelBtn" label="キャンセル" click="currentState=''" width="120" /&amp;gt;&lt;br /&gt;        &amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;      &amp;lt;/mx:AddChild&amp;gt;&lt;br /&gt;    &amp;lt;/mx:State&amp;gt;&lt;br /&gt;  &amp;lt;/mx:states&amp;gt;&lt;br /&gt;  &lt;br /&gt;  &amp;lt;mx:Panel title="ログインフォーム" id="loginPanel"&amp;gt;&lt;br /&gt;    &amp;lt;mx:Form id="loginForm"&amp;gt;&lt;br /&gt;      &amp;lt;mx:FormItem label="ユーザID"&amp;gt;&lt;br /&gt;        &amp;lt;mx:TextInput width="300" /&amp;gt;&lt;br /&gt;      &amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;      &amp;lt;mx:FormItem label="パスワード"&amp;gt;&lt;br /&gt;        &amp;lt;mx:TextInput displayAsPassword="true" width="300" /&amp;gt;&lt;br /&gt;      &amp;lt;/mx:FormItem&amp;gt;&lt;br /&gt;    &amp;lt;/mx:Form&amp;gt;&lt;br /&gt;    &amp;lt;mx:ControlBar id="ctrlBar"&amp;gt;&lt;br /&gt;      &amp;lt;mx:LinkButton id="registerLink" label="ユーザ登録" textDecoration="underline" click="currentState='Regitster'" /&amp;gt;&lt;br /&gt;      &amp;lt;mx:Spacer width="100%" /&amp;gt;&lt;br /&gt;      &amp;lt;mx:Button id="loginBtn" label="ログイン" width="120" /&amp;gt;&lt;br /&gt;    &amp;lt;/mx:ControlBar&amp;gt;&lt;br /&gt;  &amp;lt;/mx:Panel&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;embed src="http://sky.geocities.jp/tcsmq262/viewstate01.swf" width="550" height="270"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;currentStateプロパティにビューステート名（Stateタグのnameプロパティ値）を指定することで全体が変更。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;元に戻すときは、空文字列を指定すればデフォルトのビューステートに戻る。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;なるほど。「元に戻す」部分のコード書かなくていいのね。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;それだけでも楽になることはありそう。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;切り替え時にコンポーネントを追加する場合は、切り替えるタイミングでコンポーネント作成しようとするみたいなので、切り替え前に作成しておいて差し替えるような書き方をしたほうが良さげ。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;まあ、場合によりけりだと思うけど。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;結論：これは使い勝手がありそうな機能。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-3590918992399002843?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/3590918992399002843/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/04/flex_17.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/3590918992399002843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/3590918992399002843'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/04/flex_17.html' title='Flex入門～ビューステート編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-7836433314325274525</id><published>2010-04-10T02:12:00.002+09:00</published><updated>2010-04-11T00:41:39.662+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='ExtJS'/><title type='text'>Ext.DirectとSAStrutsを連携させるじぇ</title><content type='html'>今日は体調が・・・、でもいっぱい寝たのでだいぶましになりました。&lt;br /&gt;声もちゃんと出るようになったし。痛みはあるけど。&lt;br /&gt;&lt;br /&gt;最近はJavaでWebアプリケーション作るってなったら、まずSAStrutsを使います。&lt;br /&gt;で、今回はExt.DirectのリクエストをSAStrutsで処理するためのモジュールを作ってみました。&lt;br /&gt;&lt;br /&gt;Download：&lt;a href="http://sky.geocities.jp/tcsmq262/sastruts-extdirectrouting.zip"&gt;sastruts-extdirectrouting.zip&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;次のように使えるようになりました。&lt;br /&gt;設定ファイルの変更などについては、ダウンロードしたファイルのREADME.txtに書いています。&lt;br /&gt;&lt;br /&gt;①ActionにList data、JSONObject resultプロパティを定義する。&lt;br /&gt;②Ext.Directのリクエストを受け取るActionのメソッドに@Directアノテーションを付与する。&lt;br /&gt;③異常時は例外をスローすると、例外のException#getMessageで取得できる内容が返される。&lt;br /&gt;&lt;pre style="background-color: black; color: white;"&gt;public class SampleAction {&lt;br /&gt;  // Ext.Directから受け取るデータ&lt;br /&gt;  public List data;&lt;br /&gt;  // Ext.Directへ送る結果&lt;br /&gt;  public JSONObject result;&lt;br /&gt;&lt;br /&gt;  // Directアノテーションを付けるとExt.Directのリモートコール対象になる。&lt;br /&gt;  @Direct&lt;br /&gt;  @Execute(validator = false)&lt;br /&gt;  public String echo() throws Exception {&lt;br /&gt;&lt;br /&gt;    result = new JSONObject();&lt;br /&gt;    result.put("msg", "test");&lt;br /&gt;&lt;br /&gt;    // 途中で異常が発生した場合は例外をスローします。&lt;br /&gt;    // 例外のメッセージがクライアント側に返ります。&lt;br /&gt;//    if(result.has("msg")) {&lt;br /&gt;//      throw new Exception("例外を発生させましたよー。");&lt;br /&gt;//    }&lt;br /&gt;&lt;br /&gt;    // 戻り値はなんでもよいですw。&lt;br /&gt;    return null;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;処理概要に興味がある方は先を読んでみてください。&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: blue; color: white; font-weight: bold;"&gt;Ext.Directの処理概要&lt;/div&gt;Ext.Directはクライアントからサーバのモジュールをリモートコールするための仕組みです。&lt;br /&gt;ExtJS3.0から標準モジュールに含まれるようになりました。&lt;br /&gt;流れは次のとおりです。&lt;br /&gt;まず、クライアント側からExtJSで提供されるモジュール（Ext.Direct）を利用してWebサーバへリクエストを発行します。このリクエストには、「どのクラスのどのメソッドを引数～で実行せよ」といったパラメータが含まれています。&lt;br /&gt;リクエストを受け取ったサーバ側はパラメータを解析し、指定されたモジュールを実行、結果をExt.Directのルールに従った形に変換してレスポンスとして返します。&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: blue; color: white; font-weight: bold;"&gt;SAStrutsの処理概要&lt;/div&gt;次にSAStrutsです。&lt;br /&gt;SAStrutsでは、http://xxx/Sample/test/getTreeのようなURLでリクエストを送信します。&lt;br /&gt;これはTestActionのgetTreeメソッドで処理しなさいという意味です。&lt;br /&gt;リクエストを受け取るとSAStrutsの内部では下図のようなことが行われます。&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_clRJ8KPAYVc/S74XuMmzDzI/AAAAAAAAAGE/krd3YGFgs2g/s1600/SAStruts.png" /&gt;&lt;/div&gt;1つ目のルーティング用のフィルターでURLを変更してForwardしています。&lt;br /&gt;このルーティング用のフィルターの部分を自作して、Ext.DirectのリクエストからSAStrutsの流れに沿うようにURLを組み立てれば、うまく処理できるようになりそうです。&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: blue; color: white; font-weight: bold;"&gt;ルーティング部分の実装&lt;/div&gt;というわけで、ルーティング用フィルターは下図のようになるように作ってみました。&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_clRJ8KPAYVc/S8Cbx0NCa-I/AAAAAAAAAGM/VOUIiuHSygA/s1600/Ext.DirectToSAStruts.png" /&gt;&lt;/div&gt;Ext.DirectのパラメータはURLにクエリ連結して渡すようにします（だって、どうやったってパラメータマップ操作できなかったんだもの・・・）。&lt;br /&gt;GETリクエストの上限が少し気になりましたが、10000バイトのデータで試してもデータが欠落することはなかったです。&lt;br /&gt;ルーティング部分は次のようになりました。&lt;br /&gt;&lt;pre style="background-color: black; color: white;"&gt;public class ExtDirectRoutingFilter extends RoutingFilter {&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public void doFilter(ServletRequest request, ServletResponse response,&lt;br /&gt;      FilterChain chain) throws IOException, ServletException {&lt;br /&gt;&lt;br /&gt;    if(request.getParameter(ExtDirectUtil.Const.EXT_ACTION) != null) {&lt;br /&gt;      this.forwardFormPostExtDirect(request, response, chain);&lt;br /&gt;    } else if(request.getContentType() != null &amp;amp;&amp;amp; &lt;br /&gt;      request.getContentType().toLowerCase().startsWith("application/json")) {&lt;br /&gt;      this.forwardHttpPostExtDirect(request, response, chain);&lt;br /&gt;    } else {&lt;br /&gt;      super.doFilter(request, response, chain);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void forwardHttpPostExtDirect(ServletRequest request, ServletResponse response,&lt;br /&gt;      FilterChain chain) throws IOException, ServletException {&lt;br /&gt;&lt;br /&gt;    JSONObject jsonObj = JSONObject.fromObject(this.getHttpPostParameter(request));&lt;br /&gt;    String action = jsonObj.getString(ExtDirectUtil.Const.ACTION);&lt;br /&gt;    String method = jsonObj.getString(ExtDirectUtil.Const.METHOD);&lt;br /&gt;    String type = jsonObj.getString(ExtDirectUtil.Const.TYPE);&lt;br /&gt;    String tid = jsonObj.getString(ExtDirectUtil.Const.TID);&lt;br /&gt;&lt;br /&gt;    Collection dataList = null;&lt;br /&gt;    if(jsonObj.get(ExtDirectUtil.Const.DATA) instanceof JSONArray) {&lt;br /&gt;      JSONArray data = (JSONArray)jsonObj.get(ExtDirectUtil.Const.DATA);&lt;br /&gt;      removeNullMap(data);&lt;br /&gt;&lt;br /&gt;      dataList = JSONArray.toCollection((JSONArray)data);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    int findPos = action.lastIndexOf("Action");&lt;br /&gt;    String forwardActionName = action.substring(0, 1).toLowerCase() + action.substring(1, findPos);&lt;br /&gt;&lt;br /&gt;    String forwardPath =&lt;br /&gt;      forwardActionName + ".do?" +&lt;br /&gt;      ExtDirectUtil.Const.METHOD_NAME + "=" + method + "&amp;amp;" +&lt;br /&gt;      createDataParameter(dataList) +&lt;br /&gt;      ExtDirectUtil.Const.EXT_DIRECT_REQ_ACTION + "=" + action + "&amp;amp;" +&lt;br /&gt;      ExtDirectUtil.Const.EXT_DIRECT_REQ_METHOD + "=" + method + "&amp;amp;" +&lt;br /&gt;      ExtDirectUtil.Const.EXT_DIRECT_REQ_TYPE + "=" + type + "&amp;amp;" +&lt;br /&gt;      ExtDirectUtil.Const.EXT_DIRECT_REQ_TID + "=" + tid;&lt;br /&gt;&lt;br /&gt;    request.getRequestDispatcher(forwardPath).forward(request, response);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void forwardFormPostExtDirect(ServletRequest request, ServletResponse response,&lt;br /&gt;      FilterChain chain) throws IOException, ServletException {&lt;br /&gt;&lt;br /&gt;    String action = (String)request.getParameter("extAction");&lt;br /&gt;    String tid = (String)request.getParameter("extTID");&lt;br /&gt;    String method = (String)request.getParameter("extMethod");&lt;br /&gt;    String type = (String)request.getParameter("extType");&lt;br /&gt;&lt;br /&gt;    int findPos = action.lastIndexOf("Action");&lt;br /&gt;    String forwardActionName = action.substring(0, 1).toLowerCase() + action.substring(1, findPos);&lt;br /&gt;&lt;br /&gt;    String forwardPath =&lt;br /&gt;      forwardActionName + ".do?" +&lt;br /&gt;      ExtDirectUtil.Const.METHOD_NAME + "=" + method + "&amp;amp;" +&lt;br /&gt;      ExtDirectUtil.Const.EXT_DIRECT_REQ_ACTION + "=" + action + "&amp;amp;" +&lt;br /&gt;      ExtDirectUtil.Const.EXT_DIRECT_REQ_METHOD + "=" + method + "&amp;amp;" +&lt;br /&gt;      ExtDirectUtil.Const.EXT_DIRECT_REQ_TYPE + "=" + type + "&amp;amp;" +&lt;br /&gt;      ExtDirectUtil.Const.EXT_DIRECT_REQ_TID + "=" + tid;&lt;br /&gt;&lt;br /&gt;    request.getRequestDispatcher(forwardPath).forward(request, response);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private void removeNullMap(JSONArray data) {&lt;br /&gt;    for(int n = 0; n &amp;lt; data.size(); n++) {&lt;br /&gt;      Object d = data.get(n);&lt;br /&gt;      if(d instanceof Map) {&lt;br /&gt;        if(((Map)d).isEmpty()) {&lt;br /&gt;          data.remove(n--);&lt;br /&gt;          continue;&lt;br /&gt;        }&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private String createDataParameter(Collection dataList) {&lt;br /&gt;    StringBuilder sb = new StringBuilder(30);&lt;br /&gt;    if(dataList != null) {&lt;br /&gt;      for (Object obj : dataList) {&lt;br /&gt;        String data = (String)obj;&lt;br /&gt;        sb.append(ExtDirectUtil.Const.DATA + "=" + data + "&amp;amp;");&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return sb.toString();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private String getHttpPostParameter(ServletRequest req) throws IOException {&lt;br /&gt;&lt;br /&gt;    StringBuilder httpPostParameter = new StringBuilder();&lt;br /&gt;&lt;br /&gt;    BufferedReader reader = req.getReader();&lt;br /&gt;&lt;br /&gt;    String buf;&lt;br /&gt;    while((buf = reader.readLine()) != null) {&lt;br /&gt;      httpPostParameter.append(buf);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    return httpPostParameter.toString();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;データがJSON文字列でくるので、パーサにJSON-libライブラリを使わせて頂いてます(´▽｀) &lt;br /&gt;Ext.Directのリクエストには「HTTP POST」と「FORM POST」の2種類があるので、 それぞれに対する処理を分けています（「HTTP POST」の判定はコンテンツタイプが「application/json」かどうかなので、若干無理やりな気がしてますが・・・）。&lt;br /&gt;で、Ext.Directのリクエストに含まれるパラメータはクエリ文字列でつないで渡してます。&lt;br /&gt;なので、固定のパラメータ名を付与しています（これは使わないようにしないと）。&lt;br /&gt;一番イヤなのが「data」っていうExt.Directのパラメータ。&lt;br /&gt;なんと配列なのですよ。&lt;br /&gt;そのうちオブジェクトリテラルにする予定らしいですが（その時また修正いるじゃん）。&lt;br /&gt;（参考）&lt;br /&gt;&lt;a href="http://json-lib.sourceforge.net/"&gt;JSON-lib&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.masatom.in/pukiwiki/JSON/Json-lib%A4%F2%BB%C8%A4%A6/"&gt;「きのさいと」JSON/JSON-libを使う&lt;/a&gt;  &lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: blue; color: white; font-weight: bold;"&gt;■インターセプタ部分の実装&lt;/div&gt;次にExt.DirectのレスポンスをAspectで共通化しました。&lt;br /&gt;Ext.Directには「application/json」のContentTypeで次のような値を返す決まりになっています。&lt;br /&gt;（通常）&lt;br /&gt;&lt;pre style="background-color: black; color: white;"&gt;{&lt;br /&gt;   type – 'rpc' ,&lt;br /&gt;   tid – 実行されたトランザクションのID ,&lt;br /&gt;   action – 実行されたクラス/アクション ,&lt;br /&gt;   method – 実行されたメソッド ,&lt;br /&gt;   result – メソッドを呼び出した結果&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;（例外）&lt;br /&gt;&lt;pre style="background-color: black; color: white;"&gt;{&lt;br /&gt;   type – 'exception' ,&lt;br /&gt;   tid – 実行されたトランザクションのID ,&lt;br /&gt;   message – サーバー側で起きたエラーを特定するためのメッセージ ,&lt;br /&gt;   where – サーバー側のどの部分でエラーが起きたかを伝えるメッセージ&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;※（正常）のresultにはJSON形式のデータ（任意）を格納すればおｋ。&lt;br /&gt;&lt;br /&gt;で、どういう風にしようかなーと思い、Actionに「@Direct」みたいなアノテーションを付けて、 Ext.Direct固有の処理が入るようにしよう！と考えました。&lt;br /&gt;アノテーションにAOPを付与する方法がわからなかったので、こちら（&lt;a href="http://d.hatena.ne.jp/cleverware/20090426/1240726962"&gt;cleverwareの日記&lt;/a&gt;）を参考にさせて頂きました＼(´▽｀)／&lt;br /&gt;これで@Directを付けたメソッドは自動的にExt.Directにレスポンスできるようにできました。&lt;br /&gt;実行結果はActionにresultというプロパティを持たせて、そこに結果を格納するようにしています（型はMapとかのほうが良かったかな？）。&lt;br /&gt;&lt;pre style="background-color: black; color: white;"&gt;public class ExtDirectInterceptor extends AbstractInterceptor {&lt;br /&gt;&lt;br /&gt;  @Override&lt;br /&gt;  public Object invoke(MethodInvocation invocation) throws Throwable {&lt;br /&gt;    String jsonResponseMessage;&lt;br /&gt;    Object instance = invocation.getThis();&lt;br /&gt;    HttpServletRequest request = RequestUtil.getRequest();&lt;br /&gt;&lt;br /&gt;    String actionValue = request.getParameter(ExtDirectUtil.Const.EXT_DIRECT_REQ_ACTION);&lt;br /&gt;    String methodValue = request.getParameter(ExtDirectUtil.Const.EXT_DIRECT_REQ_METHOD);&lt;br /&gt;    String tidValue = request.getParameter(ExtDirectUtil.Const.EXT_DIRECT_REQ_TID);&lt;br /&gt;&lt;br /&gt;    try {&lt;br /&gt;      Class actionClass = instance.getClass();&lt;br /&gt;      Field resultField = actionClass.getField(ExtDirectUtil.Const.RESULT);&lt;br /&gt;&lt;br /&gt;      invocation.proceed();&lt;br /&gt;&lt;br /&gt;      JSONObject resultValue = (JSONObject)resultField.get(instance);&lt;br /&gt;      jsonResponseMessage = ExtDirectUtil.createSuccessResponse(&lt;br /&gt;                                   tidValue, actionValue, methodValue, resultValue);&lt;br /&gt;&lt;br /&gt;    } catch(Exception e) {&lt;br /&gt;      e.printStackTrace();&lt;br /&gt;      jsonResponseMessage = ExtDirectUtil.createExceptioonResponse(&lt;br /&gt;                                   tidValue, e.getMessage(), instance.getClass().toString());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    ResponseUtil.write(jsonResponseMessage, ExtDirectUtil.Const.CONTENT_TYPE_APPLICATION_JSON);&lt;br /&gt;&lt;br /&gt;    return null;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-7836433314325274525?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/7836433314325274525/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/04/extdirectsastruts.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/7836433314325274525'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/7836433314325274525'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/04/extdirectsastruts.html' title='Ext.DirectとSAStrutsを連携させるじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_clRJ8KPAYVc/S74XuMmzDzI/AAAAAAAAAGE/krd3YGFgs2g/s72-c/SAStruts.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-4181029044484696132</id><published>2010-04-06T01:13:00.005+09:00</published><updated>2010-04-09T15:16:08.409+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門～続！アイテムレンダラーとアイテムエディタ編～だじぇ</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;a href="http://sham-memo.blogspot.com/2010/03/flex.html" target="_blank"&gt;前回&lt;/a&gt;の続きです。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;今回はアイテムレンダラーとアイテムエディタを自作のコンポーネントとして作成してみます。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;まずベースとなるソースです。&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;    &amp;lt;mx:Script&amp;gt;&lt;br /&gt;    &amp;lt;![CDATA[&lt;br /&gt;        [Bindable]&lt;br /&gt;        private var userDataList:Array = [&lt;br /&gt;            { userid: 1, name: "家忍和馬", age: 28, birthday: '1982/03/23' },&lt;br /&gt;            { userid: 2, name: "家忍正孝", age: 30, birthday: '1980/12/12' },&lt;br /&gt;            { userid: 3, name: "家忍果凛", age: 32, birthday: '1978/01/10' }&lt;br /&gt;        ];&lt;br /&gt;    ]]&amp;gt;&lt;br /&gt;    &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;mx:DataGrid dataProvider="{userDataList}" width="500"&amp;gt;&lt;br /&gt;        &amp;lt;mx:columns&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="userid" width="100" /&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="name" width="100" /&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="age" /&amp;gt;&lt;br /&gt;        &amp;lt;/mx:columns&amp;gt;&lt;br /&gt;    &amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;これに自作コンポーネントをアイテムレンダラーやアイテムエディタとして指定してみます。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #0034e8; color: white; font-family: Arial,Helvetica,sans-serif; font-weight: bold;"&gt;アイテムレンダラー&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;自作のコンポーネントといっても特別なことはなく、例えば次のような感じになります。&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;    &amp;lt;mx:Label text="{data.age}"&amp;gt;&amp;lt;/mx:Label&amp;gt;&lt;br /&gt;    &amp;lt;mx:Label text="（生年月日：{data.birthday}）"&amp;gt;&amp;lt;/mx:Label&amp;gt;&lt;br /&gt;&amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;{data.age}や{data.birthday}の「data」は表示するデータのオブジェクトで、そのオブジェクトのプロパティ「age」「birthday」のデータを表示することを意味しています。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;これをアイテムレンダラーとして指定すると次のようになります。&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;    &amp;lt;mx:Script&amp;gt;&lt;br /&gt;    &amp;lt;![CDATA[&lt;br /&gt;        [Bindable]&lt;br /&gt;        private var userDataList:Array = [&lt;br /&gt;            { userid: 1, name: "家忍和馬", age: 28, birthday: '1982/03/23' },&lt;br /&gt;            { userid: 2, name: "家忍正孝", age: 30, birthday: '1980/12/12' },&lt;br /&gt;            { userid: 3, name: "家忍果凛", age: 32, birthday: '1978/01/10' }&lt;br /&gt;        ];&lt;br /&gt;    ]]&amp;gt;&lt;br /&gt;    &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;mx:DataGrid dataProvider="{userDataList}" width="500"&amp;gt;&lt;br /&gt;        &amp;lt;mx:columns&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="userid" width="100" /&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="name" width="100" /&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="age" &lt;span style="color: red; font-weight: bold;"&gt;itemRenderer="my.blogger.memo.MyComponent"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;/mx:columns&amp;gt;&lt;br /&gt;    &amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;embed height="220" src="http://sky.geocities.jp/tcsmq262/MyItemRenderer.swf" width="550"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;これは表示するデータの全てのプロパティにアクセスできるのが特徴です。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;これなら他のプロパティの値などを条件にして表示を切り替えたりできそうです。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;･･･ visible="{data.age &amp;amp;lt; 30}" /&amp;gt;とか。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #0034e8; color: white; font-family: Arial,Helvetica,sans-serif; font-weight: bold;"&gt;アイテムエディタ&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;基本的にはアイテムレンダラーと同じです。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ただ、アイテムエディタで値を変更したらアイテムレンダラーには変更後の値が表示されないとおかしいので、アイテムエディタ⇒アイテムレンダラーに値を渡すことになります。editorDataFieldを使うと、アイテムエディタのどのプロパティの値をアイテムレンダラーに表示するかを指定するみたいです。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;あと、アイテムエディタに渡ってくるdataオブジェクトはDataGridのdataProviderへの参照なので、それを保持しておけば直接変更できるみたい。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ということで、こんな感じにしました。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;■アイテムレンダラー(MyRendererComponent)&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" horizontalGap="0"&amp;gt;&lt;br /&gt;    &amp;lt;mx:Label text="{data.age}"&amp;gt;&amp;lt;/mx:Label&amp;gt;&lt;br /&gt;    &amp;lt;mx:Label text="（生年月日："&amp;gt;&amp;lt;/mx:Label&amp;gt;&lt;br /&gt;    &amp;lt;mx:Label text="{data.birthday}"&amp;gt;&amp;lt;/mx:Label&amp;gt;&lt;br /&gt;    &amp;lt;mx:Label text="）"&amp;gt;&amp;lt;/mx:Label&amp;gt;&lt;br /&gt;&amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;■アイテムエディタ(MyEditorComponent)&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:HBox xmlns:mx="http://www.adobe.com/2006/mxml" horizontalGap="0"&amp;gt;&lt;br /&gt;    &amp;lt;mx:Script&amp;gt;&lt;br /&gt;    &amp;lt;![CDATA[&lt;br /&gt;        import mx.events.NumericStepperEvent;&lt;br /&gt;        import mx.controls.DateField;&lt;br /&gt;&lt;br /&gt;        // 元のデータへの参照です。&lt;br /&gt;        public var tmpData:Object;&lt;br /&gt;        // アイテムレンダラーに返す値になります。&lt;br /&gt;        [Bindable]&lt;br /&gt;        public var age:int;&lt;br /&gt;        [Bindable]&lt;br /&gt;        private var birthday:String;&lt;br /&gt;        &lt;br /&gt;        override public function set data(data:Object):void {&lt;br /&gt;            this.tmpData = data;&lt;br /&gt;            this.age = data.age;&lt;br /&gt;            this.birthday = data.birthday;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        private function handleChange(e:NumericStepperEvent):void {&lt;br /&gt;            &lt;span style="color: #cc0000;"&gt;var deltaAge:int = age - e.value;   // 修正&lt;/span&gt;            this.age = e.currentTarget.value;&lt;br /&gt;            var date:Date = DateField.stringToDate(String(birthdayDateField.text), 'YYYY/MM/DD');&lt;br /&gt;            var year:int = date.getFullYear() + &lt;span style="color: #cc0000;"&gt;deltaAge&lt;/span&gt;;   &lt;span style="background-color: black; color: #cc0000;"&gt;// 修正&lt;/span&gt;&lt;br /&gt;            date.setFullYear(year);&lt;br /&gt;            this.birthday = DateField.dateToString(date, 'YYYY/MM/DD');&lt;br /&gt;            // 元のデータを更新&lt;br /&gt;            tmpData.age = this.age;&lt;br /&gt;            tmpData.birthday = this.birthday;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;    ]]&amp;gt;&lt;br /&gt;    &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;mx:NumericStepper value="{age}" minimum="0" maximum="120" change="handleChange(event)"&amp;gt;&amp;lt;/mx:NumericStepper&amp;gt;&lt;br /&gt;    &amp;lt;mx:Label text="（生年月日："&amp;gt;&amp;lt;/mx:Label&amp;gt;&lt;br /&gt;    &amp;lt;mx:Label id="birthdayDateField" text="{birthday}" &amp;gt;&amp;lt;/mx:Label&amp;gt;&lt;br /&gt;    &amp;lt;mx:Label text="）"&amp;gt;&amp;lt;/mx:Label&amp;gt;&lt;br /&gt;&amp;lt;/mx:HBox&amp;gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;■メイン&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;    &amp;lt;mx:Script&amp;gt;&lt;br /&gt;    &amp;lt;![CDATA[&lt;br /&gt;        [Bindable]&lt;br /&gt;        private var userDataList:Array = [&lt;br /&gt;            { userid: 1, name: "家忍和馬", age: 28, birthday: '1982/03/23' },&lt;br /&gt;            { userid: 2, name: "家忍正孝", age: 30, birthday: '1980/12/12' },&lt;br /&gt;            { userid: 3, name: "家忍果凛", age: 32, birthday: '1978/01/10' }&lt;br /&gt;        ];&lt;br /&gt;    ]]&amp;gt;&lt;br /&gt;    &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;mx:DataGrid dataProvider="{userDataList}" width="500" editable="true"&amp;gt;&lt;br /&gt;        &amp;lt;mx:columns&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="userid" width="100" /&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="name" width="100" /&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="age" &lt;span style="color: red; font-weight: bold;"&gt;editorDataField="age"&lt;br /&gt;              itemRenderer="my.blogger.memo.MyRendererComponent"&lt;br /&gt;              itemEditor="my.blogger.memo.MyEditComponent"&lt;/span&gt; /&amp;gt;&lt;br /&gt;        &amp;lt;/mx:columns&amp;gt;&lt;br /&gt;    &amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;embed height="220" src="http://sky.geocities.jp/tcsmq262/MyRendererEditor.swf" width="550"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;まあ、うまくいったかなぁ？&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ActionScriptで書けばもう少しきれいになるんだろうけど( ﾟДﾟ)ﾏﾝﾄﾞｸｾｰ。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;もう少し慣れたらやってもいいかな？&lt;/div&gt;&lt;br /&gt;＜追記＞&lt;br /&gt;思いっきりバグっていたので修正しました。&lt;br /&gt;今見ると生年月日なんて変わることないんだけどなぁ・・・とか思ったり。&lt;br /&gt;連動できたからおｋってことにしとこう。&lt;br /&gt;体調激ワル、喉痛い・・・。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-4181029044484696132?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/4181029044484696132/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/04/flex.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4181029044484696132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4181029044484696132'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/04/flex.html' title='Flex入門～続！アイテムレンダラーとアイテムエディタ編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-1793172788498884876</id><published>2010-04-04T19:50:00.001+09:00</published><updated>2010-04-04T19:51:27.744+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='データベース'/><title type='text'>SQL「OLAP関数」だじぇ</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&amp;nbsp;WEB+DB PRESSのvol55の掲載から。 &lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;SQLにはOLAP関数っていうものがあります。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;2003年に標準SQLで標準化されたそうです。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;OLAP＝OnLine Analytical Processing&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;（稼働環境）&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;・Oracle&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;・SQLServer&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;・DB2&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;・ PostgreSQL(8.4以降）&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;説明に使うテーブル。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;■口座テーブル(Accounts)&lt;/div&gt;&lt;table border="1" cellpadding="0" cellspacing="0" style="border-collapse: collapse; border: 1px solid black; font-family: Arial,Helvetica,sans-serif; width: 345px;" x:str=""&gt;&lt;col style="width: 86pt;" width="115"&gt;&lt;/col&gt;  &lt;col style="width: 86pt;" width="115"&gt;&lt;/col&gt;  &lt;col style="width: 86pt;" width="115"&gt;&lt;/col&gt;  &lt;tbody&gt;&lt;tr height="32" style="height: 24pt;"&gt;   &lt;td class="xl22" height="32" style="background-color: blue; color: #eeeeee; height: 24pt; text-align: center; width: 86pt;" width="115"&gt;&lt;b&gt;口座ID&lt;/b&gt;&lt;br /&gt;&lt;b&gt;(account_id)&lt;/b&gt;&lt;/td&gt;   &lt;td class="xl22" style="background-color: blue; border-left: medium none; color: #eeeeee; text-align: center; width: 86pt;" width="115"&gt;&lt;b&gt;記録日&lt;/b&gt;&lt;br /&gt;&lt;b&gt;(record_date)&lt;/b&gt;&lt;/td&gt;   &lt;td class="xl22" style="background-color: blue; border-left: medium none; color: #eeeeee; text-align: center; width: 86pt;" width="115"&gt;&lt;b&gt;処理金額&lt;/b&gt;&lt;br /&gt;&lt;b&gt;(prc_amount)&lt;/b&gt;&lt;/td&gt;  &lt;/tr&gt;&lt;tr align="center" height="16" style="height: 12pt;"&gt;   &lt;td class="xl23" height="16" style="border-top: medium none; height: 12pt;"&gt;A&lt;/td&gt;   &lt;td class="xl24" style="border-left: medium none; border-top: medium none;" x:num="40194"&gt;2010-01-16&lt;/td&gt;   &lt;td class="xl25" style="border-left: medium none; border-top: medium none;" x:num="1000"&gt;1,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr align="center" height="16" style="height: 12pt;"&gt;   &lt;td class="xl23" height="16" style="border-top: medium none; height: 12pt;"&gt;A&lt;/td&gt;   &lt;td class="xl24" style="border-left: medium none; border-top: medium none;" x:num="40195"&gt;2010-01-17&lt;/td&gt;   &lt;td class="xl25" style="border-left: medium none; border-top: medium none;" x:num="20000"&gt;20,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr align="center" height="16" style="height: 12pt;"&gt;   &lt;td class="xl23" height="16" style="border-top: medium none; height: 12pt;"&gt;A&lt;/td&gt;   &lt;td class="xl24" style="border-left: medium none; border-top: medium none;" x:num="40196"&gt;2010-01-18&lt;/td&gt;   &lt;td class="xl25" style="border-left: medium none; border-top: medium none;" x:num="-3000"&gt;-3,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr align="center" height="16" style="height: 12pt;"&gt;   &lt;td class="xl23" height="16" style="border-top: medium none; height: 12pt;"&gt;A&lt;/td&gt;   &lt;td class="xl24" style="border-left: medium none; border-top: medium none;" x:num="40197"&gt;2010-01-19&lt;/td&gt;   &lt;td class="xl25" style="border-left: medium none; border-top: medium none;" x:num="500000"&gt;-500,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr align="center" height="16" style="height: 12pt;"&gt;   &lt;td class="xl23" height="16" style="border-top: medium none; height: 12pt;"&gt;A&lt;/td&gt;   &lt;td class="xl24" style="border-left: medium none; border-top: medium none;" x:num="40198"&gt;2010-01-20&lt;/td&gt;   &lt;td class="xl25" style="border-left: medium none; border-top: medium none;" x:num="23000"&gt;23,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr align="center" height="16" style="height: 12pt;"&gt;   &lt;td class="xl23" height="16" style="border-top: medium none; height: 12pt;"&gt;B&lt;/td&gt;   &lt;td class="xl24" style="border-left: medium none; border-top: medium none;" x:num="40194"&gt;2010-01-16&lt;/td&gt;   &lt;td class="xl25" style="border-left: medium none; border-top: medium none;" x:num="48000"&gt;48,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr align="center" height="16" style="height: 12pt;"&gt;   &lt;td class="xl23" height="16" style="border-top: medium none; height: 12pt;"&gt;B&lt;/td&gt;   &lt;td class="xl24" style="border-left: medium none; border-top: medium none;" x:num="40195"&gt;2010-01-17&lt;/td&gt;   &lt;td class="xl25" style="border-left: medium none; border-top: medium none;" x:num="98000"&gt;98,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr align="center" height="16" style="height: 12pt;"&gt;   &lt;td class="xl23" height="16" style="border-top: medium none; height: 12pt;"&gt;B&lt;/td&gt;   &lt;td class="xl24" style="border-left: medium none; border-top: medium none;" x:num="40196"&gt;2010-01-18&lt;/td&gt;   &lt;td class="xl25" style="border-left: medium none; border-top: medium none;" x:num="5000"&gt;-5,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr align="center" height="16" style="height: 12pt;"&gt;   &lt;td class="xl23" height="16" style="border-top: medium none; height: 12pt;"&gt;B&lt;/td&gt;   &lt;td class="xl24" style="border-left: medium none; border-top: medium none;" x:num="40197"&gt;2010-01-19&lt;/td&gt;   &lt;td class="xl25" style="border-left: medium none; border-top: medium none;" x:num="30000"&gt;30,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr align="center" height="16" style="height: 12pt;"&gt;   &lt;td class="xl23" height="16" style="border-top: medium none; height: 12pt;"&gt;B&lt;/td&gt;   &lt;td class="xl24" style="border-left: medium none; border-top: medium none;" x:num="40198"&gt;2010-01-20&lt;/td&gt;   &lt;td class="xl25" style="border-left: medium none; border-top: medium none;" x:num="-100000"&gt;-100,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr align="center" height="16" style="height: 12pt;"&gt;   &lt;td class="xl23" height="16" style="border-top: medium none; height: 12pt;"&gt;C&lt;/td&gt;   &lt;td class="xl24" style="border-left: medium none; border-top: medium none;" x:num="40194"&gt;2010-01-16&lt;/td&gt;   &lt;td class="xl25" style="border-left: medium none; border-top: medium none;" x:num="5000"&gt;5,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr align="center" height="16" style="height: 12pt;"&gt;   &lt;td class="xl23" height="16" style="border-top: medium none; height: 12pt;"&gt;C&lt;/td&gt;   &lt;td class="xl24" style="border-left: medium none; border-top: medium none;" x:num="40195"&gt;2010-01-17&lt;/td&gt;   &lt;td class="xl25" style="border-left: medium none; border-top: medium none;" x:num="12000"&gt;12,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr align="center" height="16" style="height: 12pt;"&gt;   &lt;td class="xl23" height="16" style="border-top: medium none; height: 12pt;"&gt;C&lt;/td&gt;   &lt;td class="xl24" style="border-left: medium none; border-top: medium none;" x:num="40196"&gt;2010-01-18&lt;/td&gt;   &lt;td class="xl25" style="border-left: medium none; border-top: medium none;" x:num="30000"&gt;30,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr align="center" height="16" style="height: 12pt;"&gt;   &lt;td class="xl23" height="16" style="border-top: medium none; height: 12pt;"&gt;C&lt;/td&gt;   &lt;td class="xl24" style="border-left: medium none; border-top: medium none;" x:num="40197"&gt;2010-01-19&lt;/td&gt;   &lt;td class="xl25" style="border-left: medium none; border-top: medium none;" x:num="1000"&gt;1,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl23" height="16" style="border-top: medium none; height: 12pt; text-align: center;"&gt;C&lt;/td&gt;   &lt;td class="xl24" style="border-left: medium none; border-top: medium none; text-align: center;" x:num="40198"&gt;2010-01-20&lt;/td&gt;   &lt;td class="xl23" style="border-left: medium none; border-top: medium none; text-align: center;" x:num=""&gt;500&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;OLAP関数は、大きく以下2つに分けられる。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;①通常の集約関数（SUM/AVG/COUNT/MAX/MIN）をOLAP関数として使う。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;②RANK,ROW_NUMBERなどOLAP専用の関数&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;例えばこんなSQLになります。&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;SELECT&lt;br /&gt;    account_id,&lt;br /&gt;    record_date,&lt;br /&gt;    prc_amt,&lt;br /&gt;    AVG(prc_amt) OVER(PARTITION BY account_id ORDER BY record_date) AS cumulative_arg&lt;br /&gt;FROM Accounts;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;■実行結果&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; font-family: Arial,Helvetica,sans-serif; width: 483px;" x:str=""&gt;&lt;col style="width: 86pt;" width="115"&gt;&lt;/col&gt;  &lt;col style="width: 86pt;" width="115"&gt;&lt;/col&gt;  &lt;col style="width: 86pt;" width="115"&gt;&lt;/col&gt;  &lt;col style="width: 104pt;" width="138"&gt;&lt;/col&gt;  &lt;tbody&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt; width: 86pt;" width="115"&gt;account_id&lt;/td&gt;   &lt;td class="xl25" style="width: 86pt;" width="115"&gt;record_date&lt;/td&gt;   &lt;td class="xl24" style="width: 86pt;" width="115"&gt;amount&lt;/td&gt;   &lt;td class="xl24" style="width: 104pt;" width="138"&gt;cumulative_avg&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;A&lt;/td&gt;   &lt;td class="xl25" x:num="40194"&gt;2010-01-16&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;1000&lt;/td&gt;   &lt;td class="xl26" x:num="1000"&gt;1,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;A&lt;/td&gt;   &lt;td class="xl25" x:num="40195"&gt;2010-01-17&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;20000&lt;/td&gt;   &lt;td class="xl26" x:num="10500"&gt;10,500&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;A&lt;/td&gt;   &lt;td class="xl25" x:num="40196"&gt;2010-01-18&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;-3000&lt;/td&gt;   &lt;td class="xl26" x:num="6000"&gt;6,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;A&lt;/td&gt;   &lt;td class="xl25" x:num="40197"&gt;2010-01-19&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;500000&lt;/td&gt;   &lt;td class="xl26" x:num="-120500"&gt;-120,500&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;A&lt;/td&gt;   &lt;td class="xl25" x:num="40198"&gt;2010-01-20&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;23000&lt;/td&gt;   &lt;td class="xl26" x:num="-91800"&gt;-91,800&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;B&lt;/td&gt;   &lt;td class="xl25" x:num="40194"&gt;2010-01-16&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;48000&lt;/td&gt;   &lt;td class="xl26" x:num="48000"&gt;48,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;B&lt;/td&gt;   &lt;td class="xl25" x:num="40195"&gt;2010-01-17&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;98000&lt;/td&gt;   &lt;td class="xl26" x:num="73000"&gt;73,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;B&lt;/td&gt;   &lt;td class="xl25" x:num="40196"&gt;2010-01-18&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;5000&lt;/td&gt;   &lt;td class="xl26" x:num="47000"&gt;47,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;B&lt;/td&gt;   &lt;td class="xl25" x:num="40197"&gt;2010-01-19&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;30000&lt;/td&gt;   &lt;td class="xl26" x:num="42750"&gt;42,750&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;B&lt;/td&gt;   &lt;td class="xl25" x:num="40198"&gt;2010-01-20&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;-100000&lt;/td&gt;   &lt;td class="xl26" x:num="14200"&gt;14,200&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;C&lt;/td&gt;   &lt;td class="xl25" x:num="40194"&gt;2010-01-16&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;5000&lt;/td&gt;   &lt;td class="xl26" x:num="5000"&gt;5,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;C&lt;/td&gt;   &lt;td class="xl25" x:num="40195"&gt;2010-01-17&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;12000&lt;/td&gt;   &lt;td class="xl26" x:num="8500"&gt;8,500&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;C&lt;/td&gt;   &lt;td class="xl25" x:num="40196"&gt;2010-01-18&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;30000&lt;/td&gt;   &lt;td class="xl26" x:num="15667"&gt;15,667&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;C&lt;/td&gt;   &lt;td class="xl25" x:num="40197"&gt;2010-01-19&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;1000&lt;/td&gt;   &lt;td class="xl26" x:num="12000"&gt;12,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;C&lt;/td&gt;   &lt;td class="xl25" x:num="40198"&gt;2010-01-20&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;500&lt;/td&gt;   &lt;td class="xl26" x:num="9700"&gt;9,700&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;account_idごとに過去からその当日までの平均が計算されています。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;集約されません。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;PRECEDINGを使うと、直近Nレコードに制限できます。&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;SELECT&lt;br /&gt;    account_id,&lt;br /&gt;    record_date,&lt;br /&gt;    prc_amt,&lt;br /&gt;    AVG(prc_amt) OVER(PARTITION BY account_id&lt;br /&gt;                      ORDER BY record_date&lt;br /&gt;                      ROWS 2 PRECEDING) AS cumulative_arg&lt;br /&gt;FROM Accounts;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;■実行結果&lt;/div&gt;&lt;table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse; font-family: Arial,Helvetica,sans-serif; width: 483px;" x:str=""&gt;&lt;col style="width: 86pt;" width="115"&gt;&lt;/col&gt;  &lt;col style="width: 86pt;" width="115"&gt;&lt;/col&gt;  &lt;col style="width: 86pt;" width="115"&gt;&lt;/col&gt;  &lt;col style="width: 104pt;" width="138"&gt;&lt;/col&gt;  &lt;tbody&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt; width: 86pt;" width="115"&gt;account_id&lt;/td&gt;   &lt;td class="xl25" style="width: 86pt;" width="115"&gt;record_date&lt;/td&gt;   &lt;td class="xl24" style="width: 86pt;" width="115"&gt;amount&lt;/td&gt;   &lt;td class="xl24" style="width: 104pt;" width="138"&gt;cumulative_avg&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;A&lt;/td&gt;   &lt;td class="xl25" x:num="40194"&gt;2010-01-16&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;1000&lt;/td&gt;   &lt;td class="xl26" x:num="1000"&gt;1,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;A&lt;/td&gt;   &lt;td class="xl25" x:num="40195"&gt;2010-01-17&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;20000&lt;/td&gt;   &lt;td class="xl26" x:num="10500"&gt;10,500&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;A&lt;/td&gt;   &lt;td class="xl25" x:num="40196"&gt;2010-01-18&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;-3000&lt;/td&gt;   &lt;td class="xl26" x:fmla="=AVERAGE(C2:C4)" x:num="6000"&gt;6,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;A&lt;/td&gt;   &lt;td class="xl25" x:num="40197"&gt;2010-01-19&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;-500000&lt;/td&gt;   &lt;td class="xl26" x:fmla="=AVERAGE(C3:C5)" x:num="-161000"&gt;-161,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;A&lt;/td&gt;   &lt;td class="xl25" x:num="40198"&gt;2010-01-20&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;23000&lt;/td&gt;   &lt;td class="xl26" x:fmla="=AVERAGE(C4:C6)" x:num="-160000"&gt;-160,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;B&lt;/td&gt;   &lt;td class="xl25" x:num="40194"&gt;2010-01-16&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;48000&lt;/td&gt;   &lt;td class="xl26" x:num="48000"&gt;48,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;B&lt;/td&gt;   &lt;td class="xl25" x:num="40195"&gt;2010-01-17&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;98000&lt;/td&gt;   &lt;td class="xl26" x:num="73000"&gt;73,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;B&lt;/td&gt;   &lt;td class="xl25" x:num="40196"&gt;2010-01-18&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;-5000&lt;/td&gt;   &lt;td class="xl26" x:fmla="=SUM(C7:C9)/3" x:num="47000"&gt;47,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;B&lt;/td&gt;   &lt;td class="xl25" x:num="40197"&gt;2010-01-19&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;30000&lt;/td&gt;   &lt;td class="xl26" x:fmla="=SUM(C8:C10)/3" x:num="41000"&gt;41,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;B&lt;/td&gt;   &lt;td class="xl25" x:num="40198"&gt;2010-01-20&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;-100000&lt;/td&gt;   &lt;td class="xl26" x:fmla="=SUM(C9:C11)/3" x:num="-25000"&gt;-25,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;C&lt;/td&gt;   &lt;td class="xl25" x:num="40194"&gt;2010-01-16&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;5000&lt;/td&gt;   &lt;td class="xl26" x:num="5000"&gt;5,000&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;C&lt;/td&gt;   &lt;td class="xl25" x:num="40195"&gt;2010-01-17&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;12000&lt;/td&gt;   &lt;td class="xl26" x:num="8500"&gt;8,500&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;C&lt;/td&gt;   &lt;td class="xl25" x:num="40196"&gt;2010-01-18&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;30000&lt;/td&gt;   &lt;td class="xl26" x:fmla="=SUM(C12:C14)/3" x:num="15666.666666666666"&gt;15,667&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;C&lt;/td&gt;   &lt;td class="xl25" x:num="40197"&gt;2010-01-19&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;1000&lt;/td&gt;   &lt;td class="xl26" x:fmla="=SUM(C13:C15)/3" x:num="14333.333333333334"&gt;14,333&lt;/td&gt;  &lt;/tr&gt;&lt;tr height="16" style="height: 12pt;"&gt;   &lt;td class="xl24" height="16" style="height: 12pt;"&gt;C&lt;/td&gt;   &lt;td class="xl25" x:num="40198"&gt;2010-01-20&lt;/td&gt;   &lt;td class="xl24" x:num=""&gt;500&lt;/td&gt;   &lt;td class="xl26" x:fmla="=SUM(C14:C16)/3" x:num="10500"&gt;10,500&lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;「ROWS 2 PRECEDING」は「カレントレコードから過去の直近2レコード」という制限という意味。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;PRECEDINGの代わりにFOLLOWINGを付ければ逆になる。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;便利そう。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;実業務では、こんな計算が必要になることもたまにあるから。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;知ってれば苦労しなかったこともあったろうなぁ・・・。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-1793172788498884876?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/1793172788498884876/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/04/sqlolap.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/1793172788498884876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/1793172788498884876'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/04/sqlolap.html' title='SQL「OLAP関数」だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-6099800532508439825</id><published>2010-04-03T19:56:00.000+09:00</published><updated>2010-04-04T17:04:47.726+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Webサービス'/><title type='text'>Webサービス「Unfuddle」「Cool Text」の紹介</title><content type='html'>今週の寒さは一体・・・((((；ﾟДﾟ)))ｶﾞｸｶﾞｸ&lt;br /&gt;もう4月なのに・・・。&lt;br /&gt;&lt;br /&gt;Webサービスの紹介です。&lt;br /&gt;&lt;br /&gt;Subversionが利用できるWEBサービスがありました。&lt;br /&gt;フリーだと200MBまでいけるそうです。&lt;br /&gt;&lt;a href="http://unfuddle.com/"&gt;Unfuddle&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;最近使ったロゴジェネレータサービスです。&lt;br /&gt;&lt;a href="http://ja.cooltext.com/"&gt;Cool Text&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-6099800532508439825?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/6099800532508439825/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/04/webunfuddlecool-text.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6099800532508439825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6099800532508439825'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/04/webunfuddlecool-text.html' title='Webサービス「Unfuddle」「Cool Text」の紹介'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-8361851570455147114</id><published>2010-03-27T14:51:00.000+09:00</published><updated>2010-04-04T17:05:02.937+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門～アイテムレンダラーとアイテムエディタ編～だじぇ</title><content type='html'>久しぶりの投稿です。&lt;br /&gt;これからまたしばらくFlexを勉強していきます。&lt;br /&gt;早くマニアックなネタを書けるようになりたいなぁ。&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color:#0034E8; color:#FFFFFF; font-weight:bold;"&gt;アイテムレンダラーとアイテムエディタ&lt;/div&gt;グリッドビュー（Excelの表みたいなやつ）を触ったことがある人は多いと思いますが、その時セルをクリックすると編集可能なテキストボックスが表示されたことがないでしょうか？&lt;br /&gt;これはセルをクリックしたイベントで表示が切り替わるようになっているのですが、その際表示された編集用のコントロールをFlexでは「アイテムエディタ」と呼びます。&lt;br /&gt;さらに編集用のコントロールからフォーカスをはずすと、参照状態に戻りますよね？この参照状態でデータを表示するコントロールをFlexでは「アイテムレンダラー」と呼びます。&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color:#0034E8; color:#FFFFFF; font-weight:bold;"&gt;アイテムレンダラー&lt;/div&gt;アイテムレンダラーはListBaseクラスに用意されており、それから派生するコントロールにはアイテムレンダラーを設定できるそうです（プロパティはitemRenderer）。代表的なコントロールがDataGridやTreeです。&lt;br /&gt;各コントロールには、それぞれデフォルトのアイテムレンダラーが用意されています。DataGridであればDataGridItemRenderer、TreeであればTreeItemRendererになります。&lt;br /&gt;まずはデフォルトのアイテムレンダラーのままDataGridを表示してみます。&lt;br /&gt;&lt;pre style="background-color:#000000;color:#FFFFFF;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;    &amp;lt;mx:Script&amp;gt;&lt;br /&gt;    &amp;lt;![CDATA[&lt;br /&gt;        [Bindable]&lt;br /&gt;        private var userDataList:Array = [&lt;br /&gt;            { userid: 1, name: "家忍和馬", age: 28 },&lt;br /&gt;            { userid: 2, name: "家忍正孝", age: 30 },&lt;br /&gt;            { userid: 3, name: "家忍果凛", age: 32 }&lt;br /&gt;        ];&lt;br /&gt;    ]]&amp;gt;&lt;br /&gt;    &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;mx:DataGrid dataProvider="{userDataList}"&amp;gt;&lt;br /&gt;        &amp;lt;mx:columns&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="userid" /&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="name" /&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="age" /&amp;gt;&lt;br /&gt;        &amp;lt;/mx:columns&amp;gt;&lt;br /&gt;    &amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;embed src="http://sky.geocities.jp/tcsmq262/defaultDataGridRenderer.swf" height="230" width="450"&gt;&lt;/embed&gt;&lt;br /&gt;と、まあこれは今までも表示していたわけですが、実はこれがデフォルトのアイテムレンダラーで表示していた状態だったというわけです。&lt;br /&gt;&lt;br /&gt;itemRendererプロパティをコントロールを指定して、別のコントロールをレンダラーとして表示してみます。&lt;br /&gt;ちなみにitemRendererプロパティに指定されたコントロールを「ドロップインアイテムレンダラー」と呼びます。itemEditorプロパティに指定した場合は「ドロップインアイテムエディタ」です。&lt;br /&gt;&lt;pre style="background-color:#000000;color:#FFFFFF;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;    &amp;lt;mx:Script&amp;gt;&lt;br /&gt;    &amp;lt;![CDATA[&lt;br /&gt;        [Bindable]&lt;br /&gt;        private var userDataList:Array = [&lt;br /&gt;            { userid: 1, name: "家忍和馬", age: 28 },&lt;br /&gt;            { userid: 2, name: "家忍正孝", age: 30 },&lt;br /&gt;            { userid: 3, name: "家忍果凛", age: 32 }&lt;br /&gt;        ];&lt;br /&gt;    ]]&amp;gt;&lt;br /&gt;    &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;mx:DataGrid dataProvider="{userDataList}"&amp;gt;&lt;br /&gt;        &amp;lt;mx:columns&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="userid" itemRenderer="mx.controls.Button" /&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="name" itemRenderer="mx.controls.TextInput" /&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="age" /&amp;gt;&lt;br /&gt;        &amp;lt;/mx:columns&amp;gt;&lt;br /&gt;    &amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;embed src="http://sky.geocities.jp/tcsmq262/dropinItemRenderer.swf" height="230" width="450"&gt;&lt;/embed&gt;&lt;br /&gt;ちょっと変な感じがしますが、レンダラーとして指定したコントロールが表示されていますね。&lt;br /&gt;ドロップインアイテムにFlexの既存コントロールを渡したのですが、ボタンのラベルに表示できないような制約があるようです。これはまず使わない気がします。&lt;br /&gt;&lt;br /&gt;DataGridColumnタグのitemRendererタグ子要素としてコントロールを指定することもできます。&lt;br /&gt;&lt;pre style="background-color:#000000;color:#FFFFFF;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;    &amp;lt;mx:Script&amp;gt;&lt;br /&gt;    &amp;lt;![CDATA[&lt;br /&gt;        [Bindable]&lt;br /&gt;        private var userDataList:Array = [&lt;br /&gt;            { userid: 1, name: "家忍和馬", age: 28 },&lt;br /&gt;            { userid: 2, name: "家忍正孝", age: 30 },&lt;br /&gt;            { userid: 3, name: "家忍果凛", age: 32 }&lt;br /&gt;        ];&lt;br /&gt;    ]]&amp;gt;&lt;br /&gt;    &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;    &lt;br /&gt;    &amp;lt;mx:DataGrid dataProvider="{userDataList}"&amp;gt;&lt;br /&gt;        &amp;lt;mx:columns&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="userid"&amp;gt;&lt;br /&gt;                &amp;lt;mx:itemRenderer&amp;gt;&lt;br /&gt;                    &amp;lt;mx:Component&amp;gt;&lt;br /&gt;                        &amp;lt;mx:Button label="{data.userid}"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt;                    &amp;lt;/mx:Component&amp;gt;&lt;br /&gt;                &amp;lt;/mx:itemRenderer&amp;gt;&lt;br /&gt;            &amp;lt;/mx:DataGridColumn&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="name"&amp;gt;&lt;br /&gt;                &amp;lt;mx:itemRenderer&amp;gt;&lt;br /&gt;                    &amp;lt;mx:Component&amp;gt;&lt;br /&gt;                        &amp;lt;mx:TextInput&amp;gt;&amp;lt;/mx:TextInput&amp;gt;&lt;br /&gt;                    &amp;lt;/mx:Component&amp;gt;&lt;br /&gt;                &amp;lt;/mx:itemRenderer&amp;gt;&lt;br /&gt;            &amp;lt;/mx:DataGridColumn&amp;gt;&lt;br /&gt;            &amp;lt;mx:DataGridColumn dataField="age" /&amp;gt;&lt;br /&gt;        &amp;lt;/mx:columns&amp;gt;&lt;br /&gt;    &amp;lt;/mx:DataGrid&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;embed src="http://sky.geocities.jp/tcsmq262/inlineItemRenderer.swf" height="230" width="450"&gt;&lt;/embed&gt;&lt;br /&gt;このように指定したコントロールを「インラインアイテムレンダラー」と呼びます。&lt;br /&gt;ドロップインアイテムレンダラーとは異なり、レンダラーのコントロールのプロパティをある程度好きに設定できるようになります。上記の例だとButtonのlabelプロパティに値を設定している箇所になります。リストのデータには「data」という暗黙変数を通じてアクセスすることができます。カラムに対応したプロパティ以外のデータでもアクセス可能です。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;今回はここまで。&lt;br /&gt;次回はアイテムエディタのサンプルと、アイテムレンダラー・アイテムエディタを自作コンポーネントとして別MXMLファイルに分けるということをやってみようと思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-8361851570455147114?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/8361851570455147114/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/03/flex.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8361851570455147114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8361851570455147114'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/03/flex.html' title='Flex入門～アイテムレンダラーとアイテムエディタ編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-5052802204570267090</id><published>2010-02-16T23:38:00.000+09:00</published><updated>2010-02-16T23:38:30.098+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='その他'/><title type='text'>icoファイルをブラウザで表示した時のサイズ</title><content type='html'>icoファイルをブラウザで表示してみたら、IEとFirefoxでは表示されるサイズが違いました。&lt;br /&gt;Firefoxだと小さく、IEだと大きかったです。&lt;br /&gt;ﾉｼ&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-5052802204570267090?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/5052802204570267090/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/02/ico.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5052802204570267090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5052802204570267090'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/02/ico.html' title='icoファイルをブラウザで表示した時のサイズ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-6518977433263151089</id><published>2010-02-07T16:45:00.000+09:00</published><updated>2010-02-07T16:45:14.972+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='その他'/><title type='text'>HTML5～ローカルストレージ規格～</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;今日は某新聞の勧誘がきました。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;手強かった・・・。 炊飯器もないのに米とか渡されても困る。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;どうにか撃退できましたよ。 &lt;/div&gt;&lt;br /&gt;&lt;span style="font-family: Arial,Helvetica,sans-serif;"&gt;さて（？）、HTML5にはローカルストレージの規格があります。&lt;/span&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;これはブラウザにローカルストレージを持たせ、JavaScriptを通じて、このストレージにSQLでアクセスできるというものだそうです。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;a href="http://builder.japan.zdnet.com/news/story/0,3800079086,20359327,00.htm"&gt;http://builder.japan.zdnet.com/news/story/0,3800079086,20359327,00.htm&lt;/a&gt;を読ませていただきました。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Cookieに代わる技術ですか、なるほどなるほど。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ただSQL、というところが若干引っかかる・・・。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;現在のデータベースで既にベンダ依存のSQLがたくさんあるので、同じ運命をたどりそうな・・・。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;でも、とりあえずこういう試みがされているってことは知っておいたほうがよさそうです。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-6518977433263151089?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/6518977433263151089/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/02/html5.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6518977433263151089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6518977433263151089'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/02/html5.html' title='HTML5～ローカルストレージ規格～'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-7983330232594878219</id><published>2010-02-05T23:14:00.001+09:00</published><updated>2010-02-05T23:15:34.993+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門～ドラッグ＆ドロップ編～だじぇ</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;今回はドラッグ＆ドロップ編です。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ようやくRIAっぽいセクションに突入。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: darkblue; color: white; font-family: Arial,Helvetica,sans-serif; font-weight: bold;"&gt;ドラッグ＆ドロップの基本操作&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;何か前にも似たことを書いた気がするけど、もう一回。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ドラッグ＆ドロップは３つの段階があります。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;■開始&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;マウスでコントロールを選択するか、コントロール内のアイテムを選択し、マウスボタンを押しながらアイテムを移動させます。選択されたコントロールは、「ドラッグイニシエータ」と呼ばれます。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;■ドラッグ&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;マウスボタンを押しながら、ユーザーはマウスをアプリケーション上で移動させます。ドラッグの間、「ドラッグプロキシ」と呼ばれる画像が表示されます。「ドラッグソース」オブジェクトには、ドラッグされているデータが含まれます。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;■ドロップ&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ドラッグプロキシを他のコントロールの上に移動すると、コントロールはドロップ可能な「ドロップターゲット」になります。ドロップターゲットによってドラッグソースオブジェクトが調べられ、ターゲットで受け付けられるフォーマットのデータかどうか判断されます。ターゲットで受け付けられるフォーマットであれば、ユーザーはそこにデータをドロップすることができます。受け付けられないフォーマットのデータと判断された場合には、ドロップは許可されません。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;この辺では用語と流れが大事です。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: darkblue; color: white; font-family: Arial,Helvetica,sans-serif; font-weight: bold;"&gt;ドラッグ＆ドロップ機能がビルトインされているコントロール&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;コントロールの中にはドラッグ＆ドロップ機能がはじめから組み込まれているものがあります。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;・DataGrid&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;・HorizontalList&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;・List&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;・PrintDataGrid&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;・TileList&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;・Tree&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;これらのコントロールでは、ドラッグ＆ドロップが比較的簡単に実装できます。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;各コントロールのプロパティにドラッグ＆ドロップ用のものがあるので、それらを適切に設定するだけで基本的な動作をしてくれるようになっています。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;リストコントロールで試してみます。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="fnc_init()"&amp;gt;&lt;br /&gt; &amp;lt;mx:Script&amp;gt;&lt;br /&gt; &amp;lt;![CDATA[&lt;br /&gt;  import mx.collections.ArrayCollection;&lt;br /&gt;  private function fnc_init() : void {&lt;br /&gt;   var dataList:ArrayCollection = new ArrayCollection([&lt;br /&gt;    "drop item1"&lt;br /&gt;    ,"drop item2"&lt;br /&gt;    ,"drop item3"&lt;br /&gt;   ]);&lt;br /&gt;   &lt;br /&gt;   dragComp.dataProvider = dataList;&lt;br /&gt;  }&lt;br /&gt; ]]&amp;gt;&lt;br /&gt; &amp;lt;/mx:Script&amp;gt;&lt;br /&gt; &amp;lt;mx:HBox&amp;gt;&lt;br /&gt;  &amp;lt;mx:VBox&amp;gt;&lt;br /&gt;   &amp;lt;mx:Label text="Dragターゲット"&amp;gt;&amp;lt;/mx:Label&amp;gt;&lt;br /&gt;   &amp;lt;mx:List id="dragComp" allowMultipleSelection="true" dragEnabled="true" dragMoveEnabled="true" width="150" height="150"&amp;gt;&amp;lt;/mx:List&amp;gt;&lt;br /&gt;  &amp;lt;/mx:VBox&amp;gt;&lt;br /&gt;  &amp;lt;mx:VBox&amp;gt;&lt;br /&gt;   &amp;lt;mx:Label text="Dropターゲット"&amp;gt;&amp;lt;/mx:Label&amp;gt;&lt;br /&gt;   &amp;lt;mx:List id="dropComp" dropEnabled="true" width="150" height="150"&amp;gt;&amp;lt;/mx:List&amp;gt;&lt;br /&gt;  &amp;lt;/mx:VBox&amp;gt;&lt;br /&gt; &amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;embed height="230" src="http://sky.geocities.jp/tcsmq262/dndSample01.swf" width="450"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;イベントハンドラの指定無しで、リストのアイテムをドラッグ＆ドロップできました。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;これはデフォルトのイベントハンドラが定義されているためでしょう。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;もし、この動きは&lt;span style="font-family: Arial,Helvetica,sans-serif; font-size: small;"&gt;イヤ&lt;/span&gt;という人は、&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;自分でイベントハンドラを定義してカスタマイズする必要があります。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: darkblue; color: white; font-family: Arial,Helvetica,sans-serif; font-weight: bold;"&gt;ドラッグ＆ドロップ機能を手動で追加&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;DragManager、DragSource、DragEventを使用してドラッグ＆ドロップ操作を実装します。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ドラッグイニシエータとドロップターゲットのイベントにドラッグ＆ドロップの各処理を割り当てていきましょう。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;おおまかには、次のとおり。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;①ドラッグイニシエータの上でマウスボタンを押したらDragManager#doDragを呼び出してドラッグ処理を開始。その際、ドロップ先に渡すデータをDataSourceオブジェクトに格納します。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;②ドラッグしながらドロップターゲットの中にマウスポインタが入ったら、DragManager#acceptDragDropを呼び出してドロップを許可。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;③そのままマウスボタンを離したら、DataSourceオブジェクトから必要なデータを取得し、必要な処理を行います。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" backgroundColor="white"&amp;gt;&lt;br /&gt; &amp;lt;mx:Script&amp;gt;&lt;br /&gt; &amp;lt;![CDATA[&lt;br /&gt;  import flash.events.MouseEvent;&lt;br /&gt;  import mx.containers.Canvas;&lt;br /&gt;  import mx.core.DragSource;&lt;br /&gt;  import mx.managers.DragManager;&lt;br /&gt;  import mx.events.DragEvent;&lt;br /&gt;  &lt;br /&gt;  private function fnc_dragStart(event : MouseEvent) : void {&lt;br /&gt;   var dragInitiator:Canvas = Canvas(event.currentTarget);&lt;br /&gt;   var ds:DragSource = new DragSource();&lt;br /&gt;   var data:int = dragInitiator.getStyle('backgroundColor');&lt;br /&gt;   ds.addData(data, 'color');&lt;br /&gt;   DragManager.doDrag(dragInitiator, ds, event);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function fnc_dropStart(event:DragEvent):void {&lt;br /&gt;   var dropTarget:Canvas = Canvas(event.currentTarget);&lt;br /&gt;   DragManager.acceptDragDrop(dropTarget);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function fnc_dropEnd(event:DragEvent) : void {&lt;br /&gt;   var dropTarget:Canvas = Canvas(event.currentTarget);&lt;br /&gt;   var data:Object = event.dragSource.dataForFormat('color');&lt;br /&gt;   dropTarget.setStyle("backgroundColor", data);&lt;br /&gt;  }&lt;br /&gt; ]]&amp;gt;&lt;br /&gt; &amp;lt;/mx:Script&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;mx:VBox&amp;gt;&lt;br /&gt;  &amp;lt;mx:HBox&amp;gt;&lt;br /&gt;   &amp;lt;mx:Canvas id="cv1" width="30" height="30" backgroundColor="red" mouseDown="fnc_dragStart(event);"&amp;gt;&amp;lt;/mx:Canvas&amp;gt;&lt;br /&gt;   &amp;lt;mx:Canvas id="cv2" width="30" height="30" backgroundColor="blue" mouseDown="fnc_dragStart(event);"&amp;gt;&amp;lt;/mx:Canvas&amp;gt;&lt;br /&gt;  &amp;lt;/mx:HBox&amp;gt;&lt;br /&gt;  &amp;lt;mx:Canvas id="cv3" width="100" height="100" backgroundColor="white" dragEnter="fnc_dropStart(event);" dragDrop="fnc_dropEnd(event);"&amp;gt;&amp;lt;/mx:Canvas&amp;gt;&lt;br /&gt; &amp;lt;/mx:VBox&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;embed height="230" src="http://sky.geocities.jp/tcsmq262/dndSample02.swf" width="450"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;内容はFlexヘルプの完全なるパクリですｗ。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;だいたいこのぐらい知っていれば、後は応用でいろいろできそうです。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-7983330232594878219?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/7983330232594878219/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/02/flex.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/7983330232594878219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/7983330232594878219'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/02/flex.html' title='Flex入門～ドラッグ＆ドロップ編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-4383329011010511261</id><published>2010-01-31T23:52:00.002+09:00</published><updated>2010-01-31T23:54:56.231+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門～続フォント編～だじぇ</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;フォントは、ArialとかMSPゴシックなどのことですね。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;これらのフォントには、大抵4つの書式スタイルがあります。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;標準、ボールド、イタリック、ボールドイタリックです。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;Flexでは、任意の数の書体スタイルを埋め込むことができます。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;アプリケーションにボールド書体のみを埋め込むと、通常の書体（標準書体）は使用できません。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;たとえば下の例では、２番目のラベルにはフォントが反映されません。&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;mx:Style&amp;gt;&lt;br /&gt; @font-face {&lt;br /&gt;   src: url("SFCollegiate.ttf");&lt;br /&gt;   fontFamily: myFont;&lt;br /&gt;   advancedAntiAliasing: true;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; .myPlainStyle {&lt;br /&gt;    fontSize: 32;&lt;br /&gt;    fontFamily: myFont;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;.myBoldStyle {&lt;br /&gt;    fontSize: 32;&lt;br /&gt;    fontFamily: myFont;&lt;br /&gt;    fontWeight: bold;&lt;br /&gt; }&lt;br /&gt;&amp;lt;/mx:Style&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;mx:Label text="hello" styleName="myPlainStyle" /&amp;gt;&lt;br /&gt;&amp;lt;mx:Label text="hello" styleName="myBoldStyle" /&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;これはmyFontにボールド用が準備されていないからです。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ボールド用のフォントはちゃんと別に用意してあげなければいけません。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;というわけで、まずボールド用のttfファイルを用意しました。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;次に、font-face宣言を追加します。&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;@font-face {&lt;br /&gt;   src: url("SFCollegiate-Italic.ttf");&lt;br /&gt;   fontFamily: myFont;&lt;br /&gt;   fontStyle: italic;&lt;br /&gt;   advancedAntiAliasing: true;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;これでmyFontのボールド版が準備できます。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;これを前のソースに追記すれば、先ほどの２番目のLabelもフォントが変化します。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;embed height="220" src="http://sky.geocities.jp/tcsmq262/fontSample02.swf" width="300"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-4383329011010511261?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/4383329011010511261/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/01/flex_1586.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4383329011010511261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4383329011010511261'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/01/flex_1586.html' title='Flex入門～続フォント編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-146569543841382460</id><published>2010-01-31T01:05:00.002+09:00</published><updated>2010-01-31T01:14:04.982+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門～フォント編～だじぇ</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;今回はフォントです。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;フォントは、fontFamilyスタイルプロパティを外部スタイルシート、&amp;lt;mx:Style&amp;gt;ブロック、インラインで設定します。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;例えば、次のようにスタイルを記述することでVBoxの子要素のフォントが「Arial」になります。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ただし、クライアントのシステムに指定したフォントがない場合は類似のフォントが検索されるそうです。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;（どう判定してるのだろうか・・・）&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;VBox {&lt;br /&gt; fontFamily: Arial;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="background-color: midnightblue; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&lt;b&gt;デバイスフォント&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;フォントにはおおきく分けて物理フォントと論理フォントがあります。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;物理フォントは、「Arial」や「MS P ゴシック」など。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;論理フォントは、それぞれ物理フォントに対応するようになっていて、どの物理フォントに対応するかはシステム依存です。論理フォントには、"_sans"や"_serif"などがありますが、WindowsとUNIXに"_serif"を指定しても同じ物理フォントになるとは限りません。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;フォントを指定しても、システムによっては存在しない場合もあるので、通常は複数のフォントを指定します。&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;VBox {&lt;br /&gt; fontFamily: Arial, Helvetica, "_sans";&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;こうすると、左から優先的ににシステムに存在するフォントを利用するようになります。&lt;/div&gt;&lt;br /&gt;&lt;div style="background-color: midnightblue; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&lt;b&gt;埋め込みフォント&lt;/b&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ここまではクライアントシステム内のフォントを利用する場合になるわけですが、swfファイル内に組み込むこともできます。埋め込めるのはTrueType フォント（TTF）ファミリまたは OpenType フォント（OTF）ファミリです。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;フォントを埋め込むには、スタイルに下記のように記述します。&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;@font-face {&lt;br /&gt;    src: url("location") | local("name");&lt;br /&gt;    fontFamily: alias;&lt;br /&gt;    [fontStyle: normal | italic | oblique;]&lt;br /&gt;    [fontWeight: normal | bold | heavy;]&lt;br /&gt;    [advancedAntiAliasing: true | false;]&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;今回は、&lt;a href="http://www.pimpyourfont.com/"&gt;http://www.pimpyourfont.com/&lt;/a&gt;のフォントを遣わしてもらって、swfファイルに埋め込んでみます。&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt; &amp;lt;mx:Style&amp;gt;&lt;br /&gt; &amp;lt;![CDATA[&lt;br /&gt;  @font-face {&lt;br /&gt;   src: url("actionj.ttf");&lt;br /&gt;   fontFamily: myFontFamily;&lt;br /&gt;   advancedAntiAliasing: true;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  VBox {&lt;br /&gt;   fontFamily: myFontFamily;&lt;br /&gt;  }&lt;br /&gt; ]]&amp;gt;&lt;br /&gt; &amp;lt;/mx:Style&amp;gt;&lt;br /&gt; &amp;lt;mx:VBox&amp;gt;&lt;br /&gt;  &amp;lt;mx:Label text="hello" fontSize="72"&amp;gt;&amp;lt;/mx:Label&amp;gt;&lt;br /&gt; &amp;lt;/mx:VBox&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ttfファイルをソースと同じ場所に置いてビルド。&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;embed height="150" src="http://sky.geocities.jp/tcsmq262/fontSample01.swf" width="300"&gt;&lt;/embed&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;こんなんなりました。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-146569543841382460?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/146569543841382460/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/01/flex_31.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/146569543841382460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/146569543841382460'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/01/flex_31.html' title='Flex入門～フォント編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-3181865678742279608</id><published>2010-01-28T00:55:00.001+09:00</published><updated>2010-01-28T00:56:46.497+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門～テーマ変更編～だじぇ</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;テーマ変更の例です。&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;いくつか方法があるようですが、今回はflex-config.xmlに指定する方法です。&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;flex sdkをインストールすると、いくつかのテーマが一緒にインストールされます。&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;これを設定してみます。&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;(flex sdkをインストールしたディレクトリ)/frameworks/&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;の下に、flex-config.xmlがあるので、下記のようにします（flex sdkをCドライブ直下に配置している場合）。&lt;br /&gt;&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;theme&amp;gt;&lt;br /&gt; &amp;lt;filename&amp;gt;C:/flex_sdk/frameworks/themes/Smoke/Smoke.css&amp;lt;/filename&amp;gt;&lt;br /&gt;&amp;lt;/theme&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;こうすると、テーマが「Smoke」になるはずです。&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;こんななりました。&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;embed src="http://sky.geocities.jp/tcsmq262/themeChange.swf"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;背景とデフォルト文字色が変わったみたい。&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ﾉｼ&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-3181865678742279608?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/3181865678742279608/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/01/flex_28.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/3181865678742279608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/3181865678742279608'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/01/flex_28.html' title='Flex入門～テーマ変更編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-362243467273126036</id><published>2010-01-22T22:39:00.003+09:00</published><updated>2010-01-22T22:41:00.114+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門～続ビヘイビア編～だじぇ</title><content type='html'>SequenceとParallelを使ったビヘイビアです。&lt;br /&gt;Sequenceはエフェクトを逐次実行します。&lt;br /&gt;Parallelは並行実行します。&lt;br /&gt;場合によって使い分けが必要です。&lt;br /&gt;&lt;pre style="background-color:black; color:white;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt; &amp;lt;mx:Parallel id="effectParallel" duration="2000"&amp;gt;&lt;br /&gt;  &amp;lt;mx:Fade alphaFrom="0.0" alphaTo="1.0" target="{txtObj}"&amp;gt;&amp;lt;/mx:Fade&amp;gt;&lt;br /&gt;  &amp;lt;mx:Rotate target="{txtObj}" angleFrom="180" angleTo="720"&amp;gt;&amp;lt;/mx:Rotate&amp;gt;&lt;br /&gt;  &amp;lt;mx:Zoom zoomHeightFrom="0.0" zoomHeightTo="1.0"&lt;br /&gt; zoomWidthFrom="0.0" zoomWidthTo="1.0" target="{txtObj}"&amp;gt;&amp;lt;/mx:Zoom&amp;gt;&lt;br /&gt; &amp;lt;/mx:Parallel&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;mx:Sequence id="effectSequence" duration="2000"&amp;gt;&lt;br /&gt;  &amp;lt;mx:Fade alphaFrom="0.0" alphaTo="1.0" target="{txtObj}"&amp;gt;&amp;lt;/mx:Fade&amp;gt;&lt;br /&gt;  &amp;lt;mx:Rotate target="{txtObj}" angleFrom="180" angleTo="720"&amp;gt;&amp;lt;/mx:Rotate&amp;gt;&lt;br /&gt;  &amp;lt;mx:Zoom zoomHeightFrom="0.0" zoomHeightTo="1.0"&lt;br /&gt; zoomWidthFrom="0.0" zoomWidthTo="1.0" target="{txtObj}"&amp;gt;&amp;lt;/mx:Zoom&amp;gt;&lt;br /&gt; &amp;lt;/mx:Sequence&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;mx:VBox height="50" width="180"&amp;gt;&lt;br /&gt;  &amp;lt;mx:TextArea id="txtObj" text="Welcome to &amp;#13;             Flex world!!"&amp;gt;&amp;lt;/mx:TextArea&amp;gt;&lt;br /&gt; &amp;lt;/mx:VBox&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="parallel go!!" &lt;br /&gt; click="effectSequence.end();effectParallel.end();effectParallel.play();"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="sequence go!!"&lt;br /&gt; click="effectSequence.end();effectParallel.end();effectSequence.play();"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;embed src="http://sky.geocities.jp/tcsmq262/effectSample3.swf"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-362243467273126036?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/362243467273126036/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/01/flex.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/362243467273126036'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/362243467273126036'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/01/flex.html' title='Flex入門～続ビヘイビア編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-5660516584353606974</id><published>2010-01-20T22:32:00.001+09:00</published><updated>2010-01-20T22:40:19.149+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門7～ビヘイビア編～だじぇ</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;今日はとっても暖かい一日でした(*´∀｀*)&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;さて、今回は「ビヘイビア」です。&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="background-color: #fff8d7; font-family: Arial,Helvetica,sans-serif; font-size-adjust: none; font-size: 13px; font-stretch: normal; font-style: italic; font-variant: normal; font-weight: normal; line-height: normal;"&gt;「ビヘイビア」とは、トリガとエフェクトを組み合わせたものです。&lt;br /&gt;「トリガ」は、マウスのクリック、フォーカスの移動、不可視状態から可視状態への変更など、コンポーネントに対して行われる操作を指します。&lt;br /&gt;～Adobeヘルプより引用(&lt;a href="http://livedocs.adobe.com/flex/3_jp/html/help.html"&gt;http://livedocs.adobe.com/flex/3_jp/html/help.html&lt;/a&gt;)～&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;ようはボタン押したりしたら「ビョーン」とか「シュッ！！」って感じになれ、と指示することです。&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;embed height="450" src="http://sky.geocities.jp/tcsmq262/BehaviorSample2.swf" width="300"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt; &amp;lt;mx:Blur id="effectBlur" duration="3000"&amp;gt;&amp;lt;/mx:Blur&amp;gt;&lt;br /&gt; &amp;lt;mx:Dissolve id="effectDissolve" duration="3000"&amp;gt;&amp;lt;/mx:Dissolve&amp;gt;&lt;br /&gt; &amp;lt;mx:Fade id="effectFade" duration="3000"&amp;gt;&amp;lt;/mx:Fade&amp;gt;&lt;br /&gt; &amp;lt;mx:Glow id="effectGlow" duration="3000"&amp;gt;&amp;lt;/mx:Glow&amp;gt;&lt;br /&gt; &amp;lt;mx:Iris id="effectIris" duration="3000"&amp;gt;&amp;lt;/mx:Iris&amp;gt;&lt;br /&gt; &amp;lt;mx:Move id="effectMove" xTo="10" duration="3000"&amp;gt;&amp;lt;/mx:Move&amp;gt;&lt;br /&gt; &amp;lt;mx:Resize id="effectResize" widthTo="100" duration="3000"&amp;gt;&amp;lt;/mx:Resize&amp;gt;&lt;br /&gt; &amp;lt;mx:Rotate id="effectRotate" duration="3000"&amp;gt;&amp;lt;/mx:Rotate&amp;gt;&lt;br /&gt; &amp;lt;mx:WipeLeft id="effectWipeLeft" duration="3000"&amp;gt;&amp;lt;/mx:WipeLeft&amp;gt;&lt;br /&gt; &amp;lt;mx:WipeUp id="effectWipeUp" duration="3000"&amp;gt;&amp;lt;/mx:WipeUp&amp;gt;&lt;br /&gt; &amp;lt;mx:WipeRight id="effectWipeRight" duration="3000"&amp;gt;&amp;lt;/mx:WipeRight&amp;gt;&lt;br /&gt; &amp;lt;mx:WipeDown id="effectWipeDown" duration="3000"&amp;gt;&amp;lt;/mx:WipeDown&amp;gt;&lt;br /&gt; &amp;lt;mx:Zoom id="effectZoom" duration="3000"&amp;gt;&amp;lt;/mx:Zoom&amp;gt;&lt;br /&gt; &amp;lt;mx:AnimateProperty id="effectAnimateProperty" property="height" toValue="100" duration="3000"&amp;gt;&amp;lt;/mx:AnimateProperty&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;mx:Button label="Blur" mouseDownEffect="{effectBlur}"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="Dissolve" mouseDownEffect="{effectDissolve}"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="Fade" mouseDownEffect="{effectFade}"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="Glow" mouseDownEffect="{effectGlow}"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="Iris" mouseDownEffect="{effectIris}"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="Move" mouseDownEffect="{effectMove}"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="Resize" mouseDownEffect="{effectResize}"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="Rotate" mouseDownEffect="{effectRotate}"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="WipeLeft" mouseDownEffect="{effectWipeLeft}"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="WipeUp" mouseDownEffect="{effectWipeUp}"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="WipeRight" mouseDownEffect="{effectWipeRight}"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="WipeDown" mouseDownEffect="{effectWipeDown}"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="Zoom" mouseDownEffect="{effectZoom}"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="AnimateProperty" mouseDownEffect="{effectAnimateProperty}"&amp;gt;&amp;lt;/mx:Button&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;やっぱり同じサンプルでも、視覚的に変化が見れるとやる気がでます。&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-5660516584353606974?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/5660516584353606974/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/01/flex7.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5660516584353606974'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5660516584353606974'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/01/flex7.html' title='Flex入門7～ビヘイビア編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-1266039229057903928</id><published>2010-01-19T20:57:00.000+09:00</published><updated>2010-01-19T20:57:54.359+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>E4Xの「フィルタ演算子」だじぇ</title><content type='html'>E4Xって知ってますか？&lt;br /&gt;XMLをオブジェクトを操作するように直感的に扱えるようになります。&lt;br /&gt;これはjavascriptのパターン。&lt;br /&gt;&lt;pre style="background-color:black; color:white;"&gt;&amp;lt;script type="text/javascript;"&amp;gt;&lt;br /&gt; var obj = &amp;lt;data&amp;gt;&lt;br /&gt;   &amp;lt;msg&amp;gt;hello,world&amp;lt;/msg&amp;gt;&lt;br /&gt;   &amp;lt;msg&amp;gt;good morning&amp;lt;/msg&amp;gt;&lt;br /&gt;  &amp;lt;/data&amp;gt;;&lt;br /&gt; alert(obj.msg[0]);&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;/pre&gt;これはリテラルで書いた場合ですが、こういった感じに扱えるようにしたのが「E4X」です。&lt;br /&gt;正直、javascriptでは一回も使ったことが無いのですが、Flexではたまにでてきます。&lt;br /&gt;そのとき、&lt;br /&gt;data.(fuga == 'aaa')&lt;br /&gt;みたいな、トリッキーな書き方が出てきてプチパニックに陥ったのは最近のことです。&lt;br /&gt;ええ！？&lt;br /&gt;と、すぐにGoogle先生に助けを求めようと思ったら、キーワード思いつかずorz。&lt;br /&gt;&lt;br /&gt;最終的、「フィルタ演算子」ということが判明。&lt;br /&gt;&lt;a href="http://blog.s2factory.co.jp/yoshizu/2008/04/e4x.html"&gt;http://blog.s2factory.co.jp/yoshizu/2008/04/e4x.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;やっぱりいろんな言語を触ってると、刺激が多いなー。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-1266039229057903928?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/1266039229057903928/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/01/e4x.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/1266039229057903928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/1266039229057903928'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/01/e4x.html' title='E4Xの「フィルタ演算子」だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-6956711004739658343</id><published>2010-01-08T23:03:00.003+09:00</published><updated>2010-01-08T23:07:14.372+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門6～グラフィック編～だじぇ</title><content type='html'>コントロールばっかりはさすがに飽きてきたので、今回はちょっと味付けを変更。&lt;br /&gt;マウスで線を引くっていうのをやってみます。&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: midnightblue; color: white; font-weight: bold;"&gt;概要&lt;/div&gt;マウスでぐりぐりして線を引くアプリケーションをFlexで作ってみます。&lt;br /&gt;まず、線を引くためのキャンパスに対応するコントロールを用意します。&lt;br /&gt;今回は「&lt;a href="http://livedocs.adobe.com/flex/3_jp/langref/mx/core/UIComponent.html"&gt;UIComponent&lt;/a&gt;」です。&lt;br /&gt;操作としては、キャンパス上でマウスをドラッグすると線が引かれる、といったものです。&lt;br /&gt;ドラッグの基本的な流れは、以下のとおり。&lt;br /&gt;　１．マウスをクリック（左ボタンを押下）する。&lt;br /&gt;　２．クリックしたままマウスを動かす。&lt;br /&gt;　３．左ボタンを離す。&lt;br /&gt;&lt;br /&gt;これらを踏まえて実装方針は次のようにしました。&lt;br /&gt;①キャンパス上でマウスの左ボタンを押したら、マウス移動時に移動前の位置から移動後の位置まで線を引くイベントハンドラを設定する。&lt;br /&gt;②キャンパス上でマウスの左ボタンを離したら、マウス移動時のイベントハンドラを削除する。&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: midnightblue; color: white; font-weight: bold;"&gt;必要な知識&lt;/div&gt;■ドラッグのイベントは？&lt;br /&gt;マウスの左ボタンを押すときはmouseDown、マウスの左ボタンを離すときはmouseUpで、イベントとしてMouseEventが渡ります。&lt;br /&gt;マウス移動の場合はイベントハンドラの中で動的に付けたりはずしたりすることになるので、付けるときはaddEventListener(MouseEvent.MOUSE_MOVE, ・・・)、はずすときはremoveEventListener(MouseEvent.MOUSE_MOVE, ・・・)で制御します。&lt;br /&gt;&lt;br /&gt;■線を引くにはどうすればいい？&lt;br /&gt;UIComponentが持っている&lt;a href="http://livedocs.adobe.com/flex/3_jp/langref/flash/display/Graphics.html"&gt;Graphics&lt;/a&gt;型のgraphicsプロパティのlineToメソッドを使います。&lt;br /&gt;線のスタイルを設定する必要があるので、lineStyleで設定しておきます。&lt;br /&gt;線を引く場合、当然「始点」から「終点」まで引くことになるわけですが、始点はmoveToメソッドで設定する必要があります（まるでWindows API）。&lt;br /&gt;終点はlineToメソッドの引数として渡します。&lt;br /&gt;lineToメソッドの処理が終了すると、その引数で渡した値が新たに「始点」として自動的に設定されます。&lt;br /&gt;&lt;br /&gt;■UIComponentを使用する場合は初期処理で塗りつぶしておく&lt;br /&gt;UIComponentを使う場合、何もせずに設置すると画面上に表示されません。&lt;br /&gt;初期処理で全体を白色に塗りつぶしておきます。&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: midnightblue; color: white; font-weight: bold;"&gt;サンプルソース&lt;/div&gt;&lt;pre style="background-color:black; color:white;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="fnc_init()"&amp;gt;&lt;br /&gt; &amp;lt;mx:Script&amp;gt;&lt;br /&gt;  &amp;lt;![CDATA[&lt;br /&gt;  import mx.controls.Alert;&lt;br /&gt;  import mx.core.UIComponent;&lt;br /&gt;  import flash.events.MouseEvent;&lt;br /&gt;  &lt;br /&gt;  private function fnc_move(e:MouseEvent):void {&lt;br /&gt;   // 始点から終点まで線を引きます。&lt;br /&gt;   myPallete.graphics.lineStyle(3, 0xff0000);&lt;br /&gt;   myPallete.graphics.lineTo(e.localX, e.localY);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function fnc_mousedown(e:MouseEvent):void {&lt;br /&gt;   // マウス移動のイベントを設定します。&lt;br /&gt;   myPallete.graphics.moveTo(e.localX, e.localY);&lt;br /&gt;   myPallete.addEventListener(MouseEvent.MOUSE_MOVE, fnc_move);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function fnc_mouseup(e:MouseEvent):void {&lt;br /&gt;   // マウス移動のイベントを削除します。&lt;br /&gt;   myPallete.removeEventListener(MouseEvent.MOUSE_MOVE, fnc_move);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function fnc_init():void {&lt;br /&gt;   // UIComponentの背景を白に塗りつぶします。&lt;br /&gt;   myPallete.graphics.beginFill(0xffffff, 0.8);&lt;br /&gt;   myPallete.graphics.drawRect(0, 0, 300, 300);&lt;br /&gt;   myPallete.graphics.endFill();&lt;br /&gt;  }&lt;br /&gt;  ]]&amp;gt;&lt;br /&gt; &amp;lt;/mx:Script&amp;gt;&lt;br /&gt; &amp;lt;mx:UIComponent id="myPallete" width="300" height="300" mouseDown="fnc_mousedown(event)" mouseUp="fnc_mouseup(event)" /&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="background-color: midnightblue; color: white; font-weight: bold;"&gt;実行結果&lt;/div&gt;白い四角形の中をマウスでぐりぐりしてみてください。&lt;br /&gt;&lt;embed src="http://sky.geocities.jp/tcsmq262/paintSample02.swf" width="350" height="350"&gt;&lt;/embed&gt;&lt;br /&gt;とりあえず最低限の動作はうまくいった感じです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-6956711004739658343?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/6956711004739658343/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/01/flex6.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6956711004739658343'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6956711004739658343'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/01/flex6.html' title='Flex入門6～グラフィック編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-7827892161852006661</id><published>2010-01-07T00:37:00.000+09:00</published><updated>2010-01-07T00:37:09.757+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門5～カレンダー～だじぇ</title><content type='html'>カレンダーを触ってみました。&lt;br /&gt;比較的、簡単に扱えますね。&lt;br /&gt;コントロールを一通り触るのにどれぐらいかかるのやら・・・。&lt;br /&gt;&lt;br /&gt;&lt;embed width="300" height="300" src="http://sky.geocities.jp/tcsmq262/dateSample.swf"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;pre style="background-color:black; color:white;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt; &amp;lt;mx:Script&amp;gt;&lt;br /&gt;  &amp;lt;![CDATA[&lt;br /&gt;  import mx.controls.Alert;&lt;br /&gt;  import mx.events.CalendarLayoutChangeEvent;&lt;br /&gt;  &lt;br /&gt;  private function fnc_selectDate(e:CalendarLayoutChangeEvent): void {&lt;br /&gt;   Alert.show(dfconv.format(e.newDate));&lt;br /&gt;  }&lt;br /&gt;  ]]&amp;gt;&lt;br /&gt; &amp;lt;/mx:Script&amp;gt;&lt;br /&gt; &amp;lt;mx:DateFormatter id="dfconv" formatString="YYYY/MM/DD"/&amp;gt;&lt;br /&gt; &amp;lt;mx:DateChooser change="fnc_selectDate(event)" /&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;mx:DateField borderColor="#FF0000" formatString="YYYY年MM月DD日"&amp;gt;&amp;lt;/mx:DateField&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-7827892161852006661?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/7827892161852006661/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2010/01/flex5.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/7827892161852006661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/7827892161852006661'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2010/01/flex5.html' title='Flex入門5～カレンダー～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-4378182669738655603</id><published>2009-12-31T15:33:00.000+09:00</published><updated>2009-12-31T15:33:04.393+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門4～いろいろ編～だじぇ</title><content type='html'>実家からの初カキコです。&lt;br /&gt;今回はいろいろなコントロール。&lt;br /&gt;&lt;br /&gt;&lt;embed width="300" height="520" src="http://sky.geocities.jp/tcsmq262/anyControl.swf"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;こんなものがありますよっていう紹介程度。&lt;br /&gt;&lt;br /&gt;あ、今年最後のカキコになりますね。&lt;br /&gt;これからもコツコツとメモしていきます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-4378182669738655603?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/4378182669738655603/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/12/flex4.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4378182669738655603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4378182669738655603'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/12/flex4.html' title='Flex入門4～いろいろ編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-4136606851233460081</id><published>2009-12-28T16:57:00.001+09:00</published><updated>2009-12-31T15:07:10.427+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門3～ボタン編～だじぇ</title><content type='html'>&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;とうとう2009年も終わり。&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;今年1年を振り返ると、個人的にでかい変化が多かったかも。&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;来年は落ち着いた１年がいいんだけど、そうもいかないだろうなぁ・・・。&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;さて、今回はボタン系です。&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;なかなか種類が豊富です。&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;&lt;embed height="300" src="http://sky.geocities.jp/tcsmq262/buttonSample1.swf" width="400"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/div&gt;&lt;pre style="background-color: black; color: white; font-family: Arial,Helvetica,sans-serif;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="fnc_init()"&amp;gt;&lt;br /&gt; &amp;lt;mx:Script&amp;gt;&lt;br /&gt;  &amp;lt;![CDATA[&lt;br /&gt;  import mx.controls.Menu;&lt;br /&gt;  import mx.events.MenuEvent;&lt;br /&gt;  import mx.controls.Alert;&lt;br /&gt;  &lt;br /&gt;  private function fnc_init(): void {&lt;br /&gt;   // PopUpButton のpopUp属性に指定するコントロールを構築します。&lt;br /&gt;   var pubMenu: Menu = new Menu();&lt;br /&gt;   &lt;br /&gt;   var menuList: Array = [&lt;br /&gt;    { label : "item1" }&lt;br /&gt;    ,{ label : "item2" }&lt;br /&gt;    ,{ label : "item3" }&lt;br /&gt;   ];&lt;br /&gt;   &lt;br /&gt;   pubMenu.dataProvider = menuList;&lt;br /&gt;   pub.popUp = pubMenu;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  ]]&amp;gt;&lt;br /&gt; &amp;lt;/mx:Script&amp;gt;&lt;br /&gt; &amp;lt;mx:XML id="pumbList"&amp;gt;&lt;br /&gt;  &amp;lt;root&amp;gt;&lt;br /&gt;   &amp;lt;editItem label="item1"&amp;gt;&amp;lt;/editItem&amp;gt;&lt;br /&gt;   &amp;lt;editItem label="item2"&amp;gt;&amp;lt;/editItem&amp;gt;&lt;br /&gt;   &amp;lt;separator type="separator"&amp;gt;&amp;lt;/separator&amp;gt;&lt;br /&gt;   &amp;lt;editItem label="item3"&amp;gt;&amp;lt;/editItem&amp;gt;&lt;br /&gt;  &amp;lt;/root&amp;gt;&lt;br /&gt; &amp;lt;/mx:XML&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- 普通のボタン --&amp;gt;&lt;br /&gt; &amp;lt;mx:Button label="hello, world!!" /&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- PopUpButton --&amp;gt;&lt;br /&gt; &amp;lt;mx:PopUpButton id="pub" label="PopUpButton" /&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- PopUpMenuButton --&amp;gt;&lt;br /&gt; &amp;lt;mx:PopUpMenuButton id="pumb" label="PopUpMenuButton" dataProvider="{pumbList}" labelField="@label" showRoot="false" /&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- ButtonBar --&amp;gt;&lt;br /&gt; &amp;lt;mx:ButtonBar&amp;gt;&lt;br /&gt;  &amp;lt;mx:dataProvider&amp;gt;&lt;br /&gt;   &amp;lt;mx:String&amp;gt;item1&amp;lt;/mx:String&amp;gt;&lt;br /&gt;   &amp;lt;mx:String&amp;gt;item2&amp;lt;/mx:String&amp;gt;&lt;br /&gt;   &amp;lt;mx:String&amp;gt;item3&amp;lt;/mx:String&amp;gt;&lt;br /&gt;   &amp;lt;mx:String&amp;gt;item4&amp;lt;/mx:String&amp;gt;&lt;br /&gt;  &amp;lt;/mx:dataProvider&amp;gt;&lt;br /&gt; &amp;lt;/mx:ButtonBar&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- ToggleButtonBar --&amp;gt;&lt;br /&gt; &amp;lt;mx:ToggleButtonBar toggleOnClick="true"&amp;gt;&lt;br /&gt;  &amp;lt;mx:dataProvider&amp;gt;&lt;br /&gt;   &amp;lt;mx:String&amp;gt;item1&amp;lt;/mx:String&amp;gt;&lt;br /&gt;   &amp;lt;mx:String&amp;gt;item2&amp;lt;/mx:String&amp;gt;&lt;br /&gt;   &amp;lt;mx:String&amp;gt;item3&amp;lt;/mx:String&amp;gt;&lt;br /&gt;   &amp;lt;mx:String&amp;gt;item4&amp;lt;/mx:String&amp;gt;&lt;br /&gt;  &amp;lt;/mx:dataProvider&amp;gt;&lt;br /&gt; &amp;lt;/mx:ToggleButtonBar&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- LinkButton --&amp;gt;&lt;br /&gt; &amp;lt;mx:LinkButton label="hello, world"&amp;gt;&amp;lt;/mx:LinkButton&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- LinkBar --&amp;gt;&lt;br /&gt; &amp;lt;mx:LinkBar borderStyle="solid"&amp;gt;&lt;br /&gt;  &amp;lt;mx:dataProvider&amp;gt;&lt;br /&gt;   &amp;lt;mx:String&amp;gt;item1&amp;lt;/mx:String&amp;gt;&lt;br /&gt;   &amp;lt;mx:String&amp;gt;item2&amp;lt;/mx:String&amp;gt;&lt;br /&gt;   &amp;lt;mx:String&amp;gt;item3&amp;lt;/mx:String&amp;gt;&lt;br /&gt;  &amp;lt;/mx:dataProvider&amp;gt;&lt;br /&gt; &amp;lt;/mx:LinkBar&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;まあ特に述べる点はないですね。&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: Arial,Helvetica,sans-serif;"&gt;次はボタンのスキンを操作してみます。&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-4136606851233460081?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/4136606851233460081/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/12/2009-1-version1.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4136606851233460081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4136606851233460081'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/12/2009-1-version1.html' title='Flex入門3～ボタン編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-4534962192455786892</id><published>2009-12-23T21:35:00.004+09:00</published><updated>2009-12-23T22:52:42.949+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門2～テキスト編～だじぇ</title><content type='html'>&lt;span style="font-family: arial;"&gt;Flexのコントロールのうちテキスト関係についてです。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;テキストのコントロールとしては次のようなものがあります。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;■Label&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;1行のテキストを表示します。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;■Text&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;複数行のテキストを表示します。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;■TextInput&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;ユーザが編集可能な1行のテキストを表示します。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;■TextArea&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;ユーザが編集可能な複数行のテキストを表示します。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;■RichTextEditor&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;TextAreaに対して様々なスタイル変更を可能にした、リッチクライアントコントロールです。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;embed height="500" menu="false" src="http://sky.geocities.jp/tcsmq262/MyFlexSample.swf" style="font-family: arial;" width="500"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;&amp;amp;#13;は改行コード。&lt;br /&gt;Labelでは改行後の文字列が表示されていませんね。&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;mx:Label text="hello,&amp;amp;#13; world"&amp;gt;&amp;lt;/mx:Label&amp;gt;&lt;br /&gt;&amp;lt;mx:Text text="good afternoon, &amp;amp;#13;world"&amp;gt;&amp;lt;/mx:Text&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;mx:TextInput text="hello,&amp;amp;#13; world"&amp;gt;&amp;lt;/mx:TextInput&amp;gt;&lt;br /&gt;&amp;lt;mx:TextArea text="good afternoon, &amp;amp;#13;world"&amp;gt;&amp;lt;/mx:TextArea&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;mx:RichTextEditor text="Congratulations, winner!" /&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;1行しか表示できないコントロールに複数行を指定すると、&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;2行目からは表示できなくなってしまいました。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;テキスト関連はこんなところで。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-4534962192455786892?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/4534962192455786892/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/12/flex2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4534962192455786892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4534962192455786892'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/12/flex2.html' title='Flex入門2～テキスト編～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-5863426321445121985</id><published>2009-12-21T23:11:00.011+09:00</published><updated>2009-12-23T22:53:04.015+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex入門１～とりあえず「hello, world」～だじぇ</title><content type='html'>&lt;span style="font-family:arial;"&gt;エアコンを入れるようになって、自宅での作業も快適になってきました。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;(*´∀｀*)ｱｯﾀｶｰｲ&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;おかげで順調にノロノロと進められています。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;ようやくデータプロバイダあたりの説明を読み終わって、&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;コントロールの節に入ったぐらいです。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;でもまあ、とりあえず「hello, world」から書いておこうと思います。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;前も紹介した「FlashDevelop」を使う前提です。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;「FlashDevelop」を起動します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;「Project」-「New Project」を選択します。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_clRJ8KPAYVc/Sy-GflQpAvI/AAAAAAAAAEo/5gZI8APz7_4/s1600-h/flex1_1.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 142px;" src="http://1.bp.blogspot.com/_clRJ8KPAYVc/Sy-GflQpAvI/AAAAAAAAAEo/5gZI8APz7_4/s320/flex1_1.jpg" alt="" id="BLOGGER_PHOTO_ID_5417696753885971186" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;「New Project」ダイアログの「Installed Templates」で「Flex 3 Project」を選択。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Name、Location、Packageを入力して、「OK」ボタンを押します。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_clRJ8KPAYVc/Sy-H6S7WIKI/AAAAAAAAAE4/LwI0-VKSqt4/s1600-h/flex1_2.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 281px;" src="http://1.bp.blogspot.com/_clRJ8KPAYVc/Sy-H6S7WIKI/AAAAAAAAAE4/LwI0-VKSqt4/s320/flex1_2.jpg" alt="" id="BLOGGER_PHOTO_ID_5417698312332910754" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;プロジェクトが作成されたら、Main.mxmlファイルを開いてみましょう。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_clRJ8KPAYVc/Sy-JbzqD53I/AAAAAAAAAFA/LQeknzVftg4/s1600-h/flex1_3.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 113px;" src="http://4.bp.blogspot.com/_clRJ8KPAYVc/Sy-JbzqD53I/AAAAAAAAAFA/LQeknzVftg4/s320/flex1_3.jpg" alt="" id="BLOGGER_PHOTO_ID_5417699987566094194" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&amp;lt;mx:Application&amp;gt;タグはルートのコンテナで、今のところはHTMLファイルのHTMLタグみたいなもんだと思って下さい。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;ここに「hello, world」を出力する&amp;lt;mx:Label&amp;gt;タグを足します。&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"&amp;gt;&lt;br /&gt;&amp;lt;mx:Label text="hello, world"&amp;gt;&amp;lt;/mx:Label&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;次に、プロジェクトのコンテキストメニューを開いて「Build Project」を選択。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;するとビルドされ、swfファイルが作成されます。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;「F8」ボタンでも同じことができます。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_clRJ8KPAYVc/Sy-K5MTqbhI/AAAAAAAAAFI/Zw_JjBDDhpw/s1600-h/flex1_4.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 222px; height: 286px;" src="http://4.bp.blogspot.com/_clRJ8KPAYVc/Sy-K5MTqbhI/AAAAAAAAAFI/Zw_JjBDDhpw/s320/flex1_4.jpg" alt="" id="BLOGGER_PHOTO_ID_5417701591910870546" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;あとはindex.htmlファイルをブラウザから開いてみましょう。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_clRJ8KPAYVc/Sy-LlV7cULI/AAAAAAAAAFQ/ujTr2zpx_6o/s1600-h/flex1_5.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 276px; height: 86px;" src="http://3.bp.blogspot.com/_clRJ8KPAYVc/Sy-LlV7cULI/AAAAAAAAAFQ/ujTr2zpx_6o/s320/flex1_5.jpg" alt="" id="BLOGGER_PHOTO_ID_5417702350407880882" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;基本的な流れはこんなところです。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-5863426321445121985?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/5863426321445121985/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/12/flexhello-world.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5863426321445121985'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5863426321445121985'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/12/flexhello-world.html' title='Flex入門１～とりあえず「hello, world」～だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_clRJ8KPAYVc/Sy-GflQpAvI/AAAAAAAAAEo/5gZI8APz7_4/s72-c/flex1_1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-9199832734039119814</id><published>2009-12-20T23:50:00.004+09:00</published><updated>2009-12-23T22:53:22.285+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex本がGoogle Booksにあったじぇ</title><content type='html'>&lt;span style="font-family: arial;"&gt;日本語で書かれたFlexの書籍がGoogle Booksにあったのでメモ。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="http://books.google.co.jp/books?id=4syEoj8hJ0kC&amp;amp;printsec=frontcover#v=onepage&amp;amp;q=&amp;amp;f=false" target="_blank"&gt;Adobe Flex 3&amp;amp;AIRではじめるアプリケーション開発&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;Adobeのドキュメントを一通り見終わったら読んでみようかな？&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;日本語版の書籍が増えるのはうれしい限り。&lt;br /&gt;ｱﾘｶﾞﾄｳｺﾞｻﾞｲﾏｽ(´▽｀)&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-9199832734039119814?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/9199832734039119814/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/12/flexgoogle-books.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/9199832734039119814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/9199832734039119814'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/12/flexgoogle-books.html' title='Flex本がGoogle Booksにあったじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-6577072442139524878</id><published>2009-11-22T15:04:00.004+09:00</published><updated>2009-12-23T22:55:00.570+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='データベース'/><title type='text'>TokyoTyrantの速度を測って測ってみたじぇ</title><content type='html'>&lt;span style="font-family:arial;"&gt;((´д｀))ぶるぶる・・・&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Tokyotyrantの速度をPostgreSQLと比べてみました。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;今回は登録処理だけです。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;RubyのBenchMarkクラスを使って測定しています。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;測定用のソースコードはそれぞれ下記のようにしました。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;これらをTokyotyrant、PostgreSQLをインストールしたマシン上から実行して&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;処理時間を計測しています。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;■Tokyotyrantの登録処理&lt;/span&gt;&lt;br /&gt;&lt;pre style="background: black none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; color: white; font-family: arial;"&gt;require 'yaml'&lt;br /&gt;require 'memcache'&lt;br /&gt;require 'benchmark'&lt;br /&gt;&lt;br /&gt;memcache = MemCache::new 'localhost:1978'&lt;br /&gt;&lt;br /&gt;Benchmark.bm{ |rep|&lt;br /&gt;  rep.report {&lt;br /&gt;    100000.times { |i|&lt;br /&gt;      memcache.set("key#{i}", "value#{i}")&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;■PostgreSQLの登録処理&lt;/span&gt;&lt;br /&gt;&lt;pre style="background: black none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; color: white; font-family: arial;"&gt;require 'activerecord'&lt;br /&gt;require 'benchmark'&lt;br /&gt;&lt;br /&gt;ActiveRecord::Base.establish_connection(&lt;br /&gt;  :adapter=&gt;'postgresql',&lt;br /&gt;  :host=&gt;'localhost',&lt;br /&gt;  :username=&gt;'xxxxxx',&lt;br /&gt;  :password=&gt;'xxxxxx',&lt;br /&gt;  :database=&gt;'xxxxxx'&lt;br /&gt;)&lt;br /&gt;&lt;br /&gt;class Mytest &lt; ActiveRecord::Base&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;BenchMark.bm { |rep|&lt;br /&gt;  rep.report {&lt;br /&gt;    100000.times { |i|&lt;br /&gt;      mytest="Mytest.new({:name=&gt;"value#{i}"})&lt;br /&gt;      mytest.save&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;■測定結果（単位：sec）&lt;/span&gt;&lt;br /&gt;&lt;pre style="background: black none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; color: white; font-family: arial;"&gt;（Tokyotyrant）&lt;br /&gt;   user     system      total        real&lt;br /&gt;4.350000  13.990000  18.340000 ( 28.463882)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background: black none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; color: white; font-family: arial;"&gt;（PostgreSQL）&lt;br /&gt;   user     system      total        real&lt;br /&gt;66.440000 114.060000 180.500000 (291.731634)&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;やっぱりkey-valueストアの方が断然速いですね。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;ActiveRecordが遅すぎるっていうのもありそうだけど・・・。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-6577072442139524878?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/6577072442139524878/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/11/tokyotyrant.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6577072442139524878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6577072442139524878'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/11/tokyotyrant.html' title='TokyoTyrantの速度を測って測ってみたじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-203685420155632743</id><published>2009-11-21T00:57:00.003+09:00</published><updated>2009-12-23T22:55:00.570+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='データベース'/><title type='text'>postgres-prを使ったら実行時エラー発生！？</title><content type='html'>&lt;span style="font-family: arial;"&gt;寒い・・・&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;postgres-prはrubyのPostgreSQLドライバです。&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;# gem install postgres-pr&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family: arial;"&gt;ベンチマーク測定のためにインストールしたら、実行時エラーが発生。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;どうやらActiveRecordのバージョンアップに、postgres-prがついていけていない模様です。&lt;/span&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="http://d.hatena.ne.jp/hs9587/20090916/1253094263" target="_blank"&gt;こちら&lt;/a&gt;&lt;span style="font-family: arial;"&gt;を参考にして、モジュールに直接手をいれるはめに・・・。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;postgres-prのライブラリにpostgres-compat.rbというファイルがあり、その中でPGconnクラスが定義されています。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;このクラスにメソッドを追加。&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;def self.quote_ident(name)&lt;br /&gt;   '"' + name + '"'&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family: arial;"&gt;どうにか動いてくれました。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-203685420155632743?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/203685420155632743/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/11/postgres-pr.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/203685420155632743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/203685420155632743'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/11/postgres-pr.html' title='postgres-prを使ったら実行時エラー発生！？'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-6015125928478853513</id><published>2009-11-20T00:05:00.009+09:00</published><updated>2009-12-23T22:55:00.571+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='データベース'/><title type='text'>key-valueストアのサンプル（その2）だじぇ</title><content type='html'>&lt;span style="font-family:arial;"&gt;めっちゃ寒くなってきました・・・&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;暑いのよりはマシなんだけど、寒いものは寒いー。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;さて、今回は「Tokyo Tyrant」を使ってみたのでメモっときます。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;この子は前回の「Tokyo Cabinet」と違って、&lt;br /&gt;ネットワーク対応（memcacheプロトコル互換）しています。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;さらに永続性も備えているツワモノです。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;ということで、今回はこの機能を使ったサンプルです。&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_clRJ8KPAYVc/SwVwLWK-ixI/AAAAAAAAAEg/Ni2wu357rNs/s1600/tokyotyrant%E3%83%86%E3%82%B9%E3%83%88%E6%A7%8B%E6%88%90%E5%9B%B3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 333px;" src="http://3.bp.blogspot.com/_clRJ8KPAYVc/SwVwLWK-ixI/AAAAAAAAAEg/Ni2wu357rNs/s400/tokyotyrant%E3%83%86%E3%82%B9%E3%83%88%E6%A7%8B%E6%88%90%E5%9B%B3.png" alt="" id="BLOGGER_PHOTO_ID_5405850267960642322" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;＜Tokyo Tyrantの導入＞&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;■ダウンロード&lt;/span&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="http://sourceforge.net/projects/tokyocabinet/files/" target="_blank"&gt;ここから&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;・tokyotyrantの最新&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;■ビルド＆インストール&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;# tar zxvf tokyotyrant-1.1.33.tar.gz&lt;br /&gt;# cd tokyotyrant-1.1.33&lt;br /&gt;# ./configure&lt;br /&gt;# make&lt;br /&gt;# make install&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;■起動&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;# ttservctl start&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;ポート「1978」で動作します。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;■クライアントからデータを設定&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;ネットワーク越しにRubyで接続し、データの追加してみます。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Rubyのmemcacheプロトコル用ライブラリを追加します。&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;# gem install memcache-client&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;（Ruby ver1.8）&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;# irb&lt;br /&gt;&gt; require 'rubygems'&lt;br /&gt;&gt; require 'yaml'&lt;br /&gt;&gt; require 'memcache'&lt;br /&gt;&gt; memcache = MemCache::new 'xxx.xxx.xxx.xxx:1978'&lt;br /&gt;&gt; memcache.set('key1','value')&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;■再起動&lt;br /&gt;&lt;/span&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;# ttservctl stop&lt;br /&gt;# ttservctl start&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;■&lt;/span&gt;&lt;span style="font-family:arial;"&gt;クライアントでデータを取得&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;（Ruby ver1.9）&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;# irb&lt;br /&gt;&gt; require 'rubygems'&lt;br /&gt;&gt; require 'yaml'&lt;br /&gt;&gt; require 'memcache'&lt;br /&gt;&gt; memcache = MemCache::new 'xxx.xxx.xxx.xxx:1978'&lt;br /&gt;&gt; puts memcache.get('key1')&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;まさかのエラー。&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;/xxx/lib/memcache.rb:255:in `load': incompatible marshal file format (can't be read) (MemCache::MemCacheError)&lt;br /&gt;   format version 4.8 required; 118.97 given&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;どうやらMarshalでシリアライズしたデータのフォーマットがRubyのバージョンで異なっている模様。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;バージョンをそろえて実行したら動作しました。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;次回はベンチマーク計測してみようと思います。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-6015125928478853513?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/6015125928478853513/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/11/key-value2.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6015125928478853513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6015125928478853513'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/11/key-value2.html' title='key-valueストアのサンプル（その2）だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_clRJ8KPAYVc/SwVwLWK-ixI/AAAAAAAAAEg/Ni2wu357rNs/s72-c/tokyotyrant%E3%83%86%E3%82%B9%E3%83%88%E6%A7%8B%E6%88%90%E5%9B%B3.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-3565907952644093807</id><published>2009-11-18T22:42:00.004+09:00</published><updated>2009-12-23T22:55:00.571+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='データベース'/><title type='text'>key-valueストアのサンプル（その１）だじぇ</title><content type='html'>&lt;span style="font-family: arial;"&gt;最近key-valueストアを調べ始めました。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;以外に古い歴史や利用できるソフトウェアの多さに驚きです。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;やっぱりペーペーSEなんだなー、とつくづく感じます。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;あせってもしょうがないので、一歩ずつ進めていきます。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;WEB＋DBの記事でいくらかイメージをつかんだので、&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;「Tokyo Cabinet」を導入してみました。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;これはローカル内で動作するkey-valueストアです。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;データの永続性はありません。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;●ダウンロード&lt;/span&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="http://sourceforge.net/projects/tokyocabinet/files/" target="_blank"&gt;ここから&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;・tokyocabinetの最新版&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;・tokyocabinet-javaの最新版&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;●設定&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;JAVA_HOMEを設定する。&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;export JAVA_HOME=/usr/java/jdk1.6.0_16&lt;/pre&gt;&lt;span style="font-family: arial;"&gt;●ビルドとインストール&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;tar zxvf tokyocabinet-1.4.32.tar.gz&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;make install&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family: arial;"&gt;●/etc/ld.so.confの編集&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;vi /etc/ld.so.conf&lt;br /&gt;（編集前）&lt;br /&gt;include ld.so.conf.d/*.conf&lt;br /&gt;&lt;br /&gt;（編集後）&lt;br /&gt;/usr/local/lib&lt;br /&gt;include ld.so.conf.d/*.conf&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family: arial;"&gt;●サンプルプログラム（Java）&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;import tokyocabinet.*;&lt;br /&gt;&lt;br /&gt;public class TCHashDBTest {&lt;br /&gt;   public static void main(String[] args) {&lt;br /&gt;       HDB hdb = new HDB();&lt;br /&gt;       // ハッシュデータベースのパラメータを設定します&lt;br /&gt;       hdb.tune(131071, 4, 10, 0);&lt;br /&gt;       // ハッシュデータベースを作成します&lt;br /&gt;       hdb.open("casket.hdb", HDB.OWRITER | HDB.OCREAT | HDB.OTRUNC);&lt;br /&gt;&lt;br /&gt;       hdb.put("key1","value1");&lt;br /&gt;       hdb.put("key2","value2");&lt;br /&gt;&lt;br /&gt;       System.out.println(hdb.get("key1"));&lt;br /&gt;       System.out.println(hdb.get("key2"));&lt;br /&gt;&lt;br /&gt;       // データベースを閉じます&lt;br /&gt;       hdb.close();&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family: arial;"&gt;こんなかんじにビルド・実行します。&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color: black; color: white; font-family: arial;"&gt;javac -classpath .:/usr/local/lib/tokyocabinet.jar TCHashDBTest.java&lt;br /&gt;java -Djava.library.path=/usr/local/lib \&lt;br /&gt;-classpath .:/usr/local/lib/tokyocabinet.jar TCHashDBTest&lt;br /&gt;（実行結果）&lt;br /&gt;value1&lt;br /&gt;value2&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family: arial;"&gt;プログラム実行時にデータベースを作成し、処理が終わったらデータベースを閉じています。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;この時点で格納したデータは全て昇華します。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-3565907952644093807?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/3565907952644093807/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/11/key-value.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/3565907952644093807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/3565907952644093807'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/11/key-value.html' title='key-valueストアのサンプル（その１）だじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-5880831828405903258</id><published>2009-11-08T22:29:00.003+09:00</published><updated>2009-12-23T22:55:57.268+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Webサービス'/><title type='text'>Webホワイトボードを触ってみたじぇ</title><content type='html'>&lt;span style="font-family: arial;"&gt;Webホワイトボードを試してみました。&lt;/span&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="http://www.scribblar.com/" target="_blank"&gt;http://www.scribblar.com/&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;思っていたより快適に動いて驚き。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;２つブラウザを立ち上げて、どれくらい同期に時間がかかるか&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;試してみたけど、なかなか素早い。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;図が必要な場合には使ってみたいなーと思います。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-5880831828405903258?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/5880831828405903258/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/11/web.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5880831828405903258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5880831828405903258'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/11/web.html' title='Webホワイトボードを触ってみたじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-26347598686437157</id><published>2009-10-28T22:29:00.006+09:00</published><updated>2009-12-23T22:57:00.866+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ruby'/><title type='text'>【Ruby on Rails】JDBCでSQLServerに接続（JRuby）</title><content type='html'>&lt;span style="font-family:arial;"&gt;久しぶりにRuby on Railsです。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;今使ってるノートPCには「Microsoft SQLServer 2005 Express Edition」が入ってるので、このDBに繋ぐことにしました。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;①JDBCのダウンロード&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;ダウンロード先：&lt;/span&gt;&lt;a style="font-family: arial;" href="http://msdn.microsoft.com/en-us/data/aa937724.aspx"&gt;http://msdn.microsoft.com/en-us/data/aa937724.aspx&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;ダウンロードしたファイルを展開して、sqljdbc.jarを下記のディレクトリに配置します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;ディレクトリ：(NetBeans Dir)\ruby2\jruby-1.2.0\lib&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;②config/database.ymlの編集&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;下記はポート1433を固定動かしてる場合です。&lt;/span&gt;&lt;br /&gt;&lt;pre style="padding: 3px; background-color: black; color: white; font-size: 10pt; font-family: arial;"&gt;host: 127.0.0.1&lt;br /&gt;adapter: jdbc&lt;br /&gt;username: xxxxxxxx&lt;br /&gt;password: xxxxxxxx&lt;br /&gt;driver: com.microsoft.sqlserver.jdbc.SQLServerDriver&lt;br /&gt;url: jdbc:sqlserver://127.0.0.1:1433;databaseName=&amp;lt;データベース名&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-family:arial;"&gt;うまく動いた♪&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-26347598686437157?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/26347598686437157/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/10/railsjdbcsqlserverjruby.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/26347598686437157'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/26347598686437157'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/10/railsjdbcsqlserverjruby.html' title='【Ruby on Rails】JDBCでSQLServerに接続（JRuby）'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-1449477744525213870</id><published>2009-10-26T14:32:00.004+09:00</published><updated>2009-12-23T22:57:12.031+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SAStrutsのトランザクション制御</title><content type='html'>外は雨です。&lt;br /&gt;明日は台風が接近らしいです。&lt;br /&gt;朝には抜けてくれてるといいんだけど・・・&lt;br /&gt;&lt;br /&gt;さて、今回はSAStruts＋S2Daoでちゃんとトランザクション制御を調べてみました。&lt;br /&gt;やっぱりデータの登録とかはトランザクション制御したほうがいいもんね？&lt;br /&gt;&lt;br /&gt;んー、SAStrutsのActionクラスのpublicメソッドには、デフォルトの設定でトランザクション制御が入るみたい。&lt;br /&gt;この部分で定義しているので、削除すればトランザクション制御をはずすことができます。&lt;br /&gt;（customizer.dicon）&lt;pre style="color:white;background-color:black;"&gt;...&lt;br /&gt;&amp;lt;initMethodname="addCustomizer"&amp;gt;&lt;br /&gt; &amp;lt;arg&amp;gt;&lt;br /&gt;  &amp;lt;component class="org.seasar.framework.container.customizer.TxAttributeCustomizer"/&amp;gt;&lt;br /&gt; &amp;lt;/arg&amp;gt;&lt;br /&gt;&amp;lt;/initMethod&amp;gt;&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;次に、customizer.diconに"serviceCustomizer"というコンポーネントの定義があります。&lt;br /&gt;これはCustomizerChainとして定義されており、ログ出力とトランザクション制御が設定されています。&lt;br /&gt;どうやら、「～Service」という名前のクラスに対して適用されるようになっているようです。（creator.diconとも関係してる？）&lt;br /&gt;これら以外のクラスでトランザクションを制御する場合は、新しく定義する必要があります。&lt;br /&gt;やり方は、&lt;a href="http://s2container.seasar.org/2.3/ja/tx.html"&gt;本家サイト様&lt;/a&gt;に丁寧に書かれているので、そちらを参照したほうが良いです。&lt;br /&gt;どうやら、&lt;a href="http://sastruts.seasar.org/featureReference.html"&gt;こちら&lt;/a&gt;によるとアノテーションで指定すれば、メソッド単位でトランザクションの制御を変更できるみたいです。&lt;br /&gt;下記のように指定すれば、該当するメソッドはトランザクション制御の対象外になります。&lt;br /&gt;&lt;pre style="color:white;background-color:black;"&gt;public class TestService {&lt;br /&gt; @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)&lt;br /&gt; (メソッドの定義）&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;んー、どれを選択するか？&lt;br /&gt;一番楽出来そうなのは、デフォルト設定でトランザクション制御が入っているServiceクラスを用意して、トランザクション制御の要否に応じてアノテーションで指定する、かなぁ？&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-1449477744525213870?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/1449477744525213870/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/10/sastruts.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/1449477744525213870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/1449477744525213870'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/10/sastruts.html' title='SAStrutsのトランザクション制御'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-7919221817596858434</id><published>2009-10-25T18:50:00.002+09:00</published><updated>2009-12-23T22:57:12.031+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SAStrutsの初期処理でS2Daoのコンポーネントを登録</title><content type='html'>今日は目が覚めたら13：00。&lt;br /&gt;寝すぎたみたいで頭クラクラ。&lt;br /&gt;休みの日はやっぱりダラけちゃうなぁ・・・&lt;br /&gt;&lt;br /&gt;さて、今日やった事はタイトルのとおり。&lt;br /&gt;SAStrutsの初期処理で、S2Daoのコンポーネントを自動登録して、好きな場所でコンポーネントを取得したい！！&lt;br /&gt;調べてみると、SAStrutsの初期処理で、SingletonS2ContainerFactoryというFactoryクラスがコンポーネントの登録をしてくれている模様。&lt;br /&gt;じゃあ、これに追加すれば勝手にやってくれるはず。&lt;br /&gt;&lt;br /&gt;というわけで、diconファイルを用意。&lt;br /&gt;&lt;pre style="color:white; background-color:black;"&gt;&amp;lt;?xml version="1.0" encoding="Shift_JIS"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"&lt;br /&gt;"http://www.seasar.org/dtd/components.dtd"&amp;gt;&lt;br /&gt;&amp;lt;components namespace="dao"&amp;gt;&lt;br /&gt; &amp;lt;include path="dao.dicon"/&amp;gt;&lt;br /&gt; &amp;lt;component class="org.seasar.dao.impl.FieldAnnotationReaderFactory"/&amp;gt;&lt;br /&gt; &amp;lt;component name="interceptor" class="org.seasar.dao.interceptors.S2DaoInterceptor"/&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;component class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister"&amp;gt;&lt;br /&gt;  &amp;lt;initMethod name="addClassPattern"&amp;gt;&lt;br /&gt;   &amp;lt;arg&amp;gt;"tree.dao"&amp;lt;/arg&amp;gt;&lt;br /&gt;   &amp;lt;arg&amp;gt;".*Dao"&amp;lt;/arg&amp;gt;&lt;br /&gt;  &amp;lt;/initMethod&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; &amp;lt;component class="org.seasar.framework.container.autoregister.AspectAutoRegister"&amp;gt;&lt;br /&gt;  &amp;lt;property name="interceptor"&amp;gt;dao.interceptor&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;initMethod name="addClassPattern"&amp;gt;&lt;br /&gt;   &amp;lt;arg&amp;gt;"tree.dao"&amp;lt;/arg&amp;gt;&lt;br /&gt;   &amp;lt;arg&amp;gt;".*Dao"&amp;lt;/arg&amp;gt;&lt;br /&gt;  &amp;lt;/initMethod&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt;&amp;lt;/components&amp;gt;&lt;br /&gt;&lt;/pre&gt;そしたらこのdiconファイルをapp.diconに追記。&lt;br /&gt;&lt;pre style="color:white; background-color:black;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"&lt;br /&gt; "http://www.seasar.org/dtd/components24.dtd"&amp;gt;&lt;br /&gt;&amp;lt;components&amp;gt;&lt;br /&gt; &amp;lt;include path="convention.dicon"/&amp;gt;&lt;br /&gt; &amp;lt;include path="aop.dicon"/&amp;gt;&lt;br /&gt; &amp;lt;include path="j2ee.dicon"/&amp;gt;&lt;br /&gt; &amp;lt;!--&lt;br /&gt; &amp;lt;include path="s2jdbc.dicon"/&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt; &amp;lt;include path="test.dicon" /&amp;gt;    &lt;===こんなかんじ。&lt;br /&gt; &amp;lt;component name="actionMessagesThrowsInterceptor" class="org.seasar.struts.interceptor.ActionMessagesThrowsInterceptor"/&amp;gt;&lt;br /&gt;&amp;lt;/components&amp;gt;&lt;br /&gt;&lt;/pre&gt;あとはコンポーネントを取得してみる。&lt;br /&gt;&lt;pre style="color:white; background-color:black;"&gt;...&lt;br /&gt;S2Container container = SingletonS2ContainerFactory.getContainer();&lt;br /&gt;なんちゃらクラス obj = container.getComponent("ここにコンポーネント名を指定");&lt;br /&gt;...&lt;/pre&gt;SingletonS2ContainerFactory.destoryはSAStrutsが勝手に呼んでくれます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-7919221817596858434?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/7919221817596858434/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/10/sastrutss2dao.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/7919221817596858434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/7919221817596858434'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/10/sastrutss2dao.html' title='SAStrutsの初期処理でS2Daoのコンポーネントを登録'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-1024176772619509807</id><published>2009-10-21T21:47:00.005+09:00</published><updated>2009-12-23T22:57:42.908+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SAStrutsでJSONデータを受け取ったじぇ</title><content type='html'>クライアント側からJSON形式データを受け取り、そのデータを処理したい。&lt;br /&gt;Ajaxな動作なんだからJSONかXML形式のデータっしょ？と思い、やってみました。&lt;br /&gt;&lt;br /&gt;まずはクライアント側でJSON形式のデータをHTTPリクエストパラメータに詰め詰め・・・。&lt;br /&gt;こんなデータにしてみました。&lt;pre style="color: white;background-color:black;"&gt;{&lt;br /&gt;  id: 1,&lt;br /&gt;  items: [&lt;br /&gt;    { id:101, name:'item1', checked: false },&lt;br /&gt;    { id:102, name:'item2', checked: true },&lt;br /&gt;    { id:103, name:'item3', checked: false }&lt;br /&gt;  ]&lt;br /&gt;}&lt;/pre&gt;「はて、SAStrutsのActionにはどんなプロパティを用意すればいいの？」としばらく考えて、&lt;br /&gt;「きっとSAStrutsはすごいから直接入れてくれるんじゃないの？」と次のようなプロパティ&lt;br /&gt;にしてみました。&lt;br /&gt;&lt;pre   style="color: white;background-color:black;"&gt;String id;&lt;br /&gt;List&amp;lt;Item&amp;gt; items;   // Itemにはid,name,checkedのプロパティをもつBean&lt;/pre&gt;結果、見事に失敗。（さすがにそんな判断つかないよね・・・）&lt;br /&gt;というわけで、やっぱり一旦JSON形式の文字列として受け取ることにしました。&lt;br /&gt;まず送るデータは次のとおり。&lt;br /&gt;&lt;pre   style="color: white;background-color:black;"&gt;{ data: "（JSON形式の文字列データ）" }&lt;/pre&gt;"（JSON形式の文字列データ）"は前に出てきたJSONデータです。&lt;br /&gt;で、Actionのプロパティは、&lt;pre   style="color: white;background-color:black;"&gt;String data;&lt;/pre&gt;として、処理の最初に、JSONICを使ってJSON形式の文字列をデコード。&lt;br /&gt;何とMapで返してくれるとのこと。&lt;pre   style="color: white;background-color:black;"&gt;Map mapData = JSON.decode(data);&lt;/pre&gt;配列部分はArrayList&amp;lt;Map&amp;gt;として取得できるようで、かなり楽ができます。&lt;br /&gt;おー、JSONICエライ！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-1024176772619509807?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/1024176772619509807/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/10/sastrutsjson.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/1024176772619509807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/1024176772619509807'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/10/sastrutsjson.html' title='SAStrutsでJSONデータを受け取ったじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-5708193922330468981</id><published>2009-10-17T17:31:00.002+09:00</published><updated>2009-12-23T22:57:42.908+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SQL ServerにS2Daoで接続してみたじぇ</title><content type='html'>現在、Extでツリーパネルを勉強中です。&lt;br /&gt;コードコンプリートもちゃんと読んでるよ？&lt;br /&gt;&lt;br /&gt;さて、今回はDBにSQL Server 2005を使ってみました。&lt;br /&gt;構成はSAStruts＋S2Dao(Tiger)＋Ext＋SQL Server 2005です。&lt;br /&gt;&lt;br /&gt;SQL Server 2005にS2Daoで接続してみました。&lt;br /&gt;とりあえずSQL Server用のJDBCをDL。&lt;br /&gt;&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=e22bc83b-32ff-4474-a44a-22b6ae2c4e17&amp;displaylang=ja"&gt;ここからダウンロードしました。&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;でもって、S2Daoの設定をしてみたら、SQL Server用に用意されていた定義はjTDS JDBC Driver用になっているという罠。&lt;br /&gt;んー・・・。&lt;br /&gt;jTDSをDLは負けた気がするので、定義を変更。&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;■driverClassName&lt;br /&gt;net.sourceforge.jtds.jdbc.Driver&lt;br /&gt;↓&lt;br /&gt;com.microsoft.sqlserver.jdbc.SQLServerDriver&lt;br /&gt;&lt;br /&gt;■URL&lt;br /&gt;jdbc:jtds:sqlserver://localhost/TEST;instance=SQLEXPRESS&lt;br /&gt;↓&lt;br /&gt;jdbc:sqlserver://127.0.0.1:1433;DatabaseName=TEST&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;よし、接続テストもOK。&lt;br /&gt;これでDBまわりの準備はできました^^&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-5708193922330468981?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/5708193922330468981/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/10/sql-servers2dao.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5708193922330468981'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5708193922330468981'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/10/sql-servers2dao.html' title='SQL ServerにS2Daoで接続してみたじぇ'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-3113731051856854680</id><published>2009-09-06T21:59:00.011+09:00</published><updated>2009-12-23T22:58:24.105+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='データベース'/><title type='text'>ER図のリバースエンジニアリング</title><content type='html'>ER図を簡単にすばやく書きたい！！と思い調べてみました。&lt;br /&gt;&lt;a href="http://www.wind.sannet.ne.jp/m_matsu/developer/a5m2/"&gt;A5:SQL Mk-2&lt;/a&gt;は、リバースエンジニアリングですぐにER図を作成できそうです。&lt;br /&gt;ほんとうはテーブル定義のドキュメントとかから一発でできれば一番いいんだけどなぁ・・・&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_clRJ8KPAYVc/SqO6BGtPymI/AAAAAAAAABY/VnHaX2pioNY/s1600-h/MK2_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:left;cursor:pointer; cursor:hand;width: 320px; height: 309px;" src="http://1.bp.blogspot.com/_clRJ8KPAYVc/SqO6BGtPymI/AAAAAAAAABY/VnHaX2pioNY/s320/MK2_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5378346908153530978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ツリー上のデータベースからER図を作成したい項目を選択肢、コンテキストメニューを表示して、「ER図のリバース生成」を選択します。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_clRJ8KPAYVc/SqO6JJRI31I/AAAAAAAAABg/_ixwl4dDg5U/s1600-h/MK2_2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:left;cursor:pointer; cursor:hand;width: 320px; height: 290px;" src="http://2.bp.blogspot.com/_clRJ8KPAYVc/SqO6JJRI31I/AAAAAAAAABg/_ixwl4dDg5U/s320/MK2_2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5378347046279896914" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;リバースER図生成で、ER図に含みたいテーブルを選択、「リバースER生成」をクリックします。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_clRJ8KPAYVc/SqO6RHYKUcI/AAAAAAAAABo/J4Cm08ExxVc/s1600-h/MK2_3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:left;cursor:pointer; cursor:hand;width: 320px; height: 193px;" src="http://4.bp.blogspot.com/_clRJ8KPAYVc/SqO6RHYKUcI/AAAAAAAAABo/J4Cm08ExxVc/s320/MK2_3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5378347183211434434" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;こんな感じで出てきます。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_clRJ8KPAYVc/SqO6Yc0DiNI/AAAAAAAAABw/Fd7bVU49Jkw/s1600-h/MK2_4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:left;cursor:pointer; cursor:hand;width: 320px; height: 184px;" src="http://2.bp.blogspot.com/_clRJ8KPAYVc/SqO6Yc0DiNI/AAAAAAAAABw/Fd7bVU49Jkw/s320/MK2_4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5378347309224659154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;[メニュー]-[ER図]-[表示レベル]-[属性とデータ型]を選択します。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_clRJ8KPAYVc/SqO6eVCMBjI/AAAAAAAAAB4/wDRiMIJbKtw/s1600-h/MK2_5.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:left;cursor:pointer; cursor:hand;width: 320px; height: 147px;" src="http://3.bp.blogspot.com/_clRJ8KPAYVc/SqO6eVCMBjI/AAAAAAAAAB4/wDRiMIJbKtw/s320/MK2_5.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5378347410215667250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;データ型も表示されます。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_clRJ8KPAYVc/SqO6kBftnPI/AAAAAAAAACA/lLdrs8oLWms/s1600-h/MK2_6.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:left;cursor:pointer; cursor:hand;width: 273px; height: 320px;" src="http://3.bp.blogspot.com/_clRJ8KPAYVc/SqO6kBftnPI/AAAAAAAAACA/lLdrs8oLWms/s320/MK2_6.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5378347508050009330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;テーブルのコンテキストを表示して、「プロパティ」を選択します。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_clRJ8KPAYVc/SqO6plPi6jI/AAAAAAAAACI/6GQWHJgQdLE/s1600-h/MK2_7.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:left;cursor:pointer; cursor:hand;width: 320px; height: 189px;" src="http://2.bp.blogspot.com/_clRJ8KPAYVc/SqO6plPi6jI/AAAAAAAAACI/6GQWHJgQdLE/s320/MK2_7.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5378347603545221682" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;論理名を頑張って入力します。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_clRJ8KPAYVc/SqO6vDAfshI/AAAAAAAAACQ/LY4eouZqIN0/s1600-h/MK2_8.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:left;cursor:pointer; cursor:hand;width: 320px; height: 189px;" src="http://1.bp.blogspot.com/_clRJ8KPAYVc/SqO6vDAfshI/AAAAAAAAACQ/LY4eouZqIN0/s320/MK2_8.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5378347697434505746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;エンティティタブを選択して、頑張って入力します。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_clRJ8KPAYVc/SqO60ac25UI/AAAAAAAAACY/zfDcvSWkrjU/s1600-h/MK2_9.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:left;cursor:pointer; cursor:hand;width: 320px; height: 150px;" src="http://1.bp.blogspot.com/_clRJ8KPAYVc/SqO60ac25UI/AAAAAAAAACY/zfDcvSWkrjU/s320/MK2_9.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5378347789626828098" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;こんな感じになりました。&lt;br /&gt;データベースとマッピングされているので、ER図上からリレーションを追加したりできます。&lt;br /&gt;&lt;br /&gt;リバースエンジニアリングの場合、データベースが出来上がっていることが前提です。&lt;br /&gt;やっぱりデータベース定義書からDDLを作成するマクロとかは自作するしかないのかな・・・？&lt;br /&gt;データベースによってSQL依存性はあるしね。&lt;br /&gt;次は、Mk-2で出力したドキュメントからDDLを作成するVBAのマクロでも作ってみます。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-3113731051856854680?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/3113731051856854680/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/09/er.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/3113731051856854680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/3113731051856854680'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/09/er.html' title='ER図のリバースエンジニアリング'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_clRJ8KPAYVc/SqO6BGtPymI/AAAAAAAAABY/VnHaX2pioNY/s72-c/MK2_1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-1906117381870868092</id><published>2009-09-03T20:43:00.006+09:00</published><updated>2009-12-23T22:59:06.967+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Webサービス'/><title type='text'>Amazon WebサービスのSignature算出　　　</title><content type='html'>&lt;span style="font-size:100%;"&gt;しゃむです。&lt;br /&gt;ついこの前AWSにアクセスするサンプルを作ってみたのですが、ちょうど認証が必要になる直前だったので、今はアクセスできなくなりました。&lt;br /&gt;&lt;a href="http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/?RequestAuthenticationArticle.html"&gt;Amazonのサイト&lt;/a&gt;によると、リクエストにTimestampとSignatureを付与する必要があるようです。&lt;br /&gt;手順については、&lt;a aiotitle="Amazon Webサービス入門（Product Advertising API）" href="http://www.ajaxtower.jp/ecs/"&gt;Amazon Webサービス入門（Product Advertising API）&lt;/a&gt;が大変参考になります。&lt;br /&gt;答え合わせには、&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;a href="http://associates-amazon.s3.amazonaws.com/signed-requests/helper/index.html"&gt;&lt;span class="logo"&gt;Signed Requests Helper&lt;/span&gt;&lt;/a&gt;が便利です。&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;pre style="background-color: black; color: white;"&gt;package sample.util;&lt;br /&gt;&lt;br /&gt;import java.io.UnsupportedEncodingException;&lt;br /&gt;import java.security.InvalidKeyException;&lt;br /&gt;import java.security.Key;&lt;br /&gt;import java.security.NoSuchAlgorithmException;&lt;br /&gt;import java.util.HashMap;&lt;br /&gt;import java.util.Iterator;&lt;br /&gt;import java.util.Set;&lt;br /&gt;import java.util.TreeSet;&lt;br /&gt;&lt;br /&gt;import javax.crypto.Mac;&lt;br /&gt;import javax.crypto.spec.SecretKeySpec;&lt;br /&gt;&lt;br /&gt;import org.seasar.struts.util.URLEncoderUtil;&lt;br /&gt;&lt;br /&gt;import com.sun.org.apache.xml.internal.security.utils.Base64;&lt;br /&gt;&lt;br /&gt;public class AWSRequestManager {&lt;br /&gt; /** 改行 */&lt;br /&gt; private final static String LF = "\n";&lt;br /&gt; /** AWS URL */&lt;br /&gt; public final static String AWS_URL = "http://ecs.amazonaws.jp/onca/xml";&lt;br /&gt; /** AWS ドメイン */&lt;br /&gt; public final static String AWS_DOMAIN = "ecs.amazonaws.jp";&lt;br /&gt; /** AWS サブドメイン */&lt;br /&gt; public final static String AWS_FILE_INFO = "/onca/xml";&lt;br /&gt; /** サービス名 */&lt;br /&gt; public final static String AWS_SERVICE = "Service";&lt;br /&gt; /** AWS Key ID */&lt;br /&gt; public final static String AWS_KEY_ID = "AWSAccessKeyId";&lt;br /&gt; /** 操作名 */&lt;br /&gt; public final static String AWS_OPERATION = "Operation";&lt;br /&gt; /** 検索カテゴリ */&lt;br /&gt; public final static String AWS_SEARCH_CATEGORY = "SearchIndex";&lt;br /&gt; /**&lt;br /&gt; * RESTリクエストを取得します。&lt;br /&gt; * @param parameterMap パラメータマップ&lt;br /&gt; * @return RESTリクエスト&lt;br /&gt; * @throws InvalidKeyException&lt;br /&gt; * @throws UnsupportedEncodingException&lt;br /&gt; * @throws NoSuchAlgorithmException&lt;br /&gt; */&lt;br /&gt; public static String makeURL(HashMap&amp;lt;String, String&amp;gt; parameterMap)&lt;br /&gt;  throws InvalidKeyException, UnsupportedEncodingException, NoSuchAlgorithmException {&lt;br /&gt;  /*&lt;br /&gt;  * Signatureを取得し、パラメータに追加します。&lt;br /&gt;  */&lt;br /&gt;  String signature = makeSignature(parameterMap);&lt;br /&gt;  parameterMap.put("Signature", signature);&lt;br /&gt;  /*&lt;br /&gt;  * リクエストを生成します。&lt;br /&gt;  */&lt;br /&gt;  StringBuffer request = new StringBuffer(AWS_URL);&lt;br /&gt;  request.append("?");&lt;br /&gt; &lt;br /&gt;  Set&amp;lt;String&amp;gt; keySet = parameterMap.keySet();&lt;br /&gt;  for(Iterator&amp;lt;String&amp;gt; iterKeySet = keySet.iterator(); iterKeySet.hasNext();) {&lt;br /&gt;   String key = iterKeySet.next();&lt;br /&gt;   String value = parameterMap.get(key);&lt;br /&gt; &lt;br /&gt;   request.append(key)&lt;br /&gt;    .append("=")&lt;br /&gt;    .append(URLEncoderUtil.encode(value));&lt;br /&gt; &lt;br /&gt;   if(iterKeySet.hasNext()) {&lt;br /&gt;    // 次の要素が残っている場合は、"&amp;amp;"を連結します&lt;br /&gt;    request.append("&amp;amp;");&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; &lt;br /&gt;  return request.toString();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt; * Signatureを算出します。&lt;br /&gt; * @param parameterMap パラメータマップ&lt;br /&gt; * @return Signature文字列&lt;br /&gt; * @throws InvalidKeyException&lt;br /&gt; * @throws UnsupportedEncodingException&lt;br /&gt; * @throws NoSuchAlgorithmException&lt;br /&gt; */&lt;br /&gt; private static String makeSignature(HashMap&amp;lt;String, String&amp;gt; parameterMap)&lt;br /&gt;  throws InvalidKeyException, UnsupportedEncodingException, NoSuchAlgorithmException {&lt;br /&gt;  StringBuffer tmp = new StringBuffer();&lt;br /&gt;  /*&lt;br /&gt;  * HTTPメソッド、AWS URLの情報を設定します。&lt;br /&gt;  */&lt;br /&gt;  tmp.append("GET")&lt;br /&gt;   .append(LF)&lt;br /&gt;   .append(AWS_DOMAIN)&lt;br /&gt;   .append(LF)&lt;br /&gt;   .append(AWS_FILE_INFO)&lt;br /&gt;   .append(LF);&lt;br /&gt;  /*&lt;br /&gt;  * メインパラメータを設定します。&lt;br /&gt;  */&lt;br /&gt;  tmp.append(makeMainParameter(parameterMap));&lt;br /&gt;  /*&lt;br /&gt;  * SHA256アルゴリズムでダイジェストを作成します。&lt;br /&gt;  */&lt;br /&gt;  String signature = Base64.encode(digestSHA256(tmp.toString()));&lt;br /&gt; &lt;br /&gt;  return signature;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt; * HMAC with the SHA256アルゴリズムでダイジェストを作成します。&lt;br /&gt; * @param data ダイジェスト生成対象データ&lt;br /&gt; * @return ダイジェスト&lt;br /&gt; * @throws UnsupportedEncodingException&lt;br /&gt; * @throws NoSuchAlgorithmException&lt;br /&gt; * @throws InvalidKeyException&lt;br /&gt; */&lt;br /&gt; private static byte[] digestSHA256(String data)&lt;br /&gt;  throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException  {&lt;br /&gt;  Key key = new SecretKeySpec("(Secret Access Key)".getBytes(), "HmacSHA256");&lt;br /&gt;  Mac mac = Mac.getInstance(key.getAlgorithm());&lt;br /&gt;  mac.init(key);&lt;br /&gt;  byte[] digest = mac.doFinal(data.getBytes());&lt;br /&gt;&lt;br /&gt;  return digest;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt; * AWSリクエストのメインパラメータを取得します。&lt;br /&gt; * メインパラメータはHTTPメソッドやAWSのURLを除いた部分です。&lt;br /&gt; * @param parameterMap パラメータマップ&lt;br /&gt; * @return メインパラメータ文字列&lt;br /&gt; */&lt;br /&gt; private static String makeMainParameter(HashMap&amp;lt;String, String&amp;gt; parameterMap) {&lt;br /&gt;  StringBuffer mainParameter = new StringBuffer();&lt;br /&gt; &lt;br /&gt;  Set&amp;lt;String&amp;gt; keySet = parameterMap.keySet();&lt;br /&gt;  // ソートのためにTreeSetでラッピングします。&lt;br /&gt;  TreeSet&amp;lt;String&amp;gt; treeKeySet = new TreeSet&amp;lt;String&amp;gt;(keySet);&lt;br /&gt;  for (String key : treeKeySet) {&lt;br /&gt;   String value = parameterMap.get(key);&lt;br /&gt;   if(mainParameter.length() &amp;gt; 0) {&lt;br /&gt;    mainParameter.append("&amp;amp;");&lt;br /&gt;   }&lt;br /&gt;   mainParameter.append(key)&lt;br /&gt;       .append("=")&lt;br /&gt;       .append(URLEncoderUtil.encode(value));&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  return mainParameter.toString();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;span style="font-size:100%;"&gt;簡単そうだったのですが、「GET～」を付与する際の改行コードで地味に引っかかりました。&lt;br /&gt;最初「\r\n」にしてたのですが、「\n」じゃないと駄目でした。&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-1906117381870868092?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/1906117381870868092/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/09/amazon-websignature.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/1906117381870868092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/1906117381870868092'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/09/amazon-websignature.html' title='Amazon WebサービスのSignature算出　　　'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-4146582935998540740</id><published>2009-08-23T19:38:00.011+09:00</published><updated>2009-12-23T22:59:32.329+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Webサービス'/><title type='text'>GAE（Google App Engine）を触ってみました</title><content type='html'>&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:arial;"&gt;2009年9月号の日経ソフトウェアに、GAEのネタがあったのでやってみました。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;とりあえず雑誌の手順に従って、定番のHelloWorldを出力。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;手順としては、以下のとおり（日経ソフトウェアから抜粋）&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;ol  style="font-family:arial;"&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;Googleアカウントの取得&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;App Engineアカウントの取得&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;開発環境の整備&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;プロジェクトの作成とコーディング&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;ローカル環境で実行&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;アプリケーションIDなどGAE上での設定&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;GAEにデプロイ、実行&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;1．Googleアカウントの取得&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;もともと持ってたのでパス。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;2．App Engineアカウントの取得&lt;/span&gt;&lt;br /&gt;&lt;a style="font-family: arial;" href="http://code.google.com/intl/ja/appengine"&gt;Google App EngineのWebサイト&lt;/a&gt;&lt;span style="font-family:arial;"&gt;にアクセスして、App Engineアカウントを作成。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;3．開発環境の整備&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Eclipse用プラグイン「Google Plugin for Eclipse」をインストール。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;ソフトウェア更新で、http://dl.google.com/eclipse/plugin/3.4(eclipse3.4の場合)から全ての項目をインストールします。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;4．プロジェクトの作成とコーディング&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;3．の作業を行ったあと、Eclipseの上のほうに3つのボタンが表示されたと思います。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;そのうち、一番左の「g」のマークが付いたボタンを押すとGAEのプロジェクトを作成するためのダイアログが表示されるはずです。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;プロジェクト名とパッケージ名を入力したら、「Use Google Web Toolkit」のチェックをOFFにしてFinishボタンを押します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;すると、サンプルソースを含んだプロジェクトが作成されるでしょう。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;このサンプルソースは、すでにHelloWorldを表示するコードになっているので、そのままビルド。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;5．ローカル環境で実行&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;プロジェクトエクスプローラで、「実行」→「Webアプリケーション」を選択。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;コンソールに「The server is running at http://localhost:8080」と表示されれば成功です。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Webブラウザでhttp://localhost:8080にアクセスすると、Hello, Worldと表示されます。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;6．アプリケーションIDなどGAE上での設定&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;ローカルで動作確認できたら、GAE上にデプロイです。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;そのために、まずアプリケーションIDの作成が必要です。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;まず、&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;a style="font-family: arial;" href="http://code.google.com/intl/ja/appengine"&gt;Google App EngineのWebサイト&lt;/a&gt;&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:arial;"&gt;からApp Engineアカウントでログインします。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;すると「Welcome to Google App Engine」というページが表示されます。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;ここで「Create An Application」ボタンを押すと「Create an Application」というアプリケーション作成ページが現れます。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;「Application Identifier」のテキストには、取得したいアプリケーションIDを入力します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;アプリケーションIDは、そのままサイトのURLのサブドメインの一部となります。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;たとえば、アプリケーションIDを「mysample」としたら、URLは「http://mysample.appspot.com/」になります。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;appspot.comがGAEのドメインです。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;その下の「Application Title」のテキストには、アプリケーションの簡単な説明文を入力します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;これがアプリケーションのタイトルとして表示されます。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;さらにその下には「Authentication Options(Advanced)」という項目があります。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;これはユーザー認証するアプリケーションのための選択肢です。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;「Edit」を押すと「Open to all Google Accounts users(default)」と「Restricted to the following Google Apps  domain」の選択肢が現れます。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;「Open to～」を選択すると、Gmailアカウントを含むGoogleアカウントを、アプリケーションのユーザー認証に使えるようになります。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;一般向けWebサービスとして公開する場合は、こちらを選択します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;もう一方の「Restricted to～」は「Google Apps」との連携アプリケーションを作成する際に使用します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;今回は一般向けのアプリケーションなので初期設定で選択されている「Open to～」のままにしておきます。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;これらの項目を設定した上で「Save」。&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-style: italic;font-family:arial;" &gt;注意としては、GAEでは１つのApp Engineアカウントにつき最大10個のアプリケーションIDしか作成できません。&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-style: italic;font-family:arial;" &gt;また、アプリケーションIDの改名や削除もできません。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;アプリケーションIDは慎重に設定しましょう。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;font-family:arial;" &gt;7．GAEにデプロイ、実行&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;いよいよデプロイです。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Eclipseのプロジェクトエクスプローラで、「Google」→「App Engine Settings...」を選択します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;「Deployment」の「Application ID：」の欄に、6．で作成したアプリケーションIDを設定します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;「Version：」の欄はバージョン名を設定します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;最後に、Eclipse上部の3つのボタンのうち一番右のボタンをクリック。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;コンソールに「Deployment completed successfully」がでれば完了です。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;あとは、「http://アプリケーションID.appspot.com/」にアクセスしてみましょう。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-4146582935998540740?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/4146582935998540740/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/08/gaegoogle-app-engine.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4146582935998540740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/4146582935998540740'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/08/gaegoogle-app-engine.html' title='GAE（Google App Engine）を触ってみました'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-2429921274754176152</id><published>2009-08-09T14:56:00.003+09:00</published><updated>2009-12-23T22:59:51.872+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SAStruts＋S2Dao</title><content type='html'>&lt;span style="font-family:arial;"&gt;SAStruts標準ではS2JDBCが入ってます。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;じゃあS2Daoにしてみようと思ってやってみました。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;１．jarの追加&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;s2-dao-xxx.jarを追加します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;JDBCドライバも必要になるので、それも一緒に追加します。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;２．diconファイルの追加&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;dao.diconファイルを追加します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;jdbc.diconファイルに以下を追記します。&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;pre  style="background-color: black;color:white;"&gt;&lt;span style="font-family:arial;"&gt;&amp;lt;component name="transactionManager"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    class="org.seasar.extension.jta.TransactionManagerImpl"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&amp;lt;component name="requiredTx"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    class="org.seasar.extension.tx.RequiredInterceptor"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&amp;lt;component name="requiresNewTx"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    class="org.seasar.extension.tx.RequiresNewInterceptor"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&amp;lt;component name="mandatoryTx"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    class="org.seasar.extension.tx.MandatoryInterceptor"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&amp;lt;component name="notSupportedTx"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;    class="org.seasar.extension.tx.NotSupportedInterceptor"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&amp;lt;component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&amp;lt;component class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&amp;lt;!--&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&amp;lt;component class="org.seasar.extension.jdbc.impl.OracleResultSetFactory"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&amp;lt;component class="org.seasar.extension.jdbc.impl.BooleanToIntStatementFactory"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;３．S2Dao用のクラスやインターフェースを作成&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;４．ちょっとお祈りしてから、ビルド&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;５．Hot Deployが終わったら接続&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;６．成功します&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-2429921274754176152?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/2429921274754176152/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/08/sastrutss2dao.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/2429921274754176152'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/2429921274754176152'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/08/sastrutss2dao.html' title='SAStruts＋S2Dao'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-5246642847358030659</id><published>2009-08-09T09:28:00.004+09:00</published><updated>2009-12-23T22:59:51.873+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>S2JDBC</title><content type='html'>S2JDBCを使ってみました。&lt;br /&gt;SAStruts入れたら一緒についてきたので、つい・・・。&lt;br /&gt;&lt;br /&gt;S2JDBCのコンセプトは「流れるようなインターフェースと脱CoC」だそうです。&lt;br /&gt;流れるようなインターフェースというのは、見ればどういう内容かわかるという可読性の高さみたい。&lt;br /&gt;脱CoCは言葉のまんまで、規約ばっかりに頼ってたらそのうち痛い目にあうよ？ということらしいですｗ&lt;br /&gt;詳しくは&lt;a href="http://s2container.seasar.org/2.4/ja/s2jdbc.html"&gt;S2JDBC&lt;/a&gt;のホームページを見てください。&lt;br /&gt;&lt;br /&gt;個人的にはS2JDBCのほうが性に合う気がします。&lt;br /&gt;やっぱり直感的に分かるって大事だと思っているので。&lt;br /&gt;だっていずれ規約とか忘れていくのに、そればっかり使ってたら見直したときに「？」ってなるに決まってるもん。&lt;br /&gt;&lt;br /&gt;テーブルはこんなのを使いました。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;            Table "public.sample"&lt;br /&gt; Column |          Type          | Modifiers&lt;br /&gt;--------+------------------------+-----------&lt;br /&gt; no     | integer                | not null&lt;br /&gt; name   | character varying(128) |&lt;br /&gt; age    | integer                |&lt;br /&gt;Indexes:&lt;br /&gt;    "sample_pkey" PRIMARY KEY, btree (no)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;S2JDBCのソースがどんなものかですが、こんなもんです。&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;List&amp;lt;Sample&amp;gt; sampleList = jdbcManager.from(Sample.class).getResultList();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color:black;color:white;"&gt;package sample.entity;&lt;br /&gt;&lt;br /&gt;import javax.persistence.Column;&lt;br /&gt;import javax.persistence.Entity;&lt;br /&gt;import javax.persistence.Id;&lt;br /&gt;&lt;br /&gt;@Entity&lt;br /&gt;public class Sample {&lt;br /&gt; @Id&lt;br /&gt; @Column(nullable = false, unique = true)&lt;br /&gt; public Integer no;&lt;br /&gt; @Column(length = 128, nullable = false, unique = false)&lt;br /&gt; public String name;&lt;br /&gt;&lt;br /&gt; public Integer age;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;jdbcManagerはJdbcManager型のオブジェクトで、DIによって注入されます。&lt;br /&gt;ということは、コンポーネントの定義が必要ってことですね。&lt;br /&gt;これはjdbc.diconとs2jdbc.diconに定義されています。&lt;br /&gt;使うDBに合わせてコメントをはずしてください。&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"&lt;br /&gt; "http://www.seasar.org/dtd/components21.dtd"&amp;gt;&lt;br /&gt;&amp;lt;components namespace="jdbc"&amp;gt;&lt;br /&gt; &amp;lt;include path="jta.dicon"/&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- for HSQLDB --&amp;gt;&lt;br /&gt; &amp;lt;!--&lt;br /&gt; &amp;lt;component name="xaDataSource"&lt;br /&gt;  class="org.seasar.extension.dbcp.impl.XADataSourceImpl"&amp;gt;&lt;br /&gt;  &amp;lt;property name="driverClassName"&amp;gt;&lt;br /&gt;   "org.hsqldb.jdbcDriver"&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="URL"&amp;gt;&lt;br /&gt;   "jdbc:hsqldb:file:"&lt;br /&gt;    + application.getRealPath("/WEB-INF/data")&lt;br /&gt;    + "/test"&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="user"&amp;gt;"sa"&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="password"&amp;gt;""&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt; &amp;lt;!-- for H2 --&amp;gt;&lt;br /&gt; &amp;lt;!--&lt;br /&gt; &amp;lt;component name="xaDataSource"&lt;br /&gt;  class="org.seasar.extension.dbcp.impl.XADataSourceImpl"&amp;gt;&lt;br /&gt;  &amp;lt;property name="driverClassName"&amp;gt;&lt;br /&gt;   "org.h2.Driver"&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="URL"&amp;gt;&lt;br /&gt;   "jdbc:h2:file:"&lt;br /&gt;    + @org.seasar.framework.util.ResourceUtil@getBuildDir(@examples.entity.JdbcManagerTest@class).getCanonicalPath()&lt;br /&gt;    + "/data/demo;DB_CLOSE_ON_EXIT=FALSE"&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="user"&amp;gt;"sa"&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="password"&amp;gt;&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- for Oracle --&amp;gt;&lt;br /&gt; &amp;lt;!--&lt;br /&gt; &amp;lt;component name="xaDataSource"&lt;br /&gt;  class="org.seasar.extension.dbcp.impl.XADataSourceImpl"&amp;gt;&lt;br /&gt;  &amp;lt;property name="driverClassName"&amp;gt;&lt;br /&gt;   "oracle.jdbc.driver.OracleDriver"&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="URL"&amp;gt;&lt;br /&gt;   "jdbc:oracle:thin:@xxx:1521:xxx"&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="user"&amp;gt;"xxx"&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="password"&amp;gt;"xxx"&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- for DB2 --&amp;gt;&lt;br /&gt; &amp;lt;!--&lt;br /&gt; &amp;lt;component name="xaDataSource"&lt;br /&gt;  class="org.seasar.extension.dbcp.impl.XADataSourceImpl"&amp;gt;&lt;br /&gt;  &amp;lt;property name="driverClassName"&amp;gt;&lt;br /&gt;   "com.ibm.db2.jcc.DB2Driver"&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="URL"&amp;gt;&lt;br /&gt;   "jdbc:db2://foo.bar.com:50000/SAMPLE"&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="user"&amp;gt;"db2user"&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="password"&amp;gt;"db2password"&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;initMethod name="addProperty"&amp;gt;&lt;br /&gt;   &amp;lt;arg&amp;gt;"currentSchema"&amp;lt;/arg&amp;gt;&lt;br /&gt;   &amp;lt;arg&amp;gt;"SCHEMA"&amp;lt;/arg&amp;gt;&lt;br /&gt;  &amp;lt;/initMethod&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- for PostgreSQL --&amp;gt;&lt;br /&gt; &amp;lt;!--&lt;br /&gt; &amp;lt;component name="xaDataSource"&lt;br /&gt;  class="org.seasar.extension.dbcp.impl.XADataSourceImpl"&amp;gt;&lt;br /&gt;  &amp;lt;property name="driverClassName"&amp;gt;&lt;br /&gt;   "org.postgresql.Driver"&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="URL"&amp;gt;&lt;br /&gt;          "jdbc:postgresql://localhost/TEST"&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="user"&amp;gt;"xxxx"&amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="password"&amp;gt;"xxxx"&amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/component&amp;gt;&lt;br /&gt;    --&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- MySQL&lt;br /&gt; - MySQL4.0以下でマルチバイト文字を扱う場合には，URL指定の後に，&lt;br /&gt;  以下の接続パラメータを追加で指定してください．&lt;br /&gt;  useUnicode=true&lt;br /&gt;  characterEncoding=[MySQLのエンコーディングに対応した&lt;br /&gt;  Javaのエンコーディング名]&lt;br /&gt;  例："jdbc:mysql://localhost:3306/test?useUnicode=true" +&lt;br /&gt;  "&amp;amp;characterEncoding=Windows-31J"&lt;br /&gt;  &lt;br /&gt; - MySQL5.0以降で，エンコーディングがeucjpmsの列を扱う場合には，&lt;br /&gt;  URL指定の後に，以下の接続パラメータを追加で指定してください．&lt;br /&gt;  characterEncoding=UTF-8またはWindows-31J&lt;br /&gt;  characterSetResults=UTF-8またはWindows-31J&lt;br /&gt;  例："jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8" +&lt;br /&gt;  "&amp;amp;characterSetResults=UTF-8"&lt;br /&gt;  この指定をしない場合，Java側でUCS-2⇔EUC_JP_Solarisの変換が&lt;br /&gt;  行なわれるため，ユーザー定義外字などの一部の文字が化けます．&lt;br /&gt;  この指定をすることで，MySQL側でeucjpms⇔ucs2⇔utf8(cp932)の&lt;br /&gt;  変換が行なわれ，Java側でUCS-2⇔UTF-8(Windows-31J)の変換が&lt;br /&gt;  行なわれるようになります．この結果，文字化けを防げます．&lt;br /&gt;  なおJIS X 0212(補助漢字)を使用する場合は，Windows-31Jではなく&lt;br /&gt;  UTF-8を指定する必要があります．&lt;br /&gt;  &lt;br /&gt; - 上記以外の場合は，my.cnfでdefault-character-setの設定を適切に&lt;br /&gt;  (cp932やutf8など．デフォルトのlatin1は不可)行なっていれば，&lt;br /&gt;  文字化けは防げます．&lt;br /&gt; &amp;lt;component name="xaDataSource"&lt;br /&gt;  class="org.seasar.extension.dbcp.impl.XADataSourceImpl"&amp;gt;&lt;br /&gt;  &amp;lt;property name="driverClassName"&amp;gt;&lt;br /&gt;   "com.mysql.jdbc.Driver"&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="URL"&amp;gt;&lt;br /&gt;   "jdbc:mysql://localhost:3306/test"&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="user"&amp;gt;"xxx"&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="password"&amp;gt;"xxx"&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- for SQLServer --&amp;gt;&lt;br /&gt; &amp;lt;!--&lt;br /&gt; &amp;lt;component name="xaDataSource"&lt;br /&gt;  class="org.seasar.extension.dbcp.impl.XADataSourceImpl"&amp;gt;&lt;br /&gt;  &amp;lt;property name="driverClassName"&amp;gt;&lt;br /&gt;   "net.sourceforge.jtds.jdbc.Driver"&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="URL"&amp;gt;&lt;br /&gt;            "jdbc:jtds:sqlserver://localhost/TEST;instance=SQLEXPRESS"&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="user"&amp;gt;"xxxx"&amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="password"&amp;gt;"xxxx"&amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/component&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt; &amp;lt;component name="connectionPool"&lt;br /&gt;  class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl"&amp;gt;&lt;br /&gt;  &amp;lt;property name="timeout"&amp;gt;600&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="maxPoolSize"&amp;gt;10&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="allowLocalTx"&amp;gt;true&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;destroyMethod name="close"/&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;component name="DataSource"&lt;br /&gt;  class="org.seasar.extension.dbcp.impl.DataSourceImpl"&lt;br /&gt; /&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!-- from JNDI --&amp;gt;&lt;br /&gt; &amp;lt;!--&lt;br /&gt; &amp;lt;component name="DataSource"&lt;br /&gt;  class="javax.sql.DataSource"&amp;gt;&lt;br /&gt;  @org.seasar.extension.j2ee.JndiResourceLocator@lookup("java:comp/env/jdbc/DataSource")&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!--&lt;br /&gt; &amp;lt;component name="DataSource"&lt;br /&gt;  class="org.seasar.extension.datasource.impl.SelectableDataSourceProxy"/&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt;&amp;lt;/components&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;次にs2jdbc.diconです。&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"&lt;br /&gt; "http://www.seasar.org/dtd/components24.dtd"&amp;gt;&lt;br /&gt;&amp;lt;components&amp;gt;&lt;br /&gt; &amp;lt;include path="jdbc.dicon"/&amp;gt;&lt;br /&gt; &amp;lt;include path="s2jdbc-internal.dicon"/&amp;gt;&lt;br /&gt; &amp;lt;component name="jdbcManager" class="org.seasar.extension.jdbc.manager.JdbcManagerImpl"&amp;gt;&lt;br /&gt;  &amp;lt;property name="maxRows"&amp;gt;0&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="fetchSize"&amp;gt;0&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="queryTimeout"&amp;gt;0&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="dialect"&amp;gt;hsqlDialect&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt;&amp;lt;/components&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ここでようやくjdbcManagerという名前でコンポーネントが定義されました。&lt;br /&gt;SAStrutsにデフォルトで含まれるファイルを使う場合は、app.diconでs2jdbc.diconの記述がコメントアウトされているので、これを削除してください。&lt;br /&gt;&lt;br /&gt;ここまでやればＯＫです。&lt;br /&gt;まあ、設定ファイルなんかはダウンロードできるので、ほとんど手間はかからないはずです。&lt;br /&gt;試しにエンティティのクラス名をSampleからTestに変更して、テーブル名と別にしてみましたが、それでも問題なく動作しました。&lt;br /&gt;これは、クラス名＝テーブル名という規約が存在しないことを意味します。&lt;br /&gt;SQLで取得するカラム名と同じ名前のプロパティにデータが設定されるようになっているというわけですね。&lt;br /&gt;&lt;br /&gt;JdbcManagerのメソッドにはfromやらwhereなど、SQLに近いものが存在し、&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;List&amp;lt;Employee&amp;gt; results = jdbcManager.from(Employee.class)&lt;br /&gt;                             .join("department")&lt;br /&gt;                             .where("id in (? , ?)", 11, 22)&lt;br /&gt;                             .orderBy("name")&lt;br /&gt;                             .getResultList();&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;のように記述できます。もちろん、SQLを直接文字列として渡すこともできます。&lt;br /&gt;&lt;br /&gt;欠点としては、S2JDBCだとSQLをソース内に含めることになるので、それが嫌って人は多そう・・・。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-5246642847358030659?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/5246642847358030659/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/08/s2jdbc.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5246642847358030659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5246642847358030659'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/08/s2jdbc.html' title='S2JDBC'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-6120050890634123178</id><published>2009-07-29T01:23:00.002+09:00</published><updated>2009-12-23T23:01:18.538+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ExtJS'/><title type='text'>Extコンポーネントのプラグインサンプル</title><content type='html'>「しゃむ」です。&lt;br /&gt;眠い・・・。&lt;br /&gt;&lt;br /&gt;Extコンポーネントのプラグインを作ってみました。&lt;br /&gt;最小化するとアイコン化するプラグインです。&lt;br /&gt;画像とかパスとかは準備したり合わせたりする必要があります。&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;// プラグイン用の名前空間を作成&lt;br /&gt;Ext.namespace("Ext.ux.plugins");&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Ext.ux.plugins.IconablePluginクラス。&lt;br /&gt; * コンポーネントに最小化時にアイコン化する機能を追加します。&lt;br /&gt; * その際、コンポーネントにminIconプロパティが追加されます。&lt;br /&gt; * minIcon: Ext.Panel 最小化時のアイコン&lt;br /&gt; */&lt;br /&gt;Ext.ux.plugins.IconablePlugin = function(config) {&lt;br /&gt; Ext.apply(this, config);&lt;br /&gt;};&lt;br /&gt;Ext.extend(Ext.ux.plugins.IconablePlugin, Ext.util.Observable,{&lt;br /&gt; /**&lt;br /&gt;  * プラグインの初期化です。&lt;br /&gt;  * コンポーネント作成前に、この関数が呼ばれます。&lt;br /&gt;  * 第1引数にはコンポーネント自身のオブジェクトが渡ります。&lt;br /&gt;  */&lt;br /&gt; init: function(win) {&lt;br /&gt;  // 最小化ボタン押下時にアイコン化するようにします。&lt;br /&gt;  win.on('minimize', function() {&lt;br /&gt;   if(this.minIcon == null) {&lt;br /&gt;    this.minIcon = new Ext.Panel({&lt;br /&gt;     height: 48, // 画像サイズ次第&lt;br /&gt;     width: 48, // 画像サイズ次第&lt;br /&gt;     border: false,&lt;br /&gt;     html: '&amp;lt;img src="/MyWebStudy01/images/grid48x48.png"&amp;gt;', // とりあえずベタ書き&lt;br /&gt;     renderTo: Ext.getBody(), // とりあえずbodyタグに&lt;br /&gt;     hidden: true&lt;br /&gt;    });&lt;br /&gt;&lt;br /&gt;    this.minIcon.body.on('click', function() {&lt;br /&gt;     win.show();&lt;br /&gt;     win.minIcon.hide();&lt;br /&gt;    });&lt;br /&gt;    this.setAnimateTarget(this.minIcon.body.id);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   this.hide();&lt;br /&gt;  });&lt;br /&gt;  // コンポーネントが隠れたときに、最小化アイコンを表示します。&lt;br /&gt;  win.on('hide', function() {&lt;br /&gt;   this.minIcon.show();&lt;br /&gt;  })&lt;br /&gt; }&lt;br /&gt;});&lt;br /&gt;&lt;br /&gt;Ext.onReady(function() {&lt;br /&gt; var win = new Ext.Window({&lt;br /&gt;  width: 300,&lt;br /&gt;  height: 300,&lt;br /&gt;  title: 'sample title',&lt;br /&gt;  html: 'Hello World',&lt;br /&gt;  minimizable: true,&lt;br /&gt;  maximizable: true,&lt;br /&gt;  collapsible: true,&lt;br /&gt;  resizable: true,&lt;br /&gt;  // アイコン化プラグインの組み込み&lt;br /&gt;  plugins: new Ext.ux.plugins.IconablePlugin()&lt;br /&gt; });&lt;br /&gt; win.show();&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;プラグインといってもinit関数が定義されているだけです。&lt;br /&gt;どういう処理を持たせるかは、自分で練る必要があります。&lt;br /&gt;&lt;br /&gt;（クラス継承でなくプラグインとすることのメリット）&lt;br /&gt;・プラグインにすることで、クラス継承によるクラスの大量発生が防げます。&lt;br /&gt;・プラグインを作成することで、いろんなコンポーネントに機能を付加できる可能性があります。&lt;br /&gt;・「プラグインを作った！！」というほうがなんとなく聞こえがいいです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-6120050890634123178?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/6120050890634123178/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/07/ext.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6120050890634123178'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/6120050890634123178'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/07/ext.html' title='Extコンポーネントのプラグインサンプル'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-2821738189805661665</id><published>2009-07-23T00:49:00.003+09:00</published><updated>2009-12-23T23:01:02.079+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>SAStrutsのリクエスト処理の概観図</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_clRJ8KPAYVc/Smc1iY1kQjI/AAAAAAAAABQ/OuwZKoK-GXY/s1600-h/SAStruts%E6%A6%82%E8%A6%B3%E5%9B%B3.PNG"&gt;&lt;img style="border:1px solid black;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 299px;" src="http://3.bp.blogspot.com/_clRJ8KPAYVc/Smc1iY1kQjI/AAAAAAAAABQ/OuwZKoK-GXY/s400/SAStruts%E6%A6%82%E8%A6%B3%E5%9B%B3.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5361312746306814514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;SAStrutsのリクエスト処理がどのように流れているかを、ざっくり眺めてみたのでメモ書きです。&lt;br /&gt;やはり&lt;a href="http://sastruts.seasar.org/fileReference.html"&gt;SAStrutsのweb.xmlやstruts-config.xml&lt;/a&gt;に必要なクラスが鍵になっていました。&lt;br /&gt;&lt;br /&gt;大まかには図の順番に流れています。&lt;br /&gt;まず全てのURLパターンに対して、RoutingFilterがURLの解析と～.doへの変換を行います。&lt;br /&gt;その際、actionパスとexecuteコンフィグを保持します。&lt;br /&gt;actionパスはPOJOのアクション、executeコンフィグはアクションのどのメソッドを実行するかという情報になります。&lt;br /&gt;そして、それらの情報とともに「～.do」へフォワード or リダイレクトします。&lt;br /&gt;&lt;br /&gt;「～.do」のURLなので、これはActionServletにマッピングされます。&lt;br /&gt;web.xmlとstruts-config.xmlの定義により、ActionServletのconfigFactoryはS2ModuleConfigFactory、requestProcessorはS2RequestProcessorになります。&lt;br /&gt;&lt;br /&gt;ActionServletは各処理を実行し、ActionMappingを生成します。&lt;br /&gt;この際、configFactoryからModuleConfigを生成し、ModuleConfigからActionMappingを生成する流れになっていますが、SAStrutsの場合、S2ModuleConfigFactoryがS2ModuleConfigを生成し、S2ModuleConfigがS2ActionMappingを生成するようになっています。&lt;br /&gt;&lt;br /&gt;S2ActionMappingにはPOJOのアクション、アクションフォームのオブジェクトが保持されており、S2ActionMappingをActionWrapperに受け渡します。&lt;br /&gt;ActionWrapperは、StrutsのActionを継承したSAStrutsのPOJOアクションを呼び出すクラスです。&lt;br /&gt;渡されたPOJOアクションとexecuteコンフィグから、POJOアクションの特定のメソッドを呼び出します。&lt;br /&gt;&lt;br /&gt;&lt;span style="color:red;font-size:9pt;"&gt;&lt;b&gt;※誤解しているところもあるかもしれないので、全部鵜呑みにはしないでくださいね・・・&lt;/b&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-2821738189805661665?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/2821738189805661665/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/07/sastruts.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/2821738189805661665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/2821738189805661665'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/07/sastruts.html' title='SAStrutsのリクエスト処理の概観図'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_clRJ8KPAYVc/Smc1iY1kQjI/AAAAAAAAABQ/OuwZKoK-GXY/s72-c/SAStruts%E6%A6%82%E8%A6%B3%E5%9B%B3.PNG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-7845725718611863475</id><published>2009-06-26T21:20:00.003+09:00</published><updated>2009-12-23T23:01:02.079+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>S2Daoの続きだじぇ　</title><content type='html'>トランザクション管理はどんなアプリケーションでも必須なので、S2Daoではどうやるの？と思い調べてみました。&lt;br /&gt;どうやらS2Daoとは完全に独立しているみたいです。&lt;br /&gt;トランザクション管理は「S2Tx」を使います。&lt;br /&gt;&lt;br /&gt;S2Txの機能を使い、POJO(普通のJavaのクラス)に対して、トランザクションの自動管理機能を組み込むことができます。&lt;br /&gt;&lt;span style="font-style:italic;"&gt;～Seaserプロジェクトからの引用～&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tx.java&lt;br /&gt;&lt;pre style="background-color:black;color:white"&gt;package main;&lt;br /&gt;&lt;br /&gt;public interface Tx {&lt;br /&gt; public void foo();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;TxImpl.java&lt;br /&gt;&lt;pre style="background-color:black;color:white"&gt;package main;&lt;br /&gt;&lt;br /&gt;public class TxImpl implements Tx {&lt;br /&gt; public void foo() {&lt;br /&gt;  System.out.println("foo");&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;diconファイル&lt;/span&gt;&lt;br /&gt;TxImpl.dicon&lt;br /&gt;&lt;pre style="background-color:black;color:white"&gt;&amp;lt;?xml version="1.0" encoding="Shift_JIS"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"&lt;br /&gt;"http://www.seasar.org/dtd/components.dtd"&amp;gt;&lt;br /&gt;&amp;lt;components&amp;gt;&lt;br /&gt;   &amp;lt;include path="dao.dicon"/&amp;gt;&lt;br /&gt;   &amp;lt;component class="main.TxImpl"&amp;gt;&lt;br /&gt;       &amp;lt;aspect&amp;gt;j2ee.requiredTx&amp;lt;/aspect&amp;gt;&lt;br /&gt;   &amp;lt;/component&amp;gt;&lt;br /&gt;&amp;lt;/components&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;mainクラス&lt;/span&gt;&lt;br /&gt;MyMain.java&lt;br /&gt;&lt;pre style="background-color:black;color:white"&gt;package main;&lt;br /&gt;&lt;br /&gt;import org.seasar.framework.container.S2Container;&lt;br /&gt;import org.seasar.framework.container.factory.S2ContainerFactory;&lt;br /&gt;&lt;br /&gt;public class MyMain {&lt;br /&gt;&lt;br /&gt; private static final String PATH = "main/TxImpl.dicon";&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  S2Container container = S2ContainerFactory.create(PATH);&lt;br /&gt;  container.init();&lt;br /&gt;  try {&lt;br /&gt;   Tx tx = (Tx)container.getComponent(Tx.class);&lt;br /&gt;   // メソッドを実行しないとトランザクションを開始しないっぽい。&lt;br /&gt;   tx.foo();&lt;br /&gt;  } catch(Exception e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  } finally {&lt;br /&gt;   container.destroy();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;実行結果&lt;/span&gt;&lt;br /&gt;&lt;pre style="background-color:black;color:white"&gt;DEBUG 2009-06-26 21:36:46,936 [main] トランザクションを開始しました&lt;br /&gt;foo&lt;br /&gt;DEBUG 2009-06-26 21:36:46,936 [main] トランザクションをコミットしました&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-7845725718611863475?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/7845725718611863475/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/06/s2dao_26.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/7845725718611863475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/7845725718611863475'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/06/s2dao_26.html' title='S2Daoの続きだじぇ　'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-1156001087962759948</id><published>2009-06-25T22:12:00.003+09:00</published><updated>2009-12-23T23:01:02.097+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>S2Daoを使ってみた</title><content type='html'>今週はずっと皮膚科通いです。&lt;br /&gt;「○○君どうぞー」と君付けで呼ばれているので、ちょっとテンション上がります。&lt;br /&gt;&lt;br /&gt;突然ですが、S2Daoを使ってみました。&lt;br /&gt;S2DaoはSeaserプロジェクトのO/Rマッピングライブラリです。&lt;br /&gt;次のようなメリットがあるとのことです。&lt;br /&gt;&lt;br /&gt;1. XMLを使用しないO/Rマッピング機能&lt;br /&gt;2. JDBCの知識が不要&lt;br /&gt;3. SQLプログラマとJavaプログラマの分業した作業が可能&lt;br /&gt;4. SQL文の自動生成&lt;br /&gt;5. インターフェースと実装の分離&lt;br /&gt;&lt;br /&gt;まあそれはさておいて、今回はS2Daoを使って任意のテーブルから全レコードを取得するサンプルを作ってみます。&lt;br /&gt;パッケージ名とかは適当です。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;プロジェクト作成とライブラリの準備&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;EclipseでJavaプロジェクトとして「S2DaoSample」を作成します。&lt;br /&gt;次に&lt;a href="http://s2dao.seasar.org/ja/"&gt;ここから&lt;/a&gt;S2Daoのライブラリをダウンロードします。&lt;br /&gt;ダウンロードしたzipファイルを解凍したら、s2dao/libのjarファイルをEclipseにインポートして、パスを通します。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;j2ee.diconファイルの作成&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;DBの種類と接続先を定義するファイルです。&lt;br /&gt;ダウンロードしたS2Daoのファイル群の中に、各DB用のテンプレートファイルがあるので、それを使うと楽できます（s2-dao-examples/src/main/resources）。&lt;br /&gt;今回はPostgreSQLなので、j2ee-postgres.diconを使います。&lt;br /&gt;j2ee-postgres.diconをj2ee.diconにリネームして、URLとDB接続ユーザー・パスワードを設定します。&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;&amp;lt;?xml version="1.0" encoding="Shift_JIS"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"&lt;br /&gt;"http://www.seasar.org/dtd/components.dtd"&amp;gt;&lt;br /&gt;&amp;lt;components namespace="j2ee"&amp;gt;&lt;br /&gt; &amp;lt;component name="transactionManager"&lt;br /&gt;  class="org.seasar.extension.jta.TransactionManagerImpl"/&amp;gt;&lt;br /&gt; &amp;lt;component name="requiredTx"&lt;br /&gt;  class="org.seasar.extension.tx.RequiredInterceptor"/&amp;gt;&lt;br /&gt; &amp;lt;component name="requiresNewTx"&lt;br /&gt;  class="org.seasar.extension.tx.RequiresNewInterceptor"/&amp;gt;&lt;br /&gt; &amp;lt;component name="mandatoryTx"&lt;br /&gt;  class="org.seasar.extension.tx.MandatoryInterceptor"/&amp;gt;&lt;br /&gt; &amp;lt;component name="notSupportedTx"&lt;br /&gt;  class="org.seasar.extension.tx.NotSupportedInterceptor"/&amp;gt;&lt;br /&gt;  &lt;br /&gt; &amp;lt;component class="org.seasar.extension.jdbc.impl.BasicResultSetFactory"/&amp;gt;&lt;br /&gt; &amp;lt;component class="org.seasar.extension.jdbc.impl.BasicStatementFactory"/&amp;gt;&lt;br /&gt; &amp;lt;!--&lt;br /&gt; &amp;lt;component class="org.seasar.extension.jdbc.impl.OracleResultSetFactory"/&amp;gt;&lt;br /&gt; &amp;lt;component class="org.seasar.extension.jdbc.impl.BooleanToIntStatementFactory"/&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!--&lt;br /&gt; &amp;lt;component name="xaDataSource"&lt;br /&gt;  class="org.seasar.extension.dbcp.impl.XADataSourceImpl"&amp;gt;&lt;br /&gt;  &amp;lt;property name="driverClassName"&amp;gt;&lt;br /&gt;   "oracle.jdbc.driver.OracleDriver"&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="URL"&amp;gt;&lt;br /&gt;   "jdbc:oracle:thin:@xxx:1521:xxx"&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="user"&amp;gt;"xxx"&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="password"&amp;gt;"xxx"&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;component name="xaDataSource"&lt;br /&gt;  class="org.seasar.extension.dbcp.impl.XADataSourceImpl"&amp;gt;&lt;br /&gt;  &amp;lt;property name="driverClassName"&amp;gt;&lt;br /&gt;   "org.postgresql.Driver"&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="URL"&amp;gt;&lt;br /&gt;          "jdbc:postgresql://localhost/test" &lt;font color="red"&gt;←URL&lt;/font&gt;&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="user"&amp;gt;"testuser"&amp;lt;/property&amp;gt; &lt;font color="red"&gt;←ユーザー名&lt;/font&gt;&lt;br /&gt;        &amp;lt;property name="password"&amp;gt;"testuser"&amp;lt;/property&amp;gt; &lt;font color="red"&gt;←パスワード&lt;/font&gt;&lt;br /&gt;    &amp;lt;/component&amp;gt;&lt;br /&gt;&lt;br /&gt; &amp;lt;!--&lt;br /&gt; &amp;lt;component name="xaDataSource"&lt;br /&gt;  class="org.seasar.extension.dbcp.impl.XADataSourceImpl"&amp;gt;&lt;br /&gt;  &amp;lt;property name="driverClassName"&amp;gt;&lt;br /&gt;   "net.sourceforge.jtds.jdbc.Driver"&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="URL"&amp;gt;&lt;br /&gt;            "jdbc:jtds:sqlserver://localhost/TEST;instance=SQLEXPRESS"&lt;br /&gt;        &amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="user"&amp;gt;"xxxx"&amp;lt;/property&amp;gt;&lt;br /&gt;        &amp;lt;property name="password"&amp;gt;"xxxx"&amp;lt;/property&amp;gt;&lt;br /&gt;    &amp;lt;/component&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;component name="xaDataSource"&lt;br /&gt;  class="org.seasar.extension.dbcp.impl.XADataSourceImpl"&amp;gt;&lt;br /&gt;  &amp;lt;property name="driverClassName"&amp;gt;&lt;br /&gt;   "org.hsqldb.jdbcDriver"&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="URL"&amp;gt;&lt;br /&gt;   "jdbc:hsqldb:file:" + @org.seasar.framework.util.EclipseUtil@getProjectRoot("s2dao").getAbsolutePath() + "/s2-dao-examples/target/test-classes/data/demo"&lt;br /&gt;  &amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="user"&amp;gt;"sa"&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="password"&amp;gt;""&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;component name="connectionPool"&lt;br /&gt;  class="org.seasar.extension.dbcp.impl.ConnectionPoolImpl"&amp;gt;&lt;br /&gt;  &amp;lt;property name="timeout"&amp;gt;600&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;property name="maxPoolSize"&amp;gt;10&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;!-- JTAトランザクションが開始されていない場合にコネクションを&lt;br /&gt;       取得できないようにするには次のプロパティをfalseにしてください．--&amp;gt;&lt;br /&gt;  &amp;lt;property name="allowLocalTx"&amp;gt;true&amp;lt;/property&amp;gt;&lt;br /&gt;  &amp;lt;destroyMethod name="close"/&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; &amp;lt;component name="dataSource"&lt;br /&gt;  class="org.seasar.extension.dbcp.impl.DataSourceImpl"/&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- WebLogic&lt;br /&gt; &amp;lt;component name="initialContext" class="javax.naming.InitialContext"/&amp;gt;&lt;br /&gt; &amp;lt;component name="transactionManager"&lt;br /&gt;     class="org.seasar.extension.j2ee.JndiTransactionManager"&amp;gt;&lt;br /&gt;     &amp;lt;arg&amp;gt;initialContext&amp;lt;/arg&amp;gt;&lt;br /&gt;     &amp;lt;arg&amp;gt;"javax.transaction.TransactionManager"&amp;lt;/arg&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; &amp;lt;component&lt;br /&gt;     class="org.seasar.extension.j2ee.JndiDataSource"&amp;gt;&lt;br /&gt;     &amp;lt;arg&amp;gt;initialContext&amp;lt;/arg&amp;gt;&lt;br /&gt;     &amp;lt;arg&amp;gt;"jndiName"&amp;lt;/arg&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- WebSphere 4&lt;br /&gt; &amp;lt;component name="initialContext" class="javax.naming.InitialContext"/&amp;gt;&lt;br /&gt; &amp;lt;component name="transactionManager"&lt;br /&gt;  class="org.seasar.extension.j2ee.SingletonTransactionManager"&amp;gt;&lt;br /&gt;  &amp;lt;arg&amp;gt;"com.ibm.ejs.jts.jta.JTSXA"&amp;lt;/arg&amp;gt;&lt;br /&gt;  &amp;lt;arg&amp;gt;"getTransactionManager"&amp;lt;/arg&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; &amp;lt;component&lt;br /&gt;  class="org.seasar.extension.j2ee.JndiDataSource"&amp;gt;&lt;br /&gt;  &amp;lt;arg&amp;gt;initialContext&amp;lt;/arg&amp;gt;&lt;br /&gt;  &amp;lt;arg&amp;gt;"jndiName"&amp;lt;/arg&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- WebSphere 5&lt;br /&gt; &amp;lt;component name="initialContext" class="javax.naming.InitialContext"/&amp;gt;&lt;br /&gt; &amp;lt;component name="transactionManager"&lt;br /&gt;  class="org.seasar.extension.j2ee.SingletonTransactionManager"&amp;gt;&lt;br /&gt;  &amp;lt;arg&amp;gt;"com.ibm.ejs.jts.jta.TransactionManagerFactory"&amp;lt;/arg&amp;gt;&lt;br /&gt;  &amp;lt;arg&amp;gt;"getTransactionManager"&amp;lt;/arg&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; &amp;lt;component&lt;br /&gt;  class="org.seasar.extension.j2ee.JndiDataSource"&amp;gt;&lt;br /&gt;  &amp;lt;arg&amp;gt;initialContext&amp;lt;/arg&amp;gt;&lt;br /&gt;  &amp;lt;arg&amp;gt;"jndiName"&amp;lt;/arg&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- JBoss&lt;br /&gt; &amp;lt;component name="initialContext" class="javax.naming.InitialContext"/&amp;gt;&lt;br /&gt; &amp;lt;component name="transactionManager"&lt;br /&gt;  class="org.seasar.extension.j2ee.JndiTransactionManager"&amp;gt;&lt;br /&gt;  &amp;lt;arg&amp;gt;initialContext&amp;lt;/arg&amp;gt;&lt;br /&gt;  &amp;lt;arg&amp;gt;"java:/TransactionManager"&amp;lt;/arg&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; &amp;lt;component&lt;br /&gt;  class="org.seasar.extension.j2ee.JndiDataSource"&amp;gt;&lt;br /&gt;  &amp;lt;arg&amp;gt;initialContext&amp;lt;/arg&amp;gt;&lt;br /&gt;  &amp;lt;arg&amp;gt;"jndiName"&amp;lt;/arg&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;!-- Oracle10gAS&lt;br /&gt; &amp;lt;component name="initialContext" class="javax.naming.InitialContext"/&amp;gt;&lt;br /&gt; &amp;lt;component name="transactionManager"&lt;br /&gt;     class="org.seasar.extension.j2ee.JndiTransactionManager"&amp;gt;&lt;br /&gt;     &amp;lt;arg&amp;gt;initialContext&amp;lt;/arg&amp;gt;&lt;br /&gt;     &amp;lt;arg&amp;gt;"java:comp/UserTransaction"&amp;lt;/arg&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; &amp;lt;component&lt;br /&gt;     class="org.seasar.extension.j2ee.JndiDataSource"&amp;gt;&lt;br /&gt;     &amp;lt;arg&amp;gt;initialContext&amp;lt;/arg&amp;gt;&lt;br /&gt;     &amp;lt;arg&amp;gt;"jndiName"&amp;lt;/arg&amp;gt;&lt;br /&gt; &amp;lt;/component&amp;gt;&lt;br /&gt; --&amp;gt;&lt;br /&gt;&amp;lt;/components&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;テーブルの作成&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;次のようなテーブルを作成します。&lt;br /&gt;(Sample)&lt;br /&gt;no : integer&lt;br /&gt;name : varchar(128)&lt;br /&gt;age : integer&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;JavaBeans&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sample.java&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;package main;&lt;br /&gt;&lt;br /&gt;import java.io.Serializable;&lt;br /&gt;&lt;br /&gt;public class Sample implements Serializable {&lt;br /&gt; // テーブル名&lt;br /&gt; public static final String TABLE = "sample";&lt;br /&gt; // ID指定&lt;br /&gt; public static final String no_ID = "identity";&lt;br /&gt; // no:integer&lt;br /&gt; public long no;&lt;br /&gt; // name:varchar(128)&lt;br /&gt; public String name;&lt;br /&gt; // age:integer&lt;br /&gt; public long age;&lt;br /&gt;&lt;br /&gt; public long getNo() {&lt;br /&gt;  return no;&lt;br /&gt; }&lt;br /&gt; public void setNo(long no) {&lt;br /&gt;  this.no = no;&lt;br /&gt; }&lt;br /&gt; public String getName() {&lt;br /&gt;  return name;&lt;br /&gt; }&lt;br /&gt; public void setName(String name) {&lt;br /&gt;  this.name = name;&lt;br /&gt; }&lt;br /&gt; public long getAge() {&lt;br /&gt;  return age;&lt;br /&gt; }&lt;br /&gt; public void setAge(long age) {&lt;br /&gt;  this.age = age;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Dao&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SampleDao.java&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;package main;&lt;br /&gt;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;public interface SampleDao {&lt;br /&gt; // テーブルとのマッピング&lt;br /&gt; public static final Class BEAN = Sample.class;&lt;br /&gt; // Sampleレコードの一覧を取得します。&lt;br /&gt; public List&lt;Sample&gt; getAllSamples();&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Daoのdiconファイル&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;SampleDao.dicon&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;&amp;lt;?xml version="1.0" encoding="Shift_JIS"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"&lt;br /&gt;"http://www.seasar.org/dtd/components.dtd"&amp;gt;&lt;br /&gt;&amp;lt;components&amp;gt;&lt;br /&gt;   &amp;lt;include path="dao.dicon"/&amp;gt;&lt;br /&gt;   &amp;lt;component class="main.SampleDao"&amp;gt;&lt;br /&gt;       &amp;lt;aspect&amp;gt;dao.interceptor&amp;lt;/aspect&amp;gt;&lt;br /&gt;   &amp;lt;/component&amp;gt;&lt;br /&gt;&amp;lt;/components&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;SQLファイル&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ファイル名は(クラス名)_(メソッド名).sqlです。&lt;br /&gt;SampleDao_getAllSamples.sql&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;SELECT no,name,age FROM sample&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;mainクラス&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;MyMain.java&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;package main;&lt;br /&gt;&lt;br /&gt;import java.util.List;&lt;br /&gt;&lt;br /&gt;import org.seasar.framework.container.S2Container;&lt;br /&gt;import org.seasar.framework.container.factory.S2ContainerFactory;&lt;br /&gt;&lt;br /&gt;public class MyMain {&lt;br /&gt;&lt;br /&gt; private static final String PATH = "main/SampleDao.dicon";&lt;br /&gt;&lt;br /&gt; public static void main(String[] args) {&lt;br /&gt;  S2Container container = S2ContainerFactory.create(PATH);&lt;br /&gt;  container.init();&lt;br /&gt;  try {&lt;br /&gt;   SampleDao dao = (SampleDao)container.getComponent(SampleDao.class);&lt;br /&gt;   List&amp;lt;Sample&amp;gt; samples = dao.getAllSamples();&lt;br /&gt;   for(int n=0;n&amp;lt;samples.size();n++) {&lt;br /&gt;    System.out.println(samples.get(n).name);&lt;br /&gt;   }&lt;br /&gt;  } catch(Exception e) {&lt;br /&gt;   e.printStackTrace();&lt;br /&gt;  } finally {&lt;br /&gt;   container.destroy();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;あとはビルドして実行！！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-1156001087962759948?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/1156001087962759948/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/06/s2dao.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/1156001087962759948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/1156001087962759948'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/06/s2dao.html' title='S2Daoを使ってみた'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-302908861759106056</id><published>2009-06-16T19:44:00.008+09:00</published><updated>2010-06-25T22:56:42.620+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>JSONICを使ってみた</title><content type='html'>ついに今の現場もあと３日。&lt;br /&gt;３ヶ月はさすがに短い。&lt;br /&gt;その割には濃密な作業内容でした。&lt;br /&gt;来週からはしばらく自社なので、ゆったりした作業がいいなぁ。&lt;br /&gt;&lt;br /&gt;さて、JSONICを使ってみました。&lt;br /&gt;JSONICは、POJOなクラスとJSON文字列を相互変換するためのライブラリです。&lt;br /&gt;JSON形式で通信を行うAjaxのWebアプリケーションであれば使えるかもしれません。&lt;br /&gt;&lt;br /&gt;JSONICは以下からダウンロードできます。&lt;br /&gt;&lt;a href="http://sourceforge.jp/projects/jsonic/"&gt;http://sourceforge.jp/projects/jsonic/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ダウンロードしたファイルを解凍して、jsonic-1.1.0.jarにパスを通せば準備完了です。&lt;br /&gt;次のようなサンプルを試してみました。&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;■User.java&lt;br /&gt;package my.pojo;&lt;br /&gt;&lt;br /&gt;public class User {&lt;br /&gt;// 名前&lt;br /&gt;private String name;&lt;br /&gt;// 年&lt;br /&gt;private int age;&lt;br /&gt;&lt;br /&gt;public String getName() {&lt;br /&gt;return name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setName(String name) {&lt;br /&gt;this.name = name;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public int getAge() {&lt;br /&gt;return age;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setAge(int age) {&lt;br /&gt;this.age = age;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;■PojoSample.java&lt;br /&gt;package my.pojo;&lt;br /&gt;&lt;br /&gt;public class PojoSample {&lt;br /&gt;// ID&lt;br /&gt;private int id;&lt;br /&gt;// ユーザーs&lt;br /&gt;private User[] users;&lt;br /&gt;&lt;br /&gt;public User[] getUsers() {&lt;br /&gt;return users;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setUsers(User[] users) {&lt;br /&gt;this.users = users;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public int getId() {&lt;br /&gt;return id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;public void setId(int id) {&lt;br /&gt;this.id = id;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;■MyMain.java&lt;br /&gt;package my.pojo;&lt;br /&gt;&lt;br /&gt;import net.arnx.jsonic.JSON;&lt;br /&gt;&lt;br /&gt;public class MyMain {&lt;br /&gt;public static void main(String[] args) {&lt;br /&gt;PojoSample pojoObj = new PojoSample();&lt;br /&gt;pojoObj.setId(1);&lt;br /&gt;User[] users = new User[3];&lt;br /&gt;for(int n=0;n&amp;lt;users.length;n++) users[n] = new User();&lt;br /&gt;users[0].setAge(20);&lt;br /&gt;users[0].setName("タロー");&lt;br /&gt;users[1].setAge(20);&lt;br /&gt;users[1].setName("ジロー");&lt;br /&gt;users[2].setAge(21);&lt;br /&gt;users[2].setName("サブロー");&lt;br /&gt;pojoObj.setUsers(users);&lt;br /&gt;String strJson = JSON.encode(pojoObj);&lt;br /&gt;&lt;br /&gt;System.out.println(strJson);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;pre style="background-color:black;color:white;"&gt;&gt;実行結果&lt;br /&gt;{"id":1,"user":[{"age":20,"name":"タロー"},{"age":20,"name":"ジロー"},{"age":21,"name":"サブロー"}]}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-302908861759106056?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/302908861759106056/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/06/jsonic.html#comment-form' title='3 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/302908861759106056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/302908861759106056'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/06/jsonic.html' title='JSONICを使ってみた'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-8413011042463315042</id><published>2009-05-30T11:17:00.004+09:00</published><updated>2009-05-30T11:22:55.602+09:00</updated><title type='text'>CentOS5.3にSambaを導入</title><content type='html'>■Samba導入&lt;br /&gt;&lt;br /&gt;CentOS5.3にSamba3.3.4を入れてみた&lt;br /&gt;（LDAP認証サーバー連携は無し）&lt;br /&gt;&lt;br /&gt;１．ダウンロード&lt;br /&gt;http://wiki.samba.gr.jp/mediawiki/index.php?title=%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8&lt;br /&gt;↑から最新バージョンを取得（2009/5/30時点では3.3.4）&lt;br /&gt;&lt;br /&gt;２．展開&lt;br /&gt;&lt;br /&gt;&gt; tar zxvf samba-3.3.4.tar.gz&lt;br /&gt;&lt;br /&gt;３．RPMファイルの作成&lt;br /&gt;&lt;br /&gt;・SPECファイルを修正（/packaging/RHEL/samba.spec）&lt;br /&gt;Requires: samba = %{version} xinetd&lt;br /&gt;↓&lt;br /&gt;Requires: samba = %{version}&lt;br /&gt;&lt;br /&gt;・rpmファイルを作成&lt;br /&gt;&gt; cd /packaging/RHEL/&lt;br /&gt;&gt; chmod 755 makerpms.sh&lt;br /&gt;&gt; ./makerpms.sh&lt;br /&gt;&gt; cd /usr/src/redhat/SPECS&lt;br /&gt;&gt; cp mv samba.spec /usr/src/samba&lt;br /&gt;&gt; cd ../RPMS/i386&lt;br /&gt;(作成されるrpmファイル)&lt;br /&gt;samba-3.3.4-1.i386.rpm&lt;br /&gt;samba-common-3.3.4-1.i386.rpm&lt;br /&gt;samba-doc-3.3.4-1.i386.rpm&lt;br /&gt;samba-client-3.3.4-1.i386.rpm&lt;br /&gt;samba-swat-3.3.4-1.i386.rpm&lt;br /&gt;&gt; rm *debuginfo*&lt;br /&gt;&gt; mv *.rpm /usr/src/samba&lt;br /&gt;&gt; cd ../../SRPMS&lt;br /&gt;samba-3.3.4-1.src.rpm&lt;br /&gt;&gt; mv *.rpm /usr/src/samba&lt;br /&gt;&lt;br /&gt;４．インストール&lt;br /&gt;&gt; cd /usr/src/samba&lt;br /&gt;&gt; rpm -Uvh samba-common* samba-client* samba-3.3.4-1.i386.rpm&lt;br /&gt;&lt;br /&gt;５．設定&lt;br /&gt;/etc/samba/smb.conf&lt;br /&gt;&lt;br /&gt;個人的にLAN内で使うので、制限はかけません。&lt;br /&gt;security = share&lt;br /&gt;&lt;br /&gt;あとはファイアウォールなんかを設定して完了です。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-8413011042463315042?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/8413011042463315042/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/05/centos53samba.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8413011042463315042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8413011042463315042'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/05/centos53samba.html' title='CentOS5.3にSambaを導入'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-5591610126427388211</id><published>2009-05-03T14:26:00.002+09:00</published><updated>2009-05-03T14:28:05.677+09:00</updated><title type='text'>WSHでCOMを利用　～その２～</title><content type='html'>WSHからIEを開いて、Google検索ページへ行きます。&lt;br /&gt;&lt;br /&gt;---------------------------------------------------------&lt;br /&gt;&lt;span style="font-size:78%;"&gt;call_IE("http://www.google.co.jp")&lt;br /&gt;&lt;br /&gt;Function call_IE(url)&lt;br /&gt;&lt;br /&gt;Dim ie&lt;br /&gt;&lt;br /&gt;Set ie = CreateObject("InternetExplorer.Application")&lt;br /&gt;If Not IsObject(ie) Then&lt;br /&gt;    MsgBox("オブジェクトの生成に失敗しました。")&lt;br /&gt;    Exit Function&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;ie.Navigate2(url)&lt;br /&gt;&lt;br /&gt;Set ie = nothing&lt;br /&gt;&lt;br /&gt;End Function&lt;/span&gt;&lt;br /&gt;---------------------------------------------------------&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-5591610126427388211?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/5591610126427388211/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/05/wshcom_03.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5591610126427388211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/5591610126427388211'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/05/wshcom_03.html' title='WSHでCOMを利用　～その２～'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7079435250629241522.post-8143193951288379007</id><published>2009-05-02T21:59:00.002+09:00</published><updated>2009-05-02T22:09:27.300+09:00</updated><title type='text'>WSHでCOMを利用　～その１～</title><content type='html'>WSHからCOMを利用するサンプルを作ってみました。&lt;br /&gt;Windows Media Playerで音楽ファイルを再生させる例です。&lt;br /&gt;「～.vbs」で保存して、EnterキーでGoです。&lt;br /&gt;&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;span style="font-size:78%;"&gt;play("C:\test.mp3")&lt;br /&gt;&lt;br /&gt;Function play(filename)&lt;br /&gt;Dim wmplayer&lt;br /&gt;&lt;br /&gt;Set wmplayer = CreateObject("WMPlayer.OCX.7")&lt;br /&gt;If Not IsObject(wmplayer) Then&lt;br /&gt;    MsgBox("オブジェクトの作成に失敗しました")&lt;br /&gt;    Exit Function&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;wmplayer.url = filename&lt;br /&gt;&lt;br /&gt;wmplayer.Controls.Play&lt;br /&gt;&lt;br /&gt;Do until (wmplayer.playState = 1)&lt;br /&gt;Wscript.Sleep 200&lt;br /&gt;Loop&lt;br /&gt;&lt;br /&gt;Set wmplayer = nothing&lt;br /&gt;&lt;br /&gt;End Function&lt;/span&gt;&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;なるほど、COMとして作ればVBScriptから呼び出せると。&lt;br /&gt;バイナリレベルのライブラリって謳っているだけあって、&lt;br /&gt;こういう連携が可能になるわけですね。&lt;br /&gt;でも、oleview.exeだけで有効なCOMを探すのは、かなり酷。。。&lt;br /&gt;&lt;br /&gt;次は、自分で作ってみたCOMを呼び出してみよーっと。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7079435250629241522-8143193951288379007?l=sham-memo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sham-memo.blogspot.com/feeds/8143193951288379007/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://sham-memo.blogspot.com/2009/05/wshcom.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8143193951288379007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7079435250629241522/posts/default/8143193951288379007'/><link rel='alternate' type='text/html' href='http://sham-memo.blogspot.com/2009/05/wshcom.html' title='WSHでCOMを利用　～その１～'/><author><name>sham</name><uri>http://www.blogger.com/profile/14676953682645515980</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_clRJ8KPAYVc/ScZhgE0N4EI/AAAAAAAAAAM/6qzP_1fPSJk/S220/sham.gif'/></author><thr:total>0</thr:total></entry></feed>
