やねうら王の定跡生成コマンド

昨日公開した駒得のみの評価関数にしたやねうら王*1の定跡編集コマンドを公開します。

  • 定跡の生成コマンド

makebook depth 14 record -1

records.sfenから定跡を自動生成する。
あと、records1.sfen , records2.sfen , ..を配置してあると、そちらもrecords.sfenに連結されているものとみなして読み込む。

depth : そのときの探索深さ。default = 14。この深さで探索して -500以上ならば定跡に登録。
moves : 定跡化する最大手数。default = 32。
record : 使う棋譜の数。-1ならすべて
eval : この評価値以上ならば定跡に登録。default = -10000。
// defaultではすべて登録するが、-200以下になる指し手は採用しないのでこれはこれで構わない。
init : 定跡DBを初期化してから読み込む
skip : 棋譜のうち、最初の指定数の局だけ読み飛ばす。

makebook skip 100
なら101局目から開始。
skipmoves : 定跡の最初のN手をskipする。

makebook skipmoves 4
なら初手から数えて4手skipする。

mergebook
"shogi_book.db3"と"shogi_book2.db3"とを前者にマージする。
後者は前者を別のPCで定跡を生成してリネームしたものとする。
同じ局面の同じ指し手では探索depthが深いほうを採用する。

// depthが前者に登録されている局面のほうが深い場合skipする。
// このとき'.'を表示する。
// また、深いdepthだったので指し手をoverwriteしたなら'*'、
// その指し手が新規挿入なら'+'を表示する。


特別に以下の指し手はあまりにひどいので定跡DBにhitしたときに評価値を-10000しています。(ソースコードより抜粋)

auto gamePly = game.Searches.RootPos.game_ply();
vector removes;
switch (gamePly)
{
case 0 : // 先手の初手

// 検討モードで動かすことも考えてhashもチェックしたほうがいいか。
// てか検討モードでgamePly == 0を渡してくる将棋所がおかしいんだよな..
// gamePly = 0のときだけ局面のhash値もチェックすべきか…。
if (key == 650845876563499746ULL)
{
removes.push_back(make_move(SQ_59, SQ_68)); // 68玉
removes.push_back(make_move(SQ_39, SQ_48)); // 48銀
removes.push_back(make_move(SQ_49, SQ_58)); // 58金右
}
break;

case 1: // 後手の初手

// いかなる局面でも62銀と42玉は最善手ではないと思う。
removes.push_back(make_move(SQ_71, SQ_62)); // 62銀
removes.push_back(make_move(SQ_51, SQ_42)); // 42玉
break;
}

将棋所でPVの表示

seldepth
→ : 自ら定跡の局面で思考した指し手
← : 現在の対局で採用された指し手


例) 定跡学習させたい棋譜をrecords.sfenに用意して、やねうら王をダブルクリックして実行してコマンドラインから
makebook init moves 32 depth 24
と入力すれば、探索深さ24まで探索して、各対局棋譜の初手から32手目までを定跡として学習します。(initは定跡DBを開始前に初期化する指定)


参考記事)
コンピューター将棋の定跡をデザインする
http://d.hatena.ne.jp/yaneurao/20141114#p1

駒得のみの評価関数にしたやねうら王 V3.37を公開しました

以前のひよこ将棋が最新の将棋所ではthread = 1でないと動かないという苦情を受けて、いつか修正したものを公開してやる!!と思っていたのですが、やっと落ち着いたので、やねうら王の最新版(おもてなし定跡あり)の評価関数を駒得のみに変更したものを公開します。

ファイルはこのブログのヘッダーにある「ひよこ将棋関連の実行ファイルは → ここ 」のところに置いておきます。将棋所の思考エンジンとして使えます。

定跡についてはまだ生成過程ですので、今回の電王戦バージョンとは異なります。

レーティングはおそらく最新PCではR2000程度ではないかと思います。(わざと序盤で定跡を外したりしない限りは)

公開されている駒得のみの評価関数の将棋ソフトとして史上最強でしょう。
まあ、駒得のみなのでじわじわ押していけばアマ初段ぐらいの人でも勝てると思いますが。

対局した感想などもらえると嬉しいです。


思考エンジン設定などについてはこちらをどうぞ。
http://d.hatena.ne.jp/yaneurao/20141120#p1


やねうら王の定跡編集コマンドの仕様を公開しました。
http://d.hatena.ne.jp/hiyokoshogi/20141121/1416505613

Parallelaその後

並列プロセッサーであるParallelaは、Kickstarterで資金を集めていたようなのですが、その期日が16時間後に迫ってきました。

http://www.kickstarter.com/projects/adapteva/parallella-a-supercomputer-for-everyone


昨日の時点では予定額である$750,000に$100,000ほど満たなかったのですが、ようやく$750,000を超えたので$99払う人は16コア版が来年の5月ごろに届くことが確定的になりました。



しかしもうひとつの設定額である$3Mには満たないので64コア版は今回はリリースされないのだと思います。これについては、もう2,3年待たないといけないのかも知れません。


コンピューター将棋にParallelaのようなNUMA(Non-Uniform Memory Access)型のプロセッサーが適合するかどうか考えてみましょう。


NUMA型というのは、よくあるモデルとしてはタイル状にCPUを配置して、隣合うCPU(上下左右)同士をつないでやるというものです。


この上下左右の接続は比較的低い遅延で接続されていますが、それでも64個接続の場合で左上から右下へは下に7回、右に7回で14回のバケツリレーが必要なので14サイクル分の遅延はあります。結果データを回収するときも左上で回収するならば同様に14サイクルの遅延があります。往復で28サイクルです。CPU数が64個ではなく256個(16×16個)ですと往復60サイクルです。


いくらなんでも小さいタスクを投げて結果を回収するだけで60サイクルもかかるのは厳しいものがあります。また256個もCPUが接続されていますとデータを投げるだけで256回も投げないといけないのではメインのCPUに負担がかかりすぎます。


そこで、普通はメインのCPUの負担を減らすためにすべてのCPUに対してデータを投げる(ブロードキャストする)ための特殊な命令を用意します。左上のプロセッサーから伝達していくとして、このデータを受け取ると右側と下側に接続されているCPUにも同じデータを伝達するものとします。(Parallelaにそのような命令があるのかどうかは知りませんが。)


次に、タスク内容を左上のCPUからブロードキャストするのであれば、結果データの回収を右下のCPUからしたいのは言うまでもないことで、(計算は左上のCPUから終わるのでそれを右下に向かって伝達して右下で回収するほうが時間のロスが少ない)、NUMA型では上下左右のCPUと接続するだけではなく、リング状に接続することもよくあります。IntelのMany CoreであるKnights Cornerがこのようなリング状の接続をしていると言われています。(来年ぐらいには発売されるのでしょうか…)


コンピューター将棋に限って言えば、与えられるタスクはすべてのCPUにおいて同一だとして、例えば指し手生成であれば前回局面からの差分(次の1手の指し手情報)をブロードキャストして、そしてそれぞれのCPUが自分に割り振られた指し手を生成するという仕組みを取ります。そう考えますとブロードキャストは頻発するのでブロードキャストは少しでも速いほうが良く、本当にバケツリレーで伝達していいのかという問題はありそうです。


データの回収も、例えばそれぞれのCPUが局面の部分的な評価値を計算して結果を右下のCPUに伝達するのであればその伝達するときに足し算もして欲しい気はします。すなわち、CPU間で情報を伝達するときに足し算マークがついていれば、左のCPUから来た情報と上のCPUから来た情報を足し算したものを次のCPUに伝達するというような仕組みです。


そう考えますと、コンピューター将棋にとって望ましいのは64コア版のParallelaではなく、FPGAでNUMA型の汎用プロセッサーを実装するほうがいいのではないかとも思えます。少なくとも局面の評価値を計算するだけでしたら乗算・割算はもとより引き算も不要ですので、汎用プロセッサーと言えども命令数はかなり少なくて済みますから、Z80が1200LE(LE = Logic Element)程度で収まることを考えますと、一つのCPUはそれ以下のLE数で収まることは間違いなく、300K LEぐらいの製品でも256CPUは可能なのではないでしょうか。


FPGAでNUMA型の汎用プロセッサーを実装する利点としまして、一度論理合成をしてしまえばそのあとはその汎用プロセッサー用の命令でプログラムを書いていけばいいので以降は論理合成をする必要はなく、また、その汎用プロセッサー用のエミュレーターを実装すれば効率的にデバッグが出来るようになるということです。


FPGAのほうは、いまであればVirtex-7あたりが良いと思うのですが、300K LE規模の評価ボードで$3500程度。1M LE規模の評価ボードはおそらくその3倍ぐらいのお値段です。コンピューター将棋の探索部もまるごとFPGA化しようと思いますと、FPGA上に汎用CPUを実装してその汎用CPU用に実装するのであればそれ自体は難しいことではないのですが、Intelの最新のプロセッサーに比べて1/4程度の速度にすることすら難しいのが実状で、なかなか厳しいものがあります。


局面の評価値の計算だけFPGAでやらせるようなソリューションもありだとは思うのですが、PCIe、もしくはHyperTransportで接続したとしてもCPUとFPGA間での往復だけで0.5ms程度かかるらしく*1、他の部分の時間がすべてゼロで済んでも2Mnpsしか出ません。実際はゼロでは済まないので500Knpsすら厳しいと思います。


このような場合、CPU側は並列探索して、FPGA側からの結果を待たずにどんどん局面を投げてlatencyを隠匿させるのが普通ですが*2、仮にFPGA上では局面の評価を1秒に20M回ぐらい出来ていたとしても、1Mnps程度の実効速度すら出るのかどうか…。



Parallelaにもっとローカルメモリーがあれば普通にそれぞれのCPUに探索を割り振って並列探索をさせたほうが良さそうですが、そんなにローカルメモリーはありません。IntelのKnights Cornerの場合、それが出来そうですが、1GHz程度とアナウンスされていますので√N程度の実効しか出ないとすれば、50CPUでも…。計算したくありませんね。並列探索の効率は√Nほど悪くないと思うのですが、それでも1GHzでは萎えますね。


ただ、FPGA上に汎用CPUを作る場合、ASICに比べると動作周波数は低いはずで、500MHz程度ですら出るかどうかわからず、さらに厳しいです。



結局のところ、凄く時間のかかる局面評価だけをFPGAに投げて、メインCPUとのやりとりにかかるlatencyを隠匿するためにメインのCPU側では並列探索(100並列ぐらい?)を行なうのがいいような気はするのですが、そうしますとメインCPU側から渡す局面図が前回からの差分で済みませんから…いやはや考えたくもないですね。


ヘテロジニアス型のマルチコアでの並列コンピューティングはコンピューター将棋にはあまり向いてないのでしょうね。少なくとも普通のハイエンドCPUと同等のnpsで同等の処理が出来るということだけを目標としたとしても非常に厳しいものがありそうです。

泥沼流コンピューター将棋

米長先生の将棋は昔、「泥沼流」と呼ばれていたことがあります。


厚みを重視し、劣勢になると自陣に駒を打ち付け複雑にして逆転を狙う棋風からそう呼ばれていたようなのですが、局面を複雑化したり、定跡を外したりするのはコンピューターのみならず、人間相手でも有効です。


特に近年、どうやってコンピューター将棋が人間相手に手加減をするかという部分に注目が集まっており、私は「泥沼流」コンピューター将棋を作れないかと考えておりました。


そこで、見かたを変えまして「前例のないような局面」に誘導することを思いつきました。


「前例のない」というのをどう定義するかですが、盤面全体と比較してしまいますと定跡から外れた時点で「前例のない」局面ということになってしまい、これでは意味をなしません。


Bonanzaであれば3駒相対で評価しますが、これらのパラメーターに対して学習棋譜にその特徴が出現した回数もカウントしておきます。これが少ないものには加点します。さすがに評価値がマイナスのものに加点してプラスにするのは気持ちわるいので、評価値がプラスのものにのみ加点します。


例えば次のような計算式はどうでしょう。


評価値 = c1 × 元の評価値 / log(出現回数 + c2)
c1,c2は適当な係数。棋譜の量などで調整する。


こうしておけば出現回数が多いほど評価値が減少します。


実戦ではあまり現れない形を好んで指すようになり、それでもそこまで悪くはない形(少なくとも元の評価値はプラスなので)を目指すはずです。


米長先生の「泥沼流」とはまた違うかも知れませんが、人間の棋譜ではあまり見られない形が出てくるこのようなコンピューター将棋というのもまた面白いのではないでしょうか。

Parallellaによるコンピューター将棋の開発

Parallellaという16/64コアの並列コンピューティング向けのプラットフォームが発表(発売)されました。16コア版が$99、64コア版は$199(予定)で手に入るようです。


Adapteva公式
http://www.adapteva.com/


RISCチップでそれぞれのコアは1GHz程度で動作しているようです。OpenCLでプログラムをすることも出来ます。ただOpenCLですと並列化に向かないような処理をさせる場合には最大限の能力は発揮できないでしょう。アーキテクチャマニュアルを見る限り、もう少し細かい並列化も可能のように思えます。


ちなみに、128×128の行列の掛け算は16コア版で2ms以下で終わるそうです。つまり128×128×128回(=2^(7*3)=2M回)の掛け算と足し算が2ms以下ということで1秒間に1G回以上の掛け算と足し算が出来るということですね。アドレッシングに数命令かかり、ループ変数のインクリメント、ループの終了判定〜ジャンプにも2,3命令かかることを考慮しますと、そこそこ速いのではないでしょうか。


アーキテクチャマニュアルを見る限り、コア間はeMesh(TM)で接続されているそうです。ぱっと見た感じ、コアごとに(x,y)のような二次元座標みたいな番地が振ってあって、バケツリレーで運ぶように見えますが、よくわかりません。メモリアクセスがもっとボトルネックになるのかと思ったら、行列の掛け算の例から察するに、結構の性能が出るんだなーというのが正直なところです。


まあ、16コア版でもIntelのハイエンドCPUの1コアの3倍ぐらいの処理が出来るでしょうから、64コア版ですと、10倍ぐらいの処理はできるのではないでしょうか。コンピューター将棋の並列探索の効率が√N程度だと仮定しますと、シングルコアの10倍の速度で探索が出来るならばそれは100コア相当という計算になり、なかなか夢が広がりますね。


それでまあこのParallellaのようにコア間の通信コストが極めて小さい場合、実質的にシングルスレッドで高速に探索させることが可能だと思うのですが、そのためには評価関数は時間がかかるものであればあるほど得だというのはあります。


たとえば、BonanzaGPS将棋の評価関数ではBonanzaのほうが3倍ぐらい評価関数は軽いですが(正確に比較したことはありません)、その分たくさん探索できるので、総合的な棋力としてはGPS将棋と互角ぐらいに落ち着きます。


つまり、これがほぼ互角だとしますと、評価関数を重くしてその代わりに探索速度を低下させてもBonanzaGPS将棋と互角ぐらいになる評価関数も設計できるはずです。こうして評価関数をどんどん時間のかかるものにしていこうと考えます。


そうして行きますと計算に非常に時間がかかる(だけど精度は良い)評価関数が出来上がるわけですが、このように重い評価関数のほうが、Parallellaのようなコア間の通信コストが極めて小さいプラットフォームでは評価関数の計算をする部分を並列化したときの並列化効率が良いことになります。


そもそも評価関数以外の部分、たとえば指し手生成を並列化すると言いましてもそんなにたいした並列化はできません。むしろ、Parallellaの場合、動作クロックが低い分、普通のIntelのCPUと比較して速くなるかどうかすら微妙です。ゆえに評価関数のところで速度を稼がねばというのはあります。


ともかく、64コア版が$199で手に入るのですから、これが1台のハイエンドPCより少しでも速く探索できるのであれば、この64コア版でクラスターを組むのはありなのではないでしょうか。$199ならば普通のハイエンドPCより断然安いでしょうから。


個人的には、ParallellaにARMのA9ではなく、iPhone5に載っているものか、その倍ぐらいの性能のものがメインのCPUとして載っていれば、そのプロセッサに探索のメイン処理を任せられるのになぁというのはあります。評価関数の計算だけ並列してやらせようというアイデアですね。


まあともかく、並列コンピューティングがなかなか面白い状況になってきたのではないでしょうか。

自己対戦棋譜からの学習

皆様、明けましておめでとうございます。皆様、いかにお過ごしでしょうか。


私のほうは、いまとあるベンチャー企業のスタートアップに関わっていて、忙殺されております。
このベンチャーが数年後に株式上場でもしてくれれば、笑いが止まらなくなるのでしょうけど、もうしばらくは乾いた笑いしか出てきそうにありません。


さて、最近、自己対戦棋譜から棋譜からの学習が可能なのかが話題になっているようなので、少し思うところを書いておきます。


従来、棋譜からの学習にはプロ棋士の対局棋譜を使ってきました。これは、プロ棋士の対局棋譜に最善手が多く含まれていると仮定できるからです。つまり、最善手をたくさん含んでいる棋譜から学習させたほうがより強くなるということですね。


近年、floodgateの棋譜からのみ学習させるという研究が発表されました。*1 floodgateの棋譜将棋倶楽部24棋譜とでは前者から学習させたほうが良いというのが結論のようです。floodgateの棋譜とプロ棋士棋譜とではどちらがいいのかはその記事からはよくわかりません。


いまや終盤ではコンピューター将棋のほうが人間を上回っていることは間違いないので、コンピューター将棋が即詰みや必死を読みきれる局面であれば、それはその局面の最善手であり、人間の棋譜の指し手よりは優れているわけです。


ゆえに、そういう局面で人間の棋譜の指し手から学習させるよりは、コンピューターの指し手から学習させるほうが精度が良いことは自明です。


プロ棋士の対局における明らかな悪手を排除し、終盤の読み切りが出来る局面以降はコンピューターの示す最善手から学習させることは意味があることです。ある対局で勝ったほうの指し手からのみ学習させると有意に強くなるのは、負けたほうには何らかの悪手が含まれていて、それが学習する上で有害だからです。


では、コンピューターが読みきれる局面の指し手のみを与えて学習させた場合はどうなるでしょうか。


この場合、終盤の玉頭付近へ駒を移動させるような指し手を正しく評価出来るようになることは十分予想できますが、序盤の銀を繰り出すような指し手や玉を囲うような指し手までは評価できるようにはならないでしょう。


ここで、自己対戦棋譜からの学習にどうしてもこだわるのであれば、序盤の玉を囲うような指し手をどうやれば評価できるのかという話になります。


一つの方法として、序盤のある局面でいくつかの指し手をランダムに指してみて、そのなかでそのあと(普通に対局を進めて)勝率が一番良かった指し手を最善手とみなして棋譜からの学習を行なうことです。


これは遺伝的アルゴリズムを適用するときにある程度個体にばらつきを持たせてそれらの個体のなかで一番優れたものを採用するのにも似ています。


このようにすれば、序盤もそこそこ学習できそうに思えますが、そう簡単ではないです。


例えば、ランダムに指し手を選択するときに48銀と銀を繰り出す指し手だけ指しても、このあとこの銀を57に運んだりしないと単なる壁銀になってしまい、勝率としてはむしろ下がるかも知れないからです。こう考えるとランダムに指し手を1手だけ選択するという手法だと自己対戦棋譜から学習できそうにありません。せめて、ランダムに数手セットで指させて、そのなかで勝率の高かったものを選ぶ必要がありそうです。


例えば、囲いに関してはどうでしょうか。囲いは、例えば、金銀が離れ駒になっている状態でそのあと普通に対戦させれば、離れ駒になっているほうが勝率は下がるはずであり、離れ駒がなく、うまく囲いに入っているほうが勝率は高くなるはずです。ゆえに、囲いはおそらくこの方法で自己対戦棋譜から学習出来ても不思議ではないと思います。しかし、もしかしたら、ランダムに指し手を選択して銀冠にしたあと、その銀冠よりは普通の美濃囲いのほうが評価値が高いので銀冠→美濃囲いに戻してしまい、単に手損して形勢を損ねるだけで、いつまで経っても銀冠の良さが評価できないということは起こりえます。


そこでこのランダムに選択して動かした駒をしばらくは元の位置には戻さないというような抑制が必要かも知れません。


さて、攻めの手は自己対戦棋譜から学習できるでしょうか?


コンピューター将棋に棒銀が出来るようにしようと考えますと、まず攻めの銀と守りの銀を交換したことがプラス評価されていなければなりません。これは終盤の指し手から十分学習可能だと思うで、これは学習できているとしまして、次に、攻めの銀と守りの銀が交換できるというところまで探索できなければなりません。これは、20手ぐらい先まで調べなければなりませんが、銀を前進させることによって評価値が上がりませんと、早い段階で枝刈りされてしまいます。ゆえに、枝刈りされずに20手ぐらい先まで読めなくてはなりませんが、それはつまり、あまりいい手に見えなくても枝刈りせずに先まで読もうという話であって、そんなことをしますと、いまのコンピューターの計算能力では10手ぐらいまでしか先を読めません。


つまり、この方法ですと自己対戦棋譜からは棒銀の成功体験を学習することは出来ないことがわかります。


それでは、ランダムに指し手を何手か進めるというときに、もう少し恣意性を持たせて、例えば攻めの駒であれば、その駒だけを数手ランダムに前進させてみてはどうでしょうか。


例えば、銀を3手前進させますと、棒銀が成功するまでの手数が20手 - 3×2手 = 14手に短縮されますので、枝刈りされずに14手先まで読むことが出来れば、棒銀が成功します。(枝刈りされずに14手先まで読むというのが計算量的に大変だというのはありますが、さきほどよりはうまくいきそう、というのはわかっていただけるかと思います。) ゆえに、このとき、棒銀の成功棋譜が出来上がり、そこから攻めの銀は前進しているほうが価値が高いであろうことが学習できます。


よって、このアイデアを元に改良していけばそこそこうまく行く可能性があるとは思います。


しかし、1つの棋譜を生成するのに、ランダムに数手選択→そのあと普通に対局させるというような手順を行なう必要があるので、棋譜を1つ生成するのにすごく時間を使います。また、対局を1手1秒のように対局時間を絞ってしまいますと、棒銀の成功までが読めずに、攻めの手が学習できないであろうことはわかります。ゆえに、対局時間をあまり絞ることは出来ません。


私が思うに1つの棋譜の生成に数時間を要するはずで、1年かけても1000棋譜用意できればいいほうでしょう。この生成された棋譜で学習→新しくなった評価関数でまた1年かけて1000棋譜を生成→その棋譜で学習 というような反復をしていけば次第に強くなる(かも知れない)のですが、非常に長い歳月を要することがわかります。また、これで本当に強くなっていくとは限らないので、そんな長い歳月を費やして実験して、「やっぱり途中から強くなってませんでした」というような事態は避けるべきです。


ゆえに、自己対戦棋譜からのみの学習というのは、なかなかハードルが高いとは思います。


ただ、私は自己対戦棋譜からのみの学習自体は工夫次第では可能だと思っていて、何かここに書いたアイデアを改良し、誰かが実現してくださることを期待します。

ボンクラーズの伊藤さんからのクリスマスプレゼント

ボンクラーズの伊藤さんから、素晴らしいクリスマスプレゼントが届きました。(以下のコメント)

http://d.hatena.ne.jp/hiyokoshogi/20111223#c1324693510

A級 2011/12/24 11:25
ひよこ様
漢ですねぇ!某法人もこういうふうであってくれるといいのですが。

ひよこさんの実験的・実証的姿勢は大変興味深く、注目しています。応援しております。

24もありますが、ソフトどうしだとまたいろいろ言われて久米さんの頭痛の種を増やしたりしますので、floodgateの方がいいような気がします。当方も24の方は最近は相手が固定化してマンネリ気味な面もありますので、強い相手がいるならfloodgateの方に行くのも全然アリです。ひよこさん側の準備できましたらお申しつけください。
あと、この場を借りてなんですが、他のコン将開発者の方も、「強いバージョンできたから試したい!」というのがありましたら表明してくだされば、こちらもマシンの事情の許すかぎり参戦しますので。

ちなみに今のボンクラーズは、たとえば4コアPC3台なら、1台は4スレッドで使い、4スレッド/スレーブノード x 3ノード、というふうになります。

これにより、ひよこ将棋とボンクラーズとのfloodgateかどこかでの直接対決が実現しそうです!!

そして、『他のコン将開発者の方も、「強いバージョンできたから試したい!」というのがありましたら表明してくだされば、こちらもマシンの事情の許すかぎり参戦しますので。』とのことですので、他のコンピューター将棋開発者の方も、ボンクラーズと対局してみたくなれば伊藤さんにメールしましょう。メールの件名は「2011年度のクリスマスプレゼントの件」とかで通じると思います。通じませんか。そうですか。

私のほうは評価関数を一から設計しますので、棋譜からの学習にかかる時間+試行錯誤の期間として半年ぐらいあとになる気がしますが、いくら遅くとも来年のクリスマスまでには「2011年度のクリスマスプレゼントの件」というメールを伊藤さんにお送りしますので、よろしくお願いいたします。


よーし、俄然、燃えてきました!!