ããã³ããšã³ãWebéçºã«ãããå¹ççãªãã¥ãŒç®¡çã®ããã®ãªãœãŒã¹ããã¯é åºä»ãã解説ãããããã³ã°ãé²ããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžããããã¯ããã¯ãåŠã³ãŸãã
ããã³ããšã³ãWebããã¯ãã¥ãŒç®¡çïŒããã©ãŒãã³ã¹åäžã®ããã®ãªãœãŒã¹ããã¯é åºä»ã
çŸä»£ã®ããã³ããšã³ãWebéçºã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã¯å€æ°ã®éåææäœãåæã«åŠçããããšããããããŸããå ±æãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ç®¡çã¯ãç«¶åç¶æ ãããŒã¿ç Žæãããã©ãŒãã³ã¹ã®ããã«ããã¯ãé²ãããã«äžå¯æ¬ ã§ãããã®èšäºã§ã¯ãããã³ããšã³ãã®Webããã¯ãã¥ãŒç®¡çã«ããããªãœãŒã¹ããã¯ã®é åºä»ãã®æŠå¿µãæãäžããã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«é©ããå ç¢ã§å¹ççãªWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®æŽå¯ãšå®è·µçãªãã¯ããã¯ãæäŸããŸãã
ããã³ããšã³ãéçºã«ããããªãœãŒã¹ããã¯ã®çè§£
ãªãœãŒã¹ããã¯ãšã¯ãå ±æãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãäžåºŠã«1ã€ã®ã¹ã¬ãããŸãã¯ããã»ã¹ã«å¶éããããšã§ããããã«ãããè€æ°ã®éåææäœãåããªãœãŒã¹ãåæã«å€æŽããããšããéã®ããŒã¿ã®æŽåæ§ãä¿èšŒãããç«¶åã鲿¢ãããŸãããªãœãŒã¹ããã¯ãæçãªäžè¬çãªã·ããªãªã¯æ¬¡ã®ãšããã§ãã
- ããŒã¿åæïŒãŠãŒã¶ãŒãããã¡ã€ã«ãã·ã§ããã³ã°ã«ãŒããã¢ããªã±ãŒã·ã§ã³èšå®ãªã©ã®å ±æããŒã¿æ§é ãžã®äžè²«ããæŽæ°ãä¿èšŒããŸãã
- ã¯ãªãã£ã«ã«ã»ã¯ã·ã§ã³ã®ä¿è·ïŒããŒã«ã«ã¹ãã¬ãŒãžãžã®æžã蟌ã¿ãDOMã®æäœãªã©ããªãœãŒã¹ãžã®æä»çã¢ã¯ã»ã¹ãå¿ èŠãšããã³ãŒãã»ã¯ã·ã§ã³ãä¿è·ããŸãã
- åæå®è¡å¶åŸ¡ïŒãããã¯ãŒã¯æ¥ç¶ãããŒã¿ããŒã¹æ¥ç¶ãªã©ãéããããªãœãŒã¹ãžã®åæã¢ã¯ã»ã¹ã管çããŸãã
ããã³ããšã³ãJavaScriptã«ãããäžè¬çãªããã¯ã¡ã«ããºã
ããã³ããšã³ãã®JavaScriptã¯äž»ã«ã·ã³ã°ã«ã¹ã¬ããã§ãããWebã¢ããªã±ãŒã·ã§ã³ã®éåæçãªæ§è³ªäžãåæå®è¡æ§ã管çãããã¯ããã¯ãå¿ èŠã§ããããã¯ãå®è£ ããããã«äœ¿çšã§ããããã€ãã®ã¡ã«ããºã ããããŸãã
- ãã¥ãŒããã¯ã¹ïŒçžäºæä»ïŒïŒäžåºŠã«1ã€ã®ã¹ã¬ããã®ã¿ããªãœãŒã¹ã«ã¢ã¯ã»ã¹ã§ããããã«ããããã¯ã
- ã»ããã©ïŒéãããæ°ã®ã¹ã¬ããããªãœãŒã¹ã«åæã«ã¢ã¯ã»ã¹ã§ããããã«ããããã¯ã
- ãã¥ãŒïŒãªãœãŒã¹ãžã®ãªã¯ãšã¹ãããã¥ãŒã«å ¥ããããšã§ã¢ã¯ã»ã¹ã管çããç¹å®ã®é åºã§åŠçãããããã«ä¿èšŒããŸãã
JavaScriptã®ã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ã¯ããããã®ããã¯æŠç¥ãå®è£ ããããã®çµã¿èŸŒã¿ã¡ã«ããºã ãæäŸããããšãå€ãããŸãéçºè ã¯Promiseãasync/awaitã䜿çšããŠã«ã¹ã¿ã å®è£ ãäœæããããšãã§ããŸãã
ãªãœãŒã¹ããã¯é åºä»ãã®éèŠæ§
è€æ°ã®ãªãœãŒã¹ãé¢äžããå Žåãããã¯ãååŸãããé åºã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšå®å®æ§ã«å€§ããªåœ±é¿ãäžããå¯èœæ§ããããŸããäžé©åãªããã¯é åºã¯ããããããã¯ãåªå 床ã®é転ãäžå¿ èŠãªããããã³ã°ãåŒãèµ·ããããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã劚ããŸãããªãœãŒã¹ããã¯ã®é åºä»ãã¯ãããã¯ãååŸããããã®äžè²«æ§ã®ããäºæž¬å¯èœãªé åºã確ç«ããããšã«ãã£ãŠããããã®åé¡ã軜æžããããšãç®çãšããŠããŸãã
ãããããã¯ãšã¯ïŒ
ãããããã¯ã¯ã2ã€ä»¥äžã®ã¹ã¬ãããäºãã«ãªãœãŒã¹ãè§£æŸããã®ãåŸ ã¡ãªãããç¡æéã«ãããã¯ããããšãã«çºçããŸããäŸïŒ
- ã¹ã¬ããAããªãœãŒã¹1ã®ããã¯ãååŸããŸãã
- ã¹ã¬ããBããªãœãŒã¹2ã®ããã¯ãååŸããŸãã
- ã¹ã¬ããAããªãœãŒã¹2ã®ããã¯ãååŸããããšããŸãïŒãããã¯ãããŸãïŒã
- ã¹ã¬ããBããªãœãŒã¹1ã®ããã¯ãååŸããããšããŸãïŒãããã¯ãããŸãïŒã
ã©ã¡ãã®ã¹ã¬ãããããããããçžæã®ãªãœãŒã¹è§£æŸãåŸ ã£ãŠããããå ã«é²ãããšãã§ããããããããã¯ãçºçããŸãã
åªå 床ã®é転ãšã¯ïŒ
åªå 床ã®é転ã¯ãäœåªå 床ã®ã¹ã¬ãããé«åªå 床ã®ã¹ã¬ãããå¿ èŠãšããããã¯ãä¿æããçµæãšããŠé«åªå 床ã®ã¹ã¬ããããããã¯ããŠããŸãçŸè±¡ã§ããããã¯ãäºæž¬äžèœãªããã©ãŒãã³ã¹åé¡ãå¿çæ§ã®åé¡ã«ã€ãªããå¯èœæ§ããããŸãã
ãªãœãŒã¹ããã¯é åºä»ãã®ãã¯ããã¯
é©åãªãªãœãŒã¹ããã¯ã®é åºã確ä¿ãããããããã¯ãåªå 床ã®é転ãé²ãããã«ãããã€ãã®ãã¯ããã¯ãçšããããšãã§ããŸãã
1. äžè²«ããããã¯ååŸé åº
æãç°¡åãªã¢ãããŒãã¯ãããã¯ãååŸããããã®ã°ããŒãã«ãªé åºã確ç«ããããšã§ãããã¹ãŠã®ã¹ã¬ããã¯ãå®è¡ãããæäœã«é¢ä¿ãªããåãé åºã§ããã¯ãååŸããå¿ èŠããããŸããããã«ããããããããã¯ã«ã€ãªãã埪ç°äŸåã®å¯èœæ§ãæé€ãããŸãã
äŸïŒ
resourceAãšresourceBãšãã2ã€ã®ãªãœãŒã¹ããããšããŸããåžžã«resourceAãresourceBããå
ã«ååŸãããšããã«ãŒã«ãå®çŸ©ããŸãã
async function operation1() {
await acquireLock(resourceA);
try {
await acquireLock(resourceB);
try {
// äž¡æ¹ã®ãªãœãŒã¹ãå¿
èŠãšããæäœãå®è¡
} finally {
releaseLock(resourceB);
}
} finally {
releaseLock(resourceA);
}
}
async function operation2() {
await acquireLock(resourceA);
try {
await acquireLock(resourceB);
try {
// äž¡æ¹ã®ãªãœãŒã¹ãå¿
èŠãšããæäœãå®è¡
} finally {
releaseLock(resourceB);
}
} finally {
releaseLock(resourceA);
}
}
operation1ãšoperation2ã®äž¡æ¹ãåãé åºã§ããã¯ãååŸããããããããããã¯ã鲿¢ãããŸãã
2. ããã¯éå±€
ããã¯éå±€ã¯ãããã¯ã®éå±€ãå®çŸ©ããããšã«ãã£ãŠãäžè²«ããããã¯ååŸé åºã®æŠå¿µãæ¡åŒµããŸããéå±€ã®äžäœã«ããããã¯ã¯ãäžäœã«ããããã¯ãããå ã«ååŸãããªããã°ãªããŸãããããã«ãããã¹ã¬ããã¯ç¹å®ã®æ¹åã«ã®ã¿ããã¯ãååŸããããšãä¿èšŒããã埪ç°äŸåã鲿¢ãããŸãã
äŸïŒ
databaseConnectionãcacheãfileSystemãšãã3ã€ã®ãªãœãŒã¹ãæ³åããŠãã ãããæ¬¡ã®ãããªéå±€ã確ç«ã§ããŸãã
databaseConnectionïŒæäžäœïŒcacheïŒäžéã¬ãã«ïŒfileSystemïŒæäžäœã¬ãã«ïŒ
ã¹ã¬ããã¯æåã«databaseConnectionãæ¬¡ã«cacheããããŠfileSystemãååŸã§ããŸããããããã¹ã¬ããã¯cacheãdatabaseConnectionããå
ã«fileSystemãååŸããããšã¯ã§ããŸããããã®å³æ Œãªé åºã«ãããæœåšçãªãããããã¯ãæé€ãããŸãã
3. ã¿ã€ã ã¢ãŠãã¡ã«ããºã
ããã¯ãååŸããéã«ã¿ã€ã ã¢ãŠãã¡ã«ããºã ãå®è£ ãããšãç«¶åãçºçããå Žåã«ã¹ã¬ãããç¡æéã«ãããã¯ãããã®ãé²ãããšãã§ããŸããã¹ã¬ãããæå®ãããã¿ã€ã ã¢ãŠãæéå ã«ããã¯ãååŸã§ããªãå Žåããã§ã«ä¿æããŠããããã¯ãè§£æŸããŠåŸã§å詊è¡ããããšãã§ããŸããããã«ããããããããã¯ã鲿¢ãããã¢ããªã±ãŒã·ã§ã³ã¯ç«¶åããé©åã«å埩ã§ããŸãã
äŸïŒ
async function acquireLockWithTimeout(resource, timeout) {
const startTime = Date.now();
while (Date.now() - startTime < timeout) {
if (await tryAcquireLock(resource)) {
return true; // ããã¯ã®ååŸã«æå
}
await delay(10); // å詊è¡åã«çæéåŸ
æ©
}
return false; // ããã¯ååŸãã¿ã€ã ã¢ãŠã
}
async function operation() {
const lockAcquired = await acquireLockWithTimeout(resourceA, 1000); // 1ç§åŸã«ã¿ã€ã ã¢ãŠã
if (!lockAcquired) {
console.error("ã¿ã€ã ã¢ãŠãå
ã«ããã¯ã®ååŸã«å€±æããŸãã");
return;
}
try {
// æäœãå®è¡
} finally {
releaseLock(resourceA);
}
}
ããã¯ã1ç§ä»¥å
ã«ååŸã§ããªãå Žåã颿°ã¯falseãè¿ããæäœã¯å€±æãé©åã«åŠçã§ããŸãã
4. ããã¯ããªãŒããŒã¿æ§é
ç¹å®ã®ã·ããªãªã§ã¯ãæç€ºçãªããã¯ãå¿ èŠãšããªãããã¯ããªãŒããŒã¿æ§é ã䜿çšããããšãå¯èœã§ãããããã®ããŒã¿æ§é ã¯ãã¢ãããã¯æäœã«äŸåããŠããŒã¿ã®æŽåæ§ãšåæå®è¡æ§ãä¿èšŒããŸããããã¯ããªãŒããŒã¿æ§é ã¯ãããã¯ãšã¢ã³ããã¯ã«é¢é£ãããªãŒããŒããããæé€ããããšã§ãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã
äŸïŒAtomicsã䜿çšïŒãå©çšããããšãæ€èšããŠãã ããã
5. Try-Lock ã¡ã«ããºã
Try-lockã¡ã«ããºã ã䜿çšãããšãã¹ã¬ããã¯ãããã¯ããã«ããã¯ã®ååŸã詊ã¿ãããšãã§ããŸããããã¯ãå©çšå¯èœãªå Žåãã¹ã¬ããã¯ãããååŸããŠåŠçãé²ããŸããããã¯ãå©çšã§ããªãå Žåãã¹ã¬ããã¯åŸ ããã«ããã«æ»ããŸããããã«ãããã¹ã¬ããã¯ä»ã®ã¿ã¹ã¯ãå®è¡ããããåŸã§å詊è¡ãããããããšãã§ããããããã³ã°ãé²ããŸãã
äŸïŒ
async function operation() {
if (await tryAcquireLock(resourceA)) {
try {
// æäœãå®è¡
} finally {
releaseLock(resourceA);
}
} else {
// ããã¯ãå©çšã§ããªãå Žåã®åŠç
console.log("ãªãœãŒã¹ã¯çŸåšããã¯ãããŠããŸããåŸã§å詊è¡ããŸã...");
setTimeout(operation, 500); // 500msåŸã«å詊è¡
}
}
tryAcquireLockãtrueãè¿ããå Žåãããã¯ãååŸãããŸãããã以å€ã®å Žåãæäœã¯é
å»¶åŸã«å詊è¡ãããŸãã
6. åœéåïŒi18nïŒãšããŒã«ã©ã€ãºïŒl10nïŒã«é¢ããèæ ®äºé
ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã®ããã³ããšã³ãã¢ããªã±ãŒã·ã§ã³ãéçºããå ŽåãåœéåïŒi18nïŒãšããŒã«ã©ã€ãºïŒl10nïŒã®åŽé¢ãèæ ®ããããšãéèŠã§ãããªãœãŒã¹ããã¯ã¯ã次ã®ãããªåœ¢ã§i18n/l10nã«éæ¥çã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
- ãªãœãŒã¹ãã³ãã«ïŒç°ãªããã±ãŒã«ã®è€æ°ã®ãŠãŒã¶ãŒãåæã«ã¢ããªã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ããéã®ç ŽæãäžæŽåãé²ããããããŒã«ã©ã€ãºããããªãœãŒã¹ãã³ãã«ïŒäŸïŒç¿»èš³ãã¡ã€ã«ïŒãžã®ã¢ã¯ã»ã¹ãé©åã«åæãããŠããããšãä¿èšŒããŸãã
- æ¥ä»/æå»ã®ãã©ãŒãããïŒå ±æã®ãã±ãŒã«ããŒã¿ã«äŸåããå¯èœæ§ã®ããæ¥ä»ããã³æå»ã®ãã©ãŒããã颿°ãžã®ã¢ã¯ã»ã¹ãä¿è·ããŸãã
- é貚ã®ãã©ãŒãããïŒç°ãªããã±ãŒã«éã§é貚䟡å€ã®æ£ç¢ºãã€äžè²«ãã衚瀺ãä¿èšŒãããããé貚ãã©ãŒããã颿°ãžã®ã¢ã¯ã»ã¹ãåæããŸãã
äŸïŒ
ã¢ããªã±ãŒã·ã§ã³ãããŒã«ã©ã€ãºãããæååãä¿åããããã«å ±æãã£ãã·ã¥ã䜿çšããŠããå Žåãç°ãªããã±ãŒã«ã®è€æ°ã®ãŠãŒã¶ãŒãåãæååãåæã«ãªã¯ãšã¹ãããéã®ç«¶åç¶æ ãé²ãããã«ããã£ãã·ã¥ãžã®ã¢ã¯ã»ã¹ãããã¯ã«ãã£ãŠä¿è·ãããŠããããšã確èªããŠãã ããã
7. ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ïŒUXïŒã«é¢ããèæ ®äºé
é©åãªãªãœãŒã¹ããã¯ã®é åºä»ãã¯ãã¹ã ãŒãºã§å¿çæ§ã®é«ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãç¶æããããã«äžå¯æ¬ ã§ããäžé©åã«ç®¡çãããããã¯ã¯ã以äžã®ãããªåé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã
- UIã®ããªãŒãºïŒã¡ã€ã³ã¹ã¬ããããããã¯ãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ãå¿çããªããªãåå ãšãªããŸãã
- é ãèªã¿èŸŒã¿æéïŒç»åãã¹ã¯ãªãããããŒã¿ãªã©ã®éèŠãªãªãœãŒã¹ã®èªã¿èŸŒã¿ãé å»¶ãããŸãã
- äžæŽåãªããŒã¿ïŒç«¶åç¶æ ã«ãããå€ãããŒã¿ãç ŽæããããŒã¿ã衚瀺ããŸãã
äŸïŒ
ã¡ã€ã³ã¹ã¬ããã§ããã¯ãå¿ èŠãšããé·æéã®åææäœãå®è¡ããããšã¯é¿ããŠãã ããã代ããã«ããããã®æäœãããã¯ã°ã©ãŠã³ãã¹ã¬ããã«ãªãããŒãããããéåæãã¯ããã¯ã䜿çšããŠUIã®ããªãŒãºãé²ããŸãã
ããã³ããšã³ãWebããã¯ãã¥ãŒç®¡çã®ãã¹ããã©ã¯ãã£ã¹
ããã³ããšã³ãWebã¢ããªã±ãŒã·ã§ã³ã§ãªãœãŒã¹ããã¯ã广çã«ç®¡çããã«ã¯ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããã
- ããã¯ã®ç«¶åãæå°éã«æããïŒå ±æãªãœãŒã¹ãšããã¯ã®å¿ èŠæ§ãæå°éã«æããããã«ã¢ããªã±ãŒã·ã§ã³ãèšèšããŸãã
- ããã¯ãçãä¿ã€ïŒããããã³ã°ã®å¯èœæ§ãæžããããã«ãå¯èœãªéãçãæéã ãããã¯ãä¿æããŸãã
- ãã¹ããããããã¯ãé¿ããïŒãã¹ããããããã¯ã¯ãããããã¯ã®ãªã¹ã¯ãé«ããããããã®äœ¿çšãæå°éã«æããŸãã
- éåææäœã䜿çšããïŒã¡ã€ã³ã¹ã¬ããã®ããããã³ã°ãé²ãããã«éåææäœã掻çšããŸãã
- ãšã©ãŒãã³ããªã³ã°ãå®è£ ããïŒã¢ããªã±ãŒã·ã§ã³ã®ã¯ã©ãã·ã¥ãé²ãããã«ãããã¯ååŸã®å€±æãé©åã«åŠçããŸãã
- ããã¯ã®ããã©ãŒãã³ã¹ãç£èŠããïŒããã¯ã®ç«¶åãšããããã³ã°æéã远跡ããŠãæœåšçãªããã«ããã¯ãç¹å®ããŸãã
- 培åºçã«ãã¹ãããïŒããã¯ã¡ã«ããºã ãæ£ããæ©èœããç«¶åç¶æ ãé²ãã§ããããšã確èªããããã«ã培åºçã«ãã¹ãããŸãã
å®è·µçãªäŸãšã³ãŒãã¹ãããã
ããã³ããšã³ãJavaScriptã«ããããªãœãŒã¹ããã¯ã®é åºä»ããå®èšŒãããããã€ãã®å®è·µçãªäŸãšã³ãŒãã¹ãããããèŠãŠãããŸãããã
äŸ1ïŒã·ã³ãã«ãªãã¥ãŒããã¯ã¹ã®å®è£
class Mutex {
constructor() {
this.locked = false;
this.queue = [];
}
async acquire() {
return new Promise((resolve) => {
if (!this.locked) {
this.locked = true;
resolve();
} else {
this.queue.push(resolve);
}
});
}
release() {
if (this.queue.length > 0) {
const resolve = this.queue.shift();
resolve();
} else {
this.locked = false;
}
}
}
const mutex = new Mutex();
async function criticalSection() {
await mutex.acquire();
try {
// å
±æãªãœãŒã¹ã«ã¢ã¯ã»ã¹
console.log("å
±æãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããŠããŸã...");
await delay(1000); // äœæ¥ãã·ãã¥ã¬ãŒã
console.log("å
±æãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãå®äºããŸããã");
} finally {
mutex.release();
}
}
async function main() {
criticalSection();
criticalSection(); // æåã®åŠçãå®äºããã®ãåŸ
ã¡ãŸã
}
main();
äŸ2ïŒAsync/Awaitã䜿çšããããã¯ååŸ
let isLocked = false;
const lockQueue = [];
async function acquireLock() {
return new Promise((resolve) => {
if (!isLocked) {
isLocked = true;
resolve();
} else {
lockQueue.push(resolve);
}
});
}
function releaseLock() {
if (lockQueue.length > 0) {
const next = lockQueue.shift();
next();
} else {
isLocked = false;
}
}
async function updateData() {
await acquireLock();
try {
// ããŒã¿ãæŽæ°
console.log("ããŒã¿ãæŽæ°ããŠããŸã...");
await delay(500);
console.log("ããŒã¿ãæŽæ°ãããŸããã");
} finally {
releaseLock();
}
}
updateData();
updateData();
é«åºŠãªæŠå¿µãšèæ ®äºé
忣ããã¯
è€æ°ã®ããã³ããšã³ãã€ã³ã¹ã¿ã³ã¹ãåãããã¯ãšã³ããªãœãŒã¹ãå ±æãã忣ããã³ããšã³ãã¢ãŒããã¯ãã£ã§ã¯ã忣ããã¯ã¡ã«ããºã ãå¿ èŠã«ãªãå ŽåããããŸãããããã®ã¡ã«ããºã ã«ã¯ãRedisãZooKeeperãªã©ã®äžå€®éæš©çãªããã¯ãµãŒãã¹ã䜿çšããŠãè€æ°ã®ã€ã³ã¹ã¿ã³ã¹éã§å ±æãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ã調æŽããããšãå«ãŸããŸãã
ãªããã£ãã¹ãã£ãã¯ããã¯ïŒæ¥œèгçããã¯ïŒ
ãªããã£ãã¹ãã£ãã¯ããã¯ã¯ãç«¶åãçšã§ãããšä»®å®ãããã·ãã¹ãã£ãã¯ããã¯ïŒæ²èгçããã¯ïŒã®ä»£æ¿ææ®µã§ãããªãœãŒã¹ã倿Žããåã«ããã¯ãååŸãã代ããã«ããªããã£ãã¹ãã£ãã¯ããã¯ã¯å€æŽåŸã«ç«¶åããã§ãã¯ããŸããç«¶åãæ€åºãããå Žåã倿Žã¯ããŒã«ããã¯ãããŸãããªããã£ãã¹ãã£ãã¯ããã¯ã¯ãç«¶åãå°ãªãã·ããªãªã§ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
çµè«
ãªãœãŒã¹ããã¯ã®é åºä»ãã¯ãããã³ããšã³ãWebããã¯ãã¥ãŒç®¡çã®éèŠãªåŽé¢ã§ãããããŒã¿ã®æŽåæ§ãä¿èšŒãããããããã¯ãé²ããã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãæé©åããŸãããªãœãŒã¹ããã¯ã®ååãçè§£ããé©åãªããã¯æè¡ãæ¡çšãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãéçºè ã¯ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹ã«ã·ãŒã ã¬ã¹ãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸãããå ç¢ã§å¹ççãªWebã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããŸããåœéåãšããŒã«ã©ã€ãºã®åŽé¢ãããã³ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®èŠçŽ ãæ éã«èæ ®ããããšã§ããããã®ã¢ããªã±ãŒã·ã§ã³ã®å質ãšã¢ã¯ã»ã·ããªãã£ãããã«åäžããŸãã