ããŒã±ãã£ã³ã°åæã«ãããåå®å šæ§ã®åãè§£ãæŸã¡ãŸãããã®ã¬ã€ãã§ã¯ãå³å¯ã«åä»ããããèšèªã§å ç¢ãªãã£ã³ããŒã³åæãå®è£ ããããŒã¿æŽåæ§ãé«ãããšã©ãŒãåæžããæ¹æ³ãæ¢ããŸãã
ã¿ã€ãã»ãŒããªããŒã±ãã£ã³ã°åæïŒãã£ã³ããŒã³åæã®åå®è£
å€åã®éãããŒã±ãã£ã³ã°ã®äžçã§ã¯ãããŒã¿ãéèŠã§ããæ£ç¢ºã§ä¿¡é Œæ§ã®é«ãããŒã¿ã¯ãæ å ±ã«åºã¥ããæææ±ºå®ã广çãªãã£ã³ããŒã³æé©åããããŠæçµçã«ã¯ãããé«ãæè³åççãä¿é²ããŸããããããããŒã±ãã£ã³ã°ããŒã¿ã®èšå€§ãªéãšè€éãã¯ããšã©ãŒãççŸãåŒãèµ·ãããæ¬ é¥ã®ããæŽå¯ãšç¡é§ãªãªãœãŒã¹ã«ã€ãªããå¯èœæ§ããããŸããããã§ãã¿ã€ãã»ãŒããªããŒã±ãã£ã³ã°åæã圹ç«ã¡ãŸãã
ã¿ã€ãå®å šæ§ã¯ãææ°ã®ãœãããŠã§ã¢éçºã«ãããäžæ žçãªååã§ãããããŒã¿ãäºåã«å®çŸ©ãããåã«æºæ ããŠããããšãä¿èšŒããäºæããªãåäœãé²ãããšã©ãŒãæå°éã«æããŸããããŒã±ãã£ã³ã°åæã¯ãŒã¯ãããŒã§ã¿ã€ãå®å šæ§ãåãå ¥ããããšã§ãããŒã¿å質ãå€§å¹ ã«åäžããããããã°æéãççž®ããããå ç¢ã§ä¿¡é Œæ§ã®é«ãåæã·ã¹ãã ãæ§ç¯ã§ããŸãããã®èšäºã§ã¯ãå³å¯ã«åä»ããããããã°ã©ãã³ã°èšèªã䜿çšããŠã¿ã€ãã»ãŒããªãã£ã³ããŒã³åæãå®è£ ããæ¹æ³ã«ã€ããŠè©³ãã説æããå®è·µçãªäŸãšå®çšçãªæŽå¯ãæäŸããŸãã
ã¿ã€ãå®å šæ§ãšã¯äœãããããŠããŒã±ãã£ã³ã°åæã«ãããŠãªãéèŠãªã®ãïŒ
ã¿ã€ãå®å šæ§ãšã¯ãããã°ã©ãã³ã°èšèªãåãšã©ãŒãã€ãŸãééã£ãåã®ããŒã¿ã«å¯ŸããŠå®è¡ãããæäœãé²ãçšåºŠãæããŸããã¿ã€ãã»ãŒããªèšèªã§ã¯ãã³ã³ãã€ã©ãŸãã¯ã©ã³ã¿ã€ã ã·ã¹ãã ã䜿çšãããŠããããŒã¿ã®åããã§ãã¯ããåé¡ãçºçããåã«ççŸãæ€åºããŸããããã¯ãåçã«åä»ããããèšèªãšã¯å¯Ÿç §çã§ããåçã«åä»ããããèšèªã§ã¯ãåãã§ãã¯ã¯ã©ã³ã¿ã€ã ãŸã§å»¶æãããäºæããªãã¯ã©ãã·ã¥ã誀ã£ãçµæã«ã€ãªããå¯èœæ§ããããŸãã
ç°¡åãªäŸãèããŠã¿ãŸããããæååãæ°å€ã«è¿œå ããå Žåã§ããJavaScriptã®ãããªåçã«åä»ããããèšèªã§ã¯ãããã¯æååé£çµã«ãªãå¯èœæ§ããããŸãïŒäŸãã°ã"5" + 2ã¯"52"ã«ãªããŸãïŒãããã¯ããã«ããã°ã©ã ãã¯ã©ãã·ã¥ãããããã§ã¯ãããŸãããã远跡ãé£ããåŸç¶ã®èšç®ã§åŸ®åŠãªãšã©ãŒã«ã€ãªããå¯èœæ§ããããŸãã
å¯Ÿç §çã«ãJavaãTypeScriptã®ãããªã¿ã€ãã»ãŒããªèšèªã§ã¯ãã³ã³ãã€ã«æã«ãã®æäœãé²ãããã©ã³ã¿ã€ã æã«åãšã©ãŒãçºçãããéçºè ã¯æååãæç€ºçã«æ°å€ã«å€æããããåäžäžèŽãé©åã«åŠçããå¿ èŠããããŸãã
ããŒã±ãã£ã³ã°åæã«ãããã¿ã€ãå®å šæ§ã®å©ç¹ã¯å€å²ã«ããããŸãã
- ããŒã¿å質ã®åäžïŒåã·ã¹ãã ã¯ãä¿åããã³åŠçã§ããããŒã¿ã«å¶çŽã課ããç¡å¹ãŸãã¯ççŸããããŒã¿ãã·ã¹ãã ã«å ¥ããªã¹ã¯ã軜æžããŸããäŸãã°ããã£ã³ããŒã³äºç®ãåžžã«æ£ã®æ°ã§ããããšããŸãã¯æ¥ä»ãæå¹ãªåœ¢åŒã§ããããšãä¿èšŒããŸãã
- ãšã©ãŒãšãããã°æéã®ççž®ïŒåãšã©ãŒã¯ãéçºããã»ã¹ã®æ©ã段éã§ãéåžžã¯ã³ã³ãã€ã«æã«æ€åºããããããä¿®æ£ãããå°é£ã§ã³ã¹ãããããå¯èœæ§ãããæ¬çªç°å¢ãžã®äŒæãé²ããŸãã
- ã³ãŒãã®ä¿å®æ§ã®åäžïŒåã¢ãããŒã·ã§ã³ã«ãããã³ãŒãã®å¯èªæ§ãšç解床ãåäžããã³ã©ãã¬ãŒã·ã§ã³ãä¿é²ãããã·ã¹ãã ãé·æéã«ããã£ãŠä¿å®ããã³é²åãããããšã容æã«ãªããŸããæ°ããããŒã ã¡ã³ããŒãåå ãããšãåå®çŸ©ã«ããããŒã¿æ§é ãããã«ææ¡ã§ããŸãã
- åæçµæã«å¯Ÿããä¿¡é Œæ§ã®åäžïŒããŒã¿ã®æŽåæ§ã確ä¿ãããšã©ãŒã®ãªã¹ã¯ã軜æžããããšã§ãã¿ã€ãå®å šæ§ã¯åæçµæã®æ£ç¢ºæ§ãšä¿¡é Œæ§ã«å¯Ÿããä¿¡é Œãé«ããŸããããã«ãããããå€ãã®æ å ±ã«åºã¥ããæææ±ºå®ãšãã广çãªããŒã±ãã£ã³ã°æŠç¥ã«ã€ãªãããŸãã
- ãªãã¡ã¯ã¿ãªã³ã°ã®æ¹åïŒå€§èŠæš¡ãªããŒã±ãã£ã³ã°åæã·ã¹ãã ããªãã¡ã¯ã¿ãªã³ã°ããå¿ èŠãããå Žåãã¿ã€ãã»ãŒããªèšèªã䜿çšãããšãåãã§ãã¯ã«ãã£ãŠæœåšçãªäºææ§ã®åé¡ãç¹å®ãããªãã¡ã¯ã¿ãªã³ã°ãããã³ãŒããæåŸ ã©ããã«åäœããããšãä¿èšŒã§ãããããããã»ã¹ãããç°¡åãã€å®å šã«ãªããŸãã
ã¿ã€ãã»ãŒããªãã£ã³ããŒã³åæã®å®è£ ïŒå®è·µçãªã¬ã€ã
ã¿ã€ãã»ãŒããªãã£ã³ããŒã³åæãå®è£ ããæ¹æ³ã説æããããã«ãããŸããŸãªãã£ãã«ã§ããŸããŸãªããŒã±ãã£ã³ã°ãã£ã³ããŒã³ã®ããã©ãŒãã³ã¹ãåæããããšããæ¶ç©ºã®ã·ããªãªãèããŠã¿ãŸããããéçåä»ãã远å ããJavaScriptã®ã¹ãŒããŒã»ããã§ããTypeScriptããäŸãšããŠäœ¿çšããŸãããã ããããã§èª¬æããååã¯ãJavaãKotlinãScalaãªã©ã®ä»ã®å³å¯ã«åä»ããããèšèªã«ãé©çšã§ããŸãã
1. ããŒã¿åã®å®çŸ©ïŒã¿ã€ãå®å šæ§ã®åºç€
ã¿ã€ãã»ãŒããªãã£ã³ããŒã³åæãå®è£ ããæåã®ã¹ãããã¯ããã£ã³ããŒã³ããŒã¿ã衚ãããã«äœ¿çšãããããŒã¿åãå®çŸ©ããããšã§ããããã«ã¯ããã£ã³ããŒã³ã®äž»èŠãªå±æ§ãç¹å®ããããã«å¯Ÿå¿ããåãæå®ããããšãå«ãŸããŸããæ¬¡ã®TypeScriptã€ã³ã¿ãŒãã§ãŒã¹ãæ€èšããŠãã ããã
interface Campaign {
campaignId: string;
campaignName: string;
channel: "email" | "social" | "search" | "display";
startDate: Date;
endDate: Date;
budget: number;
targetAudience: string[];
}
ãã®ã€ã³ã¿ãŒãã§ãŒã¹ã§ã¯ã次ã®å±æ§ãå®çŸ©ããŸãã
- `campaignId`ïŒãã£ã³ããŒã³ã®äžæã®èå¥åïŒæååïŒã
- `campaignName`ïŒãã£ã³ããŒã³ã®ååïŒæååïŒã
- `channel`ïŒãã£ã³ããŒã³ã«äœ¿çšãããããŒã±ãã£ã³ã°ãã£ãã«ïŒæååãå ±çšäœåã䜿çšããŠç¹å®ã®å€ã«å¶éãããŸãïŒã
- `startDate`ïŒãã£ã³ããŒã³ã®éå§æ¥ïŒDateãªããžã§ã¯ãïŒã
- `endDate`ïŒãã£ã³ããŒã³ã®çµäºæ¥ïŒDateãªããžã§ã¯ãïŒã
- `budget`ïŒãã£ã³ããŒã³ã«å²ãåœãŠãããäºç®ïŒæ°å€ïŒã
- `targetAudience`ïŒã¿ãŒã²ãããªãŒãã£ãšã³ã¹ã»ã°ã¡ã³ãã衚ãæååã®é åïŒstring []ïŒã
ãã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ããããšã«ããããã£ã³ããŒã³ã衚ããªããžã§ã¯ãã¯ããããã®å±æ§ãšããã«å¯Ÿå¿ããåã«æºæ ããå¿ èŠããããŸããããã«ãããå¶çºçãªã¹ãã«ãã¹ãééã£ãããŒã¿åãããã³ãã®ä»ã®äžè¬çãªãšã©ãŒãé²ããŸãã
äŸãã°ãç¡å¹ãªãã£ãã«å€ãæã€ãã£ã³ããŒã³ãªããžã§ã¯ããäœæããããšãããšãTypeScriptã³ã³ãã€ã©ã¯ãšã©ãŒãçºçãããŸãã
const invalidCampaign: Campaign = {
campaignId: "123",
campaignName: "Summer Sale",
channel: "invalid", // Error: Type '"invalid"' is not assignable to type '"email" | "social" | "search" | "display"'.
startDate: new Date(),
endDate: new Date(),
budget: 1000,
targetAudience: ["young adults", "students"],
};
2. ãã£ã³ããŒã³ããã©ãŒãã³ã¹ããŒã¿ã®åŠç
次ã«ãåãã£ã³ããŒã³ã§è¿œè·¡ããããã©ãŒãã³ã¹ã¡ããªãã¯ã®ããŒã¿åãå®çŸ©ããå¿ èŠããããŸããããã«ã¯ãã€ã³ãã¬ãã·ã§ã³æ°ãã¯ãªãã¯æ°ãã³ã³ããŒãžã§ã³æ°ãåçãªã©ã®ã¡ããªãã¯ãå«ãŸããŸãããã£ã³ããŒã³ããã©ãŒãã³ã¹ããŒã¿ã®å¥ã®TypeScriptã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ããŸãããã
interface CampaignPerformance {
campaignId: string;
date: Date;
impressions: number;
clicks: number;
conversions: number;
revenue: number;
}
ããã§ã¯ã次ã®å±æ§ãå®çŸ©ããŸãã
- `campaignId`ïŒãã£ã³ããŒã³ã®IDïŒæååã`Campaign`ã€ã³ã¿ãŒãã§ãŒã¹ãåç §ïŒã
- `date`ïŒããã©ãŒãã³ã¹ããŒã¿ãèšé²ãããæ¥ä»ïŒDateãªããžã§ã¯ãïŒã
- `impressions`ïŒãã®æ¥ã«ãã£ã³ããŒã³ã«ãã£ãŠçæãããã€ã³ãã¬ãã·ã§ã³æ°ïŒæ°å€ïŒã
- `clicks`ïŒãã®æ¥ã«ãã£ã³ããŒã³ã«ãã£ãŠçæãããã¯ãªãã¯æ°ïŒæ°å€ïŒã
- `conversions`ïŒãã®æ¥ã«ãã£ã³ããŒã³ã«ãã£ãŠçæãããã³ã³ããŒãžã§ã³æ°ïŒæ°å€ïŒã
- `revenue`ïŒãã®æ¥ã«ãã£ã³ããŒã³ã«ãã£ãŠçæãããåçïŒæ°å€ïŒã
ç¹°ãè¿ããŸããããã®ã€ã³ã¿ãŒãã§ãŒã¹ãå®çŸ©ããããšã«ããããã£ã³ããŒã³ããã©ãŒãã³ã¹ããŒã¿ã衚ããªããžã§ã¯ãã¯ããããã®å±æ§ãšããã«å¯Ÿå¿ããåã«æºæ ããå¿ èŠããããŸãã
ããã§ããã£ã³ããŒã³ã®é¡§å®¢ç²åŸå䟡ïŒCPAïŒãèšç®ãããã·ããªãªãèããŠã¿ãŸãããã`Campaign`ãªããžã§ã¯ããš`CampaignPerformance`ãªããžã§ã¯ãã®é åãå ¥åãšããŠåãåããCPAãè¿ã颿°ãäœæã§ããŸãã
function calculateCPA(campaign: Campaign, performanceData: CampaignPerformance[]): number {
const totalCost = campaign.budget;
const totalConversions = performanceData.reduce((sum, data) => sum + data.conversions, 0);
if (totalConversions === 0) {
return 0; // Avoid division by zero
}
return totalCost / totalConversions;
}
ãã®é¢æ°ã¯ãåå®çŸ©ã掻çšããŠãå ¥åããŒã¿ãæå¹ã§ãããèšç®ãæ£ããå®è¡ãããããã«ããŸããäŸãã°ãã³ã³ãã€ã©ã¯ã`reduce`颿°ã«æ°å€ã®ä»£ããã«æååã誀ã£ãŠæž¡ãããšãé²ããŸãã
3. ããŒã¿æ€èšŒãšå€æ
åå®çŸ©ã¯åºæ¬çãªã¬ãã«ã®ããŒã¿æ€èšŒãæäŸããŸãããããŒã¿å質ãä¿èšŒããããã«ãããè€éãªæ€èšŒããã³å€ææäœãå®è¡ããå¿ èŠãããããšããããããŸããããã«ã¯ãæ¬ æå€ã®ç¢ºèªãããŒã¿ç¯å²ã®æ€èšŒããŸãã¯ããŒã¿åœ¢åŒã®å€æãå«ãŸããŸãã
äŸãã°ãåãã£ã³ããŒã³ããã©ãŒãã³ã¹ã¬ã³ãŒãã®åçã劥åœãªç¯å²å ã«ããããšã確èªããããšããŸããããåçã®å€ãæ€èšŒããç¡å¹ãªå Žåã¯ãšã©ãŒãã¹ããŒãã颿°ãå®çŸ©ã§ããŸãã
function validateRevenue(revenue: number): void {
if (revenue < 0) {
throw new Error("Revenue cannot be negative");
}
if (revenue > 1000000) {
throw new Error("Revenue exceeds maximum limit");
}
}
function processPerformanceData(data: any[]): CampaignPerformance[] {
return data.map(item => {
validateRevenue(item.revenue);
return {
campaignId: item.campaignId,
date: new Date(item.date),
impressions: item.impressions,
clicks: item.clicks,
conversions: item.conversions,
revenue: item.revenue
};
});
}
ãã®`validateRevenue`颿°ã¯ãåçã®å€ã蚱容ç¯å²å ã«ãããã©ããã確èªããããã§ãªãå Žåã¯ãšã©ãŒãã¹ããŒããŸãã `processPerformanceData`颿°ã¯ããã®æ€èšŒãåã¬ã³ãŒãã«é©çšããæ¥ä»æååã`Date`ãªããžã§ã¯ãã«å€æããŸãããã®ããã»ã¹ã«ãããããŒã¿ããã以äžã®èšç®ã§äœ¿çšãããåã«ãæåŸ ã©ããã«æºæ ããŠããããšãä¿èšŒãããŸãã
4. ã¿ã€ãã»ãŒããªã©ã€ãã©ãªã®äœ¿çš
ç¬èªã®ããŒã¿åãšæ€èšŒé¢æ°ãå®çŸ©ããããšã«å ããŠãã¿ã€ãã»ãŒããªã©ã€ãã©ãªã掻çšããŠãäžè¬çãªããŒã¿åŠçã¿ã¹ã¯ãç°¡ç¥åããããšãã§ããŸããäŸãã°ã`io-ts`ã`zod`ã®ãããªã©ã€ãã©ãªã¯ãããŒã¿æ§é ãå®çŸ©ããã³æ€èšŒããããã®åŒ·åãªããŒã«ãæäŸããŸãã
`io-ts`ã䜿çšããŠããã£ã³ããŒã³ããã©ãŒãã³ã¹ããŒã¿ã®åãå®çŸ©ããæ¹æ³ã®äŸã次ã«ç€ºããŸãã
import * as t from 'io-ts'
const CampaignPerformanceType = t.type({
campaignId: t.string,
date: t.string.pipe(new t.Type(
'DateFromString',
(u): u is Date => u instanceof Date,
(s, c) => {
const d = new Date(s);
return isNaN(d.getTime()) ? t.failure(s, c) : t.success(d);
},
(a: Date) => a.toISOString()
)),
impressions: t.number,
clicks: t.number,
conversions: t.number,
revenue: t.number,
})
type CampaignPerformance = t.TypeOf
function processAndValidateData(data: any): CampaignPerformance[] {
const decodedData = CampaignPerformanceType.decode(data);
if (decodedData._tag === "Left") {
console.error("Validation Error", decodedData.left);
return [];
} else {
return [decodedData.right];
}
}
ãã®äŸã§ã¯ã`io-ts`ã䜿çšããŠããã£ã³ããŒã³ããã©ãŒãã³ã¹ããŒã¿ã衚ãå`CampaignPerformanceType`ãå®çŸ©ããŸããæ¬¡ã«ã`decode`颿°ã¯ãJSONãªããžã§ã¯ãããã®åã®ã€ã³ã¹ã¿ã³ã¹ã«ãã³ãŒãããããšããŸãããã³ãŒãã倱æãããšããšã©ãŒãè¿ãããŸããæåãããšããã³ãŒãããããªããžã§ã¯ããè¿ãããŸãããã®ã¢ãããŒãã¯ãæåã®æ€èšŒé¢æ°ããããããå ç¢ã§å®£èšçãªæ¹æ³ã§ããŒã¿æ€èšŒãæäŸããŸãã
åºæ¬åãè¶ ããŠïŒé«åºŠãªãã¯ããã¯
äžèšã®äŸã¯ã¿ã€ãã»ãŒããªãã£ã³ããŒã³åæã®åºæ¬ååã瀺ããŠããŸãããããŒã¿å質ãšä¿¡é Œæ§ãããã«é«ããããšãã§ããé«åºŠãªãã¯ããã¯ãããã€ããããŸãã
1. 颿°åããã°ã©ãã³ã°
äžå€æ§ãçŽç²é¢æ°ãªã©ã®é¢æ°åããã°ã©ãã³ã°ãã©ãã€ã ã¯ãå¯äœçšã軜æžããã³ãŒããæšè«ããããããã®ã«åœ¹ç«ã¡ãŸããããŒã±ãã£ã³ã°åæã¯ãŒã¯ãããŒã§é¢æ°åããã°ã©ãã³ã°ãã¯ããã¯ã䜿çšããããšã«ããããšã©ãŒãå°å ¥ãããªã¹ã¯ãæå°éã«æããã·ã¹ãã ã®å šäœçãªä¿å®æ§ãåäžãããããšãã§ããŸããHaskellãScalaãJavaScriptïŒRamdaã®ãããªã©ã€ãã©ãªã䜿çšïŒãªã©ã®èšèªã¯ã颿°åããã°ã©ãã³ã°ã¹ã¿ã€ã«ããµããŒãããŠããŸãã
2. ãã¡ã€ã³åºæèšèªïŒDSLïŒ
DSLã¯ãç¹å®ã®ãã¡ã€ã³ã®åé¡ã解決ããããã«èšèšãããç¹æ®ãªããã°ã©ãã³ã°èšèªã§ãããã£ã³ããŒã³åæçšã®DSLãäœæããããšã«ãããåæã¿ã¹ã¯ãå®çŸ©ããã³å®è¡ããããã«ããçŽæçã§è¡šçŸåè±ããªæ¹æ³ãæäŸã§ããŸããäŸãã°ãDSLã䜿çšãããšãããŒã±ã¿ãŒã¯ã·ã³ãã«ã§å®£èšçãªæ§æã䜿çšããŠãã£ã³ããŒã³ã«ãŒã«ãšã¡ããªãã¯ãå®çŸ©ãããããå®è¡å¯èœã³ãŒãã«å€æã§ããŸãã
3. ããŒã¿ã¬ããã³ã¹ãšãªããŒãž
ã¿ã€ãå®å šæ§ã¯ãå æ¬çãªããŒã¿ã¬ããã³ã¹æŠç¥ã®1ã€ã®ã³ã³ããŒãã³ãã«ãããŸãããããŒã¿å質ãšä¿¡é Œæ§ã確ä¿ããã«ã¯ãããŒã¿ã®ãœãŒã¹ããæçµçãªå®å ãŸã§ã®ãªããŒãžã远跡ããå ç¢ãªããŒã¿ã¬ããã³ã¹ããã»ã¹ãšããŒã«ãå®è£ ããããšãäžå¯æ¬ ã§ããããã«ã¯ãããŒã¿å®çŸ©ã®ææžåãããŒã¿åè³ªã®æ€èšŒãããã³ããŒã¿äœ¿çšéã®ç£èŠãå«ãŸããŸãã
4. ãã¹ã
ã¿ã€ãå®å šæ§ã確ç«ãããŠããŠããããŒã±ãã£ã³ã°åæã·ã¹ãã ãæåŸ ã©ããã«åäœããããšãä¿èšŒããã«ã¯ã培åºçãªãã¹ããäžå¯æ¬ ã§ããåã ã®é¢æ°ãšã¢ãžã¥ãŒã«ã®æ£ç¢ºæ§ãæ€èšŒããããã«åäœãã¹ããäœæããã·ã¹ãã ã®ããŸããŸãªéšåãã·ãŒã ã¬ã¹ã«é£æºããŠåäœããããšãä¿èšŒããããã«çµ±åãã¹ãã䜿çšããå¿ èŠããããŸããç¹ã«ãå¢çæ¡ä»¶ãšãšããžã±ãŒã¹ããã¹ãããŠãåã·ã¹ãã ã§æ€åºãããªãå¯èœæ§ã®ããæœåšçãªãšã©ãŒãç¹å®ããããšã«çŠç¹ãåœãŠãŠãã ããã
çŸå®äžçã®äŸãšã±ãŒã¹ã¹ã¿ãã£
äžèšã®äŸã¯æ¶ç©ºã®ãã®ã§ãããã¿ã€ãã»ãŒããªããŒã±ãã£ã³ã°åæãæ£åžžã«å®è£ ããçŸå®äžçã®çµç¹ã¯æ°å€ããããŸããããã€ãã®äŸã次ã«ç€ºããŸãã
- 倧æeã³ããŒã¹äŒæ¥ïŒãã®äŒæ¥ã¯TypeScriptã䜿çšããŠããŒã±ãã£ã³ã°åæããã·ã¥ããŒããæ§ç¯ããããŒã¿ãæ€èšŒããããŠãŒã¶ãŒã«è¡šç€ºãããåã«æ£ãã倿ãããããã«ããŸããããã«ãããããŒã¿é¢é£ã®ãšã©ãŒã®æ°ãå€§å¹ ã«æžå°ããããã·ã¥ããŒãã®ä¿¡é Œæ§ãåäžããŸããã
- ã°ããŒãã«åºå代çåºïŒãã®ä»£çåºã¯ScalaãšApache Sparkãæ¡çšããŠã倧éã®ããŒã±ãã£ã³ã°ããŒã¿ãã¿ã€ãã»ãŒããªæ¹æ³ã§åŠçããŠããŸããããã«ãããè€éãªåæã¿ã¹ã¯ãèªä¿¡ãæã£ãŠå®è¡ããã¯ã©ã€ã¢ã³ãã«æ£ç¢ºãªã¬ããŒããçæã§ããŸãã
- ãµãŒãã¹ãšããŠã®ãœãããŠã§ã¢ïŒSaaSïŒãããã€ããŒïŒãã®ãããã€ããŒã¯Haskellã䜿çšããŠããŒã±ãã£ã³ã°èªååãã©ãããã©ãŒã ãæ§ç¯ããèšèªã®åŒ·åãªåã·ã¹ãã ãšé¢æ°åããã°ã©ãã³ã°æ©èœãå©çšããŠãããŒã¿æŽåæ§ãšã³ãŒãä¿å®æ§ã確ä¿ããŸãã
ãããã®äŸã¯ãã¿ã€ãã»ãŒããªããŒã±ãã£ã³ã°åæã¯åãªãçè«äžã®æŠå¿µã§ã¯ãªããçŸå®äžçã®ã·ããªãªã§å ·äœçãªã¡ãªãããããããããšãã§ããå®è·µçãªã¢ãããŒãã§ããããšã瀺ããŠããŸããåçŽãªããŒã¿å ¥åãšã©ãŒã®é²æ¢ãããããè€éãªåæã¿ã¹ã¯ã®å®çŸãŸã§ãã¿ã€ãå®å šæ§ã¯ããŒã±ãã£ã³ã°ããŒã¿ã®å質ãšä¿¡é Œæ§ãå€§å¹ ã«åäžãããããšãã§ããŸãã
課é¡ã®å æãšæ¢åã®ã·ã¹ãã ãžã®ã¿ã€ãå®å šæ§ã®å®è£
ããŒã±ãã£ã³ã°åæãç¹ã«æ¢åã®ã·ã¹ãã ã«ã¿ã€ãå®å šæ§ãå®è£ ãããšãããã€ãã®èª²é¡ãçºçããå¯èœæ§ããããŸããäžè¬çãªèª²é¡ã®1ã€ã¯ãããŒã¿åãå®çŸ©ãããããã®åã«æºæ ããããã«ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããããã«å¿ èŠãªåææè³ã§ããããã¯ãç¹ã«å€§èŠæš¡ã§è€éãªã·ã¹ãã ã®å ŽåãæéãšãªãœãŒã¹ãæ¶è²»ããããã»ã¹ã«ãªãå¯èœæ§ããããŸãããã ããããŒã¿å質ã®åäžããšã©ãŒã®åæžãã³ãŒãä¿å®æ§ã®åäžãšããé·æçãªã¡ãªããã¯ãéåžžãåæã³ã¹ããäžåããŸãã
ãã1ã€ã®èª²é¡ã¯ãã¿ã€ãã»ãŒãã§ãªãå¯èœæ§ã®ããå€éšãœãŒã¹ããã®ããŒã¿ã®åŠçã§ããããã«ã¯ãå€éšããŒã¿ããã以äžã®èšç®ã§äœ¿çšãããåã«ãäºæãããåã«æºæ ããããšãä¿èšŒããããã«ãå ç¢ãªããŒã¿æ€èšŒããã³å€æããã»ã¹ãå®è£ ããå¿ èŠããããŸããåã«èª¬æããããã«ã`io-ts`ã`zod`ã®ãããªã©ã€ãã©ãªã䜿çšãããšããããå€§å¹ ã«æ¯æŽã§ããŸãã
ãããã®èª²é¡ãå æããããã®æŠç¥ã次ã«ç€ºããŸãã
- å°ããå§ããïŒããŒã±ãã£ã³ã°åæã·ã¹ãã ã®å°ãããæç¢ºã«å®çŸ©ãããé åã§ã¿ã€ãå®å šæ§ã®å®è£ ãéå§ããŸããããã«ãããããå€§èŠæš¡ã§è€éãªãããžã§ã¯ãã«åãçµãåã«ãããã»ã¹ã«é¢ããçµéšãç©ãã§ãé¢ä¿è ã«ã¡ãªããã瀺ãããšãã§ããŸãã
- 段éçãªãªãã¡ã¯ã¿ãªã³ã°ïŒæ¢åã®ã³ãŒããæ®µéçã«ãäžåºŠã«1ã€ã®ã¢ãžã¥ãŒã«ãŸãã¯é¢æ°ãã€ãªãã¡ã¯ã¿ãªã³ã°ããŸããããã«ãããæ¢åã®ã¯ãŒã¯ãããŒã®äžæãæå°éã«æããããã»ã¹ããã管çããããããããšãã§ããŸãã
- èªåãã¹ãïŒãªãã¡ã¯ã¿ãªã³ã°åŸã«ã³ãŒããæåŸ ã©ããã«åäœããããšãä¿èšŒããããã«ãèªåãã¹ãã«æè³ããŸããããã¯ãããã»ã¹äžã«çºçããå¯èœæ§ã®ãããšã©ãŒãç¹å®ããŠä¿®æ£ããã®ã«åœ¹ç«ã¡ãŸãã
- ãã¬ãŒãã³ã°ãšæè²ïŒã¿ã€ãå®å šæ§ã®ã¡ãªãããšãããå®è£ ããããã®ãã¯ããã¯ã«ã€ããŠãããŒã ã«ãã¬ãŒãã³ã°ãšæè²ãæäŸããŸããããã¯ãå šå¡ãããã»ã¹ã«åå ãã广çã«è²¢ç®ããããã®ã¹ãã«ãšç¥èãæã£ãŠããããšãä¿èšŒããã®ã«åœ¹ç«ã¡ãŸãã
çµè«ïŒããŒã±ãã£ã³ã°ã®æåã®ããã«ã¿ã€ãå®å šæ§ãåãå ¥ãã
çµè«ãšããŠãã¿ã€ãã»ãŒããªããŒã±ãã£ã³ã°åæã¯ãããŒã¿å質ãåäžããããšã©ãŒãåæžããããå ç¢ã§ä¿¡é Œæ§ã®é«ãåæã·ã¹ãã ãæ§ç¯ããããã®åŒ·åãªã¢ãããŒãã§ããããŒã±ãã£ã³ã°åæã¯ãŒã¯ãããŒã§ã¿ã€ãå®å šæ§ãåãå ¥ããããšã§ãããŒã¿ã«å¯Ÿããä¿¡é Œãé«ããããå€ãã®æ å ±ã«åºã¥ããæææ±ºå®ãè¡ããæçµçã«ã¯ãã倧ããªããŒã±ãã£ã³ã°ã®æåãåããããšãã§ããŸãã
ã¿ã€ãå®å šæ§ã®å®è£ ã«ã¯æéãšãªãœãŒã¹ã®åææè³ãå¿ èŠã«ãªãå ŽåããããŸãããé·æçãªã¡ãªããã¯åªåãã䟡å€ããããŸãããã®èšäºã§æŠèª¬ãããŠããã¬ã€ãã©ã€ã³ãšæŠç¥ã«åŸãããšã§ãã¿ã€ãã»ãŒããªãã£ã³ããŒã³åæãæ£åžžã«å®è£ ããããŒã±ãã£ã³ã°ããŒã¿ã®å¯èœæ§ãæå€§éã«åŒãåºãããšãã§ããŸãããããåãªãæè¡çãªæ¹åã§ã¯ãªããããè¯ãæææ±ºå®ãšæŠç¥ãä¿é²ããããŒã¿å質ãžã®æè³ãšèããŠãã ããã
ã°ããŒãã«ãªeã³ããŒã¹å€§æããã¢ãžã£ã€ã«ããŒã±ãã£ã³ã°ä»£çåºãŸã§ãã¿ã€ãã»ãŒããªãã©ã¯ãã£ã¹ã®æ¡çšã¯æ¡å€§ããŠããŸããæä»£ã®å ãè¡ãããããã®ãã¯ããã¯ãåãå ¥ããããšã¯ãããŒã¿äž»å°ã®äžçã§æåããããã®éèŠãªå·®å¥åèŠå ãšãªãã§ãããã