ã¹ããªãŒã åæã§JavaScriptã€ãã¬ãŒã¿ãã«ããŒã®èœåãæå€§éã«åŒãåºããŸããããå¹ççã§ä¿å®æ§ã®é«ãã³ãŒããå®çŸãããè€éãªããŒã¿åŠçãã€ãã©ã€ã³ã®æ§ç¯æ¹æ³ãåŠã³ãŸãã
JavaScriptã€ãã¬ãŒã¿ãã«ããŒã®ã¹ããªãŒã åæïŒè€éãªã¹ããªãŒã æ§ç¯ããã¹ã¿ãŒãã
çŸä»£ã®JavaScriptéçºã«ãããŠãå¹ççãªããŒã¿åŠçã¯æãéèŠã§ããåŸæ¥ã®é åã¡ãœããã¯åºæ¬çãªæ©èœãæäŸããŸãããè€éãªå€æãæ±ãéã«ã¯é¢åã§èªã¿ã«ãããªãããšããããŸããJavaScriptã€ãã¬ãŒã¿ãã«ããŒã¯ããããšã¬ã¬ã³ãã§åŒ·åãªãœãªã¥ãŒã·ã§ã³ãæäŸãã衚çŸåè±ãã§æ§æå¯èœãªããŒã¿åŠçã¹ããªãŒã ã®äœæãå¯èœã«ããŸãããã®èšäºã§ã¯ãã€ãã¬ãŒã¿ãã«ããŒã®äžçãæãäžããã¹ããªãŒã åæã掻çšããŠæŽç·ŽãããããŒã¿ãã€ãã©ã€ã³ãæ§ç¯ããæ¹æ³ã解説ããŸãã
JavaScriptã€ãã¬ãŒã¿ãã«ããŒãšã¯ïŒ
ã€ãã¬ãŒã¿ãã«ããŒã¯ãã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿ã«å¯ŸããŠåäœããã¡ãœãã矀ã§ãããããŒã¿ã¹ããªãŒã ãæäœããããã®é¢æ°çã§å®£èšçãªæ¹æ³ãæäŸããŸããåã¹ãããã峿è©äŸ¡ããåŸæ¥ã®é åã¡ãœãããšã¯ç°ãªããã€ãã¬ãŒã¿ãã«ããŒã¯é å»¶è©äŸ¡ãæ¡çšããããŒã¿ãå¿ èŠã«ãªã£ããšãã«ã®ã¿åŠçããŸããããã«ãããç¹ã«å€§èŠæš¡ãªããŒã¿ã»ãããæ±ãå Žåã«ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãã
äž»èŠãªã€ãã¬ãŒã¿ãã«ããŒã«ã¯ä»¥äžãå«ãŸããŸãïŒ
- map: ã¹ããªãŒã ã®åèŠçŽ ã倿ããŸãã
- filter: æå®ãããæ¡ä»¶ãæºããèŠçŽ ãéžæããŸãã
- take: ã¹ããªãŒã ã®æåã® 'n' åã®èŠçŽ ãè¿ããŸãã
- drop: ã¹ããªãŒã ã®æåã® 'n' åã®èŠçŽ ãã¹ãããããŸãã
- flatMap: åèŠçŽ ãã¹ããªãŒã ã«ããããããã®çµæããã©ããåããŸãã
- reduce: ã¹ããªãŒã ã®èŠçŽ ãåäžã®å€ã«éçŽããŸãã
- forEach: åèŠçŽ ã«å¯ŸããŠæäŸããã颿°ãäžåºŠå®è¡ããŸããïŒé å»¶ã¹ããªãŒã ã§ã®äœ¿çšã«ã¯æ³šæãå¿ èŠã§ãïŒïŒ
- toArray: ã¹ããªãŒã ãé åã«å€æããŸãã
ã¹ããªãŒã åæã®çè§£
ã¹ããªãŒã åæãšã¯ãè€æ°ã®ã€ãã¬ãŒã¿ãã«ããŒãé£çµããŠããŒã¿åŠçãã€ãã©ã€ã³ãäœæããããšã§ããåãã«ããŒã¯åã®ãã«ããŒã®åºåã«å¯ŸããŠåäœããè€éãªå€æãæç¢ºãã€ç°¡æœãªæ¹æ³ã§æ§ç¯ã§ããŸãããã®ã¢ãããŒãã¯ãã³ãŒãã®åå©çšæ§ããã¹ãå¯èœæ§ãä¿å®æ§ãä¿é²ããŸãã
äžå¿çãªèãæ¹ã¯ãå ¥åããŒã¿ã段éçã«å€æããæãŸããçµæãåŸããããŸã§ããŒã¿ãããŒãäœæããããšã§ãã
ã·ã³ãã«ãªã¹ããªãŒã ã®æ§ç¯
åºæ¬çãªäŸããå§ããŸããããæ°å€ã®é åããããå¶æ°ããã£ã«ã¿ãªã³ã°ããæ®ãã®å¥æ°ãäºä¹ããããšããŸãã
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// åŸæ¥ã®ã¢ãããŒãïŒèªã¿ã«ããïŒ
const squaredOdds = numbers
.filter(num => num % 2 !== 0)
.map(num => num * num);
console.log(squaredOdds); // åºå: [1, 9, 25, 49, 81]
ãã®ã³ãŒãã¯æ©èœããŸãããè€éããå¢ãã«ã€ããŠèªã¿ã«ãããä¿å®ãé£ãããªãå¯èœæ§ããããŸãããããã€ãã¬ãŒã¿ãã«ããŒãšã¹ããªãŒã åæã䜿ã£ãŠæžãçŽããŠã¿ãŸãããã
function* numberGenerator(array) {
for (const item of array) {
yield item;
}
}
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const stream = numberGenerator(numbers);
const squaredOddsStream = {
*[Symbol.iterator]() {
for (const num of stream) {
if (num % 2 !== 0) {
yield num * num;
}
}
}
}
const squaredOdds = [...squaredOddsStream];
console.log(squaredOdds); // åºå: [1, 9, 25, 49, 81]
ãã®äŸã§ã¯ã`numberGenerator` ã¯å ¥åé åããåæ°å€ãyieldãããžã§ãã¬ãŒã¿é¢æ°ã§ãã`squaredOddsStream` ã¯ç§ãã¡ã®å€æãšããŠæ©èœãã奿°ã®ã¿ããã£ã«ã¿ãªã³ã°ããŠäºä¹ããŸãããã®ã¢ãããŒãã¯ãããŒã¿ãœãŒã¹ãšå€æããžãã¯ãåé¢ããŸãã
é«åºŠãªã¹ããªãŒã åæãã¯ããã¯
次ã«ãããè€éãªã¹ããªãŒã ãæ§ç¯ããããã®ããã€ãã®é«åºŠãªãã¯ããã¯ãæ¢ã£ãŠã¿ãŸãããã
1. è€æ°ã®å€æã®é£é
è€æ°ã®ã€ãã¬ãŒã¿ãã«ããŒãé£çµããŠãäžé£ã®å€æãå®è¡ã§ããŸããäŸãã°ã補åãªããžã§ã¯ãã®ãªã¹ãããããäŸ¡æ Œã10ãã«æªæºã®è£œåãé€å€ããæ®ãã®è£œåã«10%ã®å²åŒãé©çšããæåŸã«å²åŒåŸã®è£œåã®ååãæœåºããããšããŸãã
function* productGenerator(products) {
for (const product of products) {
yield product;
}
}
const products = [
{ name: "Laptop", price: 1200 },
{ name: "Mouse", price: 8 },
{ name: "Keyboard", price: 50 },
{ name: "Monitor", price: 300 },
];
const stream = productGenerator(products);
const discountedProductNamesStream = {
*[Symbol.iterator]() {
for (const product of stream) {
if (product.price >= 10) {
const discountedPrice = product.price * 0.9;
yield { name: product.name, price: discountedPrice };
}
}
}
};
const productNames = [...discountedProductNamesStream].map(product => product.name);
console.log(productNames); // åºå: [ 'Laptop', 'Keyboard', 'Monitor' ]
ãã®äŸã¯ãã€ãã¬ãŒã¿ãã«ããŒãé£çµããŠè€éãªããŒã¿åŠçãã€ãã©ã€ã³ãäœæããåã瀺ããŠããŸãããŸãäŸ¡æ Œã«åºã¥ããŠè£œåããã£ã«ã¿ãªã³ã°ããæ¬¡ã«å²åŒãé©çšããæåŸã«ååãæœåºããŸããåã¹ãããã¯æç¢ºã«å®çŸ©ãããŠãããçè§£ããããã§ãã
2. è€éãªããžãã¯ã®ããã®ãžã§ãã¬ãŒã¿é¢æ°ã®äœ¿çš
ããè€éãªå€æã«ã¯ããžã§ãã¬ãŒã¿é¢æ°ã䜿çšããŠããžãã¯ãã«ãã»ã«åã§ããŸããããã«ãããããã¯ãªãŒã³ã§ä¿å®æ§ã®é«ãã³ãŒããæžãããšãã§ããŸãã
ãŠãŒã¶ãŒãªããžã§ã¯ãã®ã¹ããªãŒã ããããç¹å®ã®åœïŒäŸïŒãã€ãïŒã«å± äœãããã¬ãã¢ã ãµãã¹ã¯ãªãã·ã§ã³ãæã€ãŠãŒã¶ãŒã®ã¡ãŒã«ã¢ãã¬ã¹ãæœåºãããã·ããªãªãèããŠã¿ãŸãããã
function* userGenerator(users) {
for (const user of users) {
yield user;
}
}
const users = [
{ name: "Alice", email: "alice@example.com", country: "USA", subscription: "premium" },
{ name: "Bob", email: "bob@example.com", country: "Germany", subscription: "basic" },
{ name: "Charlie", email: "charlie@example.com", country: "Germany", subscription: "premium" },
{ name: "David", email: "david@example.com", country: "UK", subscription: "premium" },
];
const stream = userGenerator(users);
const premiumGermanEmailsStream = {
*[Symbol.iterator]() {
for (const user of stream) {
if (user.country === "Germany" && user.subscription === "premium") {
yield user.email;
}
}
}
};
const premiumGermanEmails = [...premiumGermanEmailsStream];
console.log(premiumGermanEmails); // åºå: [ 'charlie@example.com' ]
ãã®äŸã§ã¯ããžã§ãã¬ãŒã¿é¢æ° `premiumGermanEmails` ããã£ã«ã¿ãªã³ã°ããžãã¯ãã«ãã»ã«åããŠãããã³ãŒããããèªã¿ããããä¿å®ãããããªã£ãŠããŸãã
3. éåææäœã®åŠç
ã€ãã¬ãŒã¿ãã«ããŒã¯ãéåæããŒã¿ã¹ããªãŒã ã®åŠçã«ã䜿çšã§ããŸããããã¯ãAPIãããŒã¿ããŒã¹ãããã§ããããããŒã¿ãæ±ãéã«ç¹ã«äŸ¿å©ã§ãã
APIãããŠãŒã¶ãŒã®ãªã¹ãããã§ããããéåæé¢æ°ããããéã¢ã¯ãã£ããªãŠãŒã¶ãŒãé€å€ãããã®ååãæœåºããããšããŸãã
async function* fetchUsers() {
const response = await fetch('https://jsonplaceholder.typicode.com/users');
const users = await response.json();
for (const user of users) {
yield user;
}
}
async function processUsers() {
const stream = fetchUsers();
const activeUserNamesStream = {
async *[Symbol.asyncIterator]() {
for await (const user of stream) {
// ãã¢ã®ãããåçŽãªåºæºã§ã¢ã¯ãã£ããŠãŒã¶ãŒããã£ã«ã¿ãªã³ã°
if (user.id <= 5) {
yield user.name;
}
}
}
};
const activeUserNames = [];
for await (const name of activeUserNamesStream) {
activeUserNames.push(name);
}
console.log(activeUserNames);
}
processUsers();
// èããããåºåïŒAPIã®å¿çã«ãã£ãŠé åºã¯å€ããå¯èœæ§ããããŸãïŒïŒ
// [ 'Leanne Graham', 'Ervin Howell', 'Clementine Bauch', 'Patricia Lebsack', 'Chelsey Dietrich' ]
ãã®äŸã§ã¯ã`fetchUsers` ã¯APIãããŠãŒã¶ãŒããã§ããããéåæãžã§ãã¬ãŒã¿é¢æ°ã§ãã`Symbol.asyncIterator` ãš `for await...of` ã䜿çšããŠãéåæã®ãŠãŒã¶ãŒã¹ããªãŒã ãé©åã«å埩åŠçããŸãããã¢ã³ã¹ãã¬ãŒã·ã§ã³ã®ãããåçŽãªåºæºïŒ`user.id <= 5`ïŒã§ãŠãŒã¶ãŒããã£ã«ã¿ãªã³ã°ããŠããããšã«æ³šæããŠãã ããã
ã¹ããªãŒã åæã®å©ç¹
ã€ãã¬ãŒã¿ãã«ããŒã䜿çšããã¹ããªãŒã åæã«ã¯ãããã€ãã®å©ç¹ããããŸãïŒ
- å¯èªæ§ã®åäžïŒ 宣èšçãªã¹ã¿ã€ã«ã«ãããã³ãŒããçè§£ãããããæšè«ãããããªããŸãã
- ä¿å®æ§ã®åäžïŒ ã¢ãžã¥ãŒã«èšèšã«ãããã³ãŒãã®åå©çšæ§ãä¿é²ããããããã°ãç°¡çŽ åãããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒ é å»¶è©äŸ¡ã«ããäžèŠãªèšç®ãåé¿ãããç¹ã«å€§èŠæš¡ãªããŒã¿ã»ããã§ããã©ãŒãã³ã¹ãåäžããŸãã
- ãã¹ãå¯èœæ§ã®åäžïŒ åã€ãã¬ãŒã¿ãã«ããŒã¯ç¬ç«ããŠãã¹ãã§ãããããã³ãŒãã®å質確ä¿ã容æã«ãªããŸãã
- ã³ãŒãã®åå©çšæ§ïŒ ã¹ããªãŒã ã¯ã¢ããªã±ãŒã·ã§ã³ã®ç°ãªãéšåã§æ§æã»åå©çšã§ããŸãã
å®è·µçãªäŸãšãŠãŒã¹ã±ãŒã¹
ã€ãã¬ãŒã¿ãã«ããŒã«ããã¹ããªãŒã åæã¯ã以äžãå«ãå¹ åºãã·ããªãªã«é©çšã§ããŸãïŒ
- ããŒã¿å€æïŒ æ§ã ãªãœãŒã¹ããã®ããŒã¿ã®ã¯ãªãŒãã³ã°ããã£ã«ã¿ãªã³ã°ã倿ã
- ããŒã¿éèšïŒ çµ±èšã®èšç®ãããŒã¿ã®ã°ã«ãŒãåãã¬ããŒãã®çæã
- ã€ãã³ãåŠçïŒ ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãã»ã³ãµãŒããã®ä»ã®ã·ã¹ãã ããã®ã€ãã³ãã¹ããªãŒã ã®åŠçã
- éåæããŒã¿ãã€ãã©ã€ã³ïŒ APIãããŒã¿ããŒã¹ããã®ä»ã®éåæãœãŒã¹ãããã§ããããããŒã¿ã®åŠçã
- ãªã¢ã«ã¿ã€ã ããŒã¿åæïŒ ã¹ããªãŒãã³ã°ããŒã¿ããªã¢ã«ã¿ã€ã ã§åæãããã¬ã³ããç°åžžãæ€åºã
äŸ1ïŒãŠã§ããµã€ãã®ãã©ãã£ãã¯ããŒã¿åæ
ãã°ãã¡ã€ã«ãããŠã§ããµã€ãã®ãã©ãã£ãã¯ããŒã¿ãåæããŠãããšæ³åããŠãã ãããç¹å®ã®æéæ å ã«ç¹å®ã®ããŒãžã«ã¢ã¯ã»ã¹ããæãé »ç¹ãªIPã¢ãã¬ã¹ãç¹å®ããããšããŸãã
// ãã°ãã¡ã€ã«ãèªã¿åããåãã°ãšã³ããªãyieldãã颿°ããããšä»®å®
async function* readLogFile(filePath) {
// ãã°ãã¡ã€ã«ãäžè¡ãã€èªã¿åãã
// åãã°ãšã³ããªãæååãšããŠyieldããå®è£
ã
// ãã®äŸã§ã¯ç°¡åã®ãããããŒã¿ãã¢ãã¯ããŸãã
const logEntries = [
"2024-01-01 10:00:00 - IP:192.168.1.1 - Page:/home",
"2024-01-01 10:00:05 - IP:192.168.1.2 - Page:/about",
"2024-01-01 10:00:10 - IP:192.168.1.1 - Page:/home",
"2024-01-01 10:00:15 - IP:192.168.1.3 - Page:/contact",
"2024-01-01 10:00:20 - IP:192.168.1.1 - Page:/home",
"2024-01-01 10:00:25 - IP:192.168.1.2 - Page:/about",
"2024-01-01 10:00:30 - IP:192.168.1.4 - Page:/home",
];
for (const entry of logEntries) {
yield entry;
}
}
async function analyzeTraffic(filePath, page, startTime, endTime) {
const logStream = readLogFile(filePath);
const ipAddressesStream = {
async *[Symbol.asyncIterator]() {
for await (const entry of logStream) {
const timestamp = new Date(entry.substring(0, 19));
const ip = entry.match(/IP:(.*?)-/)?.[1].trim();
const accessedPage = entry.match(/Page:(.*)/)?.[1].trim();
if (
timestamp >= startTime &&
timestamp <= endTime &&
accessedPage === page
) {
yield ip;
}
}
}
};
const ipCounts = {};
for await (const ip of ipAddressesStream) {
ipCounts[ip] = (ipCounts[ip] || 0) + 1;
}
const sortedIpAddresses = Object.entries(ipCounts)
.sort(([, countA], [, countB]) => countB - countA)
.map(([ip, count]) => ({ ip, count }));
console.log(page + " ã«ã¢ã¯ã»ã¹ããäžäœIPã¢ãã¬ã¹ïŒ", sortedIpAddresses);
}
// 䜿çšäŸïŒ
const filePath = "/path/to/logfile.log";
const page = "/home";
const startTime = new Date("2024-01-01 10:00:00");
const endTime = new Date("2024-01-01 10:00:30");
analyzeTraffic(filePath, page, startTime, endTime);
// æåŸ
ãããåºåïŒã¢ãã¯ããŒã¿ã«åºã¥ãïŒïŒ
// /home ã«ã¢ã¯ã»ã¹ããäžäœIPã¢ãã¬ã¹ïŒ [ { ip: '192.168.1.1', count: 3 }, { ip: '192.168.1.4', count: 1 } ]
ãã®äŸã¯ãã¹ããªãŒã åæã䜿çšããŠãã°ããŒã¿ãåŠçããåºæºã«åºã¥ããŠãšã³ããªããã£ã«ã¿ãªã³ã°ããçµæãéèšããŠæãé »ç¹ãªIPã¢ãã¬ã¹ãç¹å®ããæ¹æ³ã瀺ããŠããŸãããã®äŸã®éåæçãªæ§è³ªã¯ãå®éã®ãã°ãã¡ã€ã«åŠçã«çæ³çã§ãã
äŸ2ïŒéèååŒã®åŠç
éèååŒã®ã¹ããªãŒã ãããããããå€ãè¶ ããéé¡ãé«ãªã¹ã¯åœããã®ååŒãªã©ãç¹å®ã®åºæºã«åºã¥ããŠçãããååŒãç¹å®ããããšããŸãããããåœéèŠå¶ã«æºæ ããå¿ èŠãããã°ããŒãã«ãªæ±ºæžã·ã¹ãã ã®äžéšã§ãããšæ³åããŠãã ããã
function* transactionGenerator(transactions) {
for (const transaction of transactions) {
yield transaction;
}
}
const transactions = [
{ id: 1, amount: 100, currency: "USD", country: "USA", date: "2024-01-01" },
{ id: 2, amount: 5000, currency: "EUR", country: "Russia", date: "2024-01-02" },
{ id: 3, amount: 200, currency: "GBP", country: "UK", date: "2024-01-03" },
{ id: 4, amount: 10000, currency: "JPY", country: "China", date: "2024-01-04" },
];
const highRiskCountries = ["Russia", "North Korea"];
const thresholdAmount = 7500;
const stream = transactionGenerator(transactions);
const suspiciousTransactionsStream = {
*[Symbol.iterator]() {
for (const transaction of stream) {
if (
transaction.amount > thresholdAmount ||
highRiskCountries.includes(transaction.country)
) {
yield transaction;
}
}
}
};
const suspiciousTransactions = [...suspiciousTransactionsStream];
console.log("çãããååŒïŒ", suspiciousTransactions);
// åºåïŒ
// çãããååŒïŒ [
// { id: 2, amount: 5000, currency: 'EUR', country: 'Russia', date: '2024-01-02' },
// { id: 4, amount: 10000, currency: 'JPY', country: 'China', date: '2024-01-04' }
// ]
ãã®äŸã¯ãäºåå®çŸ©ãããã«ãŒã«ã«åºã¥ããŠååŒããã£ã«ã¿ãªã³ã°ããæœåšçã«äžæ£ãªæŽ»åãç¹å®ããæ¹æ³ã瀺ããŠããŸãã`highRiskCountries` é åãš `thresholdAmount` ã¯èšå®å¯èœã§ãããå€åããèŠå¶ããªã¹ã¯ãããã¡ã€ã«ã«ãœãªã¥ãŒã·ã§ã³ãé©å¿ãããããšãã§ããŸãã
ããããèœãšã穎ãšãã¹ããã©ã¯ãã£ã¹
- å¯äœçšãé¿ããïŒ äºæž¬å¯èœãªåäœãä¿èšŒããããã«ãã€ãã¬ãŒã¿ãã«ããŒå ã§ã®å¯äœçšãæå°éã«æããŸãã
- ãšã©ãŒãé©åã«åŠçããïŒ ã¹ããªãŒã ã®äžæãé²ãããã«ãšã©ãŒãã³ããªã³ã°ãå®è£ ããŸãã
- ããã©ãŒãã³ã¹ãæé©åããïŒ é©åãªã€ãã¬ãŒã¿ãã«ããŒãéžæããäžèŠãªèšç®ãé¿ããŸãã
- 説æçãªååã䜿çšããïŒ ã€ãã¬ãŒã¿ãã«ããŒã«æå³ã®ããååãä»ããŠãã³ãŒãã®æç¢ºããåäžãããŸãã
- å€éšã©ã€ãã©ãªãæ€èšããïŒ RxJSãHighland.jsãªã©ã®ã©ã€ãã©ãªã調ã¹ãŠãããé«åºŠãªã¹ããªãŒã åŠçæ©èœãå©çšããŸãã
- å¯äœçšã®ããã«forEachãå€çšããªãïŒ `forEach` ãã«ããŒã¯å³æå®è¡ãããé å»¶è©äŸ¡ã®å©ç¹ãæãªãå¯èœæ§ããããŸããå¯äœçšãæ¬åœã«å¿ èŠãªå Žåã¯ã`for...of` ã«ãŒããä»ã®ã¡ã«ããºã ãåªå ããŸãã
çµè«
JavaScriptã€ãã¬ãŒã¿ãã«ããŒãšã¹ããªãŒã åæã¯ãããŒã¿ãå¹ççãã€ä¿å®æ§ã®é«ãæ¹æ³ã§åŠçããããã®åŒ·åã§ãšã¬ã¬ã³ããªæ¹æ³ãæäŸããŸãããããã®ãã¯ããã¯ã掻çšããããšã§ãçè§£ããã¹ããåå©çšã容æãªè€éãªããŒã¿ãã€ãã©ã€ã³ãæ§ç¯ã§ããŸãã颿°åããã°ã©ãã³ã°ãšããŒã¿åŠçãæ·±ãæãäžããã«ã€ããŠãã€ãã¬ãŒã¿ãã«ããŒããã¹ã¿ãŒããããšã¯ãããªãã®JavaScriptããŒã«ãããã«ãããŠéåžžã«è²Žéãªè³ç£ãšãªãã§ããããããŸããŸãªã€ãã¬ãŒã¿ãã«ããŒãšã¹ããªãŒã åæãã¿ãŒã³ã詊ãå§ããããŒã¿åŠçã¯ãŒã¯ãããŒã®å¯èœæ§ãæå€§éã«åŒãåºããŠãã ãããåžžã«ããã©ãŒãã³ã¹ãžã®åœ±é¿ãèæ ®ããç¹å®ã®ãŠãŒã¹ã±ãŒã¹ã«æãé©ãããã¯ããã¯ãéžæããããšãå¿ããªãã§ãã ããã