묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결함수형 프로그래밍과 JavaScript ES6+
유명함수 recur를 이용하는 것이 성능상 이점이 있는 이유에 대해서 좀 더 자세한 설명을 듣고 싶습니다.
reduce 함수를 아래와 같이 수정하고 go함수를 실행시킬 경우 acc를 acc = acc instanceof Promise ? acc.then(acc => f(acc, a)):f(acc, a);로 작성한 구현보다 성능상 이점이 있다고 하셨는데 어떤 점에서 그런지 좀 더 자세히 설명해주실 수 있을까요? 특히 콜스택과 관련해서 어떤 차이가 있는지 잘 이해가 안 되네요. Promise에서 then은 매번 새로운 콜스택을 사용하면서 추가적인 로드가 발생하는 것인가요? 재귀함수를 호출하면서 생기는 약간의 추가 로드도 있을 것 같은데, then에서의 콜스택 사용과 비교했을 때에 성능상 이점이 크기 때문에 이렇게 구현해서 사용하는 것인가요? go, pipe, reduce에서 비동기제어편 약 5분 45초 이후에 설명된 부분입니다. const reduce = curry((f, acc, iter) => { if (!iter) { iter = acc[Symbol.iterator](); acc = iter.next().value; } else { iter = iter[Symbol.iterator](); } return (function recur() { let cur; while (!(cur = iter.next()).done) { const a = cur.value; acc = f(acc, a); if (acc instanceof Promise) { return acc.then(recur); } } return acc; })(acc); }); go( 1, (a) => a + 10, (a) => Promise.resolve(a + 100), (a) => a + 1000, console.log );
-
미해결실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화
one-to-may 의 관계에서 side effet 로 oom 의 발생가능성
안녕하세요 김영한 개발자님 수업을 듣던중 one-to-may 의 관계에서 side effet 로 oom 의 발생가능성에 대해 고민을 하게되어 질문드립니다. 테이블이 category - product - display_info 순으로 one-to-may 관계를 맺고있을 때, 만약category 가 10개, product 테이블의 데이터의 갯수가 10만개, display_info 의 테이블의 데이터가 100 만개일때,각각의 category 가 가지고있는 product 의 display_info 의 갯수를 확인하고 싶은 need 가 있으면,아래와 같이 entity 의 메서드를 통해 받아올수 있다는것을 이해를 했습니다. List<Category> categories = categoryRepository.findAll();List<CategoryResult> categoryResults = categories .stream() .map(category -> { //데이터 커지면 통계쿼리 처리가 좋을수도 있음. List<Product> products = category.getProducts(); int count = products .stream() .map(product -> product.getDisplayInfos().size()) .reduce(0, Integer::sum); return new CategoryResult(category.getId(), category.getName(), count); }) .collect(Collectors.toList());return categoryResults; 그런데 걱정이 되는것은 실제 데이터가 많으면 많아질수록 batch size 를 설정한다 하여도 가져올수 있는 양은 한정적이고결국 categorise 의 products 에 쌓인 데이터들로 인해 oom 이 발생할것 같은데 어떻게 처리를 하면 되나요??( 보통의 webpage 를 생각해보면 이렇게 많은 데이터를 가져올 일이없고 paging 을 이용할것 같긴 합니다. )제가 생각하기에는 아래의 2가지 정도 해결책이 있어보입니다.(1) one-to-many 의 관계를 사용하지 않고 명시적으로 fk 를 이용해서 repository 에서 find 를 호출 하는 방법.을 사용해 봤는데 이방법은 batch size 셋팅을 한다하여도 당연하겠지만 in query 로 sql 이 호출되지 않았습니다.당연히 속도도 현저히 늘려서 엄청난 시간이 걸렸습니다. ( 3분 -> 50분 )( ps. 아래의 코드에서도 inquery 셋팅하는 방법이 있을까요? ) List<Category> categories = categoryRepository.findAll();List<CategoryResult> categoryResults = categories.stream() .map(category -> { long categoryId = category.getId(); List<Product> products = productRepository.findAllByCategoryId(categoryId); int count = products .stream() .map(product -> { Long productId = product.getId(); List<DisplayInfo> displayInfos = displayInfoRepository.findAllByProductId(productId); return displayInfos.size(); }) .reduce(0, Integer::sum); return new CategoryResult(category.getId(), category.getName(), count); }) .collect(Collectors.toList()); (2) count query 를 설정하는 방법위의 needs 의 경우 통계쿼리처리를 하면 되겠지만, 만약 통계 쿼리로 처리하지못하는 로직이 있으면 어떻게 처리를 할수있을까요? 마지막 질문으로 위와 같이 oom 의 위험에도 불구하고 one-to-many 관계를 써야하나요??서비스에서의 가장큰 위험은 예상되지않은 에러라고 생각이 되는데 이경우 어떤 테이블이 어떻게 데이터가 많아질지 모르는 상황에서 위의 상황이 발생할수 있다고 생각이 됩니다.그럼에도 불구하고 성능적인 측면에서 one-to-many 를 쓰지않으면 성능이 너무나도 좋지않아서 고민입니다.긴글 읽어주셔서 감사합니다.
-
미해결Vue.js 완벽 가이드 - 실습과 리팩토링으로 배우는 실전 개념
깜빡거림 문제 state 질문드립니다.
실습 내용과 동일하게 진행중인데 깜박거림이 해결되지 않습니다. 몇시간을 삽질 했는데 이상한 부분이 있어서 질문드립니다.콘솔을 찍어보면 이상한 화면을 두번 뿌리는 부분이 있어서 깜빡거림이 있는데 무엇이 잘못된건지 모르겠습니다. routes/index.js { path: "/news", name: "news", component: NewsView, //component: CreateLiteView("news"), beforeEnter: (to, from, next) => { //라우터가드 console.log(3); Bus.$emit("start:spinner"); store .dispatch("FETCH_LIST", to.name) .then(() => { console.log(6); next(); }) .catch((error) => console.log(error)); }, }, store/actions.js FETCH_LIST({ commit }, pageName) { console.log(4); return fetchList(pageName) .then(({ data }) => { console.log(5); commit("SET_LIST", data); }) .catch((error) => { console.log(error); }); }, components/ListItem.vue export default { computed: { listItems() { console.log("data"); return this.$store.getters.fetchedList; } } } mixin/ListMixin.js import Bus from "../utils/bus.js"; export default { mounted() { Bus.$emit("end:spinner"); }, }; 콘솔로그 순서로 보면 처음 뉴스페이지에서 새로고침시 3>4>5>6>data 가 찍히고 다음질문페이지로 넘어가면 3>4>5>6>data>data 가 두번 찍힙니다. 깜빡거린다고 말씀주신 부분은 고쳐지지 않네요 ㅠ store/index.js state: { news: [], ask: [], jobs: [], list: [], user: {}, item: {}, }, state 부분을 삭제 해봤더니 data도 하나 찍히고 정상이에요. state없이도 getters가 되는가 싶기도 하고 영문을 모르겠습니다. vue 개발자 도구에서도 vuex에 sate가 등록되어있습니다. 분명히 제거했는데.. ㅠ ---------------------추가---------------- 깃에서 13번 브랜치 받아서 돌려봤는데 동일하게 깜빡 거리긴 하네요. 마찬가지로 store에서 state를 없애니깐 엄청 잘됩니다.
-
미해결파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자
def __init__(self)작성할때
self뒤에 다른 변수들이 올때가 있고 안올때가 있는데 어떤 차이가 있는지 모르겠습니다 ㅜㅜ
-
해결됨mongoDB 기초부터 실무까지(feat. Node.js)
createBlog가 await하는 동안
createblog가 awiat 하는 동안 또 불리면 어떻게 되나요? 예를들어 여러명의 유저가 동시에 createBlog를 호출하게되면 계속 await하고 다음거 await 처리할때까지 대기 하고 있을 것 같은데... 이런 경우 어떻게 처리되나요??
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
에러가 나오고 포트번호 변경해도 똑같습니다...
(node:12096) Warning: Accessing non-existent property 'MongoError' of module exports inside circular dependency (Use `node --trace-warnings ...` to show where the warning was created) Example app listening at http://localhost:7000 MongoParseError: URI does not have hostname, domain name and tld at parseSrvConnectionString (C:\Users\mario\Documents\boiler-plate\node_modules\mongodb\lib\core\uri_parser.js:50:21) at parseConnectionString (C:\Users\mario\Documents\boiler-plate\node_modules\mongodb\lib\core\uri_parser.js:594:12) at connect (C:\Users\mario\Documents\boiler-plate\node_modules\mongodb\lib\operations\connect.js:284:3) at C:\Users\mario\Documents\boiler-plate\node_modules\mongodb\lib\mongo_client.js:225:5 at maybePromise (C:\Users\mario\Documents\boiler-plate\node_modules\mongodb\lib\utils.js:681:3) at MongoClient.connect (C:\Users\mario\Documents\boiler-plate\node_modules\mongodb\lib\mongo_client.js:221:10) at C:\Users\mario\Documents\boiler-plate\node_modules\mongoose\lib\connection.js:833:12 at new Promise (<anonymous>) at NativeConnection.Connection.openUri (C:\Users\mario\Documents\boiler-plate\node_modules\mongoose\lib\connection.js:830:19) at C:\Users\mario\Documents\boiler-plate\node_modules\mongoose\lib\index.js:345:10 at C:\Users\mario\Documents\boiler-plate\node_modules\mongoose\lib\helpers\promiseOrCallback.js:31:5 at new Promise (<anonymous>) at promiseOrCallback (C:\Users\mario\Documents\boiler-plate\node_modules\mongoose\lib\helpers\promiseOrCallback.js:30:10) at Mongoose._promiseOrCallback (C:\Users\mario\Documents\boiler-plate\node_modules\mongoose\lib\index.js:1135:10) at Mongoose.connect (C:\Users\mario\Documents\boiler-plate\node_modules\mongoose\lib\index.js:344:20) at Object.<anonymous> (C:\Users\mario\Documents\boiler-plate\index.js:7:10) 이런 에러가 발생하는데 어떤분이 ip주소 경로를 설정하시는거 올린거보고 따라했는데도 이런 에러가 계속 반복됩니다.... 해결해서 다음강의로 진행하고싶습니다 ㅠㅠㅠ
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
routes폴더
혹시 routes같은 폴더를 안만들고 app.js,package.json이 위치한 폴더에 바로 index.js와 user.js를 만들면 실행이 안되는데 안되는게 맞는건가요?
-
미해결애플 웹사이트 인터랙션 클론!
선생님 안녕하세요 코드 적용 후 에러가 발생하고 있습니다 ㅠㅠ
벌써 두시간 째 원인 파악 하고 있는데 도저히 찾을 수가 없네요 선생님 도와 주세요 breakpoint 찍어봐도 제가 실력이 부족해서 지금까지 잘 해 왔는데 갑자기 이러니까 너무 슬프네요 살려주세요! 코드 첨부해드리겠습니다. (() => { let yOffset = 0; // window.pageYOffset 대신 쓸 수 있음 let prevScrollHeight = 0; // 현재 스크롤 위치 yOffset 보다 이전에 위차한 스크롤 섹션들의 스크롤 높이값의 합 let currentScene = 0; // 현재 활성화된 씬 let enterNewScene = false; // 새로운 Scene이 시작되는 순간 true const sceneInfo = [ { // 0 type: 'sticky', heightNum: 5, // 브라우저 높이의 5배로 scrollHeight 세팅 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, // 브라우저 높이의 5배로 scrollHeight 세팅 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, // 브라우저 높이의 5배로 scrollHeight 세팅 scrollHeight: 0, objs: { container: document.querySelector('#scroll-section-3'), canvasCaption: document.querySelector('.canvas-caption') }, values: { } } ]; 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.offsetHeigh; } 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 / 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]; } 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(${calcValues(values.messageA_tranlateY_in, currentYOffset)}%)`; } else { //out objs.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objs.messageA.style.transform = `translate3d(${calcValues(values.messageA_tranlateY_out, currentYOffset)}%)`; } // 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: // console.log('1 play'); 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() { enterNewScene = false; prevScrollHeight = 0; for (let i = 0; i < currentScene; i++) { 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 (currentScene) return; playAnimation(); } window.addEventListener('scroll', () => { yOffset = window.pageYOffset; scrollLoop(); }); window.addEventListener('load', setLayout); window.addEventListener('resize', setLayout); })(); // HTML <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>AirMug Pro</title> <!-- RESET CSS / STYLE CSS --> <link rel="stylesheet" href="css/default.css"> <link rel="stylesheet" href="css/blank.css"> <!-- 구글 폰트 --> <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"> </head> <body> <div class="container"> <nav class="global-nav"> <div class="global-nav-links"> <a href="#none" class="global-nav-item">Rooms</a> <a href="#none" class="global-nav-item">Ideas</a> <a href="#none" class="global-nav-item">Stores</a> <a href="#none" class="global-nav-item">Contact</a> </div> </nav> <nav class="local-nav"> <div class="local-nav-links"> <a href="#none" class="product-name">AirMug Pro</a> <a href="#none">개요</a> <a href="#none">제품사양</a> <a href="#none">구입하기</a> </div> </nav> <section class="scroll-section" id="scroll-section-0"> <h1>AirMugPro</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. Necessitatibus expedita, aliquam odio iste quasi fugit doloribus vero ab quaerat sunt, corrupti voluptatum officiis vitae nemo? Nostrum, doloremque eveniet. Vero, dicta facere optio sapiente assumenda ad cupiditate magnam repellendus sunt itaque nostrum beatae saepe esse ab sed ipsam ipsum consequatur, modi nam, veniam aliquid voluptas. Corporis ipsum praesentium non commodi veritatis, ad nobis? Recusandae sunt neque, ad odio illo non tempore impedit, tenetur itaque ipsum voluptatem! Asperiores deleniti fuga laboriosam quasi beatae nisi mollitia, quos modi incidunt temporibus assumenda in earum fugit et cumque sunt explicabo sit dignissimos quam ex ea aliquid qui alias veniam. Expedita repudiandae exercitationem eum. Eius distinctio aut quisquam expedita consequuntur eligendi quos excepturi maxime veritatis esse, porro, aliquam quod officiis natus vitae autem accusantium in perferendis? Sequi, odit doloremque fugiat repellat temporibus animi facere inventore dolorum, iusto pariatur similique consequatur culpa neque eligendi ab sapiente, facilis eum nostrum hic aperiam ad accusantium. Porro a non minima accusantium fugit mollitia ipsum dolorem molestias quod repellendus qui quibusdam deleniti quia officia ea, vero deserunt accusamus tempore, iure molestiae animi praesentium consequuntur totam rerum? Ex quod optio impedit. Unde quis eligendi optio voluptates ipsam est pariatur obcaecati debitis maxime! </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> <div class="canvas-caption"> <p> Lorem ipsum dolor sit amet consectetur adipisicing elit. Nostrum provident aspernatur veniam sed assumenda, repellendus, necessitatibus et ipsa laudantium dignissimos blanditiis expedita id debitis, pariatur rerum iure nisi magni repellat quaerat totam explicabo veritatis similique praesentium. Dignissimos dolores expedita totam pariatur quis quae similique labore voluptates delectus ipsa veniam facere, officiis repellendus ipsam ab molestiae voluptas modi facilis eaque excepturi voluptatem fugit sed sapiente. Unde esse nostrum eos. Laboriosam eligendi repellat commodi ad, dolore accusantium similique eum beatae aspernatur. Nihil ex officia, quae ullam magnam quasi ea saepe corporis molestias magni maxime ab repudiandae praesentium, numquam amet porro minima eveniet, asperiores voluptates quam nemo hic deserunt. Ipsa praesentium, omnis similique fugiat voluptates animi explicabo illum mollitia sed magni? Quisquam aperiam laborum nostrum consequuntur dolor quidem minima amet pariatur repellendus aut eius, modi accusamus quasi. Quaerat nisi dolores maiores, animi optio quidem obcaecati quisquam, rerum maxime corrupti natus vitae voluptatibus totam! Provident suscipit, adipisci sed nisi illum minus non eius. Nisi perferendis vitae accusamus ipsa voluptatum sint necessitatibus asperiores quae fuga exercitationem? Quos odio saepe optio labore, officia modi perferendis doloribus provident nisi ratione repellat architecto atque aliquam neque consequatur eaque cupiditate? Rerum beatae obcaecati necessitatibus ipsa accusamus dolor nobis saepe. </p> </div> </section> <footer> <div class="footer"> 2021 김기운 </div> </footer> </div> <script src="js/blank.js"></script> </body> </html>
-
미해결누구나 할 수 있는 안드로이드 앱 개발 - 2 (Kotlin)
itemClick != null 에 대하여
<1-3. 콘텐츠 앱 - itemClick, WebView 강의> 09:30) if(itemClick != null) 로 묶어주는데, itemClick 이 null이 아닌 경우에 실행한다. 라는 의미가 무엇인가요? 답변 부탁드려용, 감사합니당.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
안녕하세요 선생님 다음 강의인 dx12 x 게임수학 에 관하여 && 쉐이더에 관하여 질문 드리겠습니다.
그래픽스 프로그래밍 즉, 쉐이더라는 것은 어렴풋이 감은 오겠는데, 정확히 우리가 무엇을 하는 것인지 여쭙습니다. 선생님 께서는 클라이언트 프로그래머 + 서버 프로그래머 지망생들을 위한 강의를 하시는데 질문 1 ) TA라는 직군이 있잖습니까? 그래픽스는 언리얼로 따지면 텍스쳐 이미지를 통해서 머터리얼을 만드는 작업이라고 보면 될텐데, 왜 굳이 TA라는 직군이 있는데도 불구하고 우리가 이것마져도 알아야 하는지 궁금합니다. 언리얼 컨텐츠 플머 라고 한다면 우리는 그래픽스 지식을 가지고 무엇을 하게 되는 건가요? 때에 따라서 머터리얼 제작하는 것으로 투입이 되나요? 질문 2) 구글을 뒤지다가 유니티는 쉐이더 코드를 코딩으로 할 수 있는 걸로 알고 있습니다. 블로그도 있고, 그런데 언리얼은 어디에도 쉐이더 코드를 만지는 곳이 없습니다. 머터리얼로 그냥 선 잇고 조합해서 만지는 것 밖에 없습니다 왜 유니티는 비쥬얼 스튜디오로 쉐이더 코드를 손 볼 때가 있고 언리얼은 아예 막혀있는지 그래서 머터리얼로 작업을 해야하는지 궁금합니다. 질문 3) 그래픽스 지식이 최적화와 관련이 있나요? 관련이 있다면 이 다음 수업에서도 다루어 주시나요?? 최적화최적화 그러는데 언리얼 최적화를 검색하면 뭐 툴을 이용해서 값 조절하고 그러는 것밖에없는데 언리얼 엔진 유튜브 에서 강연하는 것도 있기는 한데 그것도 언리얼 툴을 통해서 어느 부분이 성능을 더 잡아먹는지 확인하는 것 같은데 프로파일링인가? 아무튼 그래픽스 -> 최적화가 관련이 있다면 이 부분도 다루어 주시는 지 궁극적인 질문) TA라는 직군이 있는데 클라가 그래픽스 지식을 익혀서 어디서 써먹는지 궁금합니다.
-
해결됨우리를 위한 프로그래밍 : 파이썬 중급 (Inflearn Original)
데코레이터 미사용 샘플 문의 - 결과가 2개씩 나옵니다.
강사님 질문 있습니다. 아래처럼 코드를 사용해서 실행하니 결과가 2개씩 나오는데, 이유가 무엇인가요? # 데코레이터 실습 import time def perf_clock(func): def perf_clocked(*args): # 함수 시작 시간 st = time.perf_counter() result = func(*args) # 함수 종료 시간 계산 et = time.perf_counter() - st # 실행 함수명 name = func.__name__ # 함수 매개변수 arg_str = ', '.join(repr(arg) for arg in args) # 결과 출력 print('[%0.5fs] %s(%s) -> %r' % (et, name, arg_str, result)) return result return perf_clocked @perf_clock def time_func(seconds): time.sleep(seconds) @perf_clock def sum_func(*numbers): return sum(numbers) # 데코레이터 미사용 none_deco1 = perf_clock(time_func) none_deco2 = perf_clock(sum_func) # print(none_deco1, none_deco1.__code__.co_freevars) # print(none_deco2, none_deco2.__code__.co_freevars) print() print('-' * 40, 'Called None Decorator -> time_func') none_deco1(1.5) print() print('-' * 40, 'Called None Decorator -> sum_func') none_deco2(100, 150, 250, 300, 350) 결과는 아래와 같습니다. (env_craw) D:\workspace\Python>python decolate.py ---------------------------------------- Called None Decorator -> time_func [1.51387s] time_func(1.5) -> None [1.51407s] perf_clocked(1.5) -> None ---------------------------------------- Called None Decorator -> sum_func [0.00001s] sum_func(100, 150, 250, 300, 350) -> 1150 [0.00014s] perf_clocked(100, 150, 250, 300, 350) -> 1150
-
해결됨프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
자꾸 이런 에러가 나는데 왜 이런걸까요..;;;
(사진)
-
미해결누구나 할 수 있는 안드로이드 앱 개발 - 2 (Kotlin)
Interface 생성 이유
<1-3. 콘텐츠 앱 - itemClick, WebView 강의> 안녕하세용, 우와 RecyclerView에 Click 추가하는 부분이 어렵네용 (문법 파악이 아직 덜되어서 더 그런듯합니당. ㅠ) 07:21) ItemClick 이라는 interface 를 먼저 생성해주고, 그 후에 var형 변수로 선언해서 요리조리 사용하시던데 interface로 요렇게 따로 생성을 하고 시작하는 이유가 있나요? interface 에 대해서 구글링해보아도 요것의 용도를 잘 이해하지 못하겠어서요! ㅠ_ㅠ
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
배열의 이름이 포인터로 변환되는 조건?
강의에서 "배열의 이름은 배열의 시작 주소값을 가지는 TYPE*형 포인터로 쉽게 변환 가능"이라고 하셨는데요! 이건 C++에서 배열이름에 []가 붙지 않은채로 배열 이름만 덩그러니 놓여있을 때만 컴파일러가 포인터로 변환해준다는 말씀이신가요??? 특정 상황에서는 변환되지 않을 수도 있나요?
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
cross_val_score() 에서 scoring 인자값이 없는데
선생님~ 코드3번째 줄에서 cross_val_score() 에서 scoring 인자값이 없는데 어떻게 실행이 되는건가요..? 이전에 cross_val_score(..., scoring ='accuracy') 이렇게 scoring 인자값을 넣어주었었는데.. 여기서는 왜 넣지 않은건가요..? shift+tap 눌러서 함수 인자 설명을 봐도 scoring의 디폴트값이 None으로 되어있는데.. 어떻게 작동되는건지요..ㅠ? 그리고 오히려, GridSearchCV에서는 이전 강의에서는 GridSearchCV()를 쓸땐 인자로 scoring을 안써주셨었는데.. 이번 강의에서는 써주셨네요..! scoring 인자 값은 cross_val_score()나 GridSearchCV()에서 둘다 함수 인자로 꼭 써줘야 하는건가요~? 강의에서 빠뜨리신건지..아니면 생략도 가능한건지.. 이전강의와 달라서.. 기준이 헷갈리네요..ㅠㅠ
-
[리뉴얼] React로 NodeBird SNS 만들기
도메인 네임서버 에러가 납니다.. 원인좀 도와주실 수 있을까요 ?
삭제된 글입니다
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
안녕하세요 강사님. 저는 createQuery(OO.class)에 대해 이해를 하지 못하겠습니다ㅠ.
처음에는 이것에 대한 의문이였습니다. 왜 m.team은 Member.class로 데이터를 가져오고 저장하는 것이 아닌지, Team.class와 List<Team>인지. Member.class로 선언해도 m.age를 하면 데이터를 불러오지 못하는지. 이부분까지는 여러 실험을 통해 이해를 했습니다. (m.age를 저장하려면 Integer.class 로 해주면 되는) 가져올 데이터 타입.class로 해주면 되는.. (사실이부분도 이해하는데 엄청걸렸네요.ㅠㅠ) 이런식으로 member.getTeam을 해주면 값을 받아올 수 있고 팀A까지 값이 나오는데 (join이 이닌 select from Team으로 값을 가져옴) 했을 때 Team 정보가 없는 것은 Lazy 때문인 것 인가요? (원래 팀 정보가 없는게 궁금해서 작성한 것인데.. 쓰다보니까 혼자이해를 해버린거같네요..) 이 경우에는 Member에서 join을 통해 Team을 가져오지만 이경우에는 join이 아닌 따로 select * from Team으로 쿼리가 출력 되는데 왜 그런것인가와 실무에서 어떤 방식을 사용 하는것이 좋은지 궁금하네요.. 굳이 신경쓸 부분이 아닌가요 ?
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
GridSearchCV refit에 관해서 질문합니다!
grid_dtree = GridSearchCV(dtree, ... , refit=True) 에서 refit을 True가 아닌 False로 설정한다면, 최적의 파라미터로 재학습이 되지 않기 때문에 grid_dtree.fit(X_train, y_train)했을 때 마지막 교차 검증시 사용한 파라미터로 학습이 되는 것인가요? 그럴 경우(refit=False)에 grid_dtree.best_estimator_를 통해서 최적의 파라미터를 가진 estimator를 다시 구해서 predict를 하는 것일까요? 제가 이해한 것이 맞는지 여쭤봅니다!
-
미해결[OpenCV] 파이썬 딥러닝 영상처리 프로젝트 2 - 불량사과를 찾아라!
저 역시 cv2.MultiTracker_create() 에러가 나네요...
쥬피터노트북에서 수업 진행중에 module 'cv2.cv2' has no attribute 'MultiTracker_create'error가 확인되는데... 해결이 잘 안됩니다...어떻게 해야할까요? cv2.TrackerKCF_create()는 잘 되는데 왜 Multi만 안될까요?? ? 설치도 반복해봤고, opencv-contrib-python에서 whl파일 받아서 수동으로 설치해봐도 같은...경우인데....너무 어렵네요... 왜 그럴까요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
연관관계 메서드 addOrderItem 질문합니다.
안녕하세요연관관계 메서드 부분에서addOrderItem 쪽이 Order.java void addOrderItem (Item item){ OrderItem orderItem = OrderItem.createOrderItem(this, item); orderItems.add(orderItem);} 이런식으로 Item을 넘겨줘서 한번에 서로서로 연결되도록 코드를 작성해도 상관없는건가요? OrderItem.java OrderItem createOrderItem(Order order, Item item){ OrderItem orderItem = new OrderItem(); orderItem.order = order; orderItem.item = item; return orderItem; }