まあ…ちょっとは進んだ…のかな…?

Google Maps APIをたたいてC#アプリケーションに…ではなく
StreetViewを作ってるJavaScriptの方にキーイベントを設定しておいて、
Formをロードしたときに、そのフォームがアクティブになってれば
キーイベントで動かせる⇒APIたたかなくても、ジェスチャーをキーイベントにあてはめればいける!

うん、なんかいけそうな気がちょっとだけ、ちょっとだけする。
StreetViewのJSにキーイベントの設定はできたし。

しかーし。NITEがいう事聞いてくれないから再インストールしようとしたらー
バージョン違ったからOpenNIまで再インストールするはめになりー
んでもって色々めんどくさい。

とりあえず環境変数が見つからないみたい。私のサンプルちゃん。

あーーーーー
お腹すいたので帰ろうかな。

とりあえずちょっとはすすめられた!
今週中にちゃんともっかいサンプル動くようにして、
視点移動はがんばるぞ!!!!

足踏みもできないわけじゃないのかな…



あーー。大好きな物いっぱいあって幸せだけど考えこんでしまうわ。
ぬおー出来る気がしないよういやホントに。ホントに。やばいよ。

とりあえずVisual Studio使って、形から入ってるなう。
Web Browserにpu-kumamoto.ac.jpのサーバに上げたStreetView表示させて、
画面設計だけはやってみてるけど…
足踏みwwwマジ足踏みwwwwwwww\(^o^)/

先にSwipeDetecterとの連携を頑張ってみてる。
まあBodyMouseとかより先にそっちやったが現実的だよね。

もう逃げたい。
くっそー!

社会人になる前のトレーニングと思って頑張るぞおおおおおおお。・゚・(ノД`)・゚・。
いやもうホントにやっと進んできたかもしんないな。
今までなにやってたんだろ。

もっと早くこのことくらいわかるべきだったぞwww

でもやっと楽しくなった~!

とりあえず
・Google maps API(JavaScript)はC#でもコード書けることがわかった。
Visual Web Developerを使用するー!
しかし座標の取得とかはYWorksキーがいるので取得しよう。1680円。

・BodyMouseはうっすらやってたけどもっかいちゃんとしよう。精度もあげなきゃ。
・パワポはちょいちょいいじってるしまだいいかなー。

・Visual Studio 2010 C# Expressで開発するのかVisual Web Developerでやるのかだよね。
どっちかというともうDeveloper上でOpenNIまで組み込めるのなら一つのHPみたいな感じで作ってもいいのかなあ。

がんばれあたし。

いっぱい色々あるけど。

きっついけどきつくないとだめだ。

ふふーい。
夏期講習前半しゅーりょー
つまり、卒研地獄がついにやってきたwwww

まずもってホント進んでないからwww
背景から考えなおしだからwwww

CiNiiで見つけた論文についてー


【スマート・エイジングのためのバーチャル散歩システム(BCI/BMIとその周辺,一般)Virtual Walking System for Smart Aging】

杉原 僚太
SUGIHARA Ryouta
東北大学医工学研究科
Graduate School of Biomedical Engineering, Tohoku University
杉田 典大
SUGITA Norihiro
東北大学サイバーサイエンスセンター
Cyberscience Center, Tohoku University
本間 経康
HOMMA Noriyasu
東北大学サイバーサイエンスセンター
Cyberscience Center, Tohoku University
吉澤 誠
YOSHIZAWA Makoto
東北大学サイバーサイエンスセンター
Cyberscience Center, Tohoku University

本研究では,高齢期の変化を積極的に受け入れて賢く年をとるスマート・エイジングを実践するため,従来にはないバーチャル散歩システムを開発した.具体的には,仮想空間と現実空間をうまく融合させ,高齢者が安全に散歩を楽しむことができるようにするための歩行器搭載型ディスプレイ(WFMD)を作成した.本システムは,歩行器にラップトップ型PC,小型プロジェクタ,スクリーンを搭載し,ユーザは仮想空間を楽しみながら実際に近い状態で安全に散歩ができる.さらに,ゲームの汎用コントローラWiiリモコンをセンサとして用いることで,一般ユーザにも使える安価なシステムとした.また,従来のバーチャルリアリティ・システムであるヘッドマウンテッドディスプレイと比較をする実験を通して,本システムの有効性を示した.

In this study, a novel virtual walking system has been developed for putting the concept of advocating a positive acceptance of the later stages of life or aging, called smart aging, into practice. An essential core of the system can be found in balancing between virtual and real worlds for old people to use pleasantly and safely. The system consists of a laptop computer, micro-projectors, and a completely new screen system mounted on the walking frame, called "walking frame mounted display (WFMD)." Users can physically walk with pleasure by the virtual reality technology and safely by the WFMD in the virtual world. Furthermore, by using the video game controller "Wii Remote" as the sensor, the system is sufficiently inexpensive for home use. Experimental results clearly demonstrate the effectiveness of the system compared to the virtual reality system with conventional head mounted display.

*******
【A-19-7 頭部動作検出による視線変更可能な仮想空間散歩システムの開発(A-19. 福祉情報工学,一般セッション)
A-19-7 Development of Virtual Walk System with Changing Viewpoint by Head Motion】

中島 祥順
Nakashima Yoshiyuki
佐賀大学大学院工学系研究科
Graduate School of Science and Engineering, Saga University
古川 達也
Furukawa Tatsuya
佐賀大学理工学部
Faculty of Science and Engineering, Saga University
相知 政司
Ohchi Masashi
佐賀大学理工学部
Faculty of Science and Engineering, Saga University
保利 敏之
Hori Toshiyuki
佐賀大学理工学部
Faculty of Science and Engineering, Saga University

PDFで保存済

*******
【GPS視覚障害者歩行支援システムの研究 : 仮想散歩機能を中心に(福祉情報工学,一般)
GPS Based Navigation System for Blind Pedestrians : Implementation of Virtual Walk Function】


石川 准
Ishikawa Jun
静岡県立大学
University of Shizuoka
兵藤 安昭
Hyodo Yasuaki
株式会社アルプス社
ALPS MAPPING K.K.

PDFで保存済

********
今日がんばること
・論文んでもって背景がんばる
・APIC#でやってみる
------ここまでは頑張る------
・足踏みプログラミング
↑一応いれとく


あーもう色々考えたり後悔したりやだよー
平和に幸せに生きたいぜ・・・!

でも、無駄にはならないといいな。
プログラミングはまだ理屈さえきちんとわかればどうにかなる!

しかーし

APIたたくのとか初体験すぎて無理★
しかもそういえばこっちにはGMのHTMLが禁止タグになるの忘れてたー
KumaScapeのマッピングするときになみだを飲んだというのにwwwww

とりあえずもいっこ卒研用にBlogger開設せんとAPIの実験ができんなー。゚(PД`q。)゚。

めんどいー

ってかねむい。

Bloggerうまく開いてくれないし帰って寝ようかな・・・




もやもやするわー!
なんていうか。
パソコン重たくていやになる。

足踏みの判定方法について構想なう。

(1)関数2つ作って、座標を配列にいれて、1こ前の座標を1この関数にいれて
もういっこの関数に今の座標をいれて、それで判定する

(int)RK.Y>300
0

(inr)RK.Y>300
1

として
0,0----×
1,0----
0,1----
1,1----

でやる?

→求めている形ではあるが、めんどい←
ってか、描画のやつ分何度も配列にいれるってできんの?

(2)判定ラインを(int)RK.Y=300として
(int)RK.Y=300の時にあしぶみ1回とし、(仮の)
/2したものを実際の足踏みとしてカウントする

重たくて=300のラインを絶対通ってるのにカウントしないwwwww

カクカクするwwwww

ぬあああああ!


列挙体使うまでもないような気がする。

ぬ。

オープンキャンパスか・・・

べーきんぐぱうだーめw
なんとかCalibrationで座標取得、表示はおっけい。
足踏みのシステムも考えた。

しかーし!
判定ラインをあがってさがって一歩っていうのがうまくいかない。
まなてぃいわく「フラグやな!」て言われたけどまだまだ勉強不足なう。
がんばらなければいけない。

でも、それがわかれば足踏みはおっけーだから
しかもSwipeDetectorで上下左右はおっけーだから

Google Maps APIとの連携、AB-roadとの連携に入らなければならんな。

とりあえず、プログラムの基礎勉強+ふらぐとはなんぞや+背景をもっかい考えよう。

色々あるけど、きらきらする自分にもなりたいし頑張らなければ!
頑張ってたら自然と魅力が出てくると・・・思う・・・が・・・・。

先生から送ってもらった
【歩行可能な簡易VRシステムを用いた、街中情報配信システムの設計と実装】を読み解くなう。



*******
ここでめも。
DICOMO2009シンポジウム
「マルチメディア通信と分散処理(DPS)」、「グループウェアとネットワークサービス(GN)」、 「モバイルコンピューティングとユビキタス通信(MBL)」、「コンピュータセキュリティ(CSEC)」、 「高度交通システム(ITS)」研究会および「ユビキタスコンピューティングシステム(UBI)」 「インターネットと運用技術(IOT)」研究会の共催、「放送コンピューティング(BCC)」研究グループ、 「電子化知的財産・社会基盤(EIP)」研究会および「情報セキュリティ心理学とトラスト(SPT)」研究グループの協賛で DICOMO2009シンポジウムを開催します。
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using OpenNI;
using NITE;

namespace SwipeDetector
{
// アプリケーション固有の処理を記述
partial class Form1
{
// 設定ファイルのパス(環境に合わせて変更してください)
private const string CONFIG_XML_PATH = @"../../Data/SamplesConfig.xml";//C/あしぶみ/Data←あしぶみまでがカレントディレクトリ

private Context context;
private ImageGenerator image;
private SessionManager sessionManager;
private NITE.SwipeDetector swipeDetector;

//*****
private UserGenerator user;
private SkeletonCapability skelton;
private DepthGenerator depth;
private string pose = string.Empty;
private string message = "";
//*****
enum SessionState
{
NotInSession,
DetectSession,
InSession,
}

private SessionState sessionState = SessionState.NotInSession;
private Direction direction = Direction.Illegal;

// 描画用
private Brush brush = new SolidBrush(Color.Black);
private Font font = new Font("Arial", 30);
private PointF point = new Point(0, 0);

private Pen pen = new Pen(Color.Yellow, 8);

// 初期化
private void xnInitialize()
{
// コンテキストの初期化
context = new Context(CONFIG_XML_PATH);

// イメージジェネレータの作成
image = context.FindExistingNode(NodeType.Image) as ImageGenerator;
if (image == null) {
throw new Exception(context.GlobalErrorState);
}

//*****
//[Calibration]より
// デプスジェネレータの作成
depth = context.FindExistingNode(NodeType.Depth) as DepthGenerator;
if (depth == null) {
throw new Exception(context.GlobalErrorState);
}

// デプスの座標をイメージに合わせる
depth.AlternativeViewpointCapability.SetViewpoint(image);
   //ユーザージェネレータの作成
user = context.FindExistingNode(NodeType.User) as UserGenerator;
//ユーザー検出機能をサポートしているか確認
if (!user.IsCapabilitySupported("User::Skeleton")) {
throw new Exception("ユーザー検出をサポートしていません");
}

// ユーザー認識のコールバックを登録
user.NewUser += new EventHandler(user_NewUser);
user.LostUser += new EventHandler(user_LostUser);

//キャリブレーションにポーズが必要か確認
skelton = user.SkeletonCapability;
if (skelton.DoesNeedPoseForCalibration) {
// ポーズ検出のサポートチェック
if (!user.IsCapabilitySupported("User::PoseDetection")) {
throw new Exception("ユーザー検出をサポートしていません");
}

// キャリブレーションポーズの取得
pose = skelton.CalibrationPose;

// ポーズ検出のコールバックを登録
PoseDetectionCapability poseDetect = user.PoseDetectionCapability;
poseDetect.PoseDetected += new EventHandler(poseDetect_PoseDetected);
poseDetect.PoseEnded += new EventHandler(poseDetect_PoseEnded);
}

// キャリブレーションのコールバックを登録
skelton.CalibrationStart += new EventHandler(skelton_CalibrationStart);

skelton.CalibrationEnd += new EventHandler(skelton_CalibrationEnd);

// すべてをトラッキングする
skelton.SetSkeletonProfile(SkeletonProfile.All);

// ジェスチャーの検出開始
context.StartGeneratingAll();


//*****
// NITEのためのセッションマネージャを作成
sessionManager = new SessionManager(context, "Wave,Click", "RaiseHand");

// セッションの開始と終了を通知するコールバックを登録する
sessionManager.SessionStart += new EventHandler(sessionManager_SessionStart);
//new SessionManager.SessionStartHandler(sessionManager_SessionStart);
sessionManager.SessionEnd += new EventHandler(sessionManager_SessionEnd);
//new SessionManager.SessionEndHandler(sessionManager_SessionEnd);
sessionManager.SessionFocusProgress += new EventHandler(sessionManager_SessionFocusProgress);
//new SessionManager.SessionFocusProgressHandler(sessionManager_SessionFocusProgress);

// Wave(左右運動の検出器)
swipeDetector = new NITE.SwipeDetector();
swipeDetector.GeneralSwipe += new EventHandler(swipeDetector_GeneralSwipe);
//new SwipeDetector.GeneralSwipeHandler(swipeDetector_GeneralSwipe);
swipeDetector.SwipeUp += new EventHandler(swipeDetector_SwipeUp);
//new SwipeDetector.SwipeUpHandler(swipeDetector_SwipeUp);
swipeDetector.SwipeDown += new EventHandler(swipeDetector_SwipeDown);
//new SwipeDetector.SwipeDownHandler(swipeDetector_SwipeDown);
swipeDetector.SwipeRight += new EventHandler(swipeDetector_SwipeRight);
//new SwipeDetector.SwipeRightHandler(swipeDetector_SwipeRight);
swipeDetector.SwipeLeft += new EventHandler(swipeDetector_SwipeLeft);
//new SwipeDetector.SwipeLeftHandler(swipeDetector_SwipeLeft);

// リスナーに追加する
sessionManager.AddListener(swipeDetector);

// ジェネレータの動作を開始する
context.StartGeneratingAll();

}

string Houkou;//文字タイプの「Houkou」準備



// 描画
private unsafe void xnDraw()
{
// コンテキストとセッションマネージャーの更新
context.WaitAndUpdateAll();
sessionManager.Update(context);

// 画像データを取得する
ImageMetaData imageMD = image.GetMetaData();
//Calibration
SceneMetaData sceneMD = user.GetUserPixels(0);

// カメラ画像の作成
lock (this) {
// 書き込み用のビットマップデータを作成
Rectangle rect = new Rectangle(0, 0, bitmap.Width, bitmap.Height);
BitmapData data = bitmap.LockBits(rect, ImageLockMode.WriteOnly,
System.Drawing.Imaging.PixelFormat.Format24bppRgb);

// 生データへのポインタを取得
byte* dst = (byte*)data.Scan0.ToPointer();
byte* src = (byte*)image.ImageMapPtr.ToPointer();
//*****
//ushort* label = (ushort*)sceneMD.LabelMapPtr.ToPointer();

for (int i = 0; i < imageMD.DataSize; i += 3, src += 3, dst += 3)//,++label) {
{
dst[0] = src[2];
dst[1] = src[1];
dst[2] = src[0];
}

bitmap.UnlockBits(data);
//Calibration
// スケルトンの描画
foreach (int id in user.GetUsers()) {
// トラッキング対象のユーザーでなければ次へ
if (!user.SkeletonCapability.IsTracking(id)) {
continue;
}

/*DrawLine(id, SkeletonJoint.Head, SkeletonJoint.Neck);//頭、首

DrawLine(id, SkeletonJoint.Neck, SkeletonJoint.LeftShoulder);//首、左肩
DrawLine(id, SkeletonJoint.LeftShoulder, SkeletonJoint.LeftElbow);//左肩、左腕
DrawLine(id, SkeletonJoint.LeftElbow, SkeletonJoint.LeftHand);//左腕、左手

DrawLine(id, SkeletonJoint.Neck, SkeletonJoint.RightShoulder);//首、右肩
DrawLine(id, SkeletonJoint.RightShoulder, SkeletonJoint.RightElbow);//右肩、右腕
DrawLine(id, SkeletonJoint.RightElbow, SkeletonJoint.RightHand);//右腕、右手

DrawLine(id, SkeletonJoint.LeftShoulder, SkeletonJoint.Torso);//左肩、胴
DrawLine(id, SkeletonJoint.RightShoulder, SkeletonJoint.Torso);//右肩、胴*/

DrawLine(id, SkeletonJoint.Torso, SkeletonJoint.LeftHip);//胴、左おしり
DrawLine(id, SkeletonJoint.LeftHip, SkeletonJoint.LeftKnee);//左おしり、左ひざ
DrawLine(id, SkeletonJoint.LeftKnee, SkeletonJoint.LeftFoot);//左ひざ、左足

DrawLine(id, SkeletonJoint.Torso, SkeletonJoint.RightHip);//胴、右おしり
DrawLine(id, SkeletonJoint.RightHip, SkeletonJoint.RightKnee);//右おしり、右ひざ
DrawLine(id, SkeletonJoint.RightKnee, SkeletonJoint.RightFoot);//右ひざ、右足

DrawLine(id, SkeletonJoint.LeftHip, SkeletonJoint.RightHip);//左おしり、右おしり
}




//*****
// 現在の状態を表示する
Graphics g = Graphics.FromImage(bitmap);

string message1 = message+"\r\n"+
sessionState.ToString() + "\r\n" +
direction.ToString();

string messageKyukei = message+"\r\n"+
sessionState.ToString() + "\r\n" +
"休憩 (*´-д-)ゞ";

if(Houkou == "Right")
{
g.DrawString(messageKyukei, font, brush, new Point(0, 0));
}
else if (Houkou == "Left")
{
g.DrawString(messageKyukei, font, brush, new Point(0, 0));
}
else
{
g.DrawString(message1, font, brush, new Point(0, 0));
}
}
}

// キーイベント
private void xnKeyDown(Keys key)
{
}

//*****

// ユーザー検出
void user_NewUser(object sender, NewUserEventArgs e)//ProductionNode node, int id
{
message = "ユーザー検出:" + e.ID;

// ポーズの検出が必要であれば、ポーズの検出を開始する
if (!string.IsNullOrEmpty(pose))
{
user.PoseDetectionCapability.StartPoseDetection(pose, e.ID);
}
// ポーズの検出が不要であれば、キャリブレーションを開始する
else
{
user.SkeletonCapability.RequestCalibration(e.ID, true);
}
}

// ユーザー消失
void user_LostUser(object sender, UserLostEventArgs e)
{
message = "ユーザー消失:" + e.ID;
}

// ポーズ検出
void poseDetect_PoseDetected(object sender, PoseDetectedEventArgs e)
{
message = "ポーズ検出:" + e.Pose + " ユーザー:" + e.ID;

// ポーズの検出を停止し、キャリブレーションを開始する
user.PoseDetectionCapability.StopPoseDetection(e.ID);
user.SkeletonCapability.RequestCalibration(e.ID, true);
}

// ポーズ検出終了
void poseDetect_PoseEnded(object sender, PoseEndedEventArgs e)
{
message = "ポーズ消失:" + e.Pose + " ユーザー:" + e.ID;
}

// キャリブレーション開始
void skelton_CalibrationStart(object sender, CalibrationStartEventArgs e)
{
message = "キャリブレーション開始:" + e.ID;
}

// キャリブレーション終了
void skelton_CalibrationEnd(object sender, CalibrationEndEventArgs e)
{
// キャリブレーション成功
if (e.Success)
{
message = "キャリブレーション成功:" + e.ID;
user.SkeletonCapability.StartTracking(e.ID);
}
// キャリブレーション失敗
else
{
message = "キャリブレーション失敗:" + e.ID;
}
}
// 骨格の線を引く
void DrawLine(int player, SkeletonJoint eJoint1, SkeletonJoint eJoint2)
{
// 各箇所の座標を取得する
SkeletonJointPosition joint1 = skelton.GetSkeletonJointPosition(player, eJoint1);
SkeletonJointPosition joint2 = skelton.GetSkeletonJointPosition(player, eJoint2);

/*skelton.GetSkeletonJointPosition(player, eJoint1, ref joint1);
skelton.GetSkeletonJointPosition(player, eJoint2, ref joint2);*/
if (joint1.Confidence < 0.5 || joint2.Confidence < 0.5) {
return;
}

// 現実の座標から画面の座標に変換する
Point3D[] pt = new Point3D[] { joint1.Position, joint2.Position };
pt = depth.ConvertRealWorldToProjective(pt);

Graphics g = Graphics.FromImage(bitmap);
g.DrawLine(pen, pt[0].X, pt[0].Y, pt[1].X, pt[1].Y);
}

//*****

// 左方向への動きを通知する
void swipeDetector_SwipeLeft(object sender,VelocityAngleEventArgs e)//float velocity, float angle)
{
//brush = new SolidBrush(Color.Red);
}

// 右方向への動きを通知する
void swipeDetector_SwipeRight(object sender,VelocityAngleEventArgs e)//float velocity, float angle)
{
//brush = new SolidBrush(Color.Blue);
}

// 下方向への動きを通知する
void swipeDetector_SwipeDown(object sender,VelocityAngleEventArgs e)//float velocity, float angle)
{
brush = new SolidBrush(Color.Yellow);
}

// 上方向への動きを通知する
void swipeDetector_SwipeUp(object sender,VelocityAngleEventArgs e)//float velocity, float angle)
{
brush = new SolidBrush(Color.Yellow);
}

// スワイプの検出を通知する
void swipeDetector_GeneralSwipe(object sender,DirectionVelocityAngleEventArgs e)//Direction dir, float velocity, float angle)
{
//検出するときに、e.Directionでイベントで来た方向をToString()にいれこんで文字タイプに変換する
Houkou=e.Direction.ToString();
if (Houkou =="Right" )//Directionが「右」だったら何もしない(命令しない)
{

}
else if (Houkou == "Left")//Directionが「左」だったら何もしない(命令しない)
{
}
else//他のやつ=上下だったら普通に方向を描画する
{
direction = e.Direction;
}



}

// セッションの開始を通知する
void sessionManager_SessionStart(object sender,PositionEventArgs e)//ref Point3D position)
{
sessionState = SessionState.InSession;
}

// セッションの終了を通知する
void sessionManager_SessionEnd(object sender,EventArgs e)
{
sessionState = SessionState.NotInSession;
}

// セッションフォーカスの検出を通知する
void sessionManager_SessionFocusProgress(object sender,SessionProgressEventArgs e)//string strFocus,ref Point3D ptPosition, float fProgress)
{
sessionState = SessionState.DetectSession;
}
}
}
約1か月も更新してなかったのか・・・
その分ノートに書いてる色々は増えました。ふふ。

現在の状況+これから+参考URL

・Kinectセンサープログラミングの本のサンプルすべて終了。
使えるクラスとかわかってきたかも。

とりあえず。
Calibration(OpenNI)【両ヒザ、両足首を認識して座標計算で?】
Swipe Detector(NITE)【Up,Downのやつで。そのためにはまず足に照準を…】
Hand--Footにできんかなー(OpenNI)【物体の位置の座標を追いかける=足も可能?】
PushDetector【押す、引く、ってことは膝の押す引く認識?でも目立たないからマーカーとかつける?】

・現在、SwipeDetector(NITE)をとりあえず「あしぶみ.sln」として
色々やってみる。
右、左のコールバックをなしにして(何も命令しない=何も通知しない)
上、下のみ。
右、左の時は「休憩 (*´-д-)ゞ」て出す
これが、照準を足(片方でもいけそうな気がする=マーカーつける?)にできればなー。

GoogleMapsAPIをC#でどのみちたたかなければ!
Ajaxがどーたらで、なんかVisualStudioじゃないけどなんか、C#で開発はできるみたいー。
でもまあ…めんどい\(^o^)/ww
まずはkinectのところかな!


先生に「iWear使えるよねー^^」て言われたけどwwwこわいwwww
とりあえず完成して時間が余ってたら!
なんか、サクサクできれば進めそうな研究だとは思うからなー。
発展として考えておこうっと!!^^

・参考URL
2ちゃんねる kinectハック
hibari.2ch.net/test/read.cgi/tech/1290795733/

USTREAM【かおるんさんのOpenNIとNITEの深い話】
www.ustream.tv/recorded/15112866
先生と話して
まずは、Kinectでマウスのかわりにできるようにしてみようってなりまして。

NIUserTrackerで、骨格の情報も取得できたから、足踏みも認識可能
つまりはバランスボードいらなくね?w

MITの人たちが開発したDepth JSっていうやつをとりあえずダウンロードしてみたけども
これ、ブラウザ用なんだよね

まあ動かしてみよう。

でも、マウスのかわりにできるやつが自分で開発できたらそれだけで卒研になるよなww


理屈は分かるんだけどな。