å¹ççãªãããåŠçãšã°ã«ãŒãåã¹ããªãŒã åŠçã®ããã®é«åºŠãªJavaScriptã€ãã¬ãŒã¿ãã«ããŒæè¡ã解説ãããã©ãŒãã³ã¹åäžã®ããã®ããŒã¿æäœã®æé©åæ¹æ³ãåŠã³ãŸãã
JavaScriptã€ãã¬ãŒã¿ãã«ããŒã®ãããåŠçïŒã°ã«ãŒãåãããã¹ããªãŒã åŠç
çŸä»£ã®JavaScriptéçºã§ã¯ãå€§èŠæš¡ãªããŒã¿ã»ãããããŒã¿ã¹ããªãŒã ãåŠçããããšãé »ç¹ã«ãããŸãããããã®ããŒã¿ã»ãããå¹ççã«åŠçããããšã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšå¿çæ§ã«ãšã£ãŠæ¥µããŠéèŠã§ããJavaScriptã®ã€ãã¬ãŒã¿ãã«ããŒã¯ããããåŠçãã°ã«ãŒãåã¹ããªãŒã åŠçã®ãããªæè¡ãšçµã¿åãããããšã§ãããŒã¿ã广çã«ç®¡çããããã®åŒ·åãªããŒã«ãæäŸããŸãããã®èšäºã§ã¯ããããã®æè¡ãæ·±ãæãäžããããŒã¿æäœã®ã¯ãŒã¯ãããŒãæé©åããããã®å®è·µçãªäŸãšæŽå¯ãæäŸããŸãã
JavaScriptã®ã€ãã¬ãŒã¿ãšãã«ããŒãçè§£ãã
ãããåŠçãšã°ã«ãŒãåã¹ããªãŒã åŠçã«æ·±ãå ¥ãåã«ãJavaScriptã®ã€ãã¬ãŒã¿ãšãã«ããŒã«ã€ããŠãã£ãããšçè§£ãæ·±ããŸãããã
ã€ãã¬ãŒã¿ãšã¯ïŒ
JavaScriptã«ãããŠãã€ãã¬ãŒã¿ã¯ã·ãŒã±ã³ã¹ãå®çŸ©ãããã®çµäºæã«æ»ãå€ãæã€å¯èœæ§ããããªããžã§ã¯ãã§ããå
·äœçã«ã¯ã2ã€ã®ããããã£ãæã€ãªããžã§ã¯ããè¿ãnext()ã¡ãœãããæã€ããšã§ã€ãã¬ãŒã¿ãããã³ã«ãå®è£
ããä»»æã®ãªããžã§ã¯ãã§ãã
value: ã·ãŒã±ã³ã¹å ã®æ¬¡ã®å€ãdone: ã€ãã¬ãŒã¿ãå®äºãããã©ããã瀺ãããŒã«å€ã
ã€ãã¬ãŒã¿ã¯ãã³ã¬ã¯ã·ã§ã³ã®åºç€ãšãªãæ§é ãå ¬éããããšãªããã³ã¬ã¯ã·ã§ã³ã®èŠçŽ ã«äžåºŠã«1ã€ãã€ã¢ã¯ã»ã¹ããããã®æšæºåãããæ¹æ³ãæäŸããŸãã
ã€ãã©ãã«ãªããžã§ã¯ã
ã€ãã©ãã«ïŒå埩å¯èœãªããžã§ã¯ãïŒã¯ãå埩åŠçãå¯èœãªãªããžã§ã¯ãã§ããSymbol.iteratorã¡ãœãããä»ããŠã€ãã¬ãŒã¿ãæäŸããªããã°ãªããŸãããJavaScriptã«ãããäžè¬çãªã€ãã©ãã«ãªããžã§ã¯ãã«ã¯ãé
åãæååãMapãSetãargumentsãªããžã§ã¯ããªã©ããããŸãã
äŸïŒ
const myArray = [1, 2, 3];
const iterator = myArray[Symbol.iterator]();
console.log(iterator.next()); // Output: { value: 1, done: false }
console.log(iterator.next()); // Output: { value: 2, done: false }
console.log(iterator.next()); // Output: { value: 3, done: false }
console.log(iterator.next()); // Output: { value: undefined, done: true }
ã€ãã¬ãŒã¿ãã«ããŒïŒçŸä»£çãªã¢ãããŒã
ã€ãã¬ãŒã¿ãã«ããŒã¯ãã€ãã¬ãŒã¿ãæäœããããããçæããå€ã倿ããããã£ã«ã¿ãªã³ã°ããããã颿°ã§ãããããã¯ãåŸæ¥ã®ã«ãŒãããŒã¹ã®ã¢ãããŒããšæ¯èŒããŠãããŒã¿ã¹ããªãŒã ãæäœããããã®ããç°¡æœã§è¡šçŸåè±ããªæ¹æ³ãæäŸããŸããä»ã®ããã€ãã®èšèªã®ããã«JavaScriptã«ã¯çµã¿èŸŒã¿ã®ã€ãã¬ãŒã¿ãã«ããŒã¯ãããŸãããããžã§ãã¬ãŒã¿é¢æ°ã䜿ãã°ç°¡åã«èªäœã§ããŸãã
ã€ãã¬ãŒã¿ã«ãããããåŠç
ãããåŠçãšã¯ãããŒã¿ãäžåºŠã«1é ç®ãã€ã§ã¯ãªããåå¥ã®ã°ã«ãŒããã€ãŸããããåäœã§åŠçããããšã§ããããã¯ãç¹ã«ãããã¯ãŒã¯ãªã¯ãšã¹ããããŒã¿ããŒã¹ãšã®ããåããªã©ããªãŒããŒãããã³ã¹ãããããæäœãæ±ãå Žåã«ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸããã€ãã¬ãŒã¿ãã«ããŒã䜿çšãããšãããŒã¿ã¹ããªãŒã ãå¹ççã«ãããã«åå²ã§ããŸãã
ãããåŠççšã€ãã¬ãŒã¿ãã«ããŒã®äœæ
ã€ãã¬ãŒã¿ãšããããµã€ãºãå
¥åãšããŠåãåããæå®ãããããããµã€ãºã®é
åãçæããæ°ããã€ãã¬ãŒã¿ãè¿ãbatchãã«ããŒé¢æ°ãäœæããŸãããã
function* batch(iterator, batchSize) {
let currentBatch = [];
for (const value of iterator) {
currentBatch.push(value);
if (currentBatch.length === batchSize) {
yield currentBatch;
currentBatch = [];
}
}
if (currentBatch.length > 0) {
yield currentBatch;
}
}
ãã®batch颿°ã¯ããžã§ãã¬ãŒã¿é¢æ°ïŒfunctionã®åŸã®*ã§ç€ºãããïŒã䜿çšããŠã€ãã¬ãŒã¿ãäœæããŸããå
¥åã€ãã¬ãŒã¿ãå埩åŠçããå€ãcurrentBatché
åã«èç©ããŸããããããæå®ãããbatchSizeã«éãããšããã®ããããyieldããcurrentBatchããªã»ããããŸããæ®ãã®å€ã¯æåŸã®ããããšããŠyieldãããŸãã
äŸïŒAPIãªã¯ãšã¹ãã®ãããåŠç
倿°ã®ãŠãŒã¶ãŒIDã«å¯ŸããŠAPIããããŒã¿ãååŸããå¿ èŠãããã·ããªãªãèããŠã¿ãŸããããåãŠãŒã¶ãŒIDã«å¯ŸããŠåå¥ã«APIãªã¯ãšã¹ããè¡ãã®ã¯éå¹ççã§ãããããåŠçã«ããããªã¯ãšã¹ãæ°ãå€§å¹ ã«åæžã§ããŸãã
async function fetchUserData(userId) {
// APIãªã¯ãšã¹ããã·ãã¥ã¬ãŒã
return new Promise(resolve => {
setTimeout(() => {
resolve({ userId: userId, data: `Data for user ${userId}` });
}, 50);
});
}
async function* userIds() {
for (let i = 1; i <= 25; i++) {
yield i;
}
}
async function processUserBatches(batchSize) {
for (const batchOfIds of batch(userIds(), batchSize)) {
const userDataPromises = batchOfIds.map(fetchUserData);
const userData = await Promise.all(userDataPromises);
console.log("Processed batch:", userData);
}
}
// ãŠãŒã¶ãŒããŒã¿ã5ä»¶ãã€ã®ãããã§åŠç
processUserBatches(5);
ãã®äŸã§ã¯ãuserIdsãžã§ãã¬ãŒã¿é¢æ°ããŠãŒã¶ãŒIDã®ã¹ããªãŒã ãyieldããŸããbatch颿°ã¯ãããã®IDã5ã€ãã€ã®ãããã«åå²ããŸããæ¬¡ã«processUserBatches颿°ããããã®ããããå埩åŠçããPromise.allã䜿çšããŠåãŠãŒã¶ãŒIDã®APIãªã¯ãšã¹ãã䞊è¡ããŠè¡ããŸããããã«ããããã¹ãŠã®ãŠãŒã¶ãŒã®ããŒã¿ãååŸããããã«å¿
èŠãªç·æéãåçã«ççž®ãããŸãã
ãããåŠçã®å©ç¹
- ãªãŒããŒãããã®åæžïŒ ãããã¯ãŒã¯ãªã¯ãšã¹ããããŒã¿ããŒã¹æ¥ç¶ããã¡ã€ã«I/Oãªã©ã®æäœã«äŒŽããªãŒããŒããããæå°éã«æããŸãã
- ã¹ã«ãŒãããã®åäžïŒ ããŒã¿ã䞊è¡åŠçããããšã§ããããåŠçã¯ã¹ã«ãŒããããå€§å¹ ã«åäžãããããšãã§ããŸãã
- ãªãœãŒã¹ã®æé©åïŒ ããŒã¿ã管çãããããã£ã³ã¯ã§åŠçããããšã§ããªãœãŒã¹å©çšçã®æé©åã«åœ¹ç«ã¡ãŸãã
ã€ãã¬ãŒã¿ã«ããã°ã«ãŒãåã¹ããªãŒã åŠç
ã°ã«ãŒãåã¹ããªãŒã åŠçãšã¯ãç¹å®ã®åºæºãããŒã«åºã¥ããŠããŒã¿ã¹ããªãŒã ã®èŠçŽ ãã°ã«ãŒãåããããšã§ããããã«ãããå ±éã®ç¹æ§ãæã€ããŒã¿ã®ãµãã»ããã«å¯ŸããŠæäœãå®è¡ã§ããŸããã€ãã¬ãŒã¿ãã«ããŒã䜿çšãããšãé«åºŠãªã°ã«ãŒãã³ã°ããžãã¯ãå®è£ ã§ããŸãã
ã°ã«ãŒãã³ã°çšã€ãã¬ãŒã¿ãã«ããŒã®äœæ
ã€ãã¬ãŒã¿ãšããŒã»ã¬ã¯ã¿é¢æ°ãå
¥åãšããŠåãåããåãããŒãæã€èŠçŽ ã®ã°ã«ãŒãã衚ããªããžã§ã¯ããyieldããæ°ããã€ãã¬ãŒã¿ãè¿ãgroupByãã«ããŒé¢æ°ãäœæããŸãããã
function* groupBy(iterator, keySelector) {
const groups = new Map();
for (const value of iterator) {
const key = keySelector(value);
if (!groups.has(key)) {
groups.set(key, []);
}
groups.get(key).push(value);
}
for (const [key, values] of groups) {
yield { key: key, values: values };
}
}
ãã®groupBy颿°ã¯Mapã䜿çšããŠã°ã«ãŒããæ ŒçŽããŸããå
¥åã€ãã¬ãŒã¿ãå埩åŠçããåèŠçŽ ã«keySelector颿°ãé©çšããŠãã®ã°ã«ãŒããæ±ºå®ããŸãããã®åŸãèŠçŽ ããããå
ã®å¯Ÿå¿ããã°ã«ãŒãã«è¿œå ããŸããæåŸã«ãããããå埩åŠçããåã°ã«ãŒãã«å¯ŸããŠããŒãšå€ã®é
åãå«ããªããžã§ã¯ããyieldããŸãã
äŸïŒé¡§å®¢IDã«ããæ³šæã®ã°ã«ãŒãã³ã°
泚æãªããžã§ã¯ãã®ã¹ããªãŒã ããããåé¡§å®¢ã®æ³šæãã¿ãŒã³ãåæããããã«é¡§å®¢IDã§ã°ã«ãŒãåããããšããã·ããªãªãèããŠã¿ãŸãããã
function* orders() {
yield { orderId: 1, customerId: 101, amount: 50 };
yield { orderId: 2, customerId: 102, amount: 100 };
yield { orderId: 3, customerId: 101, amount: 75 };
yield { orderId: 4, customerId: 103, amount: 25 };
yield { orderId: 5, customerId: 102, amount: 125 };
yield { orderId: 6, customerId: 101, amount: 200 };
}
function processOrdersByCustomer() {
for (const group of groupBy(orders(), order => order.customerId)) {
const customerId = group.key;
const customerOrders = group.values;
const totalAmount = customerOrders.reduce((sum, order) => sum + order.amount, 0);
console.log(`Customer ${customerId}: Total Amount = ${totalAmount}`);
}
}
processOrdersByCustomer();
ãã®äŸã§ã¯ãordersãžã§ãã¬ãŒã¿é¢æ°ã泚æãªããžã§ã¯ãã®ã¹ããªãŒã ãyieldããŸããgroupBy颿°ã¯ãããã®æ³šæãcustomerIdã§ã°ã«ãŒãåããŸããæ¬¡ã«processOrdersByCustomer颿°ããããã®ã°ã«ãŒããå埩åŠçããå顧客ã®åèšéé¡ãèšç®ããŠçµæããã°ã«åºåããŸãã
é«åºŠãªã°ã«ãŒãã³ã°æè¡
groupByãã«ããŒã¯ãããé«åºŠãªã°ã«ãŒãã³ã°ã·ããªãªããµããŒãããããã«æ¡åŒµã§ããŸããäŸãã°ãè€æ°ã®groupByæäœãé£ç¶ããŠé©çšããããšã§éå±€çãªã°ã«ãŒãã³ã°ãå®è£
ã§ããŸãããŸããã«ã¹ã¿ã éèšé¢æ°ã䜿çšããŠãåã°ã«ãŒãã«å¯ŸããŠããè€éãªçµ±èšãèšç®ããããšãã§ããŸãã
ã°ã«ãŒãåã¹ããªãŒã åŠçã®å©ç¹
- ããŒã¿ã®æŽçïŒ ç¹å®ã®åºæºã«åºã¥ããŠããŒã¿ãæŽçãåæããããã®æ§é åãããæ¹æ³ãæäŸããŸãã
- 察象ãçµã£ãåæïŒ ããŒã¿ã®ãµãã»ããã«å¯ŸããŠã察象ãçµã£ãåæãèšç®ãå®è¡ã§ããŸãã
- ããžãã¯ã®ç°¡çŽ åïŒ è€éãªããŒã¿åŠçããžãã¯ããããå°ãã管çããããã¹ãããã«åå²ããããšã§ç°¡çŽ åã§ããŸãã
ãããåŠçãšã°ã«ãŒãåã¹ããªãŒã åŠçã®çµã¿åãã
å Žåã«ãã£ãŠã¯ãæé©ãªããã©ãŒãã³ã¹ãšããŒã¿æŽçãå®çŸããããã«ããããåŠçãšã°ã«ãŒãåã¹ããªãŒã åŠçãçµã¿åãããå¿ èŠããããŸããäŸãã°ãåãå°ççå°åã®ãŠãŒã¶ãŒã«å¯ŸããAPIãªã¯ãšã¹ãããããåŠçãããããã©ã³ã¶ã¯ã·ã§ã³ã¿ã€ãã§ã°ã«ãŒãåãããããŒã¿ããŒã¹ã¬ã³ãŒãããããã§åŠçãããããããšãèããããŸãã
äŸïŒã°ã«ãŒãåããããŠãŒã¶ãŒããŒã¿ã®ãããåŠç
APIãªã¯ãšã¹ãã®äŸãæ¡åŒµããŠãåãåœã«ãããŠãŒã¶ãŒã®APIãªã¯ãšã¹ãããããåŠçããŠã¿ãŸãããããŸããŠãŒã¶ãŒIDãåœããšã«ã°ã«ãŒãåãããã®åŸãååœå ã§ãªã¯ãšã¹ãããããåŠçããŸãã
async function fetchUserData(userId) {
// APIãªã¯ãšã¹ããã·ãã¥ã¬ãŒã
return new Promise(resolve => {
setTimeout(() => {
resolve({ userId: userId, data: `Data for user ${userId}` });
}, 50);
});
}
async function* usersByCountry() {
yield { userId: 1, country: "USA" };
yield { userId: 2, country: "Canada" };
yield { userId: 3, country: "USA" };
yield { userId: 4, country: "UK" };
yield { userId: 5, country: "Canada" };
yield { userId: 6, country: "USA" };
}
async function processUserBatchesByCountry(batchSize) {
for (const countryGroup of groupBy(usersByCountry(), user => user.country)) {
const country = countryGroup.key;
const userIds = countryGroup.values.map(user => user.userId);
for (const batchOfIds of batch(userIds, batchSize)) {
const userDataPromises = batchOfIds.map(fetchUserData);
const userData = await Promise.all(userDataPromises);
console.log(`Processed batch for ${country}:`, userData);
}
}
}
// ãŠãŒã¶ãŒããŒã¿ãåœããšã«ã°ã«ãŒãåãã2ä»¶ãã€ã®ãããã§åŠç
processUserBatchesByCountry(2);
ãã®äŸã§ã¯ãusersByCountryãžã§ãã¬ãŒã¿é¢æ°ãåœæ
å ±ãæã€ãŠãŒã¶ãŒãªããžã§ã¯ãã®ã¹ããªãŒã ãyieldããŸããgroupBy颿°ã¯ãããã®ãŠãŒã¶ãŒãåœããšã«ã°ã«ãŒãåããŸããæ¬¡ã«processUserBatchesByCountry颿°ããããã®ã°ã«ãŒããå埩åŠçããååœå
ã®ãŠãŒã¶ãŒIDããããåããŠãåãããã«å¯ŸããŠAPIãªã¯ãšã¹ããè¡ããŸãã
ã€ãã¬ãŒã¿ãã«ããŒã«ããããšã©ãŒåŠç
ã€ãã¬ãŒã¿ãã«ããŒãæ±ãéãç¹ã«éåææäœãå€éšããŒã¿ãœãŒã¹ãæ±ãå Žåã«ã¯ãé©åãªãšã©ãŒåŠçãäžå¯æ¬ ã§ããã€ãã¬ãŒã¿ãã«ããŒé¢æ°å ã§æœåšçãªãšã©ãŒãåŠçããåŒã³åºãå ã®ã³ãŒãã«é©åã«äŒæãããã¹ãã§ãã
éåææäœã«ããããšã©ãŒåŠç
ã€ãã¬ãŒã¿ãã«ããŒå
ã§éåææäœã䜿çšããå Žåãtry...catchãããã¯ã䜿çšããŠæœåšçãªãšã©ãŒãåŠçããŸãããã®åŸããšã©ãŒãªããžã§ã¯ããyieldãããããšã©ãŒãåã¹ããŒããŠåŒã³åºãå
ã®ã³ãŒãã§åŠçãããããšãã§ããŸãã
async function* asyncIteratorWithError() {
for (let i = 1; i <= 5; i++) {
try {
if (i === 3) {
throw new Error("Simulated error");
}
yield await Promise.resolve(i);
} catch (error) {
console.error("Error in asyncIteratorWithError:", error);
yield { error: error }; // ãšã©ãŒãªããžã§ã¯ããyieldãã
}
}
}
async function processIterator() {
for (const value of asyncIteratorWithError()) {
if (value.error) {
console.error("Error processing value:", value.error);
} else {
console.log("Processed value:", value);
}
}
}
processIterator();
ããŒã»ã¬ã¯ã¿é¢æ°ã«ããããšã©ãŒåŠç
groupByãã«ããŒã§ããŒã»ã¬ã¯ã¿é¢æ°ã䜿çšããå Žåããããæœåšçãªãšã©ãŒãé©åã«åŠçããããšã確èªããŠãã ãããäŸãã°ãããŒã»ã¬ã¯ã¿é¢æ°ãnullãundefinedãè¿ãã±ãŒã¹ãåŠçããå¿
èŠããããããããŸããã
ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé
ã€ãã¬ãŒã¿ãã«ããŒã¯ããŒã¿ã¹ããªãŒã ãæäœããããã®ç°¡æœã§è¡šçŸåè±ããªæ¹æ³ãæäŸããŸããããã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãèæ ®ããããšãéèŠã§ãããžã§ãã¬ãŒã¿é¢æ°ã¯ãåŸæ¥ã®ã«ãŒãããŒã¹ã®ã¢ãããŒããšæ¯èŒããŠãªãŒããŒããããçºçãããå¯èœæ§ããããŸããããããã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãåäžãããšããå©ç¹ããå€ãã®å Žåããã©ãŒãã³ã¹ã³ã¹ããäžåããŸããããã«ããããåŠçã®ãããªæè¡ã䜿çšãããšãå€éšããŒã¿ãœãŒã¹ãé«ã³ã¹ããªæäœãæ±ãéã«ããã©ãŒãã³ã¹ãåçã«åäžãããããšãã§ããŸãã
ã€ãã¬ãŒã¿ãã«ããŒã®ããã©ãŒãã³ã¹æé©å
- 颿°åŒã³åºãã®æå°åïŒ ã€ãã¬ãŒã¿ãã«ããŒå ãç¹ã«ããã©ãŒãã³ã¹ãéèŠãªã³ãŒãã»ã¯ã·ã§ã³ã§ã®é¢æ°åŒã³åºãã®æ°ãæžãããŸãã
- äžèŠãªããŒã¿ã³ããŒã®åé¿ïŒ ã€ãã¬ãŒã¿ãã«ããŒå ã§äžèŠãªããŒã¿ã®ã³ããŒãäœæããã®ãé¿ããŸããå¯èœãªéããå ã®ããŒã¿ã¹ããªãŒã äžã§æäœããŸãã
- å¹ççãªããŒã¿æ§é ã®äœ¿çšïŒ ã€ãã¬ãŒã¿ãã«ããŒå
ã§ããŒã¿ãæ ŒçŽããã³ååŸããããã«ã
MapãSetãªã©ã®å¹ççãªããŒã¿æ§é ã䜿çšããŸãã - ã³ãŒãã®ãããã¡ã€ãªã³ã°ïŒ ãããã¡ã€ãªã³ã°ããŒã«ã䜿çšããŠãã€ãã¬ãŒã¿ãã«ããŒã³ãŒãã®ããã©ãŒãã³ã¹ããã«ããã¯ãç¹å®ããŸãã
çµè«
JavaScriptã®ã€ãã¬ãŒã¿ãã«ããŒã¯ããããåŠçãã°ã«ãŒãåã¹ããªãŒã åŠçã®ãããªæè¡ãšçµã¿åãããããšã§ãããŒã¿ãå¹ççãã€å¹æçã«æäœããããã®åŒ·åãªããŒã«ãæäŸããŸãããããã®æè¡ãšãã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãçè§£ããããšã§ãããŒã¿åŠçã¯ãŒã¯ãããŒãæé©åããããå¿çæ§ãé«ãã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸãããããã®æè¡ã¯ãéèååŒããããã§åŠçããããšããã人å£çµ±èšå¥ã«ã°ã«ãŒãåããããŠãŒã¶ãŒè¡åãåæããããšãŸã§ã倿§ãªã¢ããªã±ãŒã·ã§ã³ã«é©çšå¯èœã§ãããããã®æè¡ãçµã¿åãããèœåã«ãããç¹å®ã®ã¢ããªã±ãŒã·ã§ã³èŠä»¶ã«åãããé«åºŠã«ã«ã¹ã¿ãã€ãºãããå¹ççãªããŒã¿åŠçãå¯èœã«ãªããŸãã
ãããã®çŸä»£çãªJavaScriptã®ã¢ãããŒããåãå ¥ããããšã§ãéçºè ã¯è€éãªããŒã¿ã¹ããªãŒã ãæ±ãããã®ãããã¯ãªãŒã³ã§ä¿å®æ§ãé«ããããã©ãŒãã³ã¹ã®è¯ãã³ãŒããæžãããšãã§ããŸãã