â»ãã®èšäºã¯å人çãªå®éšã®èšäºã§ãâ»
â»å®éšå
容ã¯éæèšäºãæŽæ°ããŠãããŸãâ»
24æéãã€ã§ãæå©ããããŠãããGitHub Copilotããã
24æéæå¥ãèšããã«ãã€ã§ã芪åã«åçããŠãããChatGPTããã
ãããªäž¡è ã«èŠä»¶ã ãäŒããŠèªåã³ãŒãã£ã³ã°ããŠãããã(AIãã¢ãã)ããšããå®éšèšäºã§ãã
Copilotèªåã³ãŒãã£ã³ã°åç»
以äžã®åç»ã¯ãæåã«èŠä»¶ã ããã³ã¡ã³ãå ¥åããŠããã以éã¯Copilotã®ææ¡ãåãå ¥ããŠããã ãã«ãªããŸãã
ã³ã¡ã³ãã®å ¥åãšææ¡ã®åãå ¥ã以å€ã¯ãå šãã¿ã€ãã³ã°ãããŠããŸããã
ã³ã¡ã³ãã®å
容㯠Next.jsã§ãã¿ã³ãã¯ãªãã¯ãããç»åãéžæããŠãã©ãŠã¶ã«è¡šç€ºãã ã§ãã
宿å
èŠä»¶ã®ã³ã¡ã³ããšåãå ¥ãã ããããã³ãŒããå®éã«åãããŠã¿ãŸããã
èªåã³ãŒãã£ã³ã°ããŠããã£ãã³ãŒãã¯ä»¥äžã®éãã§ãã
// Next.jsã§ãã¿ã³ãã¯ãªãã¯ãããç»åãéžæããŠãã©ãŠã¶ã«è¡šç€ºãã
import { NextPage } from 'next';
import React, { useState } from 'react';
const IndexPage: NextPage = () => {
const [image, setImage] = useState<string | undefined>(undefined);
const onChangeImage = (e: React.ChangeEvent<HTMLInputElement>) => {
const file = e.target.files?.[0];
if (!file) return;
const reader = new FileReader();
reader.onload = () => {
setImage(reader.result as string);
};
reader.readAsDataURL(file);
};
return (
<div>
<input type="file" onChange={onChangeImage} />
{image && <img src={image} />}
</div>
);
};
export default IndexPage;
ã¡ãªã¿ã«ãCopilotã¯ææ¡äžã« ctrl + Enter ãæŒããšã
ææ¡ã®äžèЧã衚瀺ããŠãããŸãã
ChatGPTã®çšé
ç¶ããŠã¯ãChatGPTã®çšéã«ã€ããŠã§ãã
ChatGPTãšäœµçšããããšã§çè§£ãæ·±ããããã³ãŒããæŽç·ŽãããŠããããšãã§ããŸãã
ãã¡ãã®ãµã€ãã§ã¯ä»¥äžã®ããã«æžãããŠããŸãã
ChatGPTã¯ææãæè²å©æãåŠç¿ããŒãããŒãšããŠäœ¿ã£ãŠããŸããRustã®äœ¿ãæ¹ã«ã€ããŠè³ªåãããšãåçãè¿ã£ãŠããŸãïŒãããŠãã¯ã³ãŒããµã³ãã«ããããŸãïŒããŸãããšã©ãŒã¡ãã»ãŒãžã®çè§£ãå©ããããã«äœ¿ã£ãŠããŸãããããã¯éåžžã«å¹æçã§ãã
ãšã©ãŒã®è§£æ¶æ¹æ³ãæããŠããã
Copilotã«èªåçæããŠããã£ãã³ãŒããäžçºã§åããªãæããããŸãã
ãããªæã¯ããšã©ãŒå 容ããã®ãŸãŸChatGPTã«è²Œãä»ããŠè§£æ¶æ¹æ³ãæããŠããããŸãã
質åäŸ
next.jsã§ä»¥äžã®ãšã©ãŒãåºãŸããã
è§£æ¶æ¹æ³ãæããŠäžããã
Error: The default export is not a React Component in page: "/"
This error happened while generating the page. Any console logs will be displayed in the terminal window.
åçå 容
-----ããããåçå 容
ãã®ãšã©ãŒã¯ãNext.jsã/ããŒãžã«é¢é£ããããã©ã«ããšã¯ã¹ããŒããReactã³ã³ããŒãã³ãã§ã¯ãªãããšã瀺ããŠããŸããã€ãŸãããšã¯ã¹ããŒããããããã©ã«ãã®ã¢ãžã¥ãŒã«ãReactã³ã³ããŒãã³ãã§ãªããã°ãªããªãã®ã«ãããã§ãªããã®ããšã¯ã¹ããŒããããŠãããšããããšã§ãã
è§£æ±ºæ¹æ³ã¯ãpagesãã£ã¬ã¯ããªã®index.jsãŸãã¯index.tsxãã¡ã€ã«ãéããŠãé©åãªReactã³ã³ããŒãã³ããããã©ã«ããšã¯ã¹ããŒãããããã«ä¿®æ£ããããšã§ãã
äŸãã°ã以äžã®ãããªåœ¢åŒã§ãã¡ã€ã«ãä¿®æ£ããŠãã ããïŒ
import React from 'react';
const HomePage = () => {
return (
<div>
<h1>Welcome to the home page!</h1>
</div>
);
}
export default HomePage;
ãã®äŸã§ã¯ãHomePageãšããååã®Reactã³ã³ããŒãã³ããäœæããããã©ã«ããšã¯ã¹ããŒããšããŠããŸããããã«ããããšã©ãŒã解決ãããã¯ãã§ãã
ãã¡ã€ã«ãä¿®æ£ããããéçºãµãŒããŒãåèµ·åããŠããšã©ãŒãè§£æ¶ãããããšã確èªããŠãã ããã
-----ãããŸã§åçå 容
ChatGPTã«ãªãã¡ã¯ã¿/ã¬ãã¥ãŒããŠããã
ç¶ããŠãCopilotã«èªåçæããŠããã£ãã³ãŒããChatGPTã«è²Œãä»ããŠã
ãªãã¡ã¯ã¿/ã¬ãã¥ãŒããŠããããŸãã
質åäŸ
ããªãã¯åªç§ãªããã°ã©ããŒã§ãã
以äžã®å¶çŽã«åŸãã¬ãã¥ãŒããŠãã ããã
# èŠä»¶
- Next.js v13 / TypeScript v5 ã§èšè¿°ããŠãã
- Next.jsã§ãã¿ã³ãã¯ãªãã¯ãããç»åãéžæããŠãã©ãŠã¶ã«è¡šç€ºãã
# å¶çŽ
- ã¢ãã³ã§ã·ã³ãã«ãªèšè¿°ã«ããããš
- KISSã®ååãå®ãããš
- è€éãªåŠçãé¿ããããã«é«é颿°ã¯äœ¿çšã§ããããšãšãã
- ãªãŒããã«ãªã³ãŒãã«ããããš
- ã¡ãœããã¯åè©å§ãŸãã«ããããš
- ã¡ãœããã®è²¬åã¯å°ããåå²ããããš
- åäžè²¬ä»»ã®ååãå®ãããš
- åœåã¯èšèªã«åãé©åã«è¡ãããš
- æ¡ä»¶åå²ã¯æ©æreturnãªã©ã䜿ã£ãŠãã¹ããæµ
ãããããš
- å€éã«ãŒãåŠçãæ¥µåé¿ããããžãã¯ã«ããããš
- ãªããªã³ã¢ãŒããã¯ãã£ã«åãåã¬ã€ã€ãŒã®è²¬åãé©åã«ããããš
- ç¥èã¯domainã¬ã€ã€ãŒãžéçŽããããš
- ãã¹ã¿ããªãã£ã§ããããš
- ããžãã¯ãã³ããŒã¯äœ¿ããªãããã«ããããš
- letãªã©ã®ãã¥ãŒã¿ãã«ãªå€æ°ã¯äœ¿çšããªãããš
- ãã¥ãŒã¿ãã«ãªå€æ°ãé¿ããããã«å³æé¢æ°ã¯äœ¿çšå¯èœãšãã
# ã³ãŒã
import { NextPage } from 'next';
import React, { useState } from 'react';
const IndexPage: NextPage = () => {
const [image, setImage] = useState<string | undefined>(undefined);
const onChangeImage = (e: React.ChangeEvent<HTMLInputElement>) => {
const file = e.target.files?.[0];
if (!file) return;
const reader = new FileReader();
reader.onload = () => {
setImage(reader.result as string);
};
reader.readAsDataURL(file);
};
return (
<div>
<input type="file" onChange={onChangeImage} />
{image && <img src={image} />}
</div>
);
};
export default IndexPage;
åçå 容
-----ããããåçå 容
ãã®ã³ãŒãã¯ã次ã®èŠä»¶ã«åŸã£ãŠãã¢ãã³ã§ã·ã³ãã«ã§èªã¿ããããæ©èœçã«ãã¹ã¿ãã«ã§ãåäžè²¬ä»»ã®ååã«æ²¿ã£ãå®è£ ã§ãã
import { NextPage } from 'next';
import React, { useState } from 'react';
type ImageProps = {
dataUrl: string;
};
type InputProps = {
onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
};
const Image: React.FC<ImageProps> = ({ dataUrl }) => (
<img src={dataUrl} alt="selected file" />
);
const Input: React.FC<InputProps> = ({ onChange }) => (
<input type="file" onChange={onChange} />
);
const handleFileInputChange = (
callback: (dataUrl: string) => void
): ((event: React.ChangeEvent<HTMLInputElement>) => void) => (event) => {
const file = event.target.files?.[0];
if (!file) return;
const reader = new FileReader();
reader.onload = () => {
callback(reader.result as string);
};
reader.readAsDataURL(file);
};
const HomePage: NextPage = () => {
const [selectedFile, setSelectedFile] = useState<string>();
return (
<div>
<Input onChange={handleFileInputChange(setSelectedFile)} />
{selectedFile && <Image dataUrl={selectedFile} />}
</div>
);
};
export default HomePage;
äž»ãªå€æŽç¹ã¯æ¬¡ã®ãšããã§ãã
-
IndexPageã¯HomePageã«ååã倿ŽããŠããŸãã -
onChangeImageã¡ãœããã¯ãé«é颿°handleFileInputChangeã«çœ®ãæããããã³ãŒã«ããã¯é¢æ°callbackãåãåããŸãã -
ImageãšInputã¯ãåå©çšå¯èœãªã³ã³ããŒãã³ããšããŠåãåºãããããããã£ãåãåãããã«ãªããŸããã - 颿°ã³ã³ããŒãã³ãã§ã¯ã颿°ã®åŒæ°ã«åãå®çŸ©ããããšãã§ããŸãããã®ããã
onChangeImageã®åãå®çŸ©ãã代ããã«ãInputã«æž¡ãonChangeã®åãå®çŸ©ããŸããã -
useStateã§äœ¿çšãããç¶æ ã®åãstring | undefinedããåçŽãªstringã«å€æŽãããŸããã - ããžãã¯ãã³ããŒãåé€ãããå¯èªæ§ãåäžããŸããã
-
letã䜿çšããªãããã«ä¿®æ£ãããäžå€æ§ãä¿ã€ããã«å³æé¢æ°ã䜿çšãããŠããŸãã
ãããã®å€æŽã«ãããã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãåäžããåæ§ã®æ©èœãæã€ä»ã®ã³ã³ããŒãã³ãã«ãé©çšã§ããåå©çšå¯èœãªã³ã³ããŒãã³ããåŸãããŸããããŸããåäžè²¬ä»»ã®ååãšãªããªã³ã¢ãŒããã¯ãã£ã®æŠå¿µã«åŸããã³ã³ããŒãã³ããšé¢æ°ãå°ããåå²ããåã³ã³ããŒãã³ãã颿°ã®è²¬åãæç¢ºã«ããããšãã§ããŸããããŸããhandleFileInputChange 颿°ã®ãããªé«é颿°ã䜿çšããããšã§ãã³ãŒãã®å¯èªæ§ãšä¿å®æ§ãé«ããªãããè€éãªåŠçãé¿ããããšãã§ããŸããã
ããã«ãæ¡ä»¶åå²ã¯æ©æreturnã䜿çšããããšã§ããã¹ããæµ ãããå¯èªæ§ãåäžãããŸããããŸããå€éã«ãŒãåŠçãé¿ããããã颿°ã³ã³ããŒãã³ãã䜿çšããŠãããããããã·ã³ãã«ã§å¹ççãªã³ãŒããå®çŸã§ããŸããã
æåŸã«ãèšèªã«åã£ãé©åãªåœåèŠåã䜿çšãããŠãããããã³ãŒãã®å¯èªæ§ãåäžããŸããããã®ããã«ãKISSååãšåäžè²¬ä»»ã®ååãå®ããªããããªããªã³ã¢ãŒããã¯ãã£ã«åºã¥ããŠåã¬ã€ã€ãŒã®è²¬åãé©åã«åå²ããããšã§ãå¯èªæ§ãé«ããä¿å®æ§ãé«ãã³ãŒããå®çŸããããšãã§ããŸãã
-----ãããŸã§åçå 容
äžæç®æãããã°è§£èª¬ããŠããã
èªåã³ãŒãã£ã³ã°ããŠããã£ããã©ãããã®ç®æã詳ããç¥ãããããšãªã£ãå Žåã«ãChatGPTã«èããŠã¿ãŸãã
GitHub Copilot Labsã«ã説æããŠãããæ©èœããããŸãããã©ã¡ãã§ã奜ããªæ¹ã§è¯ããšæããŸãã
ä»åã¯ChatGPTã«èããŠã¿ãŸãã
質åäŸ
以äžã®ã³ãŒãã解説ããŠäžããã
const onChangeImage = (e: React.ChangeEvent<HTMLInputElement>) => {
const file = e.target.files?.[0];
if (!file) return;
const reader = new FileReader();
reader.onload = () => {
setImage(reader.result as string);
};
reader.readAsDataURL(file);
};
åçå 容
-----ããããåçå 容
ãã®ã³ãŒãã¯ããã¡ã€ã«ã®éžæã€ãã³ããçºçããéã«ãéžæããããã¡ã€ã«ãèªã¿èŸŒã¿ããã®å 容ãç»åãšããŠè¡šç€ºããããã®ãã®ã§ãã
ãã¡ã€ã«éžæã€ãã³ããçºçãããšããŸããéžæããããã¡ã€ã«ã const file ã«æ ŒçŽããŸãããã®åŸã if (!file) return; ã䜿çšããŠããã¡ã€ã«ãéžæãããŠããªãå Žåã¯ãäœãããªãã§åŠçãçµäºããŸãã
次ã«ã const reader = new FileReader(); ã䜿çšããŠã FileReader ãªããžã§ã¯ããäœæããŸãããã®ãªããžã§ã¯ãã¯ããã©ãŠã¶ã§ãã¡ã€ã«ãèªã¿èŸŒãããã«äœ¿çšãããŸãã
次ã«ã reader.onload ã¡ãœãããå®çŸ©ããŸãããã®ã¡ãœããã¯ããã¡ã€ã«ãæ£åžžã«èªã¿èŸŒãŸãããšãã«åŒã³åºãããŸãããã®ã¡ãœããã§ã¯ã reader.result ã䜿çšããŠãèªã¿èŸŒãã ãã¡ã€ã«ã®å
容ãæååãšããŠååŸãã setImage 颿°ã䜿çšããŠãç»åãšããŠè¡šç€ºããŸãã
æåŸã«ã reader.readAsDataURL(file); ã䜿çšããŠãéžæããããã¡ã€ã«ãèªã¿èŸŒã¿ãŸãããã®ã¡ãœããã¯ããã¡ã€ã«ãéåæã§èªã¿èŸŒã¿ããã¡ã€ã«ã®èªã¿èŸŒã¿ãå®äºããããreader.onload ã¡ãœãããåŒã³åºãããŸãã
ãã®ããã«ã onChangeImage 颿°ã¯ãéåžžã«ã·ã³ãã«ã§ããã¡ã€ã«ã®èªã¿èŸŒã¿ãšè¡šç€ºã«å¿
èŠãªæå°éã®åŠçããè¡ããŸããããŸããæ©æreturnã䜿çšããããšã§ãå¯èªæ§ãåäžããŠããŸãã
-----ãããŸã§åçå 容
ãã¹ãã³ãŒããæžããŠããã
ç¶ããŠã¯ãChatGTPã«ãã¹ãã³ãŒããæžããŠããããŸãã
ãã¡ãããã³ã¡ã³ããæžããŠCopilotã«èªåã³ãŒãã£ã³ã°ããŠãããããšãã§ããŸãã
ä»åã¯ChatGPTã«èããŠã¿ãŸãã
ã³ãŒãäŸ
ä»®ã«ä»¥äžã®ã³ãŒãããã£ããšããŸãã
(ãã®ã³ãŒããã³ã¡ã³ãã ãæžããŠãGitHub Copilotã«èªåã³ãŒãã£ã³ã°ããŠããããŸãã)
// numberåã®åŒæ°ãåãåã£ãŠãå°æ°ç¹ä»¥äžãåãæšãŠãæŽæ°ã2åããå€ãè¿ã颿°
export const double = (num: number): number => {
return Math.floor(num) * 2;
};
質åäŸ
以äžTypeScriptã§æžãããã³ãŒãã®ãã¹ãã³ãŒããjestã§èšè¿°ããŠäžããã
// numberåã®åŒæ°ãåãåã£ãŠãå°æ°ç¹ä»¥äžãåãæšãŠãæŽæ°ã2åã«ããå€ãè¿ã颿°
export const double = (num: number): number => {
return Math.floor(num) * 2;
};
åçå 容
-----ããããåçå 容
以äžã¯ãJestã䜿çšããTypeScriptã³ãŒãã®åäœãã¹ãã®äŸã§ãã
import { double } from './double';
describe('double', () => {
it('should return double of the integer obtained by flooring the input number', () => {
expect(double(3.7)).toEqual(6);
expect(double(4.2)).toEqual(8);
expect(double(-3.7)).toEqual(-6);
expect(double(-4.2)).toEqual(-8);
});
it('should return NaN for non-numeric input', () => {
expect(double('')).toEqual(NaN);
expect(double(null)).toEqual(NaN);
expect(double(undefined)).toEqual(NaN);
expect(double({})).toEqual(NaN);
});
});
ããã¯ãdouble颿°ããäžããããæ°å€ã®å°æ°ç¹ä»¥äžãåãæšãŠãæŽæ°ã2åã«ããŠè¿ãããšã確èªãããã¹ãã§ããæåã®ãã¹ãã¯ãããã€ãã®å
¥åå€ã§æ£ããåºåãè¿ãããšã確èªããŸããæ¬¡ã®ãã¹ãã¯ãéæ°å€å
¥åã«å¯ŸããŠNaNãè¿ãããšã確èªããŸãããããã®ãã¹ããå®è¡ããã«ã¯ãJestãã€ã³ã¹ããŒã«ããŠãäžèšã®ãã¹ãã³ãŒããä¿åãã jest ã³ãã³ããå®è¡ããŠãã ããã
-----ãããŸã§åçå 容
Copilotã§ã¯ãªããChatGPTã«èŠä»¶ãäŒããŠèªåã³ãŒãã£ã³ã°ããŠããã
ä»ãŸã§ã¯ãCopilotã§èªåã³ãŒãã£ã³ã° -> ChatGTPã§æ·±æãããŠããããšããæµãã§ããããChatGPTã ãã§ãèŠä»¶ãäŒããã°åçããŠãããŸãã
質åäŸ
numberåã®åŒæ°ãåãåã£ãŠãå°æ°ç¹ä»¥äžãåãæšãŠãæŽæ°ã
2åã«ããå€ãè¿ã颿°ãTypeScriptã§èšè¿°ããŠäžããã
åçå 容
-----ããããåçå 容
以äžã¯ãæå®ãããèŠä»¶ãæºããTypeScript颿°ã®äŸã§ãã
function truncateDouble(input: number): number {
return Math.floor(input) * 2;
}
ãã®é¢æ°ã¯ãäžããããåŒæ° input ã Math.floor() 颿°ã䜿ã£ãŠå°æ°ç¹ä»¥äžãåãæšãŠãåŸã2åããŠæŽæ°å€ãè¿ããŸãã Math.floor() 颿°ã¯ãäžããããæ°å€ä»¥äžã®æå€§ã®æŽæ°å€ãè¿ããŸãã
äŸãã°ã以äžã®ããã«äœ¿çšã§ããŸãã
console.log(truncateDouble(3.14159)); // Output: 6
console.log(truncateDouble(4.5)); // Output: 8
console.log(truncateDouble(10)); // Output: 20
泚æïŒãã®é¢æ°ã¯ãåŒæ°ã NaN ãŸã㯠Infinity ã®å Žåã«ã¯æ£ããåäœããŸãããå¿
èŠã«å¿ããŠãåŒæ°ã®ããªããŒã·ã§ã³ãå®è£
ããŠãã ããã
-----ãããŸã§åçå 容
ãŸãšã
-
Copilotã«ã³ã¡ã³ãããèŠä»¶ãã³ãŒãã£ã³ã°ããŠããã
- äž»ã«ã¿ã€ãã³ã°ã¢ã·ã¹ã¿ã³ããšããŠããããããšãã³ã¡ã³ãã§æžããŠãCopilotããã®ã³ã¡ã³ãã«ãããããã³ãŒããææ¡ããŠããããã®ãåèã«ãã
- ChatGPTã«èŠä»¶ãäŒããŠèªåã³ãŒãã£ã³ã°ããŠããã£ãŠãè¯ã
- ææ¡ã³ãŒãã§ã¯äžçºã§åããªãæããã
- ãããåå ãããããªããã°ChatGPTã«è³ªåãç¶ãã
- ãããã¯ãCopilotãžã³ã¡ã³ãã®å 容ãå€ããŠã¿ã
- ææ¡ã³ãŒãã§ãªãã¡ã¯ã¿ãããããã°ãGitHub Copilot LabsããChatGPTã«ãªãã¡ã¯ã¿ãªã³ã°ããŠããã
- å®åçãªå€§ããªã³ãŒãã§ã¯æªç¥æ°
- æçµçãªè¯ãæªãã¯ãçŸå Žãšå³ããŠããããèªåèªèº«ã®å€æãå¿ èŠ
çè ã®é¢é£èšäº


