¡û¤Ï¤¸¤á¤Ë

º£²ó¤ÏÁ°²ó¡¢Á°¡¹²ó¤Ë°ú¤­Â³¤­Azure SignalR Service¤Î¾Ò²ð¤ò¤·¤Þ¤¹¡£Á°²óºîÀ®¤·¤¿¡Ö¸½ºß¤Î³ô¼°¾ðÊó¤Î°ìÍ÷¤òɽ¼¨¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¡×¤ò´°À®¤µ¤»¤Æ¤¤¤­¤Ê¤¬¤é¡¢Azure SignalR Service¤ò»È¤Ã¤¿¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Æ¤¤¤­¤Þ¤¹¡£

¡ûº£²óºîÀ®¤¹¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó

Á°²ó¤Þ¤Ç¤Ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¥Ù¡¼¥¹¤È¤Ê¤ëÉôʬ¤òºîÀ®¤·¤¿¤Î¤Ç¡¢º£²ó¤ÏAzure Cosmos DB¤ÈAzure SignalR Service¤òÏ¢·È¤·¤Æ¾ðÊó¤Î¹¹¿·¤ò¥ê¥¢¥ë¥¿¥¤¥à¤Ç²èÌ̾å¤Ç³Îǧ¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¼ÂÁõ¤ò¹Ô¤¤¡¢¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò´°À®¤µ¤»¤Æ¤¤¤­¤Þ¤¹¡£

¤Ê¤ªº£²ó¼ÂÁõ¤¹¤ë¥½¡¼¥¹¥³¡¼¥É¤Ë¤Ä¤¤¤Æ¤Ï¡¢¤³¤Á¤é¤«¤é¥À¥¦¥ó¥í¡¼¥É¤¬¤Ç¤­¤Þ¤¹¡£

¡û¹¹¿·¤¬¤¢¤Ã¤¿³ô¼°¾ðÊó¤ÎÄÌÃΤò¹Ô¤¦Functions¤Î¼ÂÁõ

¤Þ¤º¤ÏÁ°²ó¤Ë°ú¤­Â³¤­¡¢Functions¤Î¼ÂÁõ¤ò¹Ô¤Ã¤Æ¤¤¤­¤Þ¤¹¡£º£²óºîÀ®¤¹¤ë´Ø¿ô¤Ïnegotiate¡¢stocksChanged¤Î2¼ïÎà¤ÎFunctions¤Ç¤¹¡£¤Ê¤ª¡¢negotiate´Ø¿ô¤Ë¤Ä¤¤¤Æ¤ÏÁ°¡¹²ó¤Ë¾Ò²ð¤·¤¿¤â¤Î¤ÈƱ¤¸¼ÂÁõ¤È¤Ê¤ë¤Î¤ÇÀâÌÀ¤Ï¾Êά¤·¤Þ¤¹¡£negotiate´Ø¿ô¤ÏÁ°¡¹²ó¤ËÀâÌÀ¤·¤¿Ä̤ꡢ¥¯¥é¥¤¥¢¥ó¥È¤ÈSignalR Service¥¤¥ó¥¹¥¿¥ó¥¹¤¬Àܳ¤ò³«»Ï¤¹¤ëºÝ¤Ë¸Æ¤Ó½Ð¤µ¤ì¤ëÄ귿Ū¤Ê´Ø¿ô¤Ç¤¹¡£

°Ê²¼¤Ï¡¢³ô¼°¾ðÊó¤Ë¹¹¿·¤¬¤¢¤Ã¤¿ºÝ¤Ë¼Â¹Ô¤µ¤ì¤ëstockChanged´Ø¿ô¤òÅÐÏ¿¤¹¤ë¤¿¤á¤Î¥³¡¼¥É¤Ç¤¹¡£

³ô¼°¾ðÊ󹹿·ÄÌÃΤδؿôÄêµÁ¡ÊstockChanged/functions.json¡Ë

{

"disabled": false,

"bindings": [

{

"type": "cosmosDBTrigger", ¡¦¡¦¡¦­¡

"name": "documents",

"direction": "in",

"leaseCollectionName": "leases",

"connectionStringSetting": "AzureCosmosDBConnectionString",

"databaseName": "stocksdb",

"collectionName": "stocks",

"createLeaseCollectionIfNotExists": "true",

"feedPollDelay": 500

},

{

"type": "signalR", ¡¦¡¦¡¦­¢

"name": "signalRMessages",

"connectionString": "AzureSignalRConnectionString",

"hubName": "stocks",

"direction": "out"

}

]

}

¤³¤³¤Ç¤Ï¡¢´Ø¿ô¤Îµ¯Æ°¥È¥ê¥¬¡¼¤¬¡ÖcosmosDBTrigger¡×¤Ç¡¢½ÐÎÏÀ褬¡ÖsignalR¡×¤È¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡Ê­¢¡Ë¡£¤Þ¤ºµ¯Æ°¥È¥ê¥¬¡¼¤ËÀßÄꤵ¤ì¤Æ¤¤¤ë¡ÖcosmosDBTrigger¡×¤Ç¤¹¤¬¡¢¤³¤ì¤Ï¥Õ¥£¡¼¥É¤òAzure Functions¤¬¥È¥ê¥¬¡¼¤È¤·¤ÆÍøÍѤǤ­¤ë¤è¤¦¤Ë¤·¤¿¤â¤Î¤Ç¤¹¡£

¥Õ¥£¡¼¥É¤È¤Ï¡¢»ØÄꤷ¤¿Cosmos DB¤Î¥³¥ó¥Æ¥ÊÆâ¤Î¥Ç¡¼¥¿¤ËÊѹ¹¤¬¤¢¤Ã¤¿¤³¤È¤òÄÌÃΤ¹¤ë¤¿¤á¤Î¤·¤¯¤ß¤Î¤³¤È¡£¤³¤ì¤Ë¤è¤Ã¤Æ³ô²Á¥Ç¡¼¥¿¤Î¹¹¿·¤ò¥È¥ê¥¬¡¼¤È¤·¤Æ¤³¤Î´Ø¿ô¤òµ¯Æ°¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤µ¤é¤Ë½ÐÎÏÀ褬¡ÖsignalR¡×¤Ç¤¢¤ë¤³¤È¤Ç¡¢¹¹¿·ÆâÍƤòSignalR Service·Ðͳ¤Ç¥¯¥é¥¤¥¢¥ó¥È¤Ë¥ê¥¢¥ë¥¿¥¤¥à¤ËÁ÷¿®¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

³¤¤¤Æ¡¢stockChanged´Ø¿ô¤ÎËÜÂΤǤ¹¡£

³ô¼°¾ðÊ󹹿·ÄÌÃδؿô¡ÊstockChanged/index.js¡Ë

module.exports = async function (context, documents) {

// ¹¹¿·ÆâÍƤòSignalR¤Ë½ÐÎϤǤ­¤ë·Á¼°¤ËÊÑ´¹ ¡¦¡¦¡¦­¡

const updates = documents.map(stock => ({

target: 'updated',

arguments: [stock]

}));

// ¹¹¿·ÆâÍƤòSignalR¤Ë½ÐÎÏ ¡¦¡¦¡¦­¢

context.bindings.signalRMessages = updates;

context.done();

}

´Ø¿ôËÜÂΤμÂÁõ¤Ç¤Ï¡¢Cosmos DB¤è¤êÄÌÃΤµ¤ì¤¿¹¹¿·ÆâÍÆ¡Ê´Ø¿ô¤Î°ú¿ô¤Ë¤¢¤ëdocuments¡Ë¤ò¤â¤È¤ËSignalR¤Ë½ÐÎϤǤ­¤ë·Á¼°¤ËÊÑ´¹¤·¤Æ¡Ê­¡¡Ë¡¢½ÐÎϤò¤·¤Þ¤¹¡Ê­¢¡Ë¡£·Á¼°¤ÎÊÑ´¹»þ¤Ë¡Ötarget: 'updated'¡×¤È»ØÄꤹ¤ë¤³¤È¤Ç¡¢¥¯¥é¥¤¥¢¥ó¥È¦¤ÇƱ̾¤ÎSignalRÍѤΥ¤¥Ù¥ó¥È¥ê¥¹¥Ê¡¼¤¬¸Æ¤Ó¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

¡û²èÌ̤μÂÁõ

¼¡¤Ï¸½ºß¤Î³ô²Á¤Î°ìÍ÷¤òɽ¼¨¤¹¤ë²èÌ̤ȲèÌ̤ÇÆ°ºî¤¹¤ë¥¹¥¯¥ê¥×¥È¤ò¼ÂÁõ¤·¤Þ¤¹¡£¤³¤³¤Ç¤ÏHTML¡Êindex.html¡Ë¤È¥¹¥¯¥ê¥×¥È¡Êpublic/index.html.js¡Ë¤Î¼ÂÁõ¤Î¤ßÀâÌÀ¤·¤Þ¤¹¡£CSS¡Êindex.html.css¡Ë¤Ë¤Ä¤¤¤Æ¤ÏÀâÌÀ¤ò³ä°¦¤·¤Þ¤¹¤Î¤Ç¡¢¾Ü¤·¤¯¤Ï¥½¡¼¥¹¥³¡¼¥É¤ò¤´³Îǧ²¼¤µ¤¤¡£

¤Þ¤º¤Ï²èÌ̤Ëɳ¤Å¤¯¥¹¥¯¥ê¥×¥È¤Î¼ÂÁõ¤ò¹Ô¤¤¤Þ¤¹¡£

³ô¼°¾ðÊó°ìÍ÷²èÌ̤Υ¹¥¯¥ê¥×¥È¡Êpublic/index.html.js¡Ë

// Functions¤¬µ¯Æ°¤·¤Æ¤¤¤ëURL¤ò»ØÄê

const LOCAL_BASE_URL = 'http://localhost:7071';

const app = new Vue({

el: '#app',

data() {

return {

stocks: []

}

},

methods: {

// ³ô²Á°ìÍ÷¤ò¼èÆÀ¤¹¤ë ¡¦¡¦¡¦­¡

async getStocks() {

try {

const apiUrl = `${LOCAL_BASE_URL}/api/getStocks`;

const response = await axios.get(apiUrl);

console.log('Stocks fetched from ', apiUrl);

app.stocks = response.data;

} catch (ex) {

console.error(ex);

}

}

},

created() {

this.getStocks();

}

});

const connect = () => {

// SignalR Service¥¤¥ó¥¹¥¿¥ó¥¹¤ÈÀܳ¤¹¤ë ¡¦¡¦¡¦­¢

const connection = new signalR.HubConnectionBuilder().withUrl(`${LOCAL_BASE_URL}/api`).build();

¡¦¡¦¡¦Ãæά

// ³ô²Á¤Î¹¹¿·¾ðÊó¤òSignalR Service¥¤¥ó¥¹¥¿¥ó¥¹¤«¤é¼õ¿®¤·¤Æ²èÌ̤ËÈ¿±Ç¤¹¤ë ¡¦¡¦¡¦­£

connection.on('updated', updatedStock => {

const index = app.stocks.findIndex(s => s.id === updatedStock.id);

app.stocks.splice(index, 1, updatedStock);

});

¡¦¡¦¡¦Ãæά

};

connect();

¤³¤Î¥¹¥¯¥ê¥×¥È¤Ç¤ÏVue.js¤ò»ÈÍѤ·¤Æ¤¤¤Þ¤¹¡£Vue¥¤¥ó¥¹¥¿¥ó¥¹¤ÎÀ¸À®»þ¤Ë³ô²Á¤Î°ìÍ÷¤òFunctions¤ÎgetStocks´Ø¿ô¤«¤é¼èÆÀ¤¹¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤Þ¤¹¡Ê­¡¡Ë¡£¤³¤ì¤Ç²èÌ̤˥¢¥¯¥»¥¹¤·¤¿¥¿¥¤¥ß¥ó¥°¤Ç¤¹¤Ù¤Æ¤Î³ô²Á¾ðÊó¤ò³Îǧ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£¤½¤Î¸å¡¢³ô²Á¤ËÊÑÆ°¤¬¤¢¤Ã¤¿¾ì¹ç¤ÏSignalR Service·Ðͳ¤Ç¥ê¥¢¥ë¥¿¥¤¥à¤Ë¹¹¿·ÆâÍƤò²èÌ̤ËÈ¿±Ç¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤Þ¤¹¡Ê­¢¡¢­£¡Ë¡£

­¢¤Î²Õ½ê¤Ç¤Þ¤ºSignalR Service¥¤¥ó¥¹¥¿¥ó¥¹¤È¤ÎÀܳ¤ò³«»Ï¤·¤Þ¤¹¡£¤³¤³¤Ç¤ÏÆâÉôŪ¤ËFunctions¤Î¡Önegotiate¡×´Ø¿ô¤¬¸Æ¤Ó½Ð¤µ¤ì¡¢¥¯¥é¥¤¥¢¥ó¥È¤ÈSignalR Service¥¤¥ó¥¹¥¿¥ó¥¹¤È¤Î´Ö¤ÇÀܳ¤¬³ÎΩ¤µ¤ì¤Þ¤¹¡£³ô²Á¥Ç¡¼¥¿¤Î¹¹¿·¾ðÊó¤Ï¡¢SignalR Service¤«¤é­£¤Î¥¤¥Ù¥ó¥È¥ê¥¹¥Ê¡¼¤ËÏ¢·È¤µ¤ì¤Þ¤¹¡£¥¤¥Ù¥ó¥È¥ê¥¹¥Ê¡¼Æâ¤Ç¤Ï¡¢¼õ¿®¤·¤¿ÆâÍƤò¤â¤È¤Ë²èÌÌɽ¼¨¤ò¹¹¿·¤·¤Æ¤¤¤Þ¤¹¡£

³¤¤¤Æ²èÌ̤μÂÁõ¤ò¹Ô¤¤¤Þ¤¹¡£

³ô¼°¾ðÊó°ìÍ÷²èÌÌ¡Êpublic/index.html¡Ë

Stock Service

Stocks

¡¦¡¦¡¦­£

{{ stock.symbol }}: ${{ stock.price }}

Change:

{{ stock.changeDirection }}{{ stock.change }}

¡¦¡¦¡¦­¢

¡¦¡¦¡¦­¡

HTML¤Î¼ÂÁõ¤Ç¤Ï¤Þ¤º¡¢script¥¿¥°¤ò»È¤Ã¤ÆÀèÄøºîÀ®¤·¤¿¥¹¥¯¥ê¥×¥È¡Ê­¡¡Ë¤ÈAzure SignalR Service¤¬Ä󶡤¹¤ë¥¯¥é¥¤¥¢¥ó¥ÈSDK¤ò¥¤¥ó¥Ý¡¼¥È¤·¤Þ¤¹¡£HTML¤¬¥¯¥é¥¤¥¢¥ó¥ÈSDK¤òÆɤ߹þ¤à¤³¤È¤Ç¡¢negotiate´Ø¿ô¤ò¸Æ¤Ó½Ð¤·¤ÆSignalR Service¥¤¥ó¥¹¥¿¥ó¥¹¤È¤ÎÀܳ¤ò³ÎΩ¤¹¤ë»ÅÁȤߤȤʤäƤ¤¤Þ¤¹¡£°ìÅÙÀܳ¤¬³ÎΩ¤µ¤ì¤ë¤È²èÌ̤òÊĤ¸¤ë¤Þ¤Ç¤ÏSignalR Service¥¤¥ó¥¹¥¿¥ó¥¹¤È¤ÎÀܳ¤Ï·Ñ³¤µ¤ì¡¢¥ê¥¢¥ë¥¿¥¤¥àÄÌ¿®¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

²èÌ̤μÂÁõ¤Î¥á¥¤¥óÉôʬ¡Ê­£¡Ë¤Ç¤Ï¡¢Vue.js¤Îµ­Ë¡¤òÍѤ¤¤Ê¤¬¤é³ô¼°¾ðÊó¤Î°ìÍ÷¤òɽ¼¨¤·¤Æ¤¤¤Þ¤¹¡£

¡û¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¼Â¹Ô¤·¤Æ¤ß¤è¤¦

¤³¤³¤Þ¤Ç¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î³Æ¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Î¼ÂÁõ¤ò¹Ô¤Ã¤Æ¤­¤Þ¤·¤¿¡£¤³¤³¤«¤é¤Ï¼ÂºÝ¤Ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òµ¯Æ°¤·¡¢SignalR Service¤«¤é¤Î¥Ç¡¼¥¿¹¹¿·¤¬²èÌ̤ËÈ¿±Ç¤µ¤ì¤ëÍͻҤò³Îǧ¤·¤Æ¤ß¤Þ¤·¤ç¤¦¡£

¡ûpackage.json¤Î½¤Àµ

¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òµ¯Æ°¤¹¤ëÁ°¤Ë¡¢¤Þ¤º¤Ïpackage.json¤Î½¤Àµ¤ò¤·¤Þ¤¹¡£¡Öscripts¡×¤ÎÃæ¿È¤ò°Ê²¼¤Î¤è¤¦¤Ë½ñ¤­´¹¤¨¤Þ¤¹¡£

scripts¤Î½¤Àµ¡Êpackage.json¡Ë

{

¡¦¡¦¡¦Ãæά

"scripts": {

"start": "lite-server --baseDir=\"public\"",

"setup": "node setup.js",

"update-data": "node update.js"

},

¡¦¡¦¡¦Ãæά

}

¡Öscripts¡×Æâ¤Ëµ­ºÜ¤·¤¿¥³¥Þ¥ó¥É̾¤Ï¡¢¡Önpm run¡×¤Î¸å¤í¤Ë»ØÄꤹ¤ë¤³¤È¤Çµ­ºÜ¤·¤Æ¤¤¤ë¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£

¡ûFunctions¤Îµ¯Æ°

¤Ï¤¸¤á¤ËFunctions¤ò¥í¡¼¥«¥ë¤Çµ¯Æ°¤·¤Þ¤¹¡£Á°²óƱÍÍAzure Functions¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¥Ä¡¼¥ë¤ò»ÈÍѤ·¤ÆFunctionsÍѤΥµ¡¼¥Ð¡¼¤òµ¯Æ°¤·¤Þ¤¹¡£¥¿¡¼¥ß¥Ê¥ë¤ò³«¤­¡¢¥×¥í¥¸¥§¥¯¥È¤Î¥ë¡¼¥È¥Ç¥£¥ì¥¯¥È¥ê¾å¤Ç°Ê²¼¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£

Functions¤ò¥í¡¼¥«¥ë¤Çµ¯Æ°¤¹¤ë

$ func start

¡¦¡¦¡¦Ãæά

# °Ê²¼¤Î¥á¥Ã¥»¡¼¥¸¤¬É½¼¨¤µ¤ì¤ì¤Ðµ¯Æ°À®¸ù

Generating 3 job function(s)

Found the following functions:

Host.Functions.negotiate

Host.Functions.stocksChanged

Host.Functions.getStocks

¡¦¡¦¡¦Ãæά

Job host started

µ¯Æ°¤ËÀ®¸ù¤¹¤ë¤È¡¢HTTP¥È¥ê¥¬¡¼¤Çµ¯Æ°¤¹¤ë´Ø¿ô¤Ï¡Öhttp://localhost:7071¡×¾å¤Ë¥Û¥¹¥Æ¥£¥ó¥°¤µ¤ì¤Þ¤¹¡£

¡û¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Îµ¯Æ°

³¤¤¤Æ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Îµ¯Æ°¤ò¤·¤Þ¤¹¡£Functions¤òµ¯Æ°¤·¤¿¤â¤Î¤È¤ÏÊ̤Υ¿¡¼¥ß¥Ê¥ë¤òÍÑ°Õ¤·¡¢¥×¥í¥¸¥§¥¯¥È¤Î¥ë¡¼¥È¥Ç¥£¥ì¥¯¥È¥ê¾å¤Ç°Ê²¼¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£

¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òµ¯Æ°¤¹¤ë

# ¥»¥Ã¥È¥¢¥Ã¥×ÍѤΥ¹¥¯¥ê¥×¥È¤Î¼Â¹Ô ¡¦¡¦¡¦­¡

npm run setup

# ¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Îµ¯Æ° ¡¦¡¦¡¦­¢

npm start

­¡¤Ç¤Ï¡Ösetup.js¡×¤Ë¼ÂÁõ¤·¤¿½èÍý¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£Cosmos DB¥¢¥«¥¦¥ó¥È¤Ë¥Ç¡¼¥¿¥Ù¡¼¥¹¤È¥³¥ó¥Æ¥Ê¤òºîÀ®¤·¡¢¥µ¥ó¥×¥ë¤Î³ô²Á¥Ç¡¼¥¿¤ò£³·ïÄɲ䷤Ƥ¤¤Þ¤¹¡£

­¢¤Î¼Â¹Ô¸å¡¢¥Ö¥é¥¦¥¶¤Ç°Ê²¼¤Î¤è¤¦¤Ë³ô²Á°ìÍ÷¤¬É½¼¨¤µ¤ì¤ì¤Ðµ¯Æ°¤ÏÀ®¸ù¤Ç¤¹¡£

£³¤Ä¤ÎÌÃÊÁ¤Î³ô²Á¤È¤½¤ì¤¾¤ì¤Îľ¶á¤ÎÃÍÆ°¤­¤¬É½¼¨¤µ¤ì¤Æ¤¤¤Þ¤¹¡£

¡ûÆ°ºî³ÎǧÍÑ¥¹¥¯¥ê¥×¥È¤ÎºîÀ®

¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬µ¯Æ°¤Ç¤­¤¿¤é¡¢Cosmos DB¤ËÅÐÏ¿¤µ¤ì¤Æ¤¤¤ë³ô²Á¥Ç¡¼¥¿¤Î¹¹¿·¤ò¤·¤Æ¤½¤ÎÆâÍƤ¬SignalR Service¤ò·Ðͳ¤·¤Æ²èÌ̾å¤Ë¥ê¥¢¥ë¥¿¥¤¥à¤ËÈ¿±Ç¤µ¤ì¤ë¤³¤È¤ò³Îǧ¤·¤Æ¤ß¤Þ¤·¤ç¤¦¡£¿·¤·¤¤¥¿¡¼¥ß¥Ê¥ë¤ò¤â¤¦£±¤Ä³«¤­¡¢¥×¥í¥¸¥§¥¯¥È¤Î¥ë¡¼¥È¥Ç¥£¥ì¥¯¥È¥ê¾å¤Ç°Ê²¼¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤Þ¤¹¡£

Functions¤ò¥í¡¼¥«¥ë¤Çµ¯Æ°¤¹¤ë

npm run update-data

¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤·¤¿Ä¾¸å¤Ë¡¢¥Ö¥é¥¦¥¶¾å¤Ëɽ¼¨¤µ¤ì¤Æ¤¤¤ë¡ÖABC¡×¤È¤¤¤¦ÌÃÊÁ¤Î³ô²Á¤¬¹¹¿·¤µ¤ì¤Æ¤¤¤ë¤³¤È¤¬Ê¬¤«¤ê¤Þ¤¹¡£¾åµ­¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤¿¤Ó¤Ë¡¢²èÌ̾å¤Î¥Ç¡¼¥¿¤¬¹¹¿·¤µ¤ì¤Æ¤¤¤¯¤³¤È¤¬³Îǧ¤Ç¤­¤Þ¤¹¡£

¾åµ­¤Î¥³¥Þ¥ó¥É¼Â¹Ô»þ¤Ë¤Ï¡¢¡Öupdate.js¡×¤È¤¤¤¦¥¹¥¯¥ê¥×¥È¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£¤³¤ÎÃæ¤Ç¡ÖABC¡×¤ÎÌÃÊÁ¤Î³ô²Á¤ò¥é¥ó¥À¥à¤ËÊѹ¹¤·¡¢Cosmos DB¾å¤Î¥Ç¡¼¥¿¤ò¹¹¿·¤¹¤ë½èÍý¤ò¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹¡£¤³¤Î¥³¥Þ¥ó¥É¤ò¼Â¹Ô¤¹¤ë¤³¤È¤è¤êCosmos DB¾å¤Î¥Ç¡¼¥¿¹¹¿·¤ò¥È¥ê¥¬¡¼¤ËFunctions¤Î¡ÖstocksChanged¡×´Ø¿ô¤¬¼Â¹Ô¤µ¤ì¡¢¤½¤ì¤¬SignalR Service¥¤¥ó¥¹¥¿¥ó¥¹¤ò·Ðͳ¤·¤Æ²èÌ̤ËÈ¿±Ç¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¤¹¡£

¤Ê¤ª¡Öupdate.js¡×¤Î¼ÂÁõ¤Ë¤Ä¤¤¤Æ¤Ï³ä°¦¤·¤Þ¤¹¤Î¤Ç¡¢¾Ü¤·¤¯¤Ï¥½¡¼¥¹¥³¡¼¥É¤ò¤´³Îǧ²¼¤µ¤¤¡£

¡û¤Þ¤È¤á

Á´£³²ó¤ËÅϤäÆAzure SignalR Service¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¤Æ¤­¤Þ¤·¤¿¡£Azure SignalR Service¤ò¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ËŬÍѤ¹¤ë¤³¤È¤ÇµìÍè¤Îµ¼»÷Ū¤Ê¥ê¥¢¥ë¥¿¥¤¥à¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î»ÅÁȤߤ«¤é¡¢ËܳÊŪ¤Ê¥ê¥¢¥ë¥¿¥¤¥à¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¹½Ãۤ˥·¥Õ¥È¤Ç¤­¤ë¤³¤È¤¬Ê¬¤«¤Ã¤¿¤«¤È»×¤¤¤Þ¤¹¡£Azure Functins¤äAzure Cosmos DB¤Ê¤É¾¤ÎAzure¥µ¡¼¥Ó¥¹¤È¤ÎÏ¢·È¤âÍưפʤ¿¤á¡¢¥µ¡¼¥Ð¡¼¥ì¥¹¤Ê¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¹½ÃÛ¤¹¤ëºÝ¤Î¥­¡¼¥Ý¥¤¥ó¥È¤È¤·¤ÆAzure SignalR Service¤ÎÍøÍѤò¸¡Æ¤¤·¤Æ¤ß¤ë²ÁÃͤ¬¤¢¤ë¤«¤È»×¤¤¤Þ¤¹¡£

¼¡²ó¤Ï¡¢2020ǯ5·î¤ËÀµ¼°ÈǤ¬¥ê¥ê¡¼¥¹¤µ¤ì¤¿Windows Terminal¤Ë¤Ä¤¤¤ÆÀâÌÀ¤¹¤ëͽÄê¤Ç¤¹¡£

WINGS¥×¥í¥¸¥§¥¯¥È ½©ÍÕζ°ìÃø/»³Åľʹ²´Æ½¤¡ãWINGS¥×¥í¥¸¥§¥¯¥È¤Ë¤Ä¤¤¤Æ¡ä¥Æ¥¯¥Ë¥«¥ë¼¹É®¥×¥í¥¸¥§¥¯¥È(Âåɽ»³Åľʹ²)¡£³¤³°µ­»ö¤ÎËÝÌõ¤«¤é¡¢¼ç¤ËWeb³«È¯Ê¬Ìî¤Î½ñÀÒ¡¦»¨»ï/Webµ­»ö¤Î¼¹É®¡¢¹Ö±éÅù¤òÉý¹­¤¯¼ê¤¬¤±¤ë¡£°ì½ï¤Ë¼¹É®¤ò¤Ç¤­¤ëÍ­»Ö¤òÊ罸Ãæ