| Á° | 2010ǯ 9·î |
¼¡ | ||||
| Æü | ·î | ²Ð | ¿å | ÌÚ | ¶â | ÅÚ |
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | ||
ToDo:
Categories | C++ | Coq | Haskell | ICPC | PC | TV | sendmail | spam | ¤ªÃΤ餻 | ¤½¤Î¾ | ¥¢¥ë¥Ð¥à | ¥µ¡¼¥Ð´ÉÍý | ¥»¥¥å¥ê¥Æ¥£ | ¥Ë¥å¡¼¥¹ | ¥á¥â | ³Ø¹» | µ»½Ñ | »Å»ö | ¼ñÌ£ | ¿© | Æüµ | Ë¿ÊýÌÌ | ËÜ | ÌÖ | ι
¤»¤Ã¤«¤¯¥¢¥×¥ê¤Ø¤ÎÁȤ߹þ¤ßÁ°Äó¤Ê¤Î¤À¤«¤é¡¢OS ¤Î¥Í¥¤¥Æ¥£¥Ö¤Êµ¡Ç½¤ò»È¤Ã¤Æ¤ß¤¿¤¯¤Ê¤ë¤Î¤¬¿Í¾ð¤È¤¤¤¦¤â¤Î¡Ä¡£
¤È¤¤¤¦¤ï¤±¤Ç¡¢ºÇ¶á¤Ï OLE ¥ª¡¼¥È¥á¡¼¥·¥ç¥ó¤ËÂбþ¤·¤¿¥ª¥Ö¥¸¥§¥¯¥È¤ò Javascript ¤«¤é¤¤¤¸¤ë¤¿¤á¤Ë¤´¤½¤´¤½¤ä¤Ã¤Æ¤Þ¤¹¡£¤³¤ì¤¬¤Ç¤¤ë¤È Ajax ¤Î¥³¥¢µ¡Ç½¤¬¥¢¥×¥ê¤ËÁȤ߹þ¤á¤¿¤ê¤·¤Æ¡£
¡û ¤Þ¤À¼ÂÁõ¤¬Å¬Åö¤Ê¤È¤³¤í¤¬¤¢¤Ã¤¿¤ê¤¹¤ë¤Î¤Ç¤¹¤¬¡¢¤½¤Î¤¦¤Á¥³¡¼¥É¤Ï¤Þ¤È¤á¤Æ¸ø³«¤·¤Þ¤¹¤ë¡£
¤Ï¤Æ¤Ê¥À¥¤¥¢¥ê¡¼¡¢¤Ä¤¯¤Ã¤Æ¤ß¤Þ¤·¤¿¡£¢ªÅÅÇÈÆüµ¡÷¤Ï¤Æ¤Ê
¡û ¤É¤¦¤âÀ¸¤Î tdiary ¤Ï¥³¡¼¥É¤¬½ñ¤¤Ë¤¯¤¤¤Ê¡¼¤È»×¤Ã¤Æ¤¤¤¿¤Î¤Ç¤¹¤¬¡¢¡ÖWiki ¥¹¥¿¥¤¥ë¤Ë¤·¤Æ¤ß¤¿¤é¡©¡×¤È¶µ¤¨¤Æ¤¤¤¿¤À¤¤Þ¤·¤¿¡£
¤·¤«¤·¥¹¥¿¥¤¥ë¤òÊѤ¨¤ë¤Ë¤ª¤¤¤Æ¡¢´û¸¥³¥ó¥Æ¥ó¥Ä¤Î°Ü¹Ô¤ò¹Í¤¨¤ë¤Î¤¬·ë¹½Æñ¤·¤¤¤«¤â¤·¤ì¤Ê¤¤¤Ê¤È¤¤¤¦¤Î¤â¤¢¤ë¤Î¤Ç¡¢¤È¤ê¤¢¤¨¤º¤ÏÊ̤ξì½ê¤ËÀßÄꤷ¤ÆÊÂ¹ÔÆ°ºî¡Ä¤Ê´¶¤¸¤ÇÍͻҤò¸«¤ë¤Î¤¬¤è¤µ¤½¤¦¤Ç¤¹¡£
¤¿¤À¤µ¤·¤¢¤¿¤Ã¤Æ¡¢¤Ï¤Æ¤Ê¤Î(¥³¡¼¥É¤Ê¤É¤Ë´Ø¤¹¤ë)»È¤¤¾¡¼ê¤¬¤ï¤ê¤È¤è¤µ¤½¤¦¤Ê¤³¤È¤â¤¢¤ë¤Î¤Ç¡¢¤·¤Ð¤é¤¯¤½¤Á¤é¤Ë¼´Â¤ò¤ª¤¤¤Æ»î¤·¤Æ¤ß¤è¤¦¤È»×¤¤¤Þ¤¹¡£
¤È¤ê¤¢¤¨¤º¥á¥â¤È¤·¤Æ¡£
´ðËÜŪ¤Ë¡¢´Ø¿ô¤ò FunctionTemplate ¤Ë¥³¡¼¥ë¥Ð¥Ã¥¯¤È¤·¤ÆÀßÄꤹ¤ë¤³¤È¤Ç¡¢Javascript ¤«¤é¸Æ¤Ó½Ð¤»¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£¤¿¤È¤¨¤Ð Hello, World! ¤¹¤ë´Ø¿ô¤Ï¼¡¤Î¤è¤¦¤Ê´¶¤¸¤Ë¡£
static v8::Handle<v8::Value> Hello(const v8::Arguments& args)
{
printf("Hello, World!\n");
}
¡û ¤Ç¡¢¤³¤ì¤ò Javascript ¦¤«¤é¥¢¥¯¥»¥¹¤Ç¤¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ë¡¢¥°¥í¡¼¥Ð¥ë¥ª¥Ö¥¸¥§¥¯¥È¤Î¥×¥í¥Ñ¥Æ¥£¤È¤·¤ÆÀßÄꤹ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
¤½¤Î¤¿¤á¤Ë¤Ï¡¢¥³¥ó¥Æ¥¯¥¹¥ÈÀ¸À®Éô¤Ç¼¡¤Î¤è¤¦¤Ê¥³¡¼¥É¤òµ½Ò¤·¤Þ¤¹¡£
v8::Local<v8::ObjectTemplate> global = v8::ObjectTemplate::New();
global->Set(v8::String::New("hello"), v8::FunctionTemplate::New(Hello));
v8::Persistent<v8::Context> context = v8::Context::New(NULL, global);
...
¡û ¤³¤Î¤Ø¤ó¤Þ¤Ç¤Ï Embedder's Guide ¤Î¤È¤ª¤ê¡£¥°¥í¡¼¥Ð¥ë´Ø¿ô¤Ê¤é¤³¤ì¤Ç OK ¤Ç¤·¤ç¤¦¡£
¡û ¤µ¤Æ¡¢¤³¤ì¤ò¤Õ¤Þ¤¨¤Æ¡£
¤³¤³¤«¤é¤Ï¡¢C++ ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò Javascript ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ë´ØÏ¢ÉÕ¤±¤ëÊýË¡¤ò°·¤¤¤Þ¤¹¡£¤¿¤È¤¨¤Ð²¼µ¤Î¤è¤¦¤Ê¥¯¥é¥¹ Counter ¤¬¤¢¤Ã¤¿¤È¤·¤Þ¤·¤ç¤¦¡£
class Counter {
public:
explicit Counter(int initialCount = 0) { ... };
int GetCount() const { ... };
void SetCount(int newValue) { ... };
void Add(int amount = 1) { ... };
};
¡û ¤Þ¤º¤Ï Javascript ¤«¤é¤Î¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¥³¡¼¥É¤ò½ñ¤¤Þ¤¹¡£
¥³¥ó¥¹¥È¥é¥¯¥¿¤È this ¤Î¼èÆÀ¤¬´Î¡£
struct CounterJSIF {
private:
// this ¤Ø¤Î¥¢¥¯¥»¥¹¥Ø¥ë¥Ñ
static Counter* GetThis(v8::Local<v8::Value> handle)
{
void* pThis = v8::Local<v8::External>::Cast(handle->GetInternalField(0))->Value();
return static_cast<Counter*>(pThis);
}
// ¥¯¥é¥¹¥³¥ó¥¹¥È¥é¥¯¥¿
static v8::Local<v8::Value> New(const v8::ArgumentInfo& args)
{
Counter* backend = NULL;
if (args.Length() > 0) {
backend = new Counter(args[0]->Int32Value());
} else {
backend = new Counter();
}
// internal field ¤Ë¥Ð¥Ã¥¯¥¨¥ó¥É¥ª¥Ö¥¸¥§¥¯¥È¤òÀßÄê
v8::Local<v8::Object> thisObject = args.This();
thisObject->SetInternalField(0, v8::External::New(backend));
// JS ¥ª¥Ö¥¸¥§¥¯¥È¤¬ GC ¤µ¤ì¤ë¤È¤¤Ë¥Ç¥¹¥È¥é¥¯¥¿¤¬¸Æ¤Ð¤ì¤ë¤ª¤Þ¤¸¤Ê¤¤
v8::Persistent<v8::Object> objectHolder = v8::Persistent<v8::Object>::New(thisObject);
objectHolder.MakeWeak(backend, CounterJSIF::Dispose);
// ¥³¥ó¥¹¥È¥é¥¯¥¿¤Ï this ¤òÊÖ¤¹¤³¤È¡£
return thisObject;
}
// ¥¯¥é¥¹¥Ç¥¹¥È¥é¥¯¥¿
static void Dispose(v8::Persistent<v8::Value> handle, void* pVoid)
{
delete static_cast<Counter*>(pVoid);
}
///// ¥×¥í¥Ñ¥Æ¥£¥¢¥¯¥»¥µ /////
static v8::Local<v8::Value> GetCount(v8::Local<v8::String> propertyName,
const v8::AccessorInfo& info)
{
const Counter* backend = GetThis(info.Holder());
return v8::Integer::New(backend->GetCount());
}
static void SetCount(v8::Local<v8::String> propertyName, v8::Local<v8::Value> value,
const v8::AccessorInfo& info)
{
Counter* backend = GetThis(info.Holder());
backend->SetCount(value->Int32Value());
}
///// ¥á¥½¥Ã¥É¥³¡¼¥ë¥Ð¥Ã¥¯ /////
static v8::Local<v8::Value> Add(const v8::Arguments& args)
{
Counter* backend = GetThis(args.This());
if (args.Length() > 0) {
backend->Add(args[0]->Int32Value());
} else {
backend->Add();
}
return v8::Undefined();
}
public:
// ¥¯¥é¥¹¥Æ¥ó¥×¥ì¡¼¥È¤Î½é´ü²½
void InitializeClass(v8::Local<v8::ObjectTemplate> global)
{
// ¥³¥ó¥¹¥È¥é¥¯¥¿¤òºîÀ®
v8::Local<v8::FunctionTemplate> tmpl = v8::FunctionTemplate::New(ConterJSIF::New);
tmpl->SetClassName(v8::String::New("Counter"));
// ¥Õ¥£¡¼¥ë¥É¤Ê¤É¤Ï¤³¤Á¤é¤Ë
v8::Local<v8::ObjectTemplate> inst = tmpl->InstanceTemplate();
inst->SetInternalFieldCount(1);
inst->SetAccessor(v8::String::New("count"), CounterJSIF::GetCount, CounterJSIF::SetCount);
// ¥á¥½¥Ã¥É¤Ï¤³¤Á¤é¤Ë
v8::Local<v8::ObjectTemplate> proto = tmpl->PrototypeTemplate();
proto->Set(v8::String::New("add"), FunctionTemplate::New(CounterJSIF::Add));
// ¥°¥í¡¼¥Ð¥ë¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥¯¥é¥¹¤òÄêµÁ
global->Set(v8::string::New("Counter"), tmpl);
}
} counterInterface;
¡û ¥¯¥é¥¹¤¬Ã±¤Ë¥³¥ó¥¹¥È¥é¥¯¥¿´Ø¿ô¤ò¥³¡¼¥ë¥Ð¥Ã¥¯¤È¤¹¤ë FunctionTemplate ¤Ç¤¢¤ë¤È¤¤¤¦¤Î¤Ï¡¢Javascript ¤Ë¤ª¤±¤ë¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þ¥×¥í¥°¥é¥ß¥ó¥°¤ÎºîË¡(?)¤òÃΤäƤ¤¤ë¤È¤ª¤½¤é¤¯¤¹¤ó¤Ê¤ê¤È¼õ¤±Æþ¤ì¤é¤ì¤ë¤«¤È»×¤¤¤Þ¤¹¡£
¤Þ¤¿¡¢internal field ¤È¤·¤Æ C++ ¥ª¥Ö¥¸¥§¥¯¥È¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÅϤ¹¤È¤¤¤¦¤ä¤êÊý¤Ï Embedder's Guide ¤Ë¤¢¤ëÄ̤ê¤Ç¤¹¡£¥³¥ó¥¹¥È¥é¥¯¥¿¤Ç internal field ¤òÀßÄꤷ¡¢¥×¥í¥Ñ¥Æ¥£¥¢¥¯¥»¥µ¤ä¥á¥½¥Ã¥É¥³¡¼¥ë¥Ð¥Ã¥¯¤Ç¤Ï¤½¤ì¤òÆÉ¤ß½Ð¤·¤Æ¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥¢¥¯¥»¥¹¤·¤Þ¤¹¡£*1
¡û ¥ª¥Ö¥¸¥§¥¯¥È¤¬ GC ¤µ¤ì¤ë¤È¤¤Ë°ì½ï¤Ë¥Ç¥¹¥È¥é¥¯¥È¤µ¤»¤ë¤Ë¤Ï¡¢weak reference ¤òÍøÍѤ·¤Þ¤¹¡£V8 ¤Î (persistent) handle ¤ò weak ¤Ë¤¹¤ë¤È¤¤Ë GC ¥³¡¼¥ë¥Ð¥Ã¥¯¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤¡¢¤½¤³¤Ç¥ª¥Ö¥¸¥§¥¯¥È¤ò¥Ç¥¹¥È¥é¥¯¥È¤¹¤ì¤Ð OK ¤Ç¤¹¡£V8 ¤Î src/api.cc ¤Ë¤¢¤ë ExternalString ´Ø·¸¤Î API ¤Ç¤³¤ÎÊýË¡¤òÍøÍѤ·¤Æ¤¤¤ë¤Î¤Ç¡¢¶½Ì£¤Î¤¢¤ëÊý¤Ï»²¾È¤ò¡£
°ìÊý¡¢¥Ð¥Ã¥¯¥¨¥ó¥É¥ª¥Ö¥¸¥§¥¯¥È¤¬Â礤¤Åù¡¢GC ¤Þ¤ÇÂÔ¤¿¤º¤Ë¥á¥â¥ê¾ÃÈñ¤òÍÞ¤¨¤¿¤¤¾ì¹ç¡¢¤Ä¤Þ¤ê¥ª¥Ö¥¸¥§¥¯¥È¤òÌÀ¼¨Åª¤Ë²òÊü¤·¤¿¤¤¾ì¹ç¤Ï¡¢dispose ¤Ê¤É¤Î¥á¥½¥Ã¥É¤òÄêµÁ¤¹¤ì¤Ð¤è¤¤¤Ç¤·¤ç¤¦¡£
*1 ¥³¡¼¥ë¥Ð¥Ã¥¯¤Ë(void* ¤Ê¤É¤Î)¥Ñ¥é¥á¡¼¥¿¤òÅϤ»¤ì¤Ð³Ú¥Á¥ó¡Ä¤È»×¤¦¤«¤â¤·¤ì¤Þ¤»¤ó¤¬¡¢»Äǰ¤Ê¤¬¤é¤½¤¦¤¤¤Ã¤¿¥Ñ¥é¥á¡¼¥¿¤Ï¥·¥°¥Í¥Á¥ã¤Ë¤¢¤ê¤Þ¤»¤ó¡£¤Þ¤¿¡¢¥³¡¼¥ë¥Ð¥Ã¥¯¤Ï¥³¥ó¥¹¥È¥é¥¯¥¿¤ÇÀßÄꤷ¤Æ¤¤¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¤Î¤Ç¥¤¥ó¥¹¥¿¥ó¥¹¥Ñ¥é¥á¡¼¥¿¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤¤Þ¤»¤ó¡£
¤È¤ê¤¢¤¨¤º V8 ¥¨¥ó¥¸¥ó¤Î¾å¤Ç JavaScript ¤¬Æ°¤«¤»¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¤¬¡¢ÆüËܸì¤Ê¤É¤ò°·¤¤¤¿¤¯»×¤¦¤Î¤Ï»ê¶ËÅöÁ³¤À¤È»×¤¤¤Þ¤¹¡£
´ðËÜŪ¤Ë V8 ¤Îʸ»úÎó·¿(v8::String)¤Ï¡¢ASCII, UTF-8, UTF-16 ¤Ë¤è¤ëÆþ½ÐÎÏ¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ò»ý¤Ã¤Æ¤¤¤Þ¤¹¡£ASCII ¤È UTF-8 ¤Ï¤É¤Á¤é¤â char**1¡¢UTF-16 ¤Ï uint16_t* ¤È¤¤¤¦·¿¤Î¥Ç¡¼¥¿¤Ç°·¤ï¤ì¤Þ¤¹¡£
UTF-16 ¤ÏÍפ¹¤ë¤Ë Windows ¤Ë¤ª¤¤¤Æ¤Ï¥ï¥¤¥Éʸ»ú(Unicode)¤È¤·¤Æ°·¤ï¤ì¤ë¤â¤Î¤Ç¤¹¡£¤¿¤À¤·¡¢Windows ¤Ç¤Ïʸ»úÎó¤Î·¿¤¬ LPWSTR¡¢¤Ä¤Þ¤ê¤Ï wchar_t* ¤ÈÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¤Î¤Ç¡¢ÌÀ¼¨Åª¤Ê·¿ÊÑ´¹¤¬É¬Íפˤʤ뤳¤È¤ËÃí°Õ¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
¡û ¤Á¤ç¤Ã¤ÈÏäÏÊѤï¤ê¤Þ¤¹¤¬¡¢°ìÈÌ¤Ë Visual C++ ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¤Ï¡¢¥Þ¥ë¥Á¥Ð¥¤¥Èʸ»ú¥»¥Ã¥È¤È Unicode ʸ»ú¥»¥Ã¥È¤ò¥×¥í¥¸¥§¥¯¥È¥ª¥×¥·¥ç¥ó¤ÇÀÚ¤êÂØ¤¨¤ë¤³¤È¤¬¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¤¬¤è¤¯¤¢¤ê¤Þ¤¹¡£
¤³¤Î¤È¤¥³¥ó¥Ñ¥¤¥ë¥¹¥¤¥Ã¥Á¤À¤±¤ÇÀÚ¤êÂØ¤¨¤¬¤Ç¤¤ë¤è¤¦¤Ë¡¢Ê¸»ú·¿¡¦Ê¸»úÎ󷿤Ȥ·¤Æ¤½¤ì¤¾¤ì TCHAR¡¦LPTSTR ¤òÍѤ¤¡¢Ê¸»úÎó¥ê¥Æ¥é¥ë¤Î²ó¤ê¤ò _T ¥Þ¥¯¥í¤Ç¶´¤ó¤À¤ê¤¹¤ë¤³¤È¤Ç¡¢Æ±¤¸¥³¡¼¥É¤ò¤¤¤º¤ì¤Î¥±¡¼¥¹¤Ç¤â»È¤¤¤Þ¤ï¤»¤ë¤è¤¦¤Ë¤¹¤ë¼êË¡¤¬¤È¤é¤ì¤Þ¤¹¡£
Win32 API ¤Ë¤Ï MultiByteToWideChar, WideCharToMultiByte ¤È¤¤¤¦ÊÑ´¹ API ¤¬¤¢¤ê¡¢¤³¤ì¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤Ç¥Þ¥ë¥Á¥Ð¥¤¥Èʸ»úÎó¤È¥ï¥¤¥Éʸ»úÎó¤Î´Ö¤òɬÍפ˱þ¤¸¤ÆÊÑ´¹¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£¤½¤·¤Æ¤³¤ÎÁàºî¤ò´Êñ¤Ë°·¤¦¤¿¤á¤Ë¡¢ATL ¤Ç¤¤¤¯¤Ä¤«¤Î¥¯¥é¥¹¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£(¢ªMSDN) Ãæ¿È¤Ë¶½Ì£¤Î¤¢¤ëÊý¤Ï¥¤¥ó¥¯¥ë¡¼¥É¥Ñ¥¹Æâ¤Î atlconv.h ¤ò¸«¤ë¤È¤è¤¤¤Ç¤·¤ç¤¦¡£
¡û ¤È¤â¤«¤¯¡¢¤³¤ì¤ò»È¤¨¤Ð´Êñ¤Ë LPTSTR ¤È UTF-8/16 ¤Î´Ö¤ÎÊÑ´¹¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤¿¤È¤¨¤Ð V8 ¤Ë¤è¤ë¼Â¹Ô·ë²Ì¤òʸ»úÎó¤È¤·¤Æ¼è¤ê½Ð¤¹¾ì¹ç¡¢²¼µ¤Î¤è¤¦¤Ê¥³¡¼¥É¤ò½ñ¤¯¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
v8::Handle<v8::Value> result = script->Run(); v8::String::Value str(result); m_Result = CW2T((LPWSTR) *str); UpdateData(FALSE);
¡û UTF-8 ¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤òÍѤ¤¤ë¾ì¹ç¤Ï¼ã´³ÌÌÅݤǡ¢°ìÅ٥磻¥Éʸ»úÎó¤ò·Ðͳ¤·¤Æ¤«¤é UTF-8 ¥³¡¼¥É¥Ú¡¼¥¸¤òÍѤ¤¤Æ UTF-8 ¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤µ¤ì¤¿¥Þ¥ë¥Á¥Ð¥¤¥Èʸ»úÎó¤ËÌ᤹ɬÍפ¬¤¢¤ë¤è¤¦¤Ç¤¹¡£*2
CW2A, CA2W ¤Î¥³¥ó¥¹¥È¥é¥¯¥¿¤ËÌÀ¼¨Åª¤Ë¥³¡¼¥É¥Ú¡¼¥¸¤ò»ØÄꤹ¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¤Î¤Ç¡¢¤½¤ì¤ò»È¤¨¤Ð¡¢¾å¤Î¥³¡¼¥É¤ÈƱÍͤΤ³¤È¤Ï¼¡¤Î¥³¡¼¥É¤Ë¤è¤ê¼Â¸½¤Ç¤¤Þ¤¹¡£
v8::Handle<v8::Value> result = script->Run(); v8::String::Utf8Value str(result); m_Result = CW2T(CA2W(*str, CP_UTF8)); UpdateData(FALSE);
*1 ¤³¤³¤Ç¤Ï UTF-8 ʸ»úÎó¤Î¥µ¥Ö¥»¥Ã¥È¤¬ ASCII ¤Ç¤¢¤ë¤È¤¤¤¦¤³¤È¤Ëα°Õ¤¹¤ì¤ÐÅöÁ³¤Îµ¢·ë¤Ç¤¢¤í¤¦¤È»×¤¤¤Þ¤¹¡£
*2 ¥³¥ó¥Ñ¥¤¥ë¥ª¥×¥·¥ç¥ó»ØÄ꤬¥Þ¥ë¥Á¥Ð¥¤¥Èʸ»úÎó¤Î¾ì¹ç¡¢¥³¡¼¥É¥Ú¡¼¥¸ÊÑ´¹¤¬É¬Íפˤʤê¤Þ¤¹¡£CA2T ¤Ï CA2A ¤Ë #define ¤µ¤ì¤Þ¤¹¤¬¡¢¤³¤ÎÃæ¿È¤ò¸«¤ì¤Ð²¿¤â¤·¤Æ¤¤¤Ê¤¤¤³¤È¤¬¤ï¤«¤ë¤«¤È»×¤¤¤Þ¤¹¡£¤Ê¤Î¤Ç¡¢¤º¤ì¤¿¥³¡¼¥É¥Ú¡¼¥¸¤ò½¤Àµ¤¹¤ë¤¿¤á¤Ë¼ã´³²ó¤ê¤¯¤É¤¤¤Ç¤¹¤¬¤³¤¦¤¹¤ëɬÍפ¬¤¢¤ë¤è¤¦¤Ç¤¹¡£
ºÇ¶á¥¢¥¯¥»¥¹¥í¥°¤¬·ã¤·¤¤¤Ê¤¢¤È¤ª¤â¤Ã¤¿¤é¡¢Baiduspider ¤¬·ã¤·¤¯Ì¤Íè¤È¤«²áµî¤Î¥«¥Æ¥´¥ê¥¢¡¼¥«¥¤¥Ö¤ò¼è¤ê¤Ë¤¤Æ¤Æ¡¢¥ë¡¼¥×¤Ë¤Ï¤Þ¤Ã¤Æ¤¤¤ë¤é¤·¤¤¡£
tdiary ¦¤Ç nofollow, noindex ¤È¤«¤¬»ØÄê¤Ç¤¤ì¤Ð¤¤¤¤¤ó¤À¤±¤É¡¢¤½¤¦¤¤¤¦ÀßÄ꤬(¤Ñ¤Ã¤È¸«)¤Ê¤µ¤½¤¦¤Ë¸«¤¨¤ë¤Î¤Çº¤¤Ã¤Æ¤¤¤ë¤È¤³¤í¡£
¡û ¤½¤¦¤¤¤¨¤ÐÁ´Á³´Ø·¸¤Ï¤Ê¤¤¤±¤ì¤É¡¢É´ÅÙ³ô¼°²ñ¼Ò¤Ã¤ÆË¿¥Ó¥ë¤Î 20F ¤ËÆþ¤Ã¤Æ¤ë¤ó¤Ç¤¹¤Í¡£

Á°²ó¥é¥¤¥Ö¥é¥ê¤¬¥Ó¥ë¥É¤Ç¤¤¿¤Î¤Ç¡¢º£²ó¤Ï Win32 ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë V8 ¥¨¥ó¥¸¥ó¤òÁȤ߹þ¤ó¤Ç¤ß¤Þ¤¹¡£ºÇ½é¤Ê¤Î¤Ç¡¢¤Þ¤º¤Ï´Êñ¤Ê GUI ¥¤¥ó¥¿¥×¥ê¥¿¤«¤é¡£
¤Þ¤º MFC ¥À¥¤¥¢¥í¥°¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥×¥í¥¸¥§¥¯¥È(¤³¤³¤Ç¤Ï Hoge ¤È¤¤¤¦Ì¾Á°¤Ë¤·¤¿¤È¤·¤Þ¤¹)¤ò¤Ò¤È¤Ä¤Ä¤¯¤Ã¤Æ¤ª¤¤Þ¤¹¡£¥×¥í¥¸¥§¥¯¥È¤ÎÀßÄê¤Ç¡¢¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Î¥¤¥ó¥¯¥ë¡¼¥É¥Ñ¥¹¡¢¥é¥¤¥Ö¥é¥ê¤Î¥µ¡¼¥Á¥Ñ¥¹¤Ë V8 ¤Î¥é¥¤¥Ö¥é¥ê¤Î¥Ç¥£¥ì¥¯¥È¥ê¤ò»ØÄꤷ¤Æ¤ª¤¤Þ¤¹¡£¥¤¥ó¥¯¥ë¡¼¥É¥Ñ¥¹¤Ë¤Ï (V8 ¤Î¥ê¥Ý¥¸¥È¥ê)/include¡¢¥é¥¤¥Ö¥é¥ê¥Ñ¥¹¤Ë¤Ï (V8 ¤Î¥ê¥Ý¥¸¥È¥ê)/tools/visual_studio/{Debug,Release}/lib ¤ò»ØÄꤹ¤ì¤Ð OK ¤Ç¤¹¡£¤Þ¤¿¡¢Äɲå饤¥Ö¥é¥ê¤È¤·¤Æ v8_snapshot.lib ¤òÄɲ䷤Ƥª¤¤Þ¤¹¡£
¡û ¼¡¤Ë½àÈ÷¤È¤·¤Æ¡¢¥À¥¤¥¢¥í¥°²èÌ̤òÊÔ½¸¤·¤Æ¤ª¤¤Þ¤¹¡£
¤Þ¤º¥¹¥¯¥ê¥×¥È¤ò¥æ¡¼¥¶¤¬ÆþÎϤ¹¤ë¤¿¤á¤Î¥Æ¥¥¹¥È¥Ü¥Ã¥¯¥¹¡¢¼Â¹Ô¤ò»ØÄꤹ¤ë¤¿¤á¤Î¥Ü¥¿¥ó¤È¡¢¤µ¤é¤Ë·ë²Ì¤òɽ¼¨¤¹¤ë¤¿¤á¤Î Static ¥³¥ó¥È¥í¡¼¥ë¤¯¤é¤¤¤¬É¬Íפˤʤë¤Ç¤·¤ç¤¦¡£
¤³¤ì¤é¤Î¥³¥ó¥Ý¡¼¥Í¥ó¥È¤òÇÛÃÖ¤·¤¿¸å¡¢Å¬µ¹ DDX ÊÑ¿ô¤Ë³ä¤êÅö¤Æ¤Æ¤ª¤¤Þ¤¹¡£¤³¤³¤Ç¤Ï¥Æ¥¥¹¥È¥Ü¥Ã¥¯¥¹¤Ï m_Script¡¢·ë²Ì¤Ï m_Result (¤¤¤º¤ì¤âÃÍÊÑ¿ô¤Ç¡¢CString ·¿¤ò»ý¤Ä)¤È¤¤¤¦Ì¾Á°¤ò¤Ä¤±¤¿¤È¤·¤Þ¤¹¡£
¡û ¤³¤³¤Þ¤Ç½àÈ÷¤¬¤Ç¤¤¿¤é¡¢¤¤¤è¤¤¤è¥³¡¼¥É¤òµ½Ò¤¹¤ëºî¶È¤Ë¤Ï¤¤¤ê¤Þ¤¹¡£stdafx.h ¤Ç v8.h ¤ò¥¤¥ó¥¯¥ë¡¼¥É¤·¡¢cpp ¤Î¥½¡¼¥¹¥³¡¼¥É¦¤Ç using namespace v8; ¤ò¤·¤Æ¤¤¤ë¤³¤È¤òÁ°Äó¤Ë¤·¤Þ¤¹*1¡£
V8 ¤Î Embedder's Guide ¤ä CodeProject ¤Î V8 µ»ö¤Ë¤¢¤ë¤È¤ª¤ê¡¢V8 ¤òÍøÍѤ¹¤ë¤¿¤á¤Ë¤Ï¤Þ¤º¥³¥ó¥Æ¥¯¥¹¥È(Context ¤Î¥¤¥ó¥¹¥¿¥ó¥¹)¤òºîÀ®¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
¥³¥ó¥Æ¥¯¥¹¥È¤Ï Context::New() ¥á¥½¥Ã¥É¤ÇºîÀ®¤Ç¤¤Þ¤¹¤¬¡¢¤³¤ì¤ÎÊÖ¤êÃÍ¤Ï Persistent<Context> ¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£Persistent ¤È¤¤¤¦¥Æ¥ó¥×¥ì¡¼¥È¥¯¥é¥¹¤Ï Handle ¥¯¥é¥¹¤Î¥µ¥Ö¥¯¥é¥¹¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¢¤³¤ì¤é¤Ï¥¹¥Þ¡¼¥È¥Ý¥¤¥ó¥¿¤È²ò¼á¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤Þ¤¿¡¢¥¹¥¯¥ê¥×¥È¤Î¼Â¹Ô¤Ë¤Ï Context::Scope ¤òºîÀ®¤·¤Æ¡¢Àè¤Û¤ÉºîÀ®¤µ¤ì¤¿¥³¥ó¥Æ¥¯¥¹¥È¤Ë¡ÖÆþ¤Ã¤Æ¤ª¤¯¡×(Context::Enter ¤ò¸Æ¤ó¤Ç¤ª¤¯)ɬÍפ¬¤¢¤ê¤Þ¤¹¡£Context::Scope ¥¯¥é¥¹¤Ï¡¢¥¤¥ó¥¹¥¿¥ó¥¹¤¬¥ì¥¥·¥«¥ë¥¹¥³¡¼¥×¤Ë¤¢¤ë´Ö¡¢¥³¥ó¥¹¥È¥é¥¯¥¿¤ËÅϤµ¤ì¤¿¥³¥ó¥Æ¥¯¥¹¥È¤ËÆþ¤Ã¤Æ¤¯¤ì¤Þ¤¹¡£
¤³¤ì¤é¤Î½é´ü²½¤Ï¡¢¥À¥¤¥¢¥í¥°¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¾ì¹ç CHogeApp::InitInstance() ¤Ç¤ä¤ì¤Ð¤è¤¤¤Ç¤·¤ç¤¦*2¡£½é´ü²½¥³¡¼¥É¤Î¥³¥á¥ó¥È¤¬¤Ä¤¤¤Æ¤¤¤ë¤¢¤¿¤ê¤ò½ñ¤´¹¤¨¤Þ¤¹¡£
BOOL CHogeApp::InitInstance()
{
...(¾Êά)
// ½é´ü²½
CHogeDlg dlg;
m_pMainWnd = &dlg;
Persistent<Context> context = Context::New();
Context::Scope context_scope(context);
dlg.DoModal();
// ¥À¥¤¥¢¥í¥°¤ÏÊĤ¸¤é¤ì¤Þ¤·¤¿¡£¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥á¥Ã¥»¡¼¥¸ ¥Ý¥ó¥×¤ò³«»Ï¤·¤Ê¤¤¤Ç
// ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò½ªÎ»¤¹¤ë¤¿¤á¤Ë FALSE ¤òÊÖ¤·¤Æ¤¯¤À¤µ¤¤¡£
return FALSE;
}
¡û ¤³¤ì¤Ç¥¹¥¯¥ê¥×¥È¤Î¼Â¹Ô´Ä¶¤¬À°¤Ã¤¿¤Î¤Ç¡¢¤¢¤È¤Ï¥À¥¤¥¢¥í¥°Â¦¤Ç¥¹¥¯¥ê¥×¥È¤ò²ò¼á¡¦¼Â¹Ô¤¹¤ë¥³¡¼¥É¤ò½ñ¤¤Þ¤¹¡£
¼Â¹Ô¥Ü¥¿¥ó¤Î¥Ï¥ó¥É¥é¤òºîÀ®¤·¡¢¼¡¤Î¤è¤¦¤Ê¥³¡¼¥É¤ò½ñ¤¤Þ¤¹¡£
void CHogeDlg::OnBnClickedRun()
{
HandleScope handle_scope;
// ¥¹¥¯¥ê¥×¥È¤ò¥³¥ó¥Ñ¥¤¥ë
UpdateData(TRUE);
Local<Script> script =¡¡Script::Compile(String::New(CT2CA(m_Script)));
if (script.IsEmpty()) {
MessageBox(_T("Script compilation error"), _T("Error"), MB_ICONERROR | MB_OK);
} else {
// ¼Â¹Ô
Local<Value> result = script->Run();
if (result.IsEmpty()) {
MessageBox(_T("Script execution error"), _T("Error"), MB_ICONERROR | MB_OK);
} else {
// ·ë²Ì¤òɽ¼¨
String::Utf8Value str(result);
m_Result = CA2CT(*str);
UpdateData(FALSE);
}
}
}
¡û ¤³¤Î¥ë¡¼¥Á¥ó¤Ï Handle ¤ò°·¤¦¤Î¤Ç¡¢¤Þ¤º HandleScope ¤òºîÀ®¤·¤Æ¤ª¤¯É¬Íפ¬¤¢¤ê¤Þ¤¹¡£»úÌ̤ǤϤ¢¤Þ¤ê¸«¤¨¤Þ¤»¤ó¤¬¡¢T::New ¤ÇÊ֤äƤ¯¤ë¤â¤Î¤Ï¤À¤¤¤¿¤¤ Local<T> ¤Ç¡¢¤³¤ì¤Ï¥Ï¥ó¥É¥ë¥¹¥¿¥Ã¥¯¤È¸Æ¤Ð¤ì¤ë¹½Â¤¤Ë³ä¤êÅö¤Æ¤é¤ì¤Þ¤¹¡£¤³¤Î¥¹¥³¡¼¥×¤ò´ÉÍý¤¹¤ë¤¿¤á¤Ë¤¢¤ë¤Î¤¬ HandleScope ¤Ç¡¢¤³¤Î¥¯¥é¥¹¤â¥ì¥¥·¥«¥ë¥¹¥³¡¼¥×¤ò¥Ï¥ó¥É¥ë¥¹¥¿¥Ã¥¯¾å¤Î¥¹¥³¡¼¥×¤È¤·¤Æ°·¤¦¤¿¤á¤ÎÊä½õ¤ò¤·¤Æ¤¯¤ì¤Þ¤¹¡£
¤Þ¤º¥¹¥¯¥ê¥×¥È¤Î¥³¥ó¥Ñ¥¤¥ë¤Ç¤¹¤¬¡¢Script::Compile ¤ò»È¤¤¤Þ¤¹¡£String ¤òÅϤ¹É¬Íפ¬¤¢¤ê¡¢´ðËÜŪ¤Ë¤Ï UTF-8 ¤Ç²ò¼á¤µ¤ì¤ë¤è¤¦¤Ê¤Î¤ÇËÜÍè¤Ï¤³¤³¤Î¶³¦¤Çʸ»ú¥³¡¼¥ÉÊÑ´¹¤¬É¬Íפˤʤê¤Þ¤¹¤¬´Êñ¤Î¤¿¤á¤Ë¾Êά¤·¤Æ¤¤¤Þ¤¹¡£(ASCII ¤ÏÌäÂê¤Ê¤¯°·¤¨¤Þ¤¹¤Î¤Ç¡¢ÊÑ´¹¥ë¡¼¥Á¥ó¤Ê¤É¤Ï¸å¤Û¤ÉÄɲ䷤Ƥ¤¤±¤Ð¤è¤¤¤Ç¤¹¡£)
¥³¥ó¥Ñ¥¤¥ë·ë²Ì¤Ï Local<Script> ¤È¤·¤ÆÊ֤äƤ¯¤ë¤Î¤Ç¡¢¥³¥ó¥Ñ¥¤¥ë¤¬À®¸ù¤·¤¿¤é Script::Run() ¤ò»È¤Ã¤Æ¼Â¹Ô¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¥³¥ó¥Ñ¥¤¥ë»þ¡¢¤Þ¤¿¤Ï¼Â¹Ô»þ¤Ë¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¤Ï¤¤¤º¤ì¤«¤Î¥ë¡¼¥Á¥ó¤¬ empty ¤Ê¥Ï¥ó¥É¥ë¤òÊÖ¤·¤Þ¤¹¡£¥¨¥é¡¼½èÍý¤â¤Ç¤¤Þ¤¹¤¬¤³¤ì¤Ï¤Þ¤¿Ê̤ε¡²ñ¤Ë¸å½Ò¤·¤Þ¤¹¡£
¼Â¹Ô¤¬À®¸ù¤·¤¿¤é¡¢Run ¤ÎÊÖ¤êÃͤòʸ»úÎó¤ËÊÑ´¹¤·¤Æ·ë²Ì¤Î¥¦¥£¥ó¥É¥¦¤Ëɽ¼¨¤¹¤ë¤è¤¦¤Ë¤·¤Æ¤ä¤ê¤Þ¤¹¡£¤³¤³¤Ç¤âʸ»ú¥³¡¼¥ÉÊÑ´¹¤¬¤ª¤¤¤ª¤¤É¬Íפˤʤê¤Þ¤¹¡£
¡û ¤³¤³¤Þ¤Ç¤Ç¡¢¤Þ¤º¤Ï´Êñ¤Ê¥¤¥ó¥¿¥×¥ê¥¿¤¬¤Ç¤¤Þ¤·¤¿¡£non-ASCII ¤Êʸ»úÎó¤Ï¤Þ¤À¤¦¤Þ¤¯°·¤¨¤Þ¤»¤ó¤¬¡¢¤È¤ê¤¢¤¨¤º´Êñ¤Ê¥¹¥¯¥ê¥×¥È¤Ïư¤¯¤«¤È»×¤¤¤Þ¤¹¡£
¥¹¥¯¥ê¥×¥È¥³¥ó¥Ñ¥¤¥ë¡¦¼Â¹Ô¤ËºÝ¤·¤Æ¥¨¥é¡¼¤¬¤¢¤Ã¤¿¾ì¹ç(¤¿¤È¤¨¤Ð syntax error ¤¬¤¢¤Ã¤¿¾ì¹ç¤Ê¤É)¤Ë¤Ï¡¢¶õ¤Î¥Ï¥ó¥É¥ë¤¬ÊÖ¤ë¤È¤¤¤¦É÷¤Ë½ñ¤¤Þ¤·¤¿¡£Àè¤Û¤É¤Î¥¨¥ó¥È¥ê¤Ç¤Ïñ½ã¤Ë¥á¥Ã¥»¡¼¥¸¥Ü¥Ã¥¯¥¹¤ò½Ð¤¹¤À¤±¤Ë¤·¤¿¤Î¤Ç¤¹¤¬¡¢¤³¤ì¤À¤±¤Ç¤Ï¤Ê¤¼¥¨¥é¡¼¤Ë¤Ê¤Ã¤¿¤Î¤«¤¬¤Þ¤Ã¤¿¤¯¤ï¤«¤ê¤Þ¤»¤ó¡£
¤½¤³¤Ç¡¢¥¨¥é¡¼(Îã³°)¤Î¥Ï¥ó¥É¥ê¥ó¥°¤ò¹Ô¤¦¤ï¤±¤Ç¤¹¤¬¡¢¤³¤Î¤¿¤á¤Ë¤Ï V8 ¤Î TryCatch ¥¯¥é¥¹¤ò»È¤¤¤Þ¤¹¡£¤³¤Î¥¯¥é¥¹¤Ï¥¤¥ó¥¹¥¿¥ó¥¹¤Î¥ì¥¥·¥«¥ë¥¹¥³¡¼¥×¤ò try-catch ¥Ö¥í¥Ã¥¯¤È¤·¤Æµ¡Ç½¤µ¤»¤Þ¤¹¡£¤½¤ÎÃæ¤ÇÎã³°¤¬È¯À¸¤·¤¿¤È¤¡¢Îã³°¤Ë´Ø¤¹¤ë¾ðÊó¤òÆâÉô¤ËÊÝ»ý¤¹¤ë¤È¤¤¤¦¤·¤«¤±¤Ç¤¹¡£
TryCatch ¤ò»È¤¦¤Ë¤Ï¡¢¤¿¤È¤¨¤Ð OnBnClickedRun() ¤ò¼¡¤Î¤è¤¦¤Ë½ñ¤´¹¤¨¤Þ¤¹¡£
void CHogeDlg::OnBnClickedRun()
{
HandleScope handle_scope;
TryCatch try_catch;
...
if (script.IsEmpty()) {
String::Utf8Value str(try_catch.Exception());
MessageBox(CA2CT(*str), _T("Error"), MB_ICONERROR | MB_OK);
} else {
...
}
}
¡û ¥¹¥¯¥ê¥×¥È¤Î¼Â¹Ô¥¨¥é¡¼¤¬È¯À¸¤·¤¿¾ì¹ç¤âƱÍÍ¤Ë try_catch.Exception() ¤òÍøÍѤ·¤Æ½ñ¤±¤Ð OK ¤Ç¤¹¡£
¤Ê¤ó¤«È¾Ç¯¤¢¤¤¤Æ¤·¤Þ¤¤¤Þ¤·¤¿(´À
ºÇ¶á¤É¤¦¤â̵°Ù¤Ë²á¤´¤¹¤³¤È¤¬Â¿¤¯¤Æ¥À¥á¤Ç¤¹¤Í¡Ä¡£
Á°¤«¤é JavaScript ¥¨¥ó¥¸¥ó¤ÎÁȤ߹þ¤ß¤Ë¶½Ì£¤ò»ý¤Ã¤Æ¤¤¤¿¤Î¤Ç¤¹¤¬¡¢Google Chrome ¤Î JavaScript ¥¨¥ó¥¸¥ó¡ÖV8¡×¤ÎÁȤ߹þ¤ßµ»ö¤¬CodeProject ¤Ç½Ð¤Æ¤¤¤¿¤Î¤Ç¡¢»î¤·¤Æ¤ß¤ë¤³¤È¤Ë¤·¤Þ¤·¤¿¡£
°ÊÁ° SpiderMonkey ¤È¤«¤â»î¤·¤Æ¤ß¤¿¤³¤È¤¬¤¢¤ê¤Þ¤¹¤¬¡¢¤Ê¤ó¤È¤« Visual Studio ¤Ç¥Ó¥ë¥É¤·¤¿¤È»×¤Ã¤¿¤é Release ¥Ó¥ë¥É¤À¤È¤É¤¦¤âÊÑ¿ô¥¹¥³¡¼¥×¤Þ¤ï¤ê¤Îưºî¤¬ÊѤÀ¤Ã¤¿¤ê¡¢¥³¡¼¥É¤¬ C ¤È¤¤¤¦¤³¤È¤â¤¢¤Ã¤Æ C++ ¤«¤é¤¤ì¤¤¤Ë¸Æ¤Ó½Ð¤¹¤Ë¤Ï¥é¥Ã¥Ñ¥¯¥é¥¹¤È¤«¤òÍѰդ¹¤ëɬÍפ¬¤¢¤ê¤½¤¦¤À¤Ã¤¿¤ê¤·¤Æ°à¤¨¤Æ¤·¤Þ¤·¤¿¡£V8 ¤Ï¤â¤È¤â¤È C++ ¤Ç¤Á¤ã¤ó¤È¥¯¥é¥¹¤ò»È¤Ã¤Æ½ñ¤«¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢C++ ¤Î GUI ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤«¤é¤Ï¸Æ¤Ó¤ä¤¹¤¤¤«¤Ê¤È»×¤Ã¤¿¼¡Âè¡£
¡û ²¿¤Ï¤Ê¤¯¤È¤â¡¢¤Þ¤º¤Ï¥Ó¥ë¥É¤¹¤ëɬÍפ¬¤¢¤ë¤Î¤Ç¤¹¤¬¡¢º£²ó¤Ï MFC ¤È¤«¤ò»È¤Ã¤¿ GUI ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òÁȤ߹þ¤ß¥¿¡¼¥²¥Ã¥È¤È¤·¤Æ¹Í¤¨¤ë¤Î¤Ç¡¢½èÍý·Ï¤Ï Visual Studio (¤Á¤Ê¤ß¤Ë¥Ð¡¼¥¸¥ç¥ó¤Ï 2005)¤ò»È¤¤¤Þ¤¹¡£¤È¤¤¤Ã¤Æ¤â¡¢V8 ¤Ï¸ø¼°¤Ë VS2005, 2008 ¤Ç¤Î¥Ó¥ë¥É¤¬¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¢¼ê½ç¤Ë±è¤Ã¤Æ¤ä¤ì¤ÐÆÃ¤Ë¤Ä¤Þ¤ë¤È¤³¤í¤Ï¤Ê¤¤¤«¤È»×¤¤¤Þ¤¹¡£
svn ¤«¤é¥³¡¼¥É¤òŬÅö¤Ê¤È¤³¤í¤Ë¥À¥¦¥ó¥í¡¼¥É¤·¥Ó¥ë¥É¤ò¹Ô¤¤¤Þ¤¹¤¬¡¢Visual Studio ¤Î¾ì¹ç´ðËÜŪ¤Ë¤Ï tools/visual_studio ¤Ë¤¢¤ë v8.sln ¤ò»È¤¨¤Ð OK ¤Ç¤¹¡£
¥Ó¥ë¥É¤Ë¤Ï¥³¥ó¥Ñ¥¤¥é¤Î¤Û¤«¤Ë Python ¤¬É¬ÍפÇ*1¡¢»ä¤Ï Win32 ¥Í¥¤¥Æ¥£¥Ö¤Ç¤Ï¤Ê¤¯ Cygwin ¤Î Python ¤ò»È¤¤¤Þ¤·¤¿¡£¤³¤Î¤¿¤á¡¢²¿²Õ½ê¤«¥¹¥¯¥ê¥×¥È¤Ê¤É¤Î½ñ¤´¹¤¨¤¬É¬Íפˤʤê¤Þ¤¹¡£
¡û °Ê¾å¤ÎÊѹ¹¤ò¹Ô¤Ã¤Æ¡¢Ìµ»ö¤Ë¥é¥¤¥Ö¥é¥ê¤ä¥µ¥ó¥×¥ë·²¤¬¥Ó¥ë¥É¤Ç¤¤Þ¤·¤¿¡£¥Ó¥ë¥É¤Î·ë²Ì¤Ï¡¢tools/visual_studio/{Debug, Release} ¤Ë½ÐÎϤµ¤ì¤Þ¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï V8 ¤Î snapshot ÈÇ*3 static library ¤¬¾åµ¤Î¥Ç¥£¥ì¥¯¥È¥ê²¼¤Î lib ¥Ç¥£¥ì¥¯¥È¥êÆâ¤Ë¥Ó¥ë¥É¤µ¤ì¤Þ¤¹¡£DLL ¤Î¥Ó¥ë¥É¤Ë¤Ä¤¤¤Æ¤Ï¸½ºß¤Î¤È¤³¤í¤ä¤Ã¤Æ¤¤¤Þ¤»¤ó¤¬¡¢scons ¤ò»È¤¨¤Ð´Êñ¤ËÀÚ¤êÂØ¤¨¤Ç¤¤ë¤è¤¦¤Ç¤¹¡£
¥·¥§¥ë¤Î¥µ¥ó¥×¥ë¤ò¥Ó¥ë¥É¤¹¤ë¤È¡¢¥³¥Þ¥ó¥É¥é¥¤¥ó¤«¤é V8 ¤Îưºî¤ò´Êñ¤Ë»î¤¹¤³¤È¤¬¤Ç¤¤Þ¤¹¡£¥·¥§¥ë¤Ï .../{Debug,Release}/v8_shell_sample.exe ¤È¤Ê¤ê¤Þ¤¹¤Î¤Ç¡¢µ¯Æ°¤¹¤ë¤È¥×¥í¥ó¥×¥È¤¬½Ð¤ë¤Î¤Ç¡¢JavaScript ¥³¡¼¥É¤òÆþÎϤ¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
V8 version 0.4.2.1
> function fact(x) { if (x <= 1) return 1; else return x * fact(x - 1); }
> fact(10)
3628800
>
¡û ¤Ê¤É¡£
*1 ¥Ç¥Õ¥©¥ë¥È¥¯¥é¥¹Îà¤ÎÄêµÁ¤ò¹Ô¤¦ JavaScript ¤ò C++ ¥½¡¼¥¹¤ËÁ°½èÍý¤¹¤ë¤¿¤á¤ËɬÍפʤ褦¤Ç¤¹¡£
*2 Cygwin ¤Î¾ì¹ç path separator ¤¬ '\' ¤Ç¤Ï¤Ê¤¯ '/' ¤Ê¤Î¤Ç¡¢¤½¤Î¤Þ¤Þ¤Ç¤Ïưºî¤·¤Þ¤»¤ó¡£¤½¤Î¤¿¤á¡¢ad hoc ¤Ç¤¢¤ë¤¬Ê¸»úÎóÃÖ´¹¤Ê¤É¤Ç¥Ñ¥¹¤òÊÑ´¹¤·¤Æ¤ä¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
*3 ¥Ç¥Õ¥©¥ë¥È¥¯¥é¥¹·²¤òÆâÉô¥³¡¼¥É¤Ë¥³¥ó¥Ñ¥¤¥ë¤·¤Æµ¯Æ°¤ò¹â®²½¤¹¤ë¡¢¤È¤Î¤³¤È¡£Emacs ¤Î¥À¥ó¥×¤ÈƱ¤¸¤è¤¦¤Ê¤â¤Î¤«¤È»×¤ï¤ì¤Þ¤¹¡£
ÀèÆü½Ð¤¿ Debian ·Ï Linux ¥Ç¥£¥¹¥È¥ê¥Ó¥å¡¼¥·¥ç¥ó¤Î PRNG ¤ÎÌäÂê¤Ëµ¯°ø¤¹¤ëÀȼåÀ¤Ë´Ø¤·¤Æ¡¢¼«Â𥵡¼¥Ð¤Ç¤â dowkd/dowkd.pl ¤Ë¤è¤ë¸ø³«¸°¤Î¥Æ¥¹¥È¤ò¹Ô¤¤¤Þ¤·¤¿¡£
¤È¤ê¤¢¤¨¤º³°Éô¤«¤é¤Î¥í¥°¥¤¥ó¥Ñ¥¹¤¬¤¢¤ë¤È¤³¤í¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤·¤¿¤¬¡¢º£¤Î¤È¤³¤íÌäÂê¤Î¤¢¤ë¸°¤Ï¸«¤Ä¤«¤Ã¤Æ¤¤¤Þ¤»¤ó¡£
¤Þ¤¢¡¢»ä¤Î»È¤Ã¤Æ¤¤¤ë¡¦´ÉÍý¤·¤Æ¤¤¤ë¥Û¥¹¥È¤Ï¤Û¤È¤ó¤É FreeBSD ¤« Cygwin ¤¯¤é¤¤¤·¤«¤Ê¤¤¤Î¤Ç¿ʬ±Æ¶Á¤Ï¼õ¤±¤Æ¤¤¤Ê¤¤¤È»×¤¦¤Î¤Ç¤¹¤¬¡¢¸°¤È¤Ã¤«¤¨¤ä¤í¤¦¤È¤¹¤ë¤È·ë¹½¤á¤ó¤É¤¤¤ó¤À¤è¤Í¡£°ÊÁ°½ñ¤¤¤¿¸°¥æ¡¼¥Æ¥£¥ê¥Æ¥£»È¤¦¤È¿¾¯¤Ï³Ú¤À¤í¤¦¤«¡©
¡û ¤æ¤ [ÆÍÁ³¤Ç¤¹¤¬¤Á¤ç¤Ã¤È¼ÁÌ䤷¤¿¤¤¤Î¤Ç¤¹¤¬¡¢¤¹¤´¡¼¤¯Á°¤ËÆüµ¤Ë º¸ÌܤÎÇòÌܤΤȤ³¤í¤Ë¤Á¤ç¤Ã¤È¡¢·ìƦ¤Î¤è¤¦¤Ê´¶¤¸¤ÇÀÖ¤¯¤Ê¤Ã..]
¡û Tossy-2 [To: ¤æ¤¤µ¤ó ¤¹¤°¤«¤É¤¦¤«¤Ï³Ð¤¨¤Æ¤¤¤Þ¤»¤ó¤¬¡¢¤¤¤Ä¤Î´Ö¤Ë¤«¾Ã¤¨¤Æ¤¤¤¿¤è¤¦¤Ç¤¹¡£ Ìܤΰì»þŪ¤Ê½¼·ì¤ÈƱ¤¸¤Ç¡¢ÆÃ..]