検索メタ
検索メタ
http://www.saisin.to/top-kensaku.htm
というのが便利らしい。
検索キーワードをいくつかあらかじめ登録しておくことができる。
普段使っている検索スタートページは、
検索デスク
http://www.searchdesk.com/
だ。
これはこれで便利なのだ。
階層化されたデータをMySQLで扱う
http://www.mysql.gr.jp/mysqlml/mysql/msg/12071
うむ、これはメモっとく必要がある。
http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
(図はこのサイトを参照のこと)
Mike Hillyer著
初めに
多くのユーザーは一回くらいはSQLデータベース内で、階層化したデータを
扱ったことがあると思います。そのときはリレーショナル
データベースは階層化したデータ用に開発されなかったと考えたと思います。
リレーショナルデータベースのテーブルは階層化されておらず(XMLの
ように)単に平たいリストです。階層化されたデータは親と子供の
関係を持っており、リレーショナル データベース
のテーブルでは自然に表すことができません。
ここでは、階層化されたデータとはそれぞれが1つの
親をを持ちゼロかそれ以上の子供を持つデータの
集まりをさします。(例外はルートで親がありません。)
階層化されたデータは種種のデータベースのアプリで
見かけることができます。例えば、フォーラムや
メールリストのスレッド、組織表、コンテンツ管理のカテゴリ、
や製品カテゴリなどです。ここでは、仮想の電機機器店
からの製品階層を使用します。
こういったカテゴリは他の例で引かれているのと
同様な階層を形成します。この記事ではMySQLで扱う
階層化されたデータの2つのモデルを検証します。まづは
前からあるadjacency listモデルから始めます。
Adjacency List モデル
上での例のカテゴリは以下のテーブルに格納されます。 (フォローし易い
ようにCREATEとINSERTの完全なステートメントを書き出します。)
CREATE TABLE category(
category_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
parent INT DEFAULT NULL);
INSERT INTO category
VALUES(1,'ELECTRONICS',NULL),(2,'TELEVISIONS',1),(3,'TUBE',2),
(4,'LCD',2),(5,'PLASMA',2),(6,'PORTABLE ELECTRONICS',1),
(7,'MP3 PLAYERS',6),(8,'FLASH',7),
(9,'CD PLAYERS',6),(10,'2 WAY RADIOS',6);
SELECT * FROM category ORDER BY category_id;
+-------------+----------------------+--------+
| category_id | name | parent |
+-------------+----------------------+--------+
| 1 | ELECTRONICS | NULL |
| 2 | TELEVISIONS | 1 |
| 3 | TUBE | 2 |
| 4 | LCD | 2 |
| 5 | PLASMA | 2 |
| 6 | PORTABLE ELECTRONICS | 1 |
| 7 | MP3 PLAYERS | 6 |
| 8 | FLASH | 7 |
| 9 | CD PLAYERS | 6 |
| 10 | 2 WAY RADIOS | 6 |
+-------------+----------------------+--------+
10 rows in set (0.00 sec)
adjacency list モデルではテーブルそれぞれのアイテム
は親へのポインターを持っています。一番上の要素のポインター
は何もさしていません。adjacency list モデルの利点は簡単な
ことです。FLASH がmp3 playersの子供であることは一目
瞭然です。そしてさらに、mp3 playersがportable
electronicsの子供で、それがelectronicsの子供であることも。
adjacency list モデルはクライアント側のコードで
容易に扱うことができます。しかし、完全なSQLで扱う
には問題になります。
完全なツリーを取り出す
最初に一番良くすることは全体のツリーを字下げを
することで表示することです。一番良く使う方法は
完全なSQLでself-joinを使用して行うことです。
SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3,
t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ELECTRONICS';
+-------------+----------------------+--------------+-------+
| lev1 | lev2 | lev3 | lev4 |
+-------------+----------------------+--------------+-------+
| ELECTRONICS | TELEVISIONS | TUBE | NULL |
| ELECTRONICS | TELEVISIONS | LCD | NULL |
| ELECTRONICS | TELEVISIONS | PLASMA | NULL |
| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS | FLASH |
| ELECTRONICS | PORTABLE ELECTRONICS | CD PLAYERS | NULL |
| ELECTRONICS | PORTABLE ELECTRONICS | 2 WAY RADIOS | NULL |
+-------------+----------------------+--------------+-------+
6 rows in set (0.00 sec)
全てのリーフノードを発見する
全てのリーフノードをLEFT JOIN クエリを
使って全て見つけることができます。
SELECT t1.name FROM
category AS t1 LEFT JOIN category as t2
ON t1.category_id = t2.parent
WHERE t2.category_id IS NULL;
+--------------+
| name |
+--------------+
| TUBE |
| LCD |
| PLASMA |
| FLASH |
| CD PLAYERS |
| 2 WAY RADIOS |
+--------------+
シングル・パスを見つける
self-joinを使えば階層から完全なパスを見つけられます
SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
WHERE t1.name = 'ELECTRONICS' AND t4.name = 'FLASH';
+-------------+----------------------+-------------+-------+
| lev1 | lev2 | lev3 | lev4 |
+-------------+----------------------+-------------+-------+
| ELECTRONICS | PORTABLE ELECTRONICS | MP3 PLAYERS | FLASH |
+-------------+----------------------+-------------+-------+
1 row in set (0.01 sec)
このアプローチの最大の問題点は階層の全てのレベルに関して
1つのself-joinがいることです。そのため、それぞれのレベル
でjoinが複雑になるにつれて性能が落ちてきます。
Adjacency Listモデルの限界
完全なSQLでadjacency list モデルを使用するのはかなり困難です。
カテゴリーの完全なパスを見つけられる前に、それがどの位置に
あるのか知る必要があります。更に、ノードを除去する際に
は細心の注意を払う必要があります。そうでないと、サブツリー
が切り離されてしまいます。(portable electronics カテゴリーを
除去するとその子供は全て切り離されてしまいます。)
このような問題は幾分はクライアント側のコードやstored procedure
で処理できます。プロシージャー言語ならば、ツリーの一番下から
始めて上に向かって進みながら完全なツリーまたはシングル
パスを表示できます。プロシージャ言語を使って、
残りのノードが新しい親を指すことで、サブツリーを
切り離さずにノードを除去できます。
ネストしたセット・モデル
この記事で焦点を当てたいのは異なったアプローチで、ネストしたセット・モデル
と呼ばれるものです。ネストしたセット・モデルでは階層を
新しい方向からみます。これはノードとそれを
結ぶ線と見ずに、ネストしたコンテーナーと見ます。
上の例をこれを使ってみて見ましょう。
どうやって階層が維持されているかみましょう。親のカテゴリーが
子供を包み込んでいます。この形式の階層を左と右の
値でノードのネスティングを表してみましょう。
CREATE TABLE nested_category (
category_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
lft INT NOT NULL,
rgt INT NOT NULL
);
INSERT INTO nested_category
VALUES(1,'ELECTRONICS',1,20),(2,'TELEVISIONS',2,9),(3,'TUBE',3,4),
(4,'LCD',5,6),(5,'PLASMA',7,8),(6,'PORTABLE ELECTRONICS',10,19),
(7,'MP3 PLAYERS',11,14),(8,'FLASH',12,13),
(9,'CD PLAYERS',15,16),(10,'2 WAY RADIOS',17,18);
SELECT * FROM nested_category ORDER BY category_id;
+-------------+----------------------+-----+-----+
| category_id | name | lft | rgt |
+-------------+----------------------+-----+-----+
| 1 | ELECTRONICS | 1 | 20 |
| 2 | TELEVISIONS | 2 | 9 |
| 3 | TUBE | 3 | 4 |
| 4 | LCD | 5 | 6 |
| 5 | PLASMA | 7 | 8 |
| 6 | PORTABLE ELECTRONICS | 10 | 19 |
| 7 | MP3 PLAYERS | 11 | 14 |
| 8 | FLASH | 12 | 13 |
| 9 | CD PLAYERS | 15 | 16 |
| 10 | 2 WAY RADIOS | 17 | 18 |
+-------------+----------------------+-----+-----+
leftとrightはMySQLではキーワードなので、lftとrgtを代わりに使います。
参照:http://dev.mysql.com/doc/mysql/en/reserved-words.html
ではどうやって、左と右の値を決めるのでしょうか。
外側のノードの一番左の側から始めて右へ進みます。
典型的なツリーに適用してみましょう。
ツリーに応用する際は、左から右へと動き、1つの層ごと
に適用し、右側に番号を当てはめる前に、それぞれのノードの子供へ
降りていきます。それから右へ進みます。このアプローチ
は変形プリオーダーツリー横断アルゴリズムと呼ばれます。
完全なツリーの取り出し
完全なツリーをself-joinを使うことによって取り出すことが出来ます。
これは親とノードを次のようにしてリンクします。ノードの
lftの値が常に親のlftとrgtの値の間に来るようにします。
SELECT node.name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND parent.name = 'ELECTRONICS'
ORDER BY node.lft;
+----------------------+
| name |
+----------------------+
| ELECTRONICS |
| TELEVISIONS |
| TUBE |
| LCD |
| PLASMA |
| PORTABLE ELECTRONICS |
| MP3 PLAYERS |
| FLASH |
| CD PLAYERS |
| 2 WAY RADIOS |
+----------------------+
前出のadjacency listモデルの例とは異なり、クエリはツリーの
深さに限らず良く動作します。BETWEENクローズではノード
のrgtの値には拘りません。というのは、rgtの値は常に同じ親の
lftの値の間にあるからです。
全てのリーフノードを探す
ネストセットモデルで、全てのリーフノードを探すのは adjacency listモデル
で使われたLEFT JOIN メソッドよりも簡単です。nested_categoryテーブルを
見ると、リーフノードのlftとrgtの値は続き番号です。
リーフノードを発見するには、rgt = lft + 1の関係のある
ノードを見つければ良いのです。
SELECT name
FROM nested_category
WHERE rgt = lft + 1;
+--------------+
| name |
+--------------+
| TUBE |
| LCD |
| PLASMA |
| FLASH |
| CD PLAYERS |
| 2 WAY RADIOS |
+--------------+
シングル・パスの表示
ネストセットモデルでは複数のself-joinなしで
シングルパスを取り出すことができます。
SELECT parent.name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.name = 'FLASH'
ORDER BY node.lft;
+----------------------+
| name |
+----------------------+
| ELECTRONICS |
| PORTABLE ELECTRONICS |
| MP3 PLAYERS |
| FLASH |
+----------------------+
ノードの深さを測る
ツリー全体を取り出す方法を見てきました。しかし、ツリー
のそれぞれのノードの深さも示したいとしたらどうしましょうか。
それは階層のなかで、ノードが何処に位置しているかを
探るためです。これには 全体のツリーを示す
クエリにCOUNT functionとGROUP BY clause
を追加します。
SELECT node.name, (COUNT(parent.name) - 1) AS depth
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;
+----------------------+-------+
| name | depth |
+----------------------+-------+
| ELECTRONICS | 0 |
| TELEVISIONS | 1 |
| TUBE | 2 |
| LCD | 2 |
| PLASMA | 2 |
| PORTABLE ELECTRONICS | 1 |
| MP3 PLAYERS | 2 |
| FLASH | 3 |
| CD PLAYERS | 2 |
| 2 WAY RADIOS | 2 |
+----------------------+-------+
CONCAT and REPEAT string関数を使い、深さの
値に応じてカテゴリの名前をインデントします。
SELECT CONCAT( REPEAT(' ', COUNT(parent.name) - 1), node.name) AS name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;
+-----------------------+
| name |
+-----------------------+
| ELECTRONICS |
| TELEVISIONS |
| TUBE |
| LCD |
| PLASMA |
| PORTABLE ELECTRONICS |
| MP3 PLAYERS |
| FLASH |
| CD PLAYERS |
| 2 WAY RADIOS |
+-----------------------+
もちろん、クライアント側のアプリでは階層の深さを直接
提示するでしょうが。ウエブの開発者はツリーをループしながら、
と
毎に、追加します。
サブツリーの深さ
サブツリーの深さの情報が必要となると、self-joinの中で
ノードと親テーブルに限ることができなくなります。というのも
そうすると結果がコラプトされるからです。代わりに3番目
の self-joinを追加します、同時にサブクエリも加えて、サブツリー
の新しいスタートのポイントからの深さを決定します。
SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth
FROM nested_category AS node,
nested_category AS parent,
nested_category AS sub_parent,
(
SELECT node.name, (COUNT(parent.name) - 1) AS depth
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.name = 'PORTABLE ELECTRONICS'
GROUP BY node.name
ORDER BY node.lft
)AS sub_tree
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
AND sub_parent.name = sub_tree.name
GROUP BY node.name
ORDER BY node.lft;
+----------------------+-------+
| name | depth |
+----------------------+-------+
| PORTABLE ELECTRONICS | 0 |
| MP3 PLAYERS | 1 |
| FLASH | 2 |
| CD PLAYERS | 1 |
| 2 WAY RADIOS | 1 |
+----------------------+-------+
この関数はどんなノードの名前とでも(ルートノードを含む)使用できます。
深さの値は与えらたノードからの値です。
ノードの直下にあるノードを検索
ウエブで電機製品のカテゴリーを見せているとしましょう。
ユーザがカテゴリーをクリックすると、そのカテゴリの製品を
表示したいでしょう。またその直下のサブカテゴリーも表示
したでしょうが、その下のサブカテゴリーを全ては
表示したくないでしょう。そのためには、ノードと
その直下のノードを表示する必要がありますが、それ以下
は必要ありません。例えば、PORTABLE ELECTRONICSカテゴリー
を示すとき、MP3 PLAYERS, CD PLAYERSと2 WAY RADIOS
は示したいがFLASHは表示しない。
これは前のクエリにHAVING clause を追加すれば簡単にできます。
SELECT node.name, (COUNT(parent.name) - (sub_tree.depth + 1)) AS depth
FROM nested_category AS node,
nested_category AS parent,
nested_category AS sub_parent,
(
SELECT node.name, (COUNT(parent.name) - 1) AS depth
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.name = 'PORTABLE ELECTRONICS'
GROUP BY node.name
ORDER BY node.lft
)AS sub_tree
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.lft BETWEEN sub_parent.lft AND sub_parent.rgt
AND sub_parent.name = sub_tree.name
GROUP BY node.name
HAVING depth <= 1
ORDER BY node.lft;
+----------------------+-------+
| name | depth |
+----------------------+-------+
| PORTABLE ELECTRONICS | 0 |
| MP3 PLAYERS | 1 |
| CD PLAYERS | 1 |
| 2 WAY RADIOS | 1 |
+----------------------+-------+
親のノードを表示したくなければ、HAVING depth <= 1 をHAVING depth = 1
にすれば宜しい。
ネストセットの中のAggregate Function
aggregate functionをデモできる製品のテーブルを追加します。
CREATE TABLE product(
product_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(40),
category_id INT NOT NULL
);
INSERT INTO product(name, category_id) VALUES('20" TV',3),('36" TV',3),
('Super-LCD 42"',4),('Ultra-Plasma 62"',5),('Value Plasma 38"',5),
('Power-MP3 5gb',7),('Super-Player 1gb',8),('Porta CD',9),('CD To go!',9),
('Family Talk 360',10);
SELECT * FROM product;
+------------+-------------------+-------------+
| product_id | name | category_id |
+------------+-------------------+-------------+
| 1 | 20" TV | 3 |
| 2 | 36" TV | 3 |
| 3 | Super-LCD 42" | 4 |
| 4 | Ultra-Plasma 62" | 5 |
| 5 | Value Plasma 38" | 5 |
| 6 | Power-MP3 128mb | 7 |
| 7 | Super-Shuffle 1gb | 8 |
| 8 | Porta CD | 9 |
| 9 | CD To go! | 9 |
| 10 | Family Talk 360 | 10 |
+------------+-------------------+-------------+
カテゴリーツリーを取り出すクエリを作成しましょう。また
それぞれのカテゴリの製品の数も示します。
SELECT parent.name, COUNT(product.name)
FROM nested_category AS node ,
nested_category AS parent,
product
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.category_id = product.category_id
GROUP BY parent.name
ORDER BY node.lft;
+----------------------+---------------------+
| name | COUNT(product.name) |
+----------------------+---------------------+
| ELECTRONICS | 10 |
| TELEVISIONS | 5 |
| TUBE | 2 |
| LCD | 1 |
| PLASMA | 2 |
| PORTABLE ELECTRONICS | 5 |
| MP3 PLAYERS | 2 |
| FLASH | 1 |
| CD PLAYERS | 2 |
| 2 WAY RADIOS | 1 |
+----------------------+---------------------+
これはCOUNTと GROUP BYを加えての典型的な全部のツリー用
のクエリです。これは製品テーブルとWHERE clauseでのノードと
製品テーブルのjoinへのレファレンスを伴います。これから
分かるように、それぞれのカテゴリに関して数があります。
サブカテゴリーの数は親のカテゴリーに反映されています。
ノードの追加
ツリーのクエリの方法を学ぶために、新たなノードを追加
することでツリーをアップデートする方法をみてみましょう。
ネストセットのダイアグラムをみましょう。
TELEVISIONSと PORTABLE ELECTRONICSノードの間に新しい
ノードを追加したいとしますと、新しいノードはlft
とrgt の値は10 と11です。その右側にあるノードの
全てはそのlft とrgtの値を2つ増加します。それから
正しいlftとrgtの値で新しいノードを追加します。これはMySQL 5では
stored procedureを使ってできますが、多分大分の
ユーザはまだ4.1を使っていると思います。それでLOCK TABLES ステートメント
でクエリを発します。
LOCK TABLE nested_category WRITE;
SELECT @myRight := rgt FROM nested_category
WHERE name = 'TELEVISIONS';
UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myRight;
INSERT INTO nested_category(name, lft, rgt) VALUES('GAME CONSOLES',
@myRight + 1, @myRight + 2);
UNLOCK TABLES;
ツリー・クエリでネスティングをチェックできます。
SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;
+-----------------------+
| name |
+-----------------------+
| ELECTRONICS |
| TELEVISIONS |
| TUBE |
| LCD |
| PLASMA |
| GAME CONSOLES |
| PORTABLE ELECTRONICS |
| MP3 PLAYERS |
| FLASH |
| CD PLAYERS |
| 2 WAY RADIOS |
+-----------------------+
子供のないノードの子供としてノードを追加する場合は幾分プロシージャを
変更する必要があります。2 WAY RADIOSノードの下に新しいFRS ノードを
追加しましょう。
LOCK TABLE nested_category WRITE;
SELECT @myLeft := lft FROM nested_category
WHERE name = '2 WAY RADIOS';
UPDATE nested_category SET rgt = rgt + 2 WHERE rgt > @myLeft;
UPDATE nested_category SET lft = lft + 2 WHERE lft > @myLeft;
INSERT INTO nested_category(name, lft, rgt) VALUES('FRS', @myLeft + 1,
@myLeft + 2);
UNLOCK TABLES;
この例では新しいノードの左側の番号の右の
全てを拡張します。それから、左側の値の右にノードを置きます。
見た通り、新しいノードはちゃんとネストしています。
SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;
+-----------------------+
| name |
+-----------------------+
| ELECTRONICS |
| TELEVISIONS |
| TUBE |
| LCD |
| PLASMA |
| GAME CONSOLES |
| PORTABLE ELECTRONICS |
| MP3 PLAYERS |
| FLASH |
| CD PLAYERS |
| 2 WAY RADIOS |
| FRS |
+-----------------------+
ノードの除去
最後の基本的なタスクはノードの除去です。ノードを除去する
際に必要なことは階層内のノードの位置によります。
リーフノードを除去することは子供がいるノードを除去するよりも
簡単です。当然その場合は切り離されてしまったノード
の処理が必要ですから。
リーフノードを除去する際は追加の反対で、ノードを除去して、
そのノードの右にあるノードから幅分だけ減らします。
LOCK TABLE nested_category WRITE;
SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
FROM nested_category
WHERE name = 'GAME CONSOLES';
DELETE FROM nested_category WHERE lft BETWEEN @myLeft AND @myRight;
UPDATE nested_category SET rgt = rgt - @myWidth WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft - @myWidth WHERE lft > @myRight;
UNLOCK TABLES;
もう一度、意図したツリー・クエリを実行して
階層を乱さないでノードが本当に除去されたかを確認します。
SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;
+-----------------------+
| name |
+-----------------------+
| ELECTRONICS |
| TELEVISIONS |
| TUBE |
| LCD |
| PLASMA |
| PORTABLE ELECTRONICS |
| MP3 PLAYERS |
| FLASH |
| CD PLAYERS |
| 2 WAY RADIOS |
| FRS |
+-----------------------+
この方法はノードを除去して、その子供全て
を除去するのに有効です。
LOCK TABLE nested_category WRITE;
SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
FROM nested_category
WHERE name = 'MP3 PLAYERS';
DELETE FROM nested_category WHERE lft BETWEEN @myLeft AND @myRight;
UPDATE nested_category SET rgt = rgt - @myWidth WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft - @myWidth WHERE lft > @myRight;
UNLOCK TABLES;
もう一度、全てのサブツリーが除去できたかを確かめます。
SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;
+-----------------------+
| name |
+-----------------------+
| ELECTRONICS |
| TELEVISIONS |
| TUBE |
| LCD |
| PLASMA |
| PORTABLE ELECTRONICS |
| CD PLAYERS |
| 2 WAY RADIOS |
| FRS |
+-----------------------+
もう一方のシナリオでは子供ではなく親のノード
を除去した場合です。ある場合には代わりがくるまで、
プレースフォールダーの名前を変えるだけにするかも知れません。
これは例えば、スーパーバイザーが首になったようなときです。他の
場合は全ての子供を親があったレヴェルまで押し上げる必要
があります。
LOCK TABLE nested_category WRITE;
SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
FROM nested_category
WHERE name = 'PORTABLE ELECTRONICS';
DELETE FROM nested_category WHERE lft = @myLeft;
UPDATE nested_category SET rgt = rgt - 1, lft = lft - 1 WHERE lft
BETWEEN @myLeft AND @myRight;
UPDATE nested_category SET rgt = rgt - 2 WHERE rgt > @myRight;
UPDATE nested_category SET lft = lft - 2 WHERE lft > @myRight;
UNLOCK TABLES;
この場合、ノードの右にあるエレメントの全てから2を引きます。
(子供がなければ幅は2だからです。)またその子供のノードから
1を引きます。(これは親の左の値がなくなったことによる
ギャップを閉じるためです。). もう一度、エレメントが
格上げされたことを確認します。
SELECT CONCAT( REPEAT( ' ', (COUNT(parent.name) - 1) ), node.name) AS name
FROM nested_category AS node,
nested_category AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.name
ORDER BY node.lft;
+---------------+
| name |
+---------------+
| ELECTRONICS |
| TELEVISIONS |
| TUBE |
| LCD |
| PLASMA |
| CD PLAYERS |
| 2 WAY RADIOS |
| FRS |
+---------------+
他のシナリオでは除去したノードの子供の1つを前の親の
位置にもってきて、その子供を前の親の兄弟の下の位置にもって
きます。しかし、紙面の都合でそれはここでは述べません。
最後に
この情報が役立つものであったことを希望しますが、SQLでのネスト
セットのコンセプトはもう10年程度存在します、そして
本やインターネットでたくさんの情報が存在します。私の
考えではこの分野で一番よく書けているのは、Joe Celko著
の「Trees and Hierarchies in SQL for Smarties」でJoe Celkoは
SQLの専門家です。 Joe Celkoはネスト・モデルに関する
権威です。そしてもっとも、多くの著書を残している著者です。Celkoの本は重要な
ソースで、推薦します。本はこの記事でカバーしなかった高度なトピック
をカバーします。またAdjacency ListとNested Setモデル以外の
方法にも言及します。
レファレンス・セクションでウエブのレファレンスをリストアップ
しました。階層化されたデータの管理のリサーチ役立つを思います。
この中にはMySQLのなかでネストされたセットを処理するPHPの
ライブラリーなども含みます。現在adjacency listモデルを使用
しているが、ネストセットモデルを試したい人は、この2つの
モデル間での変換コードのサンプルは「Storing Hierarchical Data in a
Database」
のセクションにあります。
--
Zen Kishimoto www.ipdevices.com
IP Devices, Inc. zen@xxxxxxxxxx
2175 De La Cruz Blvd., Suite 10 (408) 567-9391
Santa Clara, CA 95050 (801) 720-8847 (FAX)
ヒューリスティック
ヒューリスティック Heuristic
http://d.hatena.ne.jp/keyword/%A5%D2%A5%E5%A1%BC%A5%EA%A5%B9%A5%C6%A5%A3%A5%C3%A5%AF
■意味
1.経験則
2.自己発見的学習
3.試行錯誤を繰り返して問題を解決する
4.少ない努力で即座に結論を求める方法
2番目のやつだな。自己発見的学習というやつ。
新・発見学習のすすめ
物事に取り組むとき、あまり難しく考えすぎると、なかなか手がつけられない。
逆に、易しく考えすぎても、到達点が低いままで終わってしまう。
どちらの極端にも偏らず、まずは取り組んでみて、分からないことにブチ当たったら、その都度問題を解決しながら前進していく。
そういう態度で学習していくこと、それがヒューリスティックな態度なのだ。
【“ヒューリスティック”の続きを読む】
利根川でウォーキング
利根川の周りを歩いた。
距離にして26キロ!
利根川を船で渡った。
船に乗ったのは久しぶりだ。
ラジコン飛行機を飛ばす人、ジェットスキーに乗る人、サイクリングをしている人、のんびりしている人…いろんな人がそれぞれに楽しんでいた。
昼食はアウトドアでカレーライス。
うまかった。
お代わりをして満腹。
芝生の上で昼寝をして気持ちがよかった。
ときどき自然の中で、リフレッシュするのもいいだろう。
はじめての自宅サーバー構築 〜 Fedora / CentOS 〜
サーバーの構築方法を調べるのに便利だ。
参考にさせてもらおう。
BlueQuartz 5100R インストールメモ (CentOS4.0 用)
http://bluequartz.org/~oda/docs/centos4/index-j.html
こっちもついでにメモ
ISO ファイルの焼き方
http://mcn.oops.jp/lab/linux/burn-iso.htm
ISO ファイル (*.iso) は、CD の Image として保存されていますので、何時も行っているやり方で普通に CD を焼いても Boot することは出来ません。
通常の焼き方とは異なることに気をつける必要があります。
B's Recorder GOLD 5/7 の場合
手順としては以下のとおり。
『編集(E)』→『登録(S)』→『トラック(T)』を選択します
ファイル選択の画面で ISO ファイルを選択します
『トラックの追加ダイアログ』にて、ISO ファイルが指定できない場合には『ファイルの種類(T):』を『すべてのファイル(*.*)』に設定するとファイルが見えるようになります。
この状態で CD を焼きます
open-gorotto
オープンソースのSNSシステム open-gorotto
成果物を他に還元するのは、良い姿勢だと思う。
今度試しに入れてみますか?
http://open-gorotto.jp/
http://www.nikkeibp.co.jp/netbiz/opensource/050906_kumamoto/
http://itpro.nikkeibp.co.jp/free/ITPro/OPINION/20050802/165730/
実は,八代市で使用しているSNSのソースコードは「open-gorotto」として無償公開されている。
↓作者の小林隆生氏

――お一人ですべて開発されたそうですね。
SNSは5時から残業して作りました。かけた時間は,3カ月,1日平均4時間くらいでしょうか。サーバーは既存のもの,OSはFreeBSD, Webアプリケーション開発言語はPHP,DBMSはPostgreSQLなどオープンソース・ソフトウエアを使いましたので,私の残業代だけでできました。
苦労したことは,とよく聞かれるのですが,すんなり出来てしまいましたね(笑)。勉強しながら作りましたが,もともと,プログラミングは好きでずっとやっていたので,ストレスは感じませんでした。
FinePrint
印刷するとき、紙の枚数を節約できるソフト
http://www.vector.co.jp/soft/win95/writing/se322363.html
FinePrint5は、Windows用多機能印刷ドライバです。
Windowsの印刷機能を大幅に拡張し、縮小印刷・まとめ印刷・プレビュー・ヘッダ/フッタ付与・ジョブの保存・イメージデータへの変換などさまざまな機能を提供します。
※基本的にWindowsのすべてのアプリケーション・プリンタで使用することができます。
★印刷コスト削減のための機能
複数ページを縮小して1枚にしたり、プレビュー表示により内容を確認して不要ページを削除してから印刷できるため、無駄な印刷がなくなり、印刷コストを大幅に削減することができます。
★印刷をより多様に、より使いやすく
複数のアプリケーションで作成した文書を組み合わせて印刷したり、日付やページ数や透かし文字の付与など、すべてのアプリケーション・プリンタで同じ操作で実現。
★さまざまな便利な機能
「小冊子印刷」では製本用の印刷機能を提供し、冊子を簡単に作成できます。「フォーム機能」はあらかじめ作成したフォームをオーバーレイして印刷できます。「手動両面印刷」は両面印刷機能のないプリンターでも両面印刷を可能にします。
誰でもすぐに使える操作性の良さ、豊富な機能は、今までの印刷の概念を大きく変えます。すでにFinePrintユーザーは40万人を突破! 幅広く、長くお使い頂ける製品です。
利用条件・試用期間中の制限など
試用期間及び機能の制限は一切ありません。但し、印刷結果の下側にFinePrintで印刷した旨のメッセージが出力されます。
そんぐらい気にせんよ。
良質な教科書系ウェブサイト集
RubyをWindowsにインストール
RubyのソースコードをWindows用にコンパイルしたバイナリは、いくつか種類があるようですが、mswin32というのを使ってみます。
(UNIX特有の機能が、mswin32ではいくつか使えないそうです。)
●インストールの流れ
mswin32 (バイナリ)
●ダウンロード
Ruby-mswin32 (ja) Release
![]() | RailsによるアジャイルWebアプリケーション開発 前田 修吾 (2006/02/25) オーム社 この商品の詳細を見る |
![]() | たのしいRuby―Rubyではじめる気軽なプログラミング まつもと ゆきひろ、高橋 征義 他 (2002/03) ソフトバンククリエイティブ この商品の詳細を見る |
![]() | プログラミングRuby―達人プログラマーガイド まつもと ゆきひろ、デビット トーマス 他 (2001/09) ピアソンエデュケーション この商品の詳細を見る |
ビルゲイツ氏、引退
http://www.asahi.com/digital/pc/TKY200606160083.html
![]() |
2年後に経営の一線から退くと表明するマイクロソフトのビル・ゲイツ会長=米シアトル近郊で、AP |
2006年06月16日
マイクロソフト(MS)の創業者、ビル・ゲイツ会長(50)は15日、08年7月に非常勤の会長となって経営の一線を退き、夫妻の慈善財団の活動に重心を移すと発表した。「引退ではない」としているが、経営関与は重要事業への助言などにとどめる。
今後2年間は、移行を円滑に完了させるための期間と位置づけた。ともに最高技術責任者だったレイ・オジー氏とクレイグ・マンディー氏を15日付でそれぞれ最高ソフト設計者と最高研究・戦略責任者に指名。スティーブ・バルマー最高経営責任者(CEO)のもとでの指導体制を固める。
ゲイツ氏は「難しい決断だったが、幸運なことに、大切で挑戦しがいのある(MSと財団の)二つの情熱を私は持っている」と思いを語った。
ゲイツ氏は75年に友人のポール・アレン氏とMSを創業し、パソコンの基本ソフト(OS)「ウィンドウズ」の爆発的普及などにより、05年6月期の年間売上高397億ドル(約4兆6000億円)、当期利益122億ドル(約1兆4000億円)にのぼる世界最大のソフトウエア会社を築いた。00年にバルマー氏にCEOの座を譲った後は、会長兼最高ソフト設計者として経営戦略の方向づけを続けてきた。
米経済誌フォーブスが3月に発表した世界の長者番付によると、資産総額は500億ドル(約5兆7500億円)と、12年連続で世界一だ。
慈善活動にも熱心。00年にそれまでの二つの財団を合併させて発足した現在の財団「ビル・アンド・メリンダ・ゲイツ財団」は基金の規模が約290億ドル(約3兆3000億円)と米最大。エイズ対策や貧困解消などにすでに1兆円を超える寄付をしている。
↓↓↓こんなご意見、ありました↓↓↓
ビルゲイツの最終目標はノーベル平和賞?
http://blogs.itmedia.co.jp/kurikiyo/2006/06/post_9c1a.html
こういうのに対して「偽善」だとか、「さんざんアコギに儲けておいて罪滅ぼしのつもりか」とかいろいろ言う人はいると思います。しかし、自分は、2ちゃんねるの名フレーズを借りれば「やらない善よりやる偽善」だと思うわけです。周りによく思われたいという不純な動機で始めた慈善活動でも結果的に幸福になる人々が増えれば良いと思います。自分もうまくビジネスで成功できてアーリーリタイアできれば、福祉関係とかで積極的に「偽善活動」をできればと思っています。
「やらない善よりやる偽善」…このフレーズ、いいですね☆(^-^)/
【“ビルゲイツ氏、引退”の続きを読む】
BlogPet(BlogPet)
MySQL 4.0と5.0の違い
http://tech.blog.klab.org/archives/50322153.html
4.0系と5.0系の安定版が使いやすい。
4.1系はあまり使われない(タイミング的な理由などから)。
安定版を選べと。
■ 各バージョンの違いについて
4.0系と4.1系の間で大きな違いがある。
4.1系
文字の扱いが違う。
VARCHARがサイズ指定がバイトだったのが文字数になっている。
キャラクタセットの扱いが変更された。
文字コード追加
日本語に関係あるところだと、utf8, ucs2, cp932
サブクエリ追加
NDBクラスタ追加
サブクエリの恩恵は大きいな。
5.0系
ストアドプロシージャ追加
トリガ追加
ビュー追加
文字コード追加
日本語に関係あるところだと、eucjpms
FEDERATEDエンジン
他のホストのテーブルを使って実体を持たずにテーブルを使うことができる。
ただし、show table status でコネクション情報が出力される際、パスワードも出力されてしまう。
ビューはAccessでいうところのクエリーだな。
OpenPNEに使うMySQLをどうするか?
枯れた仕様の方がトラブルシューティングのノウハウが蓄積されているというメリットはある。
しかし、新しいバージョンだと、改良点〜速い、高機能という恩恵もある。
■ 5.0を触ってみた感触
主に新機能部分でテストが不十分な印象。
- View関連でbinlogに正しく出力されない問題
- mysqldumpしたCREATE VIEW文を実行時
- Viewカラムに別名をつけたとき
どうするMySQL?
…ものは試しで5.0使ってみますか?
・MySQLって、20万レコードとか、ある段階を越えると遅くなるって聞いたけど大丈夫かな?
・ストレージエンジン選択の違い?
![]() | 現場で使える MySQL 松信 嘉範 (2006/03/17) 翔泳社 この商品の詳細を見る |
投稿のテスト(BlogPet)
BlogPet
http://www.blogpet.net/
ブログペットはあなたのブログから言葉をおぼえる“謎のペット”です。
言葉をおぼえて話します
ブログのアクセサリになります
友達と交流出来ます
「Blog Petサービス」利用規約
KDDI株式会社(以下「当社」といいます。)が提供するBlogPetサービスは、この「BlogPetサービス」利用規約(以下「本規約」といいます。)によって取り扱います。
第1条(定義)
次の各号で定める用語の意味は、当該各号で定めるとおりとする。
(1)BlogPetサービス 本規約で定める条件に基づき、当社が運営するBlogPetサービスのためのウェブサイト(http://www.blogpet.net/)(以下、本サイト)に定める機能を利用できるサービスをいいます。
(2)BlogPet BlogPetサービスを利用するにあたり利用者が当社所定の設定を行うことによりパソコンの画面上に表示され、当社所定の条件に従って動作するキャラクターをいいます。
第2条(本規約の適用、範囲および変更)
1.本規約は、本サービスをご利用いただく際の当社と利用者との間の一切の関係に適用されるものとします。
2.本サイトに掲載するBlogPetサービスの利用に関する諸規程、注意事項及びその他名目の如何に拘わらず当社から利用者に対して要請する事項は本規約の一部を構成するものとします。
3.当社は、利用者の承諾を得ることなく、必要に応じて本規約を変更することができるものとします。この場合、当社は、利用者に対し、予め、変更後の規約を本サイトに掲示することにより、通知するものとします。
第3条(利用申込)
BlogPetサービスを利用しようとする方は、本規約を承諾のうえ、当社が別に定める手続きに従い、BlogPetサービスの利用を当社に申し込んでください。
2.当社は、前項に基づく申込みを承諾したときは、登録確認メールの送付を以って利用者に通知します。利用者は、登録確認メールに記載されたウェブページのアドレスにアクセスすることを以って、BlogPetサービスの提供を受けるための契約(以下「利用契約」といいます。)を当社と締結するものとします。
3.当社は、次の各号の一に該当すると判断したときは、第1項に基づく申込みを承諾しないことがあります。
(1)BlogPetサービスの利用申込みを行うにあたり当社に虚偽の内容を申告し、又はその虞がある場合
(2)本規約に違反し、又はその虞がある場合
(3)過去に利用者の責めに帰すべき事由によりBlogPetサービスの提供を受けるための契約を解除されたことがある場合
(4)当社が利用者によるBlogPetサービスの利用申込みを承諾することでBlogPetサービスの提供に支障を生じ、又はその虞がある場合
(5)前各号に定めるほか、当社が利用者によるBlogPetサービスの利用申込みを承諾しないことにつき相当の理由がある場合
第4条(利用方法)
利用者は、BlogPetサービスを利用するにあたり、当社が別に定める設定を行ってください。
2.利用者は、次の各号に該当するウェブサイト(次の各号に該当するウェブサイトにリンクを設定しているウェブサイトを含みます。)においてBlogPetサービスを利用することはできません。
(1) BlogPetサービスの利用者又は第三者を差別若しくは誹謗中傷し、又は名誉若しくは信用を毀損し、又はその虞がある内容を記載するウェブサイト
(2) 猥褻、児童ポルノ又は児童虐待にあたり、又はその虞がある画像、文書等を掲載するウェブサイト
(3) 無限連鎖講(ネズミ講)を開設し、又はこれを勧誘するためのウェブサイト
(4) 詐欺等の犯罪に結びつく、又はその虞がある内容を記載するウェブサイト
(5) 法令、条例等に違反し、又はその虞がある内容を記載するウェブサイト
(6) 公序良俗に違反し、又その虞がある内容を記載するウェブサイト
(7) 不適正な方法により又は不適正な目的のために個人情報を収集することを目的としたウェブサイト
(8) 本サービスの利用者又は第三者に不当に不利益を与え、又はその虞があるウェブサイト
(9) 事実に反する情報を記載するウェブサイト
(10)利用者又は第三者の承諾なく、広告宣伝又は勧誘等を目的とした内容を記載する電子メールを送信し、及び受信者が嫌悪感を抱く内容を記載する電子メールを送信するためのウェブサイト
(11)その他、当社が不適切と判断するウェブサイト
3. BlogPetサービスの利用方法については、本規約に定めるほか、本サイトに定めるとおりとします。
第5条(提供停止、解除)
当社は、利用者が次の各号の何れか一に該当する行為を行った場合、何ら催告を要することなく、BlogPetサービスの提供を停止し又は利用契約を解除できるものとします。
(1) 当社又は第三者の著作権を侵害する行為。
(2) BlogPetサービスに係るプログラム、画像及び関連資料に関し、修正、変更、改変、リバース・エンジニアリング、逆コンパイル、逆アセンブルなどをする行為。
(3) BlogPetサービスを商業目的に利用する行為。
(4) BlogPetサービスに係るプログラム、画像及び関連資料を、当社に無断で転載・複写・蓄積・転送する行為。
(5) BlogPetサービスの運営を妨げる行為。
(6) 第三者が管理するサーバ等設備の運営を妨げる行為。
(7) 他の利用者になりすましてBlogPetサービスを利用する行為。
(8) BlogPetサービスを第三者に利用させる行為
(9) 前各号に定める行為を助長する行為。
(10)前各号に該当する可能性があると当社が判断する行為。
(11)その他、当社が不適切と判断する行為。
(12)本規約の条項に違反する行為。
2.前項に基づきBlogPetサービスの提供を停止し又は利用契約が解除された場合であっても、当社は当該利用者に対して一切責任を負わないものとします。
第6条(BlogPetサービスの提供)
利用者は、BlogPetサービスを利用するにあたり、当社が何ら事前の通知若しくは承諾を要することなく何時でも、利用者が設定したBlogPetが表示される画面上に当社若しくは第三者の広告又はアンケートを表示し、及び当社若しくは第三者の広告又はアンケートを記載又は添付した電子メールを利用者が指定する自らの電子メールアドレスに送信することを承諾します。
2.当社は、利用者の承諾なく、BlogPetサービスの全部若しくはは一部を変更し又は廃止することができるものとします。この場合、当社は、予め、その旨を本サイトに掲示することにより、通知するものとします。
第7条(BlogPetサービスの中断または中止)
当社は、次の各号の何れか一に該当する場合、BlogPetサービスの提供の全部または一部を中断または中止することができるものとします。
(1) 天災、事変、その他の非常事態が発生し、または発生する恐れがある場合。
(2) BlogPetサービスに関連して当社が設置または管理する設備の保守を定期的に若しくは緊急に行う場合。
(3) 当社が設置または管理する設備の異常、故障、障害その他BlogPetサービスを利用者に提供できない事由が生じた場合。
(4) その他当社が必要と判断した場合。
2.当社は、前項の規定により本サービスの提供を中断または中止する場合、事前に利用者に対してその旨を電子メールにて通知し又は本サイト上に掲載することで告知するものとします。但し、緊急の場合には、この限りではないものとします。
3.当社は、当社の責めに帰すべからざる事由による本サービスの提供の中断または中止によって生じた利用者の損害につき、その責任を一切負わないものとします。
第8条(個人情報)
1.利用者は、当社にご登録いただいた電子メールアドレスおよびその他の自己の情報を、当社が次の目的で利用することに同意するものとします。
(1) BlogPetサービスの提供に関すること
(2) 利用者本人からの問合わせへの対応に関すること
(3) BlogPetサービスおよびその他のサービスに関連する情報の利用者への提供に関すること
(4) BlogPetサービスに関連するアンケートに関すること
2.利用者は、本サイト上において、当社が別に定める方法により自ら登録した情報を閲覧または変更できるものとします。
3.利用者は、当社が利用者の情報(BlogPetサービスの利用履歴を含む。)を個人が特定できない情報に集計、加工して、広告主、広告代理業者およびアンケート依頼主に開示、提供することに同意するものとします。
4.利用者は、当社が利用者の要望に対してより適した情報を配信する為、当社が本サービスの利用履歴を収集することを同意するものとします。
5.当社は、次の各号の何れか一に該当する場合、利用者に関して自らが有する全部または一部の情報を、司法機関、その他第三者に対して開示できるものとします。
(1) 裁判所及びその他の者から法令に基づき利用者に関する情報の開示を要求された場合
(2) 当社、他の利用者又は第三者の権利および財産を保護する必要がある場合
(3) 利用者と他の利用者又は第三者との紛争により、当社が迷惑または損害を被ることを回避する場合
(4) 前各号で定めるほか、個人情報の保護に関する法律第23条に基づき許容されている場合
第9条(免責)
1.当社は、利用者がBlogPetサービスを利用して取得できる他の利用者が掲載する情報等について、その完全性、正確性、確実性、有用性等いかなる保証も行わないものとします。
2.本サービスの利用に関連して、利用者が他の利用者もしくは第三者に対して損害を与えた場合、または利用者と他の利用者もしくは第三者との間で紛争が生じた場合、当該利用者は自己の費用と責任によりかかる損害を賠償し、紛争を解決するものとし、当社に何等の迷惑をかけまたは損害を与えないものとします。
4.当社は、利用者が本サービスを利用できるようにする為、利用者が利用する設備、端末、ソフトウェア等のサポートおよびこれらに対応して当社が設置または管理する設備、端末、ソフトウェア等の設定、改変を行う義務を負わないものとします。
5.当社が独自に行なう旨の明記がなされていない広告の内容は、広告主が自らの責任によって定めるものであり、その内容に関して、当社は一切責任を負わないものとします。6.当社が独自に行なう旨の明記が為されていないアンケートの内容は、アンケート依頼主が自らの責任において定めるものであり、その内容に関して当社は一切責任を負わないものとします。
7.利用者は、自己の責任に基づき本サービスを利用するものとし、利用者は当社に対し、他人の著作物を使用したことなどが原因での紛争、損害賠償の請求などが起こった場合の損害、責任について一切を免責するものとします。また、利用者は当社に対し、BlogPetサービスの利用に必要となる当社が利用者に発行するユーザーIDおよびパスワード」を利用者の責めに帰すべき事由により第三者に盗用されたことなどが原因でクレーム、紛争、損害賠償の請求などが起こった場合の損害、責任についても一切を免責するものとします。
第10条(準拠法)
利用契約の成立、効力、履行および解釈に関しては、日本法が適用されるものとします。
第11条(譲渡禁止)
利用者は、利用契約に基づく利用者の契約上の地位及び利用契約に基づく権利の全部又は一部を第三者に譲渡し、又は担保の用に供してはならないものとします。
OpenPNE その2
・OpenPNEの動作条件チェック
・テスト環境=LAMPの用意
・バージョン管理システムを入れる。→SubVersion
・バグトラックシステムを入れる。→影舞にしとく?
●OpenPNEの中身調査開始
・OpenPNEのテストインストール
・OpenPNEの中身をトレースしてみる。
・主要な機能について、どこでどういう処理をして進めているのかチェック!!!
=できれば簡単なフローチャート図を作成してみたい。UMLの図とかあれば便利。マインドマップ的な簡略図でも可。
・MVC、フレームワークの基本知識確認 → Ruby on Rails本も参考にしてみる。
・mojaviの情報収集
・SymfonyでWebアプリを作る練習をしてみたりして。←mojaviのやり方を調べる上で多少は役に立つ?
●カスタマイズ
・ユーザー同士の情報共有(連携)
・必須コミュニティー、紹介者の表示、コミュニティー属性設定=コミュニティーの持ち方、参加者管理
・お知らせ(全国、個別)の表示
・質問掲示板→はてなみたいなやつ
・検索系の機能→ユーザー属性によるマッチング
・オーナー70〜80、メンバー5000〜10万
Google Spreadsheets
Google Spreadsheets
http://spreadsheets.google.com/
こいつはスゲーぜ!
ブラウザで表計算かよ。
Googleのプログラマー、なかなかやるじゃん!!!
オイラもがんばるぜ!!!
↓こんな画面らしいッス☆

Blue Quartz Installation CD
http://blog.ieserver.net/archives/000488.html
うむ、簡単にインストールできそうです。
CentOS ™ / Blue Quartz ™ Installation CD v4.3
http://www.nuonce.net/bq-cd.php
BlueQuartz Packages (有料)
http://www.webmerch.com/index.php?cPath=1
Linuxの操作がGUIになってMacのように直感に近い操作になってきているが、サーバー部分の設定はまだコマンド操作だったり、テキストベースの設定だったりで初心者が扱うにはまだ、敷居が高い。
CentOS+BlueQuartzの組み合わせならメールサーバーやWebサーバーの運用が、コンピュータにそれほど詳しくなくてできるのではと思う。

OpenPNEのカスタマイズ
So-net SNSのような仕組みを作るという観点から見ていくことにする。
(1) デザインのカスタマイズ → どこをいじれば良いのか?
(2) 機能のカスタマイズ → アプリケーションの仕組み 〜 どこをいじれば良いのか?
(1) デザインのカスタマイズ
1. 標準のCSS、画像パーツは、管理画面経由で入れ替えられる。
2. OpenPNEは、Smartyを使っている。
デザインテンプレートは、
/webapp/modules/pc/templates
/webapp/modules/ktai/templates
にある。
新たな表示部分を加えたら、デザインテンプレートにSmartyタグを追加する。
そして、Smarty経由で出力するようなプログラムコードを追加する。
=OpenPNEはフレームワークを使ったMVCモデルで作られているので、プログラムコードを調べないといけない。
(2) 機能のカスタマイズ
OpenPNEは、PHPフレームワーク「mojavi」を利用しているらしい。
http://snsoft.jp/archives/2005/04/snsoft_4.html
・6/30 Mojavi化、ADODB(PEARDB)化完了
MVCモデルの
・Controller
・Action
・Model
・View
の機能が、どこにあるか所在の確認=ファイルを特定する。
フローチャート、画面遷移図みたいのを作ってみるか?
=UMLの知識がないので、自分流のデタラメ図でもいいかと思う。
99ROOMS

FLASHで作られた廃墟を巡るコンテンツがありました。
http://99rooms.terracontent.de/99rooms/99rooms.html
ドイツ在住の4人組(Art、Direction、Programming、Sounddesign)によるインタラクティブなギャラリーサイト。
ROSTLAUB Gbr
Kim Köster (The Artist)
Richard Schumann (Art Direction)
Johannes Bünemann (Sounddesign)
Stephan Schulz (Flash / Programming)

【“99ROOMS”の続きを読む】
株式会社 NEAT
スゴイ社名だと思ったが、NEETの方ではなかった。
■ 社名変更のご挨拶 ■ 2006年5月1日
このたび弊社は社名を来る5月1日より下記のごとく変更することといたしました。
新社名 株式会社 NEAT
旧社名 株式会社 ニート
「NEAT」は、ラテン語の「光り輝く」に由来し、「きちんとした」「素晴しい」
などの意味があります。「Make a neat job of it」を合言葉に今まで以上に気の利いた、きちんとした、巧みなサービスをご提供することをお約束いたします。
2006年5月1日
TEL・FAXとも従来と変更ございません。
株式会社 ニート
代表取締役 加藤 直樹
情報処理試験 参考資料
[おすすめの参考書一覧]
http://www.geocities.jp/jyoho_syori/index.html
[リンク]
のんびりやろう!情報処理試験!
http://www.shunzei.com/
☆末広ページ 情報処理技術者試験☆
http://www.yscon.co.jp/j/
一夜漬け 情報処理技術者試験
http://www15.plala.or.jp/gcap/data/
情報処理試験.jp
http://xn--n9q36mh1hnxuksz7wt.jp/
実体験から始める情報講座(kayakaya)
http://www.jtw.zaq.ne.jp/kayakaya/
情報処理技術者試験は俺に聞け 公式ページ
http://t_h_.nce.buttobi.net/
情報処理合格街道
http://leo-lina.com/
http://pc8.2ch.net/test/read.cgi/prog/1142866538/195
アルゴリズムの切り札とC言語の切り札
午後の合格教本やって過去問4回分
を3回くらいループしとけば、根本的にバカじゃなかったら
合格ラインはいきますよね
皆さんはどういう対策を練ってますか
どうせだから有意義な情報交換して皆で受かろうよ!!
ヾ(*´∀`*)ノ
セフセフ
(⊃⊂)
⊂(^ω^)⊃ セフセフ!!
ミ⊃⊂彡


![明快入門SQL [林晴比古実用マスターシリーズ] (林晴比古実用マスターシリーズ)](http://ecx.images-amazon.com/images/I/41vIWLSNXvL._SL160_.jpg)












