mySQL5.1.52での複合インデックス実験

インデックスの実験。
以下のようなテーブル。

CREATE TABLE `test` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `admin_id` bigint(20) NOT NULL,
  `user_id` bigint(20) DEFAULT NULL,
  `give_interest_limit` int(20) DEFAULT NULL,
  `action` text,
  `created_at` datetime DEFAULT NULL,
  `updated_at` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
);

行数は3万件位入れておく。
こんな感じのバルクインサートが良いかも。

INSERT INTO `test` (`admin_id`, `user_id`, `give_interest_limit`) 
VALUES 
('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1'),('14', '15', '1');

以下のようなインデックスを貼ってみる。

ALTER TABLE `test`
ADD INDEX admin_id(`admin_id`) ,
ADD INDEX user_id(`user_id`) ,
ADD INDEX admin_id__user_id(`admin_id`,`user_id`),
ADD INDEX user_id__admin_id(`user_id`,`admin_id`);

■explainしてみる
とりあえずpossible_keysが、使えそうなインデックスで、keyが実際に使われたインデックスと見ればOKです。
explainの読み方はいつも参考にしている方のブログがわかりやすいです。

explain select * from test
 where
admin_id = 14 AND user_id = 15;


■結果

+----+-------------+-------+------+------------------------------------------------------+----------+---------+-------+--------+-------------+
| id | select_type | table | type | possible_keys                                        | key      | key_len | ref   | rows   | Extra       |
+----+-------------+-------+------+------------------------------------------------------+----------+---------+-------+--------+-------------+
|  1 | SIMPLE      | test  | ref  | admin_id,user_id,admin_id__user_id,user_id__admin_id | admin_id | 8       | const | 146559 | Using where |
+----+-------------+-------+------+------------------------------------------------------+----------+---------+-------+--------+-------------+

■あれ
なぜか`admin_id__user_id`を使ってくれない。

■消してみる

ALTER TABLE `test`
DROP INDEX `admin_id`;

■explainしてみる

explain select * from test
 where
admin_id = 14 AND user_id = 15;

■結果

+----+-------------+-------+------+---------------------------------------------+---------+---------+-------+--------+-------------+
| id | select_type | table | type | possible_keys                               | key     | key_len | ref   | rows   | Extra       |
+----+-------------+-------+------+---------------------------------------------+---------+---------+-------+--------+-------------+
|  1 | SIMPLE      | test  | ref  | user_id,admin_id__user_id,user_id__admin_id | user_id | 9       | const | 146484 | Using where |
+----+-------------+-------+------+---------------------------------------------+---------+---------+-------+--------+-------------+

■あれ
`user_id`使われちゃった。
困ったな。

■消してみる

ALTER TABLE `test`
DROP INDEX `user_id`;

■explainしてみる

explain select * from test
 where
admin_id = 14 AND user_id = 15;

■結果

+----+-------------+-------+------+-------------------------------------+-------------------+---------+-------------+--------+-------------+
| id | select_type | table | type | possible_keys                       | key               | key_len | ref         | rows   | Extra       |
+----+-------------+-------+------+-------------------------------------+-------------------+---------+-------------+--------+-------------+
|  1 | SIMPLE      | test  | ref  | admin_id__user_id,user_id__admin_id | admin_id__user_id | 17      | const,const | 146466 | Using where |
+----+-------------+-------+------+-------------------------------------+-------------------+---------+-------------+--------+-------------+

■お、使ってくれた。
でも、user_id__admin_idは使ってくれるのかな。andの左右を逆にしてみよう。

■explainしてみる

explain select * from test
 where
user_id = 15 and admin_id = 14;

■結果

+----+-------------+-------+------+-------------------------------------+-------------------+---------+-------------+--------+-------------+
| id | select_type | table | type | possible_keys                       | key               | key_len | ref         | rows   | Extra       |
+----+-------------+-------+------+-------------------------------------+-------------------+---------+-------------+--------+-------------+
|  1 | SIMPLE      | test  | ref  | admin_id__user_id,user_id__admin_id | admin_id__user_id | 17      | const,const | 146466 | Using where |
+----+-------------+-------+------+-------------------------------------+-------------------+---------+-------------+--------+-------------+

■あれ・・・・
user_id__admin_id使ってくれない。



◎以上から2つの結論が導かれる。
■複合インデックスで順番を気にすべき!というのはネットで散々書かれているのでホントっぽいけど
割とオプティマイザが内部でAND等の順番を入れ替えてしまっていると考えられる。
適切なインデックスを用いよう!としている様子。
ただ、単一インデックスがあるとそちらを使ってしまう傾向があるみたいに見える(こちらの検証はまた別の機会にしてみるけどオプティマイザを追うなんてのは割と泣けるから嫌かなぁ)
ので、複雑になった時はUSE INDEXやIGNORE INDEX※を用いるといいかも。









#http://dev.mysql.com/doc/refman/5.1-olh/ja/index-hints.html
#USE INDEX (index_list) を指定することによって、テーブル内の行を検索するために、指定されたインデックスの 1 つのみを使用するよう MySQL に指示できます。代わりの構文 IGNORE INDEX (index_list) を使用すると、いくつかの特定の (1 つまたは複数の) インデックスを使用しないよう MySQL に指示できます。これらのヒントは、MySQL が可能なインデックスのリストの中から、間違ったインデックスを利用していることを、EXPLAIN が表示したときに便利なものです。
#また、USE INDEX (index_list) と同様の機能を持つが、テーブルスキャンが非常に負荷が大きいと見なされる点が追加された FORCE INDEX を使用することもできます。言い換えると、テーブル内の行を見つけるために与えられたインデックスを利用できない場合、テーブルスキャンを利用することができるということです。
#各ヒントには、カラムの名前ではなく、インデックスの名前が必要です。PRIMARY KEY の名前は PRIMARY です。テーブルのインデックス名を表示するには、SHOW INDEX を使用します。

例:
SELECT * FROM table1 USE INDEX (col1_index,col2_index)
WHERE col1=1 AND col2=2 AND col3=3;
SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;

いまさらながらcakePHP入門。その1


Symfonyの応用でなんとかかんとか修正はできるんだけど1から構築となれば話は違う。
人に指示しておいて自分が出来ないと悲しいのでちゃんと入門してみる。
あとでレポートにして会社でも共有しようかなぁ

http://cakephp.jp/
からまずはダウンロードしてみた。

個人的に良くやるのがコマンドプロンプト
>tree>tree.txt

ツリーの一覧を見ることが出来る。
以下が1.3.13のツリー構造か。

C:.
├─app
│ ├─config
│ │ └─schema
│ ├─controllers
│ │ └─components
│ ├─libs
│ ├─locale
│ │ └─eng
│ │ └─LC_MESSAGES
│ ├─models
│ │ ├─behaviors
│ │ └─datasources
│ ├─plugins
│ ├─tests
│ │ ├─cases
│ │ │ ├─behaviors
│ │ │ ├─components
│ │ │ ├─controllers
│ │ │ ├─helpers
│ │ │ └─models
│ │ ├─fixtures
│ │ └─groups
│ ├─tmp
│ │ ├─cache
│ │ │ ├─models
│ │ │ ├─persistent
│ │ │ └─views
│ │ ├─logs
│ │ ├─sessions
│ │ └─tests
│ ├─vendors
│ │ └─shells
│ │ ├─tasks
│ │ └─templates
│ ├─views
│ │ ├─elements
│ │ │ └─email
│ │ │ ├─html
│ │ │ └─text
│ │ ├─errors
│ │ ├─helpers
│ │ ├─layouts
│ │ │ ├─email
│ │ │ │ ├─html
│ │ │ │ └─text
│ │ │ ├─js
│ │ │ ├─rss
│ │ │ └─xml
│ │ ├─pages
│ │ └─scaffolds
│ └─webroot
│ ├─css
│ ├─files
│ ├─img
│ └─js
├─cake
│ ├─config
│ │ └─unicode
│ │ └─casefolding
│ ├─console
│ │ ├─libs
│ │ │ └─tasks
│ │ └─templates
│ │ ├─default
│ │ │ ├─actions
│ │ │ ├─classes
│ │ │ └─views
│ │ └─skel
│ │ ├─config
│ │ │ └─schema
│ │ ├─controllers
│ │ │ └─components
│ │ ├─libs
│ │ ├─locale
│ │ │ └─eng
│ │ │ └─LC_MESSAGES
│ │ ├─models
│ │ │ ├─behaviors
│ │ │ └─datasources
│ │ ├─plugins
│ │ ├─tests
│ │ │ ├─cases
│ │ │ │ ├─behaviors
│ │ │ │ ├─components
│ │ │ │ ├─controllers
│ │ │ │ ├─datasources
│ │ │ │ ├─helpers
│ │ │ │ ├─models
│ │ │ │ └─shells
│ │ │ ├─fixtures
│ │ │ └─groups
│ │ ├─tmp
│ │ │ ├─cache
│ │ │ │ ├─models
│ │ │ │ ├─persistent
│ │ │ │ └─views
│ │ │ ├─logs
│ │ │ ├─sessions
│ │ │ └─tests
│ │ ├─vendors
│ │ │ └─shells
│ │ │ └─tasks
│ │ ├─views
│ │ │ ├─elements
│ │ │ │ └─email
│ │ │ │ ├─html
│ │ │ │ └─text
│ │ │ ├─errors
│ │ │ ├─helpers
│ │ │ ├─layouts
│ │ │ │ ├─email
│ │ │ │ │ ├─html
│ │ │ │ │ └─text
│ │ │ │ ├─js
│ │ │ │ ├─rss
│ │ │ │ └─xml
│ │ │ ├─pages
│ │ │ └─scaffolds
│ │ └─webroot
│ │ ├─css
│ │ ├─img
│ │ └─js
│ ├─libs
│ │ ├─cache
│ │ ├─controller
│ │ │ └─components
│ │ ├─log
│ │ ├─model
│ │ │ ├─behaviors
│ │ │ └─datasources
│ │ │ └─dbo
│ │ └─view
│ │ ├─elements
│ │ │ └─email
│ │ │ ├─html
│ │ │ └─text
│ │ ├─errors
│ │ ├─helpers
│ │ ├─layouts
│ │ │ ├─email
│ │ │ │ ├─html
│ │ │ │ └─text
│ │ │ ├─js
│ │ │ ├─rss
│ │ │ └─xml
│ │ ├─pages
│ │ └─scaffolds
│ └─tests...
├─plugins
└─vendors
└─shells
├─tasks
└─templates

なるほど。ざっくりは確認した。
cakeディレクトリ下がフレームワークのソースで
app下がアプリソースなのね。
じゃapp下だけを見ていこう。

├─app
│ ├─config
│ │ └─schema
│ ├─controllers
│ │ └─components
│ ├─libs
│ ├─locale
│ │ └─eng
│ │ └─LC_MESSAGES
│ ├─models
│ │ ├─behaviors
│ │ └─datasources
│ ├─plugins
│ ├─tests
│ │ ├─cases
│ │ │ ├─behaviors
│ │ │ ├─components
│ │ │ ├─controllers
│ │ │ ├─helpers
│ │ │ └─models
│ │ ├─fixtures
│ │ └─groups
│ ├─tmp
│ │ ├─cache
│ │ │ ├─models
│ │ │ ├─persistent
│ │ │ └─views
│ │ ├─logs
│ │ ├─sessions
│ │ └─tests
│ ├─vendors
│ │ └─shells
│ │ ├─tasks
│ │ └─templates
│ ├─views
│ │ ├─elements
│ │ │ └─email
│ │ │ ├─html
│ │ │ └─text
│ │ ├─errors
│ │ ├─helpers
│ │ ├─layouts
│ │ │ ├─email
│ │ │ │ ├─html
│ │ │ │ └─text
│ │ │ ├─js
│ │ │ ├─rss
│ │ │ └─xml
│ │ ├─pages
│ │ └─scaffolds
│ └─webroot
│ ├─css
│ ├─files
│ ├─img
│ └─js


MVC的に割りと分かり易いな。
controllersがC
modelsがM
viewsがVか。
まんまだー。

他のディレクトリは
│ ├─config
│ ├─libs
│ ├─locale
│ ├─plugins
│ ├─tests
│ ├─tmp
│ ├─vendors
│ └─webroot
か。
一応一個一個目算をつけておくと
configは設定
libsは共通のいわゆるライブラリ系。共通のクラスとか分類しにくいものを入れたりするのかも。
localeはローカライズなのかな?よくわからん。
pluginsは名前のままでプラグインだろう。
testsは、テスト。
tmpは、、まぁテンポラリだから気にしなくていいかな
vendorsはイマイチヨクワカラナイ
webrootは、CSSとかを格納したり、htmlを置いたりするのかな。
名前の通りかも。ようするにこのディレクトリをApacheのhomeにしておけばいいのか。

親切なマニュアルが結構ある。Symfonyはえらい違いだ・・・w
http://book.cakephp.org/ja/view/879/CakePHP%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86
一応ざーっと目を通す。


http://book.cakephp.org/ja/view/899/CakePHP%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E6%A7%8B%E9%80%A0
に全部書いてあった。
config CakePHP が使用する(数個の)設定ファイルが入る場所です。データベース接続の詳細、ブートストラップ、コアの設定ファイルなどがここに入ります。
controllers アプリケーションのコントローラとコンポーネントが入ります。
libs サードパーティ、外部ベンダからのライブラリではなく、ファーストパーティのライブラリが入ります。これはベンダライブラリと内部ライブラリの構成を分割することを可能にします。
locale 国際化のための文字ファイルが入ります。
models アプリケーションのモデル、ビヘイビア、データソースが入ります。
plugins プラグインパッケージが入ります。
tmp CakePHP が一時的なデータを保管する場所です。保管される実際のデータは、CakePHP の設定しだいですが、このフォルダは通常、モデルの内容データや、ログの保管に使用されます。時にはセッション情報も入ります。
確実にこのフォルダが存在し、書き込み可能であるようにしてください。そうしないと、アプリケーションのパフォーマンスは激しく影響をうけることになります。デバッグモードでは、CakePHPがそうなっているかどうかを警告してくれます。
vendors 外部(サードパーティ)で作成されたクラスやライブラリは、ここに置いてください。そうすることで、App::import('vendor', 'name') で簡単にアクセスできるようになります。注意して観察している人は、これは重複しているのではないか、と言うかもしれません。ディレクトリ構造のいちばん上にも vendors フォルダがあるからです。この二つのフォルダの違いは、複数のアプリケーションを動作させて、より複雑なシステムセットアップをする場合のことを考える際に扱いましょう。
views 表示用のファイルはここに置きます。エレメント、エラーページ、ヘルパー、レイアウト、ビューのファイルなどです。
webroot 運用時(production)用のセットアップでは、このフォルダがアプリケーションのドキュメントルートになります。CSS スタイルシートや画像、JavaScript を入れるためのフォルダもあります。
だそうだ。
なるほどね。

お、規約がある。
http://book.cakephp.org/ja/view/902/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%82%AF%E3%83%A9%E3%82%B9%E5%90%8D%E3%81%AE%E8%A6%8F%E7%B4%84
へーなるほど。
クラス名がキャメル(CamelCased)でファイル名はアンダースコアか。
>各ファイルは、 app フォルダ内のそれぞれ適切なフォルダの中かその下(サブフォルダも可)に設置します。
って書いてあるから、オートロードが有効なのかも?

http://book.cakephp.org/ja/view/903/%E3%83%A2%E3%83%87%E3%83%AB%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E8%A6%8F%E7%B4%84
>hasMany, blongsTo, hasOne 中の外部キーは、デフォルトで関連するモデルの(単数形の)名前に _id を付けたものとして認識されます。ケーキ職人(Backer)がケーキ(Cake)を複数持っている(hasMany)としたら、cakes テーブルは、baker_id を外部キーとして bakers テーブルのデータを参照します。categoly_types のような複数の単語のテーブルでは、外部キーは categoty_type_id のようになるでしょう。 For a multiple worded table like category_types, the foreign key would be category_type_id.

>モデル間の hasAndBelongsToMany (HABTM) の関係で使用される join テーブルは、join するテーブルに合わせて、アルファベット順に(zebras_apples ではなく、apples_zebras)並べた名前にしてください。
へー細かいなーメモメモ

あらら複数主キーをサポートしないのか。

今日はここまでかなー

L2J

久々にN鯖を回復させようとしてみたら、元々DBだったものがかなりXMLに・・・。
ということで、ガリガリXMLを手書きするのは嫌なので、プログラムを書いてみた。

<?php
$itemDir = "items";

define("NORMAL"        , "0");
define("MULTIPLICATION", "1");
define("ADDITION"      , "2");
define("SUBTRACTION"   , "3");
define("DIVISION"      , "4");

//ディレクトリ内のファイル名を1つずつを取得
$res_dir = opendir( './' . $itemDir );
while( $file_name = readdir( $res_dir ) ) if(strstr($file_name,'.xml')) $fileNameArray[] = $file_name;
closedir( $res_dir );

//ファイルごとのループ
foreach($fileNameArray as $fileName){
	echo $fileName . "===========\n";
	$file = $fileName;
	$xml = new SimpleXMLElement($itemDir.'/'. $fileName, null, true);
	//ここからどんどこ追加------------------------------------------------------
	$searchIdArray = array(729, 730,947,948,951,952,955,956,959,960,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,
		731,732,949,950,953,954,957,958,961,962);
	changeIsStackableFromIdArray($xml, $searchIdArray, "true");
	//ここまでどんどこ追加------------------------------------------------------
	$xml -> asXML( 'result/' . $file ); 
}

// 検索IDからpriceの変更を実行する
function changePriceFromIdArray($xml, $searchIdArray, $price){
	changeKeyFromIdArray($xml, $searchIdArray, "price", $price);
}

// 検索IDからpriceの変更を掛け算で実行する(multiplication)
function changeMultiplicationPriceFromIdArray($xml, $searchIdArray, $multiplicationValue){
	changeKeyFromIdArray($xml, $searchIdArray, "price", $multiplicationValue, MULTIPLICATION);
}

// 検索IDからis_destroyableの変更を実行する
function changeIsDestroyableFromIdArray($xml, $searchIdArray, $flag){
	changeKeyFromIdArray($xml, $searchIdArray, "is_destroyable", $flag);
}
// 検索IDからweightの変更を実行する
function changeWeightFromIdArray($xml, $searchIdArray, $weight){
	changeKeyFromIdArray($xml, $searchIdArray, "weight", $weight);
}

// 検索IDからis_sellableの変更を実行する
function changeIsSellableFromIdArray($xml, $searchIdArray, $flag){
	changeKeyFromIdArray($xml, $searchIdArray, "is_sellable", $flag);
}

// 検索IDからis_dropableの変更を実行する
function changeIsDropableFromIdArray($xml, $searchIdArray, $flag){
	changeKeyFromIdArray($xml, $searchIdArray, "is_dropable", $flag);
}

// 検索IDからis_tradableの変更を実行する
function changeIsTradableFromIdArray($xml, $searchIdArray, $flag){
	changeKeyFromIdArray($xml, $searchIdArray, "is_tradable", $flag);
}

// 検索IDからis_depositableの変更を実行する
function changeIsDepositableFromIdArray($xml, $searchIdArray, $flag){
	changeKeyFromIdArray($xml, $searchIdArray, "is_depositable", $flag);
}
// 検索IDからis_stackableの変更を実行する
function changeIsStackableFromIdArray($xml, $searchIdArray, $flag){
	changeKeyFromIdArray($xml, $searchIdArray, "is_stackable", $flag);
}

// 検索IDからcrystal_countの変更を実行する
function changeCrystalCountFromIdArray($xml, $searchIdArray, $count){
	changeKeyFromIdArray($xml, $searchIdArray, "crystal_count", $count);
}

function changeKeyFromIdArray($xml,$searchIdArray, $key, $value, $changeFormat = NORMAL){
	foreach($xml->item as $items){
		//検索IDArrayに入っているか
		if(in_array($items->attributes()->id , $searchIdArray)){
			$elementFoundFlag = false;
			$itemName = $items->attributes()->name;
			$itemType = $items->attributes()->type;
			$itemId   = $items->attributes()->id;
			//要素を走査
			foreach($items->set as $sets){
				//keyの項目か
				if($sets["name"] == $key){
					echo  "[$itemType\t$itemId\t$itemName]  $key : " . $sets["val"] . "";
					switch ($changeFormat){
					case (NORMAL):
						$sets["val"] = $value;
						echo $sets["val"] . " に変換\n";
						break;
					case (MULTIPLICATION):
						echo $value. "で乗算して";
						$sets["val"] *= $value;
						echo $sets["val"] . " に変換\n";
						break;
					case (ADDITION):
						echo $value. "で加算して";
						$sets["val"] += $value;
						break;
					case (SUBTRACTION):
						echo $value. "で減算して";
						$sets["val"] -= $value;
						break;
					case (DIVISION):
						echo $value. "で除算(÷)して";
						$sets["val"] /= $value;
						break;
					}
					$elementFoundFlag = true;
				}
			}
			//要素が存在しない場合
			if(!$elementFoundFlag){
				switch ($changeFormat){
				case (NORMAL):
					echo "情報: id[" . $items->attributes()->id . "]には" .  $key . "が存在しない様子。適切に要素を追加しました。";
					break;
				case (MULTIPLICATION):
					echo  "警告: id[" . $items->attributes()->id . "]には" .  $key . "が存在しない様子。" . $value. "で乗算する予定の値を、ひとまずそのまま入れておきました。";
					break;
				case (ADDITION):
					echo "警告: id[" . $items->attributes()->id . "]には" .  $key . "が存在しない様子。" . $value. "で加算する予定の値を、ひとまずそのまま入れておきました。";
					break;
				case (SUBTRACTION):
					echo "警告: id[" . $items->attributes()->id . "]には" .  $key . "が存在しない様子。" . $value. "で減算する予定だったので、ひとまず0を入れておきました。";
					$value = 0;
					break;
				case (DIVISION):
					echo "警告: id[" . $items->attributes()->id . "]には" .  $key . "が存在しない様子。" . $value. "で除算する予定だったので、ひとまず0を入れておきました。絶対修正してください。";
					$value = 0;
					break;
				}
				$items->addChild("set name=\"$key\" val=\"$value\"");
				echo "\n";

			}
		}
	}
}

過去のブラウザダウンロード方法

テストチームから言われて調べてみた。
過去のFireFoxダウンロード
https://ftp.mozilla.org/pub/mozilla.org/firefox/releases/
過去のChromeダウンロード
http://www.oldapps.com/google_chrome.php

割とあるもんだ=w=

NeoComplCache入れたいって聞いたので。

CentOS6.0インスコ直後。
adminでログイン

su -

yum install git

exit
cd ~
mkdir .vim
git clone https://github.com/Shougo/neocomplcache
cp -r ./neocomplcache/* ./.vim
vi .vimrc

[[	let g:NeoComplCache_EnableAtStartup = 1]]

exit

adminでログイン
以上。

Symfony2ドキュメント翻訳温泉ツアーに参加して

2011/7/23,24一泊二日で翻訳温泉ツアーに行ってきました。

成果は「翻訳できる環境を作り、2pullrequestしたこと」デス。
今後はチョコチョコ翻訳していきたいと思います。

やったことがなかった事
gitHubを使用(遅くて申し訳ないorz
・gitのリモートリポジトリにPush(・・・あ、そこ何か投げないで・・・(´Д⊂ヽウェェェン
・git rebase(あ、痛い痛い
・深夜のredbull買い占め
・テトラポッター爆誕

温泉の中で話した事
・Symfony2は、普通に使い物になるまでには2年掛かるんでは無かろうか
・使い物に成り始めたら、ユーザー会はむちゃくちゃ忙しくなる
・crocosがSymfony2を使って人柱になってくれている
・イケメン(@gilbite)はアメリカに行く
・イケメン(@gilbite)はギターを作りたい

思ったこと
Mac便利過ぎ
・みんなツッコミ過ぎ
・git clone早すぎ
・branchにしてもcommitにしても概念がSVNとはちょっと違う。頭切り替えなくちゃイカン。
・今まで聞いていたgitの利点の点が線になって行った
・日本語難しい
・Symfony2を今から勉強して隅々まで知っておけば、あらゆる開発に応用出来る
・イケメン(@gilbite)はイケメン
・みんなルノアラー