My Photo

« October 2012 | Main | December 2012 »

November 25, 2012

ウィンドウ関数 ROW_NUMBER()

SQLで相関サブクエリや自己結合を使ったSQL文を、ウィンドウ関数のROW_NUMBER()で書き直すことができる。
一般的にはROW_NUMBER()を使ったほうがパフォーマンスが良いそうだ。

sales、customers、productsの3つのテーブルがあって、customersの顧客毎に最新の販売を取得する例を考える。
各テーブルのデータは以下のようになっている。

sales
saleID quqntity customerID productID date
1311 2012-10-01
2132 2012-10-02
3212 2012-10-02
4211 2012-10-05
5232 2012-10-10
customers
customerID customerName
1Suzuki
2Tanaka
3Yamashita
products
productID productName price
1AAA100
2BBB200

customersの顧客毎に最新の販売を取得するSQLを自己結合、相関サブクエリで書くとそれぞれ以下のようになる。

SELECT c.customerName, s.date, p.productName,
       p.price, s.quantity
FROM customers c
LEFT OUTER JOIN (
 SELECT * FROM sales
 JOIN (
   SELECT MAX(saleID) AS maxID FROM sales 
   GROUP BY customerID) max
 ON sales.saleID = max.maxID
) s
  ON c.customerID = s.customerID
LEFT OUTER JOIN products p
  ON s.productID = p.productID
ORDER BY c.customerID;
SELECT c.customerName, s.date, p.productName,
       p.price, s.quantity 
FROM customers c
LEFT OUTER JOIN (
 SELECT * FROM sales
 WHERE sales.saleID
       = (SELECT MAX(saleID) FROM sales ss
          WHERE sales.customerID = ss.customerID)
) s
  ON c.customerID = s.customerID
LEFT OUTER JOIN products p
  ON s.productID = p.productID
ORDER BY c.customerID;

ROW_NUMBER()を使うとこうなる。自己結合、相関サブクエリは使っていない。

SELECT c.customerName, s.date, p.productName,
       p.price, s.quantity, s.maxID
FROM customers c
LEFT OUTER JOIN (
 SELECT *,
        ROW_NUMBER() OVER
          (PARTITION BY customerID
           ORDER BY saleID DESC) AS maxID
 FROM sales
) s
  ON c.customerID = s.customerID
     AND s.maxID = 1
LEFT OUTER JOIN products p
  ON s.productID = p.productID
ORDER BY c.customerID;

実行結果は以下。

 customername |        date         | productname | price | quantity | maxid
--------------+---------------------+-------------+-------+----------+-------
 Suzuki       | 2012-10-05 00:00:00 | AAA         |   100 |        2 |     1
 Tanaka       |                     |             |       |          |
 Yamashita    | 2012-10-10 00:00:00 | BBB         |   200 |        2 |     1

自分は仕事で、当初 ・テーブルAとBがあってAとBの各レコードは1対1に対応する。 と思っていたが、実は ・Aの1レコードに対してBが2レコード存在する場合がある。 ということがわかり、Aとそれに対応するBのうち最新のものを結合してもってこなければならないという場合にROW_NUMBER()を使ってうまいこと行った。

参考文献:WEB+DB PRESS Vol.62 SQL緊急救命室 第1回

PostgreSQLのコマンドラインクライアントpsql

接続時のオプションや主なコマンドのメモ

psql [-h <ホスト名またはIPアドレス>] -U <ユーザ名> <DB名>DBに接続する

「-U <ユーザ名>」を省略するとOSのユーザ名で接続しに行くので、OSユーザ名とPostgreSQLのユーザ名が同じなら省略できるかも。確認していないが。
「-h <ホスト名またはIPアドレス>」はサーバを指定する。
接続のために必要なオプションに加えて以下のオプションで色々とできる。

-l DB一覧を表示
-c <SQL> SQLを実行
-e -f <SQLファイル> SQLファイルに書かれたSQLを実行
-e -f <SQLファイル> -o <出力ファイル> SQLファイルに書かれたSQLを実行し、実行結果を出力ファイルに出力

主なコマンド

\d [<テーブル名>] テーブルの情報の表示。引数無しの場合は全テーブルが対象。
\z 全テーブルのアクセス権を表示
\i <SQLファイル> SQLファイルに書かれたSQLを実行
\h [<SQLコマンド>] SQLコマンドのヘルプ
\? psqlコマンドのヘルプ
\q psqlを終了する
\pset pager ページャのON/OFF。OFFの場合、一画面毎に停止せず、画面端の折り返しもしない。

2014/07/20追記
文字化けする場合、下記でpsqlの文字コードを設定すると文字化けしなくなるかも。

set client_encoding to '<文字コード>';

文字コードの部分は "SJIS" とか。

参考ページ:
psql PostgreSQL 8.4.4文書
PostgreSQLの覚え書き

November 18, 2012

Androidアプリ開発メモ068:Tweenアニメーション

Viewに対して回転やサイズ変更などをすることでアニメーションを作成する。
下記のクラスを利用できるが、クラスを直接利用するのではなくXMLでリソースファイルとして定義してプログラムに読み込んで利用することがほとんど。

クラス説明XML要素
AlphaAnimationアルファ値変更<alpha>
RotateAnimation回転<rotate>
ScaleAnimation拡大・縮小<scale>
TranslateAnimation移動・変形<translate>

上表のクラスは android.view.animation.Animationクラスを継承している。

アニメーションの定義の例。下記の定義はだんだん濃くなりながら回転していくアニメーションである。
ファイル名は制限はない。例えば tween.xml とかにしておく。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:interpolator="@android:anim/accelerate_interpolator">
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0" 
           android:duration="3000" />
    <rotate android:fromDegrees="0" android:toDegrees="360"
            android:pivotX="50%" android:pivotY="50%"
            android:duration="3000" />
</set></pre>

android:interpolator属性はアニメーションの変化の割合を指定する。値は下表参照。

属性説明
@android:anim/accelerate_interpolator動きがだんだん速くなる
@android:anim/accelerate_decelerate_interpolator動きがだんだん遅くなる

属性にはalpha、rotate、scale、translateの各要素に固有のものと、共通のものがある。それぞれの意味は参考ページを参照。

下記は1秒で縦に縮んで、2秒で元に戻るアニメーションの例。
android:startOffset属性を使って、前半のscale要素で定義した動きが終わってから後半のscale要素で定義した動きが始まるように、後半のscale要素にはandroid:startOffset属性を持たせてある。

<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:interpolator="@android:anim/accelerate_interpolator"
     android:shareInterpolator="false"
     android:fillAfter="true" >
    <scale android:fromXScale="1.0" android:toXScale="1.0"
           android:fromYScale="1.0" android:toYScale="0.5"
           android:pivotX="50%" android:pivotY="50%"
           android:duration="1000" />
    <set android:interpolator="@android:anim/accelerate_interpolator">
        <scale android:fromXScale="1.0" android:toXScale="1.0"
               android:fromYScale="1.0" android:toYScale="2.0"
               android:pivotX="50%" android:pivotY="50%"
               android:startOffset="1000" android:duration="2000" />
    </set>
</set>

上記の例で注意点が2つ。
まず、アニーメーションが終わった後そのままの状態を保つためにandroid:fillAfter属性をtrueとしているが、この属性はscale要素など個々の動きを定義する要素に設定しても効かない。Tweenアニメーションの定義のトップレベルのset要素に設定しないと意味がないようだ。
また、後半のscale要素のY軸方向の値は1.0~2.0としている。縮めた物体を元に戻すなら0.5~1.0のような気がするが、それでは思ったようなアニメーションにはならない。
scale要素のandroid:fromXScale属性などの値はそこで定義されたアニメーションが始まる時点の大きさが基準となるからである。
0.5~1.0では前半の動きで既に大きさの0.5倍になっているところからさらに0.5倍(元の大きさの0.25倍)からはじまって、1倍(0.5×1.0で元の0.5倍)の大きさで終わってしまう。1.0~2.0なら元の大きさの0.5倍(0.5×1.0)から始まって、元の大きさ(0.5×2.0)となる。

tweenアニメーションのリソースファイルを読み込んで実行する onCreate() の例。

public void onCreate(Bundle savedInstanceState) {
	super.onCreate(savedInstanceState);
	setContentView(R.layout.main);
	ImageView img = (ImageView)findViewById(R.id.test_image);
	Animation animation = AnimationUtils.loadAnimation(this, R.anim.tween);
	img.startAnimation(animation);
}

参考文献:Androidアプリケーション開発標準資格教科書 10-5 NDKの概要

参考ページ:
7.5.1 アニメーションリソース - ソフトウェア技術ドキュメントを勝手に翻訳
Viewにアニメーションを付与する(Tweenアニメーション) << Tech Booster
Androidアプリのアニメーションリソースの使い方、定義方法 | mucchinのAndroid戦記

Android SDK tools, Revision 21 に更新

Android SDK が更新されたというので SDK Manager を起動してみた。
しかし新しいパッケージはAndroid4.2(API 17)の下に「Google APIs」しか表示されない。あれ?
API 17 のSDK Platform なしに Google API だけをインストールできるはずもなく。SDK Manager を再起動してみたが変わらず。
しばらくして、メニューの Packages に reload っていうのがあるのに気付いて実行したら、無事に SDK Platform やらドキュメントやら他の項目も出てきた。
#気付くのが遅い^^;

Android4.2(API 17)をインストール、更新された項目をアップデートし、Eclipse のADTも更新。
Eclipseを再起動する。
で、メニューの「Android Virtual Device Manager」をクリックしたが、AVDは起動しない。
Eclipse からではなく単独でなら起動する。あら?
Eclipse で適当なプロジェクトを実行してみたらエラー発生。エラーのダイアログには「内部エラーが発生しました。 /com/android/sdklib/ISdkLog」とか出ている。
さっそくgoogleさんに聞いてみると
「eclipse -clean すればいい」
と。
基本ですね^^;

しかし、まだすんなりとは行かない。
コマンドプロンプトを管理者権限で起動し、「start eclipse.exe -clean」とやってみたら、eclipseの画面は出てきたが「応答なし」orz
タスクマネージャでeclipseを殺してもう1回やってみたが、やはり「応答なし」になる。
-cleanオプションを付けずに、普段どおりにショートカットから起動したら立ち上がったが、AVDが起動しない状態はかわらない。うーん。。。

管理者権限がいけないのかと思い、普通にコマンドプロンプトから「eclipse.exe -clean」とやったら今度はちゃんと起動した。
念のため1回終了して、ショートカットからEclipseを起動しなおしたらEclipseからAVDが起動するようになった。プロジェクトの実行もできた。

ふーっ。時間かかった。
まあ、自分がボケていただけだが、毎度、すんなりいきませんなあ。


参考ページ:スマートラボラトリー開発記録

November 11, 2012

10月開始アニメ視聴状況

当初、見るつもりだったのは
「ヨルムンガンド PERFECT ORDER」
「新世界より」
「ひだまりスケッチ ハニカム」
の3つ。
あと、見ようかどうか迷っていたのは
「ROBOTICS;NOTES」
「リトルバスターズ!」
「ジョジョの奇妙な冒険」
の3つ。


前者の3つは予定通り録画して見始めたが、「新世界より」は先週で視聴を中止。
作画が崩壊した回があって、そこで続きを見る気がグッと減った。続きを見たいと思わせるような話でもなかったし。
貴志祐介の原作がつまらないはずはないと思う。「黒い家」は面白かったし、「悪の教典」は映画も面白そうだ。
アニメの監督や脚本家がまずかったのか、あるいはそもそもアニメの原作に向いた作品ではなかったのか。
アニメは見ないけど、原作は今年の年末年始の休みにでも読んでみようと思う。
ヨルムンとひだまりは視聴中。期待通りに面白い^^


見るかどうか迷っていた3作品はいずれも見ていない。
「リトルバスターズ」と「ジョジョ」はなんとなく見送り。
「ROBOTICS;NOTES」は地上波の放送を見逃したのでBSフジで見ようと思っていたが、こちらのアニメ感想ブログを読んで、ヒロインが嫌いなタイプだなーと思って結局見るのをやめた。


あと、予定してなかったけど見ているのは以前の記事に書いた「ゴクジョ」と「ライチDE光クラブ」。
他に「みなみけ」(再放送)と「さくら荘のペットな彼女」を録画だけしている。
「みなみけ」はたしか3期とか4期とかやっている。そんなに人気の作品なら一度見てみようかなと。
「さくら荘のペットな彼女」は作品の内容自体はよくわからないがw、END歌が鈴木このみなので。「黄昏乙女アムネジア」のOP歌は良かった。

こんな感じです。

November 04, 2012

城ヶ島で釣り、というよりウロウロしただけ

11月になって急に寒くなったような気がするが、それでも釣りには行く。

この日は現地につくまで色々と失敗した。
最初、城ヶ島ではなく三浦半島の相模湾側にいくつもりだった。出発が遅くなったので少しでも近くでやろうと。
電車に乗っている間に北西の風が吹いているて海からの向かい風でやりにくいかなと思い、三崎の変更。
#堀ノ内で三崎にするか立石にするか迷い、一端電車降りたり、時間の無駄遣い^^;
三崎に着いたらバスも混んでいたし道も混んでいた。祝日だからか。普段の土曜日と変わらないかと思ったが、やはり祝日だと違うのか。時間も前回より遅かったし。
やはり釣りは朝早くにでないといろいろ無駄が多いと思った。

城ヶ島の灘ヶ崎に12時過ぎに到着。釣り場は先端の方は相変わらずの混雑だが、すこし手間の方は入る余地があった。来る前に買っておいたコッペパンで腹ごしらえをして、三崎港側に向いてエギを投げ始めた。
北西の風のことを考えてたはずなのに北を向いて釣りをするバカ。
この日は午前中は曇りがちで午後はだんだんと天気は良くなっていったがお昼ごろはまだ曇っている時間の方が長くて、陽が出ていないと寒い。太陽がが出てきても陽が当たる背中側はとても暖かくて風が当たる正面側は寒いまま。
この日の服装は下は綿パンツ、上は長袖シャツにデニムジャケット、あとマフラーを巻いていた。荷物を持って移動しているときはいいが、竿を出してじっとしていると寒くなってくる。
これからの季節、 きちんと防寒していかないといけないな。

灘ヶ崎にいる間、ちっちゃい魚。シラスよりは大きいけどサビキで釣れるイワシよりはちいさい、ちょっと青・緑がかった小魚がいっぱいいた。
時々、大きな魚に追われているのか水面がザワザワいう、ボイルって言うのかな?現象が見られた。イカやシーバスがいるんだろうか。
でも全然つれず、エギとメタルジグを投げたが全く反応がなかった。

ボイルがあってからエギをやめてメタルジグに変えたが、やはり反応なし。
メタルジグだとすごい根掛かり、というか水中に根掛かりして放置された?糸や仕掛けが引っかかってすごい釣りづらかった。
あと、すぐ隣に浮き釣りの親子連れが来て釣りづらくなったので13時過ぎに撤収。
周りも釣れてないし、ほとんど釣りしてねえじゃんw
灘ヶ崎は先端の方じゃないと釣りづらい。でも先端で場所を取るには相当早起きが必要だし、混んでいるのでお祭りにならないように正確なキャストが必要。
へたくそな自分は当分ここには来ないなと思った。


灘ヶ崎を出て城ヶ島ホテル方面の磯に移動。
あまり竿を出す気がなかったので歩いて状況を見てまわった。
こちらは前回行ったときより断然人が多い。コマセをまいている人がほとんど。ウキフカセ釣りというやつか。
南向きなので灘ヶ崎より風は弱くて釣りやすそうだった。
Miurahantou20121103_01_2


次に今まで行ったことないところに行ってみようと思い、観音山の方へ行くことにした。バスを乗り換えるために椿の御所で途中下車。
乗り継ぐバスまで30分以上時間があったので、通り矢の方までブラブラ。椿の御所から通り矢は全然歩ける距離だった。
城ヶ島大橋の下あたりや通り矢にもかなり釣り人が多い。特に通り矢はかなり込み合っていた。
3年前か5年前か、一度行ったことがあったが、その時と比べるとすごい人が増えている。ネットや本で紹介されて人気スポットになったのかな。
まあまあ、ちょこちょこつれいてるようだった。城ヶ島大橋の下付近でカエルアンコウという見た目がキモカワイイw魚を釣りあげてる人がいた。
Miurahantou20121103_02_3
Miurahantou20121103_03_2


少し遅れて着いた三浦海岸行きのバスに乗りこみ、宮川町で降りた。
宮川港までは坂を降りて行く。港には有料の駐車場があって、車がある人には便利そう。
港自体は小さく釣り人はさほど多くなかった。
港の左側を通って観音山方面へ移動。
案内板があってハイキングコースみたいな楽な道かと思ったら、さにあらず。途中、下がグチャグチャのところや、潮が満ちすると水没するところがあった。水没してたらスニーカーではきつい。距離も結構あり、汗をかいた。
観音山の下に着いたら既に日没まで1時間を切っていた。マリーナができてから釣果が落ちたという話もネットで見たような気がする。釣り人はそれなりにいる。城ヶ島ホテルの方と同じようにだいたいコマセをまいている人が多かった。
とりあえずアオイソメを付けてブッコミ釣り。1投目でいきなり根掛かり。その後も1回根掛かり。なるべく根掛かりしないように中通し錘、1本針にしたのだがやはり浮き釣りじゃないとだめか^^;
オハグロベラが1匹だけ釣れた。またこいつだ。別の魚が釣れて欲しいw

4時過ぎ、日没が近づいてきたので竿を収めた。
最後に城ヶ島に沈む夕日の写真を1枚。
これが今日最大の成果ww
Miurahantou20121103_04_2
Miurahantou20121103_05_3


港に戻ってきたのが16:40頃。三崎港に行くバスは行ってしまった。次にくる三浦海岸行きまで50分orz
三崎港や城ヶ崎に通っていて忘れていたが、観光地を通らない普通の地方のバス路線は1時間に1本とか、それ以下なんだな。まいった。
バスに乗れたころにはあたりは真っ暗。しばらく外の景色は街灯以外何も見えなかった。東京湾側に出ると夜景がきれいだった。

今回は行き当たりばったり、釣りをしたというよりうろうろしてる時間がほとんどだった。
次はちゃんと計画を立てて、ブレずに釣りをしようw

来週は用事があるので次に行くなら再来週。さて、どうしようか。今回行かなかった立石とか秋谷港、あるいは今回行った宮川港・観音山に近い毘沙門湾、行きたいこところは尽きない。

« October 2012 | Main | December 2012 »

April 2017
Sun Mon Tue Wed Thu Fri Sat
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof