묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨프론트엔드 개발자를 위한 웹팩
.txt 파일 자동생성 관련 질문이 있습니다.
main.js.LICENSE.txt 파일이 자동으로 생성이 됩니다. 라이센스 .txt 파일이 생성되지 않게 설정하는 방법도 있나요?
-
미해결애플 웹사이트 인터랙션 클론!
main.js 를 적용한 후에 show-scene-1에서 2로 넘아기질 않습니다..ㅠㅠ
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="preconnect" href="https://fonts.gstatic.com"> <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;900&display=swap" rel="stylesheet"> <link rel="stylesheet" href="default.css"> <link rel="stylesheet" href="01.css"> </head> <body> <div class="container"> <nav class="global-nav"> <div class="global-nav-links"> <a href="#" class="global-nav-item">Rooms</a> <a href="#" class="global-nav-item">Ideas</a> <a href="#" class="global-nav-item">Stores</a> <a href="#" class="global-nav-item">Contact</a> </div> </nav> <nav class="local-nav"> <div class="local-nav-links"> <a href="#" class="product-name">AirMug Pro</a> <a href="#" class="local-nav-item">개요</a> <a href="#" class="local-nav-item">제품사양</a> <a href="#" class="local-nav-item">구입하기</a> </div> </nav> <section class="scroll-section" id="scroll-section-0"> <h1>AirMug Pro</h1> <div class="sticky-elem main-message a"> <p>온전히 빠져들게 하는<br>최고급 세라믹</p> </div> <div class="sticky-elem main-message b"> <p>주변 맛을 느끼게 해주는<br>주변 맛 허용 모드</p> </div> <div class="sticky-elem main-message c"> <p>온종일 편안한<br>맞춤형 손잡이</p> </div> <div class="sticky-elem main-message d"> <p>새롭게 입가를<br>찾아온 매혹</p> </div> </section> <section class="scroll-section" id="scroll-section-1"> <p class="description"> <strong >보통 스크롤 영역</strong> Lorem ipsum dolor sit amet consectetur adipisicing elit. Blanditiis optio quasi maxime quam dolore sequi, beatae non qui dolorum magni aspernatur. Temporibus id debitis accusantium non porro. Veritatis, magnam saepe. Lorem ipsum dolor sit, amet consectetur adipisicing elit. Nobis, debitis vero aliquam facilis soluta, facere, quis magnam ex deleniti dicta reprehenderit ad necessitatibus veritatis quas repellendus nemo tempore molestiae dignissimos. </p> </section> <section class="scroll-section" id="scroll-section-2"> <div class="sticky-elem main-message a"> <p> <small>편안한 촉감</small> 입과 하나되다 </p> </div> <div class="sticky-elem desc-message b"> <p> 편안한 목넘김을 완성하는 디테일한 여러 구성 요소들, 우리는 이를 하나하나 새롭게 살피고 재구성하는 과정을 거쳐 새로운 수준의 머그, AirMug Pro를 만들었습니다. 입에 뭔가 댔다는 감각은 어느새 사라지고 오롯이 당신과 음료만 남게 되죠. </p> <div class="pin"></div> </div> <div class="sticky-elem desc-message c"> <p> 디자인 앤 퀄리티 오브 스웨덴,<br>메이드 인 차이나 </p> <div class="pin"></div> </div> </section> <section class="scroll-section" id="scroll-section-3"> <p class="mid-message"> <strong>Retina 머그</strong><br> 아이디어를 광활하게 펼칠<br> 아름답고 부드러운 음료 공간. </p> <p class="canvas-caption"> Lorem ipsum dolor sit amet consectetur adipisicing elit. Assumenda natus totam molestias sequi possimus ducimus nisi id. Odit, mollitia consequuntur voluptatum eius doloremque, aperiam, porro tenetur officiis ex illum nisi! Lorem ipsum dolor sit amet consectetur, adipisicing elit. Dolorum ducimus nemo harum iusto consequatur, ipsam necessitatibus nulla, tempora nobis, nam sunt nostrum accusantium atque. Itaque quas veniam eum molestiae nesciunt! </p> </section> <footer class="footer"> 2020, 최태호 </footer> </div> <script src="js/01.js"></script> </body> </html> (()=> { let yOffset = 0; //window.pageYOffset 대신 쓸 변수 let prevScrollHeight = 0; //현재 스크롤 위치(yoffset)보다 이전에 위치한 스크롤 섹션들의 스크롤 높이값의 합 let currentScene = 0; //현재 활성된(눈앞에 보고 있는)씬(scroll-section) let enterNewScene = false; //새로운 씬이 시작된 순간 트루로 바뀔 예정 const sceneInfo = [ { //0 type: 'sticky', heightNum: 5, //브라우저 높이의 5배로 scrollHeight를 세팅(디바이스의 높이의 5배를 하기 위해 설정) scrollHeight: 0, objs: { container: document.querySelector("#scroll-section-0"), messageA: document.querySelector('#scroll-section-0 .main-message.a'), messageB: document.querySelector('#scroll-section-0 .main-message.b'), messageC: document.querySelector('#scroll-section-0 .main-message.c'), messageD: document.querySelector('#scroll-section-0 .main-message.d'), }, values: { messageA_opacity_in: [0, 1, { start: 0.1, end: 0.2 }], messageB_opacity_in: [0, 1, { start: 0.3, end: 0.4 }], messageC_opacity_in: [0, 1, { start: 0.5, end: 0.6 }], messageD_opacity_in: [0, 1, { start: 0.7, end: 0.8 }], messageA_translateY_in: [20, 0, { start: 0.1, end: 0.2 }], messageB_translateY_in: [20, 0, { start: 0.3, end: 0.4 }], messageC_translateY_in: [20, 0, { start: 0.5, end: 0.6 }], messageD_translateY_in: [20, 0, { start: 0.7, end: 0.8 }], messageA_opacity_out: [1, 0, { start: 0.25, end: 0.3 }], messageB_opacity_out: [1, 0, { start: 0.45, end: 0.5 }], messageC_opacity_out: [1, 0, { start: 0.65, end: 0.7 }], messageD_opacity_out: [1, 0, { start: 0.85, end: 0.9 }], messageA_translateY_out: [0, -20, { start: 0.25, end: 0.3 }], messageB_translateY_out: [0, -20, { start: 0.45, end: 0.5 }], messageC_translateY_out: [0, -20, { start: 0.65, end: 0.7 }], messageD_translateY_out: [0, -20, { start: 0.85, end: 0.9 }] } }, { //1 type: 'normal', heightNum: 5, scrollHeight: 0, objs: { container: document.querySelector("#scroll-section-1"), content: document.querySelector('#scroll-section-1 .description') } }, { //2 type: 'sticky', heightNum: 5, scrollHeight: 0, objs: { container: document.querySelector('#scroll-section-2'), messageA: document.querySelector('#scroll-section-2 .a'), messageB: document.querySelector('#scroll-section-2 .b'), messageC: document.querySelector('#scroll-section-2 .c'), pinB: document.querySelector('#scroll-section-2 .b .pin'), pinC: document.querySelector('#scroll-section-2 .c .pin') }, values: { messageA_translateY_in: [20, 0, { start: 0.15, end: 0.2 }], messageB_translateY_in: [30, 0, { start: 0.6, end: 0.65 }], messageC_translateY_in: [30, 0, { start: 0.87, end: 0.92 }], messageA_opacity_in: [0, 1, { start: 0.25, end: 0.3 }], messageB_opacity_in: [0, 1, { start: 0.6, end: 0.65 }], messageC_opacity_in: [0, 1, { start: 0.87, end: 0.92 }], messageA_translateY_out: [0, -20, { start: 0.4, end: 0.45 }], messageB_translateY_out: [0, -20, { start: 0.68, end: 0.73 }], messageC_translateY_out: [0, -20, { start: 0.95, end: 1 }], messageA_opacity_out: [1, 0, { start: 0.4, end: 0.45 }], messageB_opacity_out: [1, 0, { start: 0.68, end: 0.73 }], messageC_opacity_out: [1, 0, { start: 0.95, end: 1 }], pinB_scaleY: [0.5, 1, { start: 0.6, end: 0.65 }], pinC_scaleY: [0.5, 1, { start: 0.87, end: 0.92 }] } }, { //3 type: 'sticky', heightNum: 5, scrollHeight: 0, objs: { container: document.querySelector("#scroll-section-3") } } ]; function setLayout() { // 각 스크롤 섹션의 높이 세팅 for (let i=0; i< sceneInfo.length; i++){ if (sceneInfo[i].type === "sticky") { sceneInfo[i].scrollHeight = sceneInfo[i].heightNum * window.innerHeight; } else if (sceneInfo[i].type === "normal") { sceneInfo[i].scrollHeight = sceneInfo[i].objs.container.yOffsetHeight + window.innerHeight * 0.5; } sceneInfo[i].objs.container.style.height = `${sceneInfo[i].scrollHeight}px`; } yOffset = window.pageYOffset; let totalScrollHeight = 0; for (let i = 0; i < sceneInfo.length; i++) { totalScrollHeight += sceneInfo[i].scrollHeight; if (totalScrollHeight >= yOffset) { currentScene = i; break; } } document.body.setAttribute('id', `show-scene-${currentScene}`); } function calcValues (values, currentYOffset) { let rv; // 현재 씬(스크롤섹션)에서 스크롤된 범위를 비율로 구하기 const scrollHeight = sceneInfo[currentScene].scrollHeight; const scrollRatio = currentYOffset / sceneInfo[currentScene].scrollHeight; if (values.length === 3) { // start ~ end 사이에 애니메이션 실행 const partScrollStart = values[2].start * scrollHeight; const partScrollEnd = values[2].end * scrollHeight; const partScrollHeight = partScrollEnd - partScrollStart; if (currentYOffset >= partScrollStart && currentYOffset <= partScrollEnd) { rv = (currentYOffset - partScrollStart) / partScrollHeight * (values[1] - values[0]) + values[0]; } else if (currentYOffset < partScrollStart){ rv = values[0]; } else if (currentYOffset > partScrollEnd) { rv = values[1]; } } else { rv = scrollRatio * (values[1] - values[0]) + values[0]; } console.log(rv) return rv; } function playAnimation() { const objs = sceneInfo[currentScene].objs; const values = sceneInfo[currentScene].values; const currentYOffset = yOffset- prevScrollHeight; const scrollHeight = sceneInfo[currentScene].scrollHeight; const scrollRatio = currentYOffset / scrollHeight; switch (currentScene) { case 0: if (scrollRatio <= 0.22) { // in objs.messageA.style.opacity = calcValues(values.messageA_opacity_in, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.42) { // in objs.messageB.style.opacity = calcValues(values.messageB_opacity_in, currentYOffset); objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageB.style.opacity = calcValues(values.messageB_opacity_out, currentYOffset); objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.62) { // in objs.messageC.style.opacity = calcValues(values.messageC_opacity_in, currentYOffset); objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageC.style.opacity = calcValues(values.messageC_opacity_out, currentYOffset); objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.82) { // in objs.messageD.style.opacity = calcValues(values.messageD_opacity_in, currentYOffset); objs.messageD.style.transform = `translate3d(0, ${calcValues(values.messageD_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageD.style.opacity = calcValues(values.messageD_opacity_out, currentYOffset); objs.messageD.style.transform = `translate3d(0, ${calcValues(values.messageD_translateY_out, currentYOffset)}%, 0)`; } break; case 1: // let messageA_opacity_in = calcValues(values.messageA_opacity, currentYOffset); // objs.messageA.style.opacity = messageA_opacity_in; break; case 2: // console.log("2 play"); if (scrollRatio <= 0.32) { // in objs.messageA.style.opacity = calcValues(values.messageA_opacity_in, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_in, currentYOffset)}%, 0)`; } else { // out objs.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objs.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.67) { // in objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_in, currentYOffset)}%, 0)`; objs.messageB.style.opacity = calcValues(values.messageB_opacity_in, currentYOffset); objs.pinB.style.transform = `scaleY(${calcValues(values.pinB_scaleY, currentYOffset)})`; } else { // out objs.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_out, currentYOffset)}%, 0)`; objs.messageB.style.opacity = calcValues(values.messageB_opacity_out, currentYOffset); objs.pinB.style.transform = `scaleY(${calcValues(values.pinB_scaleY, currentYOffset)})`; } if (scrollRatio <= 0.93) { // in objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_in, currentYOffset)}%, 0)`; objs.messageC.style.opacity = calcValues(values.messageC_opacity_in, currentYOffset); objs.pinC.style.transform = `scaleY(${calcValues(values.pinC_scaleY, currentYOffset)})`; } else { // out objs.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_out, currentYOffset)}%, 0)`; objs.messageC.style.opacity = calcValues(values.messageC_opacity_out, currentYOffset); objs.pinC.style.transform = `scaleY(${calcValues(values.pinC_scaleY, currentYOffset)})`; } break; case 3: // console.log("3 play"); break; } } function scrollLoop() { //전체 스크롤(타임라인 합)의 누적을 막기 위해 0으로 설정 enterNewScene = false; prevScrollHeight = 0; for(let i=0; i <currentScene; i++){ prevScrollHeight = prevScrollHeight + sceneInfo[i].scrollHeight; } if (yOffset > prevScrollHeight + sceneInfo[currentScene].scrollHeight) { enterNewScene = true; currentScene++; document.body.setAttribute('id', `show-scene-${currentScene}`); } if (yOffset < prevScrollHeight) { enterNewScene = true; if (currentScene === 0) return; //브라우저 바운스 효과로 인해 마이너스가 되는 것을 방지(모바일) currentScene--; document.body.setAttribute('id', `show-scene-${currentScene}`); } if (enterNewScene) return; playAnimation(); } window.addEventListener("scroll", () =>{ yOffset= window.pageYOffset; scrollLoop(); }); window.addEventListener('load', setLayout); window.addEventListener('resize', setLayout); })();
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
경고 문구 질문드려요
안녕하세요 보스턴 주택가격 예측 실습을 하던 중에 자꾸만 경고문이 떠서 질문드렸습니다. 실습대로 LinearRegression, Ridge, Lasso의 RMSE 값 리스트와 평균 RMSE를 구했을 뿐인데 자꾸 저런 경고문이 뜨네요. 저게 뭘 의미하는 것인지, 그리고 어떻게하면 해결할 수 있을까요?
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
model에서 Comment.Find를 할때 궁금한것이 있습니다.
Comment.find({'_id':comment._id}) .populate('writer') .exec((err,result)=>{ if(err) return res.json({seccess:false,err}) res.status(200).json({success:true,result}); }) 파라미터로 _id를 보냈는데, 이는 writer의 User에 대한 _id 인지 궁금합니다. Comment 모델 자체의 필드값은 _id를 받을수 있는게 없어 보여서, 저 뜻이 writer에 대한 _id 정보를 가져온다는 뜻으로 봐야할까요?
-
미해결파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자
" n ", ' n ' 차이점이 뭔가요
큰 따음표와 작은 따음표 차이점이 뭔가요?
-
미해결따라하면서 배우는 고박사의 유니티 기초
설치에러
유니티 허브에서 유니티 설치하는데 용량 큰 외장하드로 경로를 설정했음에도 불구하고 계속용량이 부족하다고 하오네요... 이유가 무엇인지 알고 싶습니다...
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
useSelector로 가져온 state 값을 변경하고 싶습니다.
현재 이메일 중복 체크를 구현 하고 있습니다. const onChangeEmailInput = useCallback((evt) => { setEmailInput(evt.target.value); const regExp = /^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/; if (!regExp.test(evt.target.value)) { setEmailVerify('이메일 형식에 맞게 입력을 해주세요.'); } else { dispatch({ type: CHECK_OVERLAP_EMAIL_REQUEST, data: evt.target.value, }); } }, [emailInput, emailVerify]); input이 변경될 때 이메일 정규식에 통과되면 중복된 이메일을 찾는 액션이 실행되고 router에서 router.get('/check_overlap_email', (req, res, next) => { try { const query = `SELECT email FROM TB_USER WHERE email = '${req.query.data}'`; connection.query(query, (err, result) => { if (err) throw err; if (result[0]) { res.status(200).send('exists'); } else { res.status(200).send('available'); } }); } catch (err) { console.error(err); next(err); } }); 이런식으로 값이 있으면 exists, 없으면 available로 값을 받습니다. 받은 값으로 useEffect(() => { console.log(checkOverLapEmailResult); if (checkOverLapEmailResult !== null) { if (checkOverLapEmailResult === 'exists') { setEmailVerify('이미 가입된 이메일입니다.'); } else { setEmailVerify(true); } } }, [checkOverLapEmailResult]); useEffect를 통해 체크를 해주는데 문제는 아래 flow일 때 문제가 됩니다. 1. 정규식 통과를 한 뒤 중복체크를 했는데 이메일이 없어서 available값을 받음. 2. 그 다음 이메일을 다 지워서 정규식을 통과하지 못해 '이메일 형식에 맞게 입력을 해주세요'가 출력. 3. 다시 정상적인 이메일을 입력후에 available값을 받음. 이 flow 대로 진행했을 때 checkOverLapEmailResult state가 available로 동일하여 useEffect에 들어오지 못하여 setEmailVerify(true); 코드가 실행이 되지 않아 emailVerify가 변경되지 않습니다. 그래서 정규식에 통과를 하지 못할 때 useSelector로 가져온 checkOverLapEmailResult state 값을 null로 초기화를하고 싶은데 어떤 방법이 효율적인지 궁금합니다. 제가 생각한거는 RESET_OVERLAP_EMAIL_STATE라는 액션을 하나 만들어서 정규식에 통과하지 못할 때 마다 호출하여 값을 초기화 하는 방법을 생각하고 있는데, 괜찮은지 궁금합니다.
-
미해결업무 자동화를 위한 파이썬 pyautogui, beautifulsoup 크롤링 기초
크롤링 할때 sh_blog_title 형식으로 안나오는데요! ㅠ
f12를 누르고 블로그 창을 봐도 'api_text_lines'으로 나오는데 아무리 찾아도 sh_blog_title 형식으로 안나오네요! ㅠ
-
미해결[직딩꿀템] 나도 금손! 지나가던 팀장도 돌아보는 PPT 디자인
학습에 필요한 실습파일은 별도로 제공되지 않는지요?
동영상을 보고 따라할려고 하는데, 기본적인 실습파일이 제공되는 문의드립니다.
-
미해결따라하며 배우는 도커와 CI환경 [2023.11 업데이트]
aws 배포 오류가뜨네요
코딩 다 검사하구 테스트도 잘 통과됬는데두 aws에서 배포 오류가뜨네요 ㅜㅜ
-
미해결HTML+CSS+JS 포트폴리오 실전 퍼블리싱(시즌1)
구글 웹폰트
안녕하세요 선생님 강의 초반에 Google web Font 하고 @important url(도메인주소) 가 있는데 이건 무슨 뜻인가요? 안배우운 부분인거같아서 여쭤봅니다 !
-
해결됨자바스크립트 알고리즘 문제풀이 입문(코딩테스트 대비)
이메일로 문의 드렸는데요 아직 답변없어서 이곳에 질문을 남깁니다. 한글이 깨져요
수업자료를 다운 로드를 받고 압축을 풀었는데요 첨부 파일을 보니 섹션 1-10 까지는 한글이 보이지만 나머지는 한글이 깨져서 나옵니다. 문제 풀이를 하려고 하는데요 파일을 찾기가 너무 어렵습니다. 파일 이름저장 할때 모두다 유니코드로 해주셨으면 합니다. 참고로 저는 맥 사용자 입니다.
-
해결됨파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
n = 1인 경우에 대하여
n = 1이면 자기 자신을 선택해서 결과가 1이 나와야할거 같은데 0이 나옵니다. res = 1로 초기화하면 될까용?
-
미해결[2026년 출제기준] 웹디자인개발기능사 실기시험 완벽 가이드
블라켓위에 아이콘표시는 어떻게하나요?
선생님보시면 html / css / js 별로 위에보시면 각 기능에맞게 아이콘그림이뜨는데 어떤 익스텐션기능을 사용하시는지 알려주시면 감사하겠습니다!
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
While(true)
안녕하세요. 마지막에 맵을 실제 그리는 코드문을 보면 While(true) { Setposition board.render(); } 로 구현하고 있는데요 , 이때 while(true)면 무한루프가 되어 렌더함수가 계속호출되어 계속 맵을 그리는 상태가 되는것 아닌가 싶습니다. 딱히 루프를 나오게하는 코드는 안보이거든요. 또한 , Board라는 클래스 객체가 사라져도 한번그린 맵은 그대로 유지되는것으로 보이는데 왜 무한루프를 사용한건지 모르겠습니다! 감사합니다
-
미해결Vue.js 끝장내기 - 실무에 필요한 모든 것
nvm 실행이 되지 않아 문의드립니다.
mac 에서 vi ~/.bashrc 파일에 설명해 주신 설정 값을 삽입 후 nvm을 실행해 봤지만 도저히 실행이 되지 않아 문의드립니다. 설정 값을 여러번 확인 했는데도 되지 않네요..ㅠ
-
해결됨[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
도메인 설정
안녕하세요 도메인 설정하는 방법이 궁금합니다 즉 127.0.0.1:8080처럼이 아니라 예를들어 도메인으로 접속하고싶습니다 node-dev.com:8080처럼요 php는 아파치 설정파일에서 하는데 노드는 어디서 할수있나요?
-
미해결웹브라우저 Javascript (자바스크립트)
jQuery 객체란 --> li.map()
li.map()의 함수에 전달하는 index, elem은 HTMLElement마다 다르겠죠? 일부는 비슷할것 같은데요.. (가령 UL은 LI와 동일할 것으로 생각이됩니다만)
-
미해결리눅스 시스템 프로그래밍 - 이론과 실습
mmap의 동작을 올바르게 이해했는지 질문 드리고 싶습니다.
안녕하세요. 강의를 수강하면서 mmap을 설명하시는 부분을 제가 기존에 알고 있던 지식과 연결짓는 과정에서 제대로 연결을 지었는지 궁금하여 확인을 받았으면 하여 질문을 남기게 되었습니다. posix 계열의 file api(read, write) 와 같은 경우에는stream을 개방한 뒤에, read 요청이 있을 경우, kernel space에 할당된 버퍼에 device driver로 부터 가져온 내용을 block 단위로 읽어 들인 뒤, 이를 다시, user space에 존재하는 process의 메 메모리 공간에 read함수에 파라미터로 들어가는 size만큼 읽어 들이는 것으로 이해했습니다. 이 os의 paging과 연관지어 볼 때, user process와 kernel process가 다른 (정말 극악의 확률로 같을 수...도 있지만) virtual address를 물리적으로 다른 page frame을 사용하는 것으로 볼 수 있을것 같았습니다. 하지만 mmap은 file과 memory가 mapping 돠는 것으로 보아서, device driver의 io와 연결된 kernel space에 user space에서 direct하게 접근 가능한 것으로 이해했습니다. 이 방식이 가능하려면, paging을 해줄 때, kernel space와 process가 동작하는 user space에서 해당 파일을 요청한 공간이 동일한 page frame을 사용해서 동일한 physical address에 매핑이 되는 것 같았습니다. 제가 이해한 내용이 맞는지, 틀렸다면 올바른 이해가 무엇인지 궁금합니다.
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
GetComponentsInChildren()
안녕하세요! 강의를 듣다가 이해가 잘 안되고 헷갈리는 부분이 있어서 질문드립니다. GetComponentsInChildren() 함수 설명에 component를 리턴한다고 되어있어서 처음에는 Rigidbody, Collider, Transform같은 component를 말하는 줄 알았습니다. 그런데 component.name == name으로 비교를 하길래 디버깅해보니 component.name에 PointText, ScoreText가 들어가더라구요. 제가 생각하는 component는 Text이고, component.name도 Text인데 뭔가 이상했습니다(??) 검색을 해보니 컴포넌트형으로 자식 오브젝트를 검색해서 나타난 자식오브젝트의 배열을 반환한다, 자식 객체들에게서 지정한 컴포넌트를 모두 추출한다 등의 설명이 있더라구요. 둘 다 맞는 말인 것 같고 이해도 되는 것 같은데 여기서의 component는 자식 오브젝트를 나타내는 건가요? 왜 T라는 component를 가지는 자식들을 찾는데 component를 리턴한다고 했는지 혼란스럽습니다.