Home > Archives > 2008-11

2008-11

Mind Map: マンキュー入門経済学 - 第1章 経済学の十大原理

最近マンキュー入門経済学を読み始めましたので復習を兼ねてMindMapを作成してみました。以下のイメージをクリックすると拡大表示します。
Mankiw_Principles_of_Economics_1_Ten_Principles_of_Economics.gif
章末の復習問題は後日追記したいと思います(気長に)。

ActionScript: 画像ファイルをダウンロードして表示 - Loaderクラス

サーバ上にあるイメージファイルをダウンロードして表示するサンプル。Loaderクラスで画像など(SWF, JPEG, GIF, PNG)をダウンロードし、そのプロセス中に送出するイベントはLoaderInfoクラスが管理。

ソースコード

package info.yukun
{
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.IOErrorEvent;
	import flash.net.URLRequest;

	/**
	 * 外部画像のロードサンプル
	 */
	public class LoadImage extends Sprite {
		private var imageURL:String =
			"http://www.google.co.jp/intl/ja/images/about_logo.gif";
		private var imageLoader:Loader;

		public function LoadImage():void {
			init();
		}

		private function init(e:Event = null):void {
			imageLoader = new Loader();
			var imageURLreq:URLRequest = new URLRequest(imageURL);
			var imgInfo:LoaderInfo = imageLoader.contentLoaderInfo;
			imgInfo.addEventListener(Event.INIT, onInit);
			imgInfo.addEventListener(IOErrorEvent.IO_ERROR, onIOerror);
			addChild(imageLoader);
			imageLoader.load(imageURLreq);
		}

		// ダウンロード完了
		private function onInit(e:Event):void {
			trace("Can access the loaded object.");
		}

		// IOエラーによりダウンロード失敗
		private function onIOerror(e:IOErrorEvent):void {
			trace("IO Error.");
		}
	}
}

リファレンス

MySQL: 同じ値のフィールドをグルーピング - GROUP BY句

前回はソートした検索結果を出力しましたね。今回は、フィールドの値が同じレコードをグルーピングし、そのレコード集の任意のカラムに対してAVG(),MIN(),MAX(),COUNT(),SUM()...などの関数計算を適応してみます。使用するレコードは以下のものを用います。

mysql> SELECT * FROM product_list
    -> ORDER BY date, name;
+----+-----------+----------+------------+
| id | name      | quantity | date       |
+----+-----------+----------+------------+
| 10 | chocolate | 18       | 2009-11-17 |
|  7 | cake      | 35       | 2009-11-18 |
|  6 | candy     | 28       | 2009-11-18 |
|  3 | chocolate | 40       | 2009-11-18 |
|  8 | parfait   | 18       | 2009-11-18 |
|  4 | cake      | 29       | 2009-11-19 |
|  2 | candy     | 32       | 2009-11-19 |
|  1 | chocolate | 16       | 2009-11-19 |
|  5 | parfait   | 29       | 2009-11-19 |
|  9 | eclair    | 56       | 2009-11-20 |
+----+-----------+----------+------------+

背景状況はとあるお菓子工場の11/17~20までの出荷製品とその個数の記録、とでもしておきましょう。さて、このレコード集から「4日間で一番出荷されたお菓子」を判別するクエリは以下のようになります。

mysql> SELECT name, SUM(quantity)
    -> FROM product_list
    -> GROUP BY name
    -> ORDER BY SUM(quantity) DESC;
+-----------+---------------+
| name      | SUM(quantity) |
+-----------+---------------+
| chocolate |            74 |
| cake      |            64 |
| candy     |            60 |
| eclair    |            56 |
| parfait   |            47 |
+-----------+---------------+

<SELECT文の前半(FROM, WHERE句など)>
GROUP BY <列名>

まず、結果の列名がSUM(quantity)になっていることに注目してください。GROUP BY句によりnameフィールドが同じ値のレコードを集計します。例えばnameフィールドがcakeのレコードはidが7と4です。その二つのレコードは一つのグループとみなされます(同じ値なので)。そのグループ(レコード集)に対してSUM()関数を適応しています。SUM()は合計を返しますので、35+29=64と上の出力結果になります。他のフィールド値に対しても同様の計算を行うことで、「4日間で一番出荷されたお菓子」はchocolateと分かります(最後にLIMIT 1を付けてもいいです)。

同様に「1日あたりの平均出荷量が最高のお菓子」を求めるクエリは下のようになります。

mysql> SELECT name, ROUND(AVG(quantity),0)
    -> FROM product_list
    -> GROUP BY name
    -> ORDER BY AVG(quantity) DESC;
+-----------+------------------------+
| name      | ROUND(AVG(quantity),0) |
+-----------+------------------------+
| eclair    |                     56 |
| cake      |                     32 |
| candy     |                     30 |
| chocolate |                     25 |
| parfait   |                     23 |
+-----------+------------------------+

ROUND()関数は小数点の切捨てに使っています。
もしGROUP BY句を用いずに上述の関数(AVG,SUM)を用いると以下のようなエラーが出ます。

mysql> SELECT name, ROUND(AVG(quantity),0)
    -> FROM product_list;
ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...)
with no GROUP columns is illegal if there is no GROUP BY clause

グループカラム(=同値のフィールドのレコード集)を渡さなければいけませんので、1つのカラムを渡しても意味無い、という解釈でいいのかな。
ちなみに、COUNT()関数は引数に列(カラム)名を取り、その行(レコード)数を返します

mysql> SELECT COUNT(name)
    -> FROM product_list;
+-------------+
| count(name) |
+-------------+
|          10 |
+-------------+

この場合はGROUP BY句も必要ありません。
今記事では取り上げませんでしたがMIN(),MAX()はそれぞれ最小、最大値を返します(文字どおりですね)。

リファレンス

MySQL: レコードを昇順・降順にソートして出力 - ORDER BY句

前回はUPDATE文とDELETE文を扱いました。今回は下記のレコードを含むテーブルに対して、SELECT文のORDER BY句を用いて任意のレコードをソートして出力する例を示します。

mysql> SELECT * FROM book_list_auto;
+----+------------------------------------+---------+-------+------------+
| id | title                              | author  | price | date       |
+----+------------------------------------+---------+-------+------------+
|  1 | eu,                                | Brody   | 2330  | 2004-06-09 |
|  2 | rutrum. Fusce dolor quam,          | James   | 2150  | 2006-02-25 |
|  3 | ultrices sit amet, risus.          | Wang    | 2495  | 2009-11-12 |
|  4 | placerat, augue. Sed molestie.     | Lev     | 2752  | 2005-05-02 |
|  5 | Proin mi.                          | Dante   | 1155  | 2004-07-23 |
|  6 | sed,                               | Porter  | 4566  | 2006-05-14 |
|  7 | onec sollicitudin adipiscing       | Sader   | 2503  | 2004-04-28 |
|  8 | tortor. Integer aliquam adipiscing | Desiree | 2810  | 2002-08-24 |
|  9 | Mauris eu                          | Maggy   | 3843  | 2001-04-21 |
| 10 | eget metus. In nec orci.           | Rhea    | 4820  | 2002-11-05 |
+----+------------------------------------+---------+-------+------------+

ランダムに生成した10レコード(ブックリスト)を使います。

まず、値段の安い順、すなわちpriceフィールドを昇順で出力するSQL文は下のようになります。

mysql> SELECT title, price
    -> FROM book_list_auto
    -> ORDER BY price;
+------------------------------------+-------+
| title                              | price |
+------------------------------------+-------+
| Proin mi.                          | 1155  |
| rutrum. Fusce dolor quam,          | 2150  |
| eu,                                | 2330  |
| ultrices sit amet, risus.          | 2495  |
| onec sollicitudin adipiscing       | 2503  |
| placerat, augue. Sed molestie.     | 2752  |
| tortor. Integer aliquam adipiscing | 2810  |
| Mauris eu                          | 3843  |
| sed,                               | 4566  |
| eget metus. In nec orci.           | 4820  |
+------------------------------------+-------+

<SELECT文の前半(FROM, WHERE句など)>
ORDER BY <列名1> [, <列名2>, ...]

ORDER BYの後ろにフィールド名を指定することで、そのフィールド基準にソートしたレコードを返します。デフォルトでは昇順(ascending)ソートでそれを明示的に示す場合は、ASCキーワードをフィールド名の後ろに付け足します。上の例では、最終行をORDER BY price ASC;しても結果は同じです。

対して、あるフィールドを降順(descending)にソートする場合はフィールド名の後ろにDESCキーワードを付け足します。以下の例で確認してみましょう。

mysql> SELECT title, price
    -> FROM book_list_auto
    -> ORDER BY price DESC
    -> LIMIT 3;
+--------------------------+-------+
| title                    | price |
+--------------------------+-------+
| eget metus. In nec orci. | 4820  |
| sed,                     | 4566  |
| Mauris eu                | 3843  |
+--------------------------+-------+

確かに、降順、ここで例では値段の高い順にソートされていますね。

LIMIT句で表示行数を指定

さて、ここで使われているLIMIT句は出力する行数を指定することが出来ます。上の例では

LIMIT <表示行数>

より3行(値段の高い本ベスト3)を表示しています。LIMIT句には他にも、

LIMIT <表示開始インデックス>,<表示行数>

という書き方があり、以下のSQL文は上と同じ結果を出力します。ちなみにインデックスは0から数え始めます。

mysql> SELECT title, price
    -> FROM book_list_auto
    -> ORDER BY price DESC
    -> LIMIT 0, 3;

最後に、ORDER BY句では複数のフィールドを指定できますが、その際のソートの適応順序は指定した順(書いた順)になります。次の例で確認してみましょう。

mysql> SELECT title, author, date
    -> FROM book_list_auto
    -> ORDER BY date DESC, author ASC
    -> LIMIT 5;
+--------------------------------+--------+------------+
| title                          | author | date       |
+--------------------------------+--------+------------+
| ultrices sit amet, risus.      | Wang   | 2009-11-12 |
| sed,                           | Porter | 2006-05-14 |
| rutrum. Fusce dolor quam,      | James  | 2006-02-25 |
| placerat, augue. Sed molestie. | Lev    | 2005-05-02 |
| Proin mi.                      | Dante  | 2004-07-23 |
+--------------------------------+--------+------------+

上の例では、dateフィールドでソートして、その中で同じ値があった場合はauthorをソートして順序を決めています。うーん、このレコード集ではちょっと分かり難いですね。

リファレンス

サイトメンテナンスのお知らせ - 日→英翻訳スクリプト

↓使用時の図
JavaScriptでホップアップ翻訳
先日JavaScriptを学び始めてみたので、手始めにこのブログに翻訳スクリプトを付けてました。この機能は単一記事ページ上でテキストをドラッグするとマウスの近くに英訳が表示されます。まぁ自動翻訳の性能は・・・f^^;一応スクリプトのロードを計測したら、たいして時間と負荷がかからないようなのでしばらく様子みて、また私の学習度合いに合わせてUIを改良してみます。設置の動機は最近なぜか海外からのアクセスが増えてきているみたいなので。

追記: Google Chromeでは使えないみたいです。原因究明中です。
追記2: 使ってみて案外煩わしいので一時取り外します>_<

Page 1 of 3123

Home > Archives > 2008-11

バックナンバー
最近のコメント
最近のトラックバック
メタ情報

Return to page top