묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
이번 강의로 인한 의문은 아니구요...
네트워크 강의는 들을수록 재미있기도하고 라이브코딩도 없어서 그냥 이야기꾼이 이야기해주는가보다 하고 듣고있습니다. 뭐 물론 이해를 잘하고 넘어왔는지는 모르겠지만요 ㅠ 그리고 듣고나서 나와 같은 강의를 들었을 사람들이 어떤 질문을 했는지도 모두 읽어보고 넘어갑니다. 사람마다 같은 강의를 보더라도 생기는 의문은 아주 다양하더라구요?? 단순 수업내용에 대한 질문부터 기술의 한계점에 대해 의문을 가지시는분, 보안이슈, 현업 적용 등등 아주 다양한 주제의 질문들이 쏟아져나옵니다. 근데 강사님께서는 그 모든 질문에 빠짐없이 디테일하게 대답을 해주시는거보고 엄청 대단하게 느껴지면서도 신기했습니다. 저는 이제 막 졸업한 취준생이라서 아직 현업에 대해 잘 모르지만 어디든지 제가 웹 개발자가 되어서 바쁘게 살다보면 그런 지식들은 자연스레 획득하게 되는것일까요?? 아니면 강사님이 그저 다른 개발자들보다도 많은 경험을 했던것일까요?? 다음 강의 시청하러 가겠습니다! 수업 잘 듣고 있습니다.
-
미해결초보자도 만들 수 있는 스크롤 인터렉션. 1편 자바스크립트
안녕하세요. stop(true) 질문입니다
$('html').stop(true).animate({ scrollTop: sectionMainBottom+1 //IE버그 반복 버그 처리를 위해 1을 추가합니다. },500,function(){ sectionIsMoving = false; //섹션이 이동중인지 체크하는 변수 }); stop()을 사용하면 애니메이션이 중단되는거로 알고 있는데 ()안에 ture를 넣는다는건 어떤의미로 작동이 된다는건가요??
-
미해결홍정모의 따라하며 배우는 C언어
에러 발생
error C4700: 초기화되지 않은 'ch' 지역 변수를 사용했습니다. // 제 코드입니다(메인 함수 안쪽 부분입니다) char ch; int count = 0; while ((ch == getchar()) != PERIOD) { if (ch != '\n' && ch != ' ') { count++; } } printf("%d\n", count); 계속 while문 부분에서 에러가 뜨네요... 변수를 선언하면 꼭 초기화를 해야 하나요?? 그리고 무엇으로 초기화를 해야 하나요?? ch에 NULL값이나 0을 집어넣으면 결과가 달라집니다..
-
미해결Slack 클론 코딩[실시간 채팅 with React]
안녕하세요. 문의드립니다!
안녕하세요. 이번에 강의를 시청하게된 취준생입니다. 다름이 아니라 대부분 소스파일을 다 제공해주셨던데 강의를 참고해서 그냥 제 레포지터리에 아무것도 없는 백지 상태에서 시작해도 되는지 궁금합니다. 따로 오류가 발생하거나 진행이 안될까봐 걱정되서요! 마지막으로 프로젝트가 완성되면 저의 깃허브에 올려놔도 괜찮은지 궁금합니다!
-
미해결자바스크립트 입문자를 위한 강의
안녕하세요.~
자바스크립트 강의 잘듣고있습니다 ㅎ.. 다름아니라 궁금한게 생겨서요..... 혹시 si업체에 30대 초 중반 되는 사람들이 신입으로 가끔 들어오고 하나요..? 보통 si업체에서 3년정도는 경험 쌓는게 좋다고 하는데 30대도 가능한가 해서요 -_-
-
미해결대세는 쿠버네티스 (초급~중급편)
storageos 설치 중 에러
storageos-scheduler-85c9889f58-b8hxb, POD에서 아래와 같은 에러가 발생합니다. Failed to pull image "gcr.io/google_containers/hyperkube:v1.19.3": rpc error: code = Unknown desc = Error response from daemon: manifest for gcr.io/google_containers/hyperkube:v1.19.3 not found: manifest unknown: Failed to fetch "v1.19.3" from request "/v2/google_containers/hyperkube/manifests/v1.19.3". 제가 docker pull "gcr.io/google_containers/hyperkube:v1.19.3" 명령으로 수동 pull을 해봤습니다. 다음과 같은 에러입니다. [root@k8s-master ~]# docker pull gcr.io/google_containers/hyperkube:v1.19.3 Error response from daemon: manifest for gcr.io/google_containers/hyperkube:v1.19.3 not found: manifest unknown: Failed to fetch "v1.19.3" from request "/v2/google_containers/hyperkube/manifests/v1.19.3". 대안을 찾아야 할 것 같습니다.
-
미해결애플 웹사이트 인터랙션 클론!
opacity out을 추가한 이후부터 in이 제대로 작동하지 않아서 문의드립니다
opacity in 만 적용했을 땐 잘 됬는데, out을 추가한 후부터 스크롤을 살짝만 내려도 바로 opacity가 1이 됩니다ㅠㅠ out은 정상적으로 작동하지만 스크롤을 맨 위로 올리게 되면 opacity가 0이 되야 하는데 1로 남아있어서요ㅠㅠ 검토좀 부탁드립니다 이부분에서 계속 꼬여서 중간부터 다시 하는데 또 꼬여버리네요.. (() => { let yOffset = 0; // 현재 스크롤 위치 - window.pageOffset 대신 사용 할 변수, 블럭 내부의 어디서든 접근 가능 let prevScrollHeight = 0; // yOffset보다 이전에 위치한 스크롤 섹션 스크롤 높이값의 합 let currentScene = 0; // 현재 활성화 된(내가 보고 있는) 씬의 번호(scroll-section) let enterNewScene = false; // 새로운 scene이 시작된 순간 true로 바뀜 const sceneInfo = [ { // scroll-section 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-messagqe.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 }] }, }, // { // // scroll-section 1 // type: "normal", // heightNum: 5, // scrollHeight: 0, // objs: { // container: document.querySelector("#scroll-section-1"), // }, // }, // { // // scroll-section 2 // type: "sticky", // heightNum: 5, // scrollHeight: 0, // objs: { // container: document.querySelector("#scroll-section-2"), // }, // }, // { // // scroll-section 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.offsetHeight; // } 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}`); } // 현재 섹션에서 스크롤이 얼마나 움직였는지의 비율(0~1)을 계산해서 css에 적용하기 위한 함수 function calcValues(values, currentYOffset) { let rv; // 현재 씬(스크롤 섹션)에서만 스크롤 된 범위를 비율로 구하기 const scrollHeight = sceneInfo[currentScene].scrollHeight; const scrollRatio = currentYOffset / sceneInfo[currentScene].scrollHeight; // start ~ end 사이에 애니메이션 실행 (values의 길이가 3일 때, 세번째 원소가 존재할 때 작동하도록 함) if (values.length === 3) { 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; // return 값이 존재해야 계산된 값을 사용할 수 있음 } function playAnimation() { const objs = sceneInfo[currentScene].objs; const values = sceneInfo[currentScene].values; const currentYOffset = yOffset - prevScrollHeight; // 전체 스크롤값에서 이전 섹션들의 스크롤값 총합을 뺀 값 const scrollHeight = sceneInfo[currentScene].scrollHieght; const scrollRatio = currentYOffset / scrollHeight; // currentYOffest을 사용하는 이유는, 첫번째 섹션이 아닌 이상 yOffset에서 이전 섹션들의 스크롤합은 빼주어야 하기 때문 switch (currentScene) { case 0: // messageA가 0에서 등장하기 때문에 'in'으로 구분하기(나가는건 out) // opacity의 start와 end시점의 중간지점의 비율을 잡아서 그 지점보다 작을땐 in에 해당되는 효과를, 클땐 out에 해당되는 효과를 나타나게 함 if ( scrollRatio <= 0.22 ) { // in일 때 objs.messageA.style.opacity = calcValues(values.messageA_opacity_in, currentYOffset); objs.messageA.style.transform = `translateY(${calcValues(values.messageA_translateY_in, currentYOffset)}%)`; } else { // out일 때 objs.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objs.messageA.style.transform = `translateY(${calcValues(values.messageA_translateY_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: break; case 2: break; case 3: 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; // 가끔 브라우저별로 바운스 효과가 일어나게 되면 currentScened이 -1이 되는 경우가 있기 때문 (모바일) currentScene--; document.body.setAttribute("id", `show-scene-${currentScene}`); } if (enterNewScene) return; // enterNewScene이 true라면 멈추게 해서 playAnimation이 한턴 걸러지게 되도록 함 (1에서 다시 스크롤을 위로 올렸을 때 음수가 나오는 것을 막아줌) playAnimation(); } window.addEventListener("scroll", () => { yOffset = window.pageYOffset; scrollLoop(); }); window.addEventListener("load", setLayout); // 이미지와 텍스트가 같이 로드되어야 하기 때문, 페이지가 다 로드되기 이전에 나오는 로드표시까지 함께 작동하게 하기 위함 window.addEventListener("resize", setLayout); })();
-
미해결유니티 2D 로그라이크 게임 만들기 [한글자막]
gamemanager 질문
실행을 하면 gamemanager가 dontdestroyonload라는걸로 바뀌면서 계속 파란 화면만 뜨는데 어떻게 해결해야 하나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
Coroutine 질문
CoroutineTest test = new CoroutineTest(); 여기서 할당을 받은거 뿐인데 어떻게 foreach에서 CoroutineTest 내부에 있는 함수가 실행되어서 yield return 값이 전달되는지 궁금합니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
component
삭제된 글입니다
-
미해결[리뉴얼] 처음하는 MongoDB(몽고DB) 와 NoSQL(빅데이터) 데이터베이스 부트캠프 [입문부터 활용까지] (업데이트)
4분 부분 질문입니다
select는 안되고 select_one인 이유가 뭔가요??ㅠ attrs를 안붙였을때 오류가 나는 점도 궁금합니다!
-
미해결자바스크립트로 알아보는 함수형 프로그래밍 (ES5)
코딩 결과가 다르게 나와요
var user = users3[0]; _.go(user, _.deep_pluck('posts.comments'), console.log); 의 결과가 (4) [{…}, {…}, {…}, {…}] 이 아니라 (2) [Array(3), Array(1)] 나오는데 이거 어디가 잘못 된거에요?
-
미해결대세는 쿠버네티스 (초급~중급편)
PVC 연결할때 POD에서 nodeSelector 연결하면 오류가 나는데요.
matchExpressions 에서 k8s-node1 만 입력 후에, POD 생성할 때kubernetes.io/hostname: k8s-node2 를 입력하면 오류가 납니다.양쪽 노드에서 같이 사용 하려면, matchExpressions에 노드 두개를 다 정의해 줘야 하나요?
-
해결됨나만의 포트폴리오 블로그 만들기(feat. 티스토리 스킨)
웹팩 빌드 오류
안녕하세요, 현재 :stylus 웹팩 에러가 발생하는데요. 티도리 문서의 webpack configuration extends를 사용해서 이렇게 추가한후 tidory start를 실행해도 :stylus를 사용할수가 없는데 해결방법을 알고싶습니다... packge.json
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
질문있습니다! 쿠키관련
const cookie = context.req ? context.req.headers.cookie : ''; 위와 같은 쿠키는 매번 모든 js들에 적어주어야 하나요 ? 하나의 파일에서 모든곳에 공유되게 설정할 수 있나요 ?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Transaction script/Domain model 패턴에 대한 질문입니다.
안녕하세요. 항상 좋은 강의 즐겁게 시청하고 있습니다! 강의를 따라가다보니 서비스 레이어가 아닌 엔티티에 비즈니스 로직을 넣어두는 도메인 모델 패턴을 사용하고 계시더라구요. 설명주셨던 것 처럼 코드의 응집도를 높여 중복을 방지하고 재사용성을 높이는 부분에 장점이 크다는 건 잘 알고 있습니다. 저는 현재 실무에서 서비스에 모든 비즈니스 로직을 넣어두는 트랜잭션 스크립트 패턴을 사용하고 있는데요. 도메인별로 서비스를 나눠두고, 해당 서비스에 비즈니스 로직들을 넣어두는 형태로 구현하고 있습니다. 현재 강의에서는 엔티티에 넣어놓은 비즈니스 로직을 서비스에서 단순히 호출만 하는 형태로 사용하고 있는데 서비스 레이어에 넣어둔 비즈니스 로직을 호출하는 형태로 구현해도 어떻게 보면 같은 방식이 아닐까 생각이 들어요. (강의에 나와있는 Order엔티티의 cancel(), createOrder() 등을 엔티티가 아닌 OrderService에 넣어두고 타 서비스에서 필요 시 호출하는 형태) 이렇게 구현을 해도 엔티티에 넣어두는 방식과 동일하게 응집도를 높여 중복을 방지하고 재사용성을 높일 수 있다고 생각합니다. 다만, 아래와 같은 이유들 때문에 도메인 모델 패턴을 선택하시지 않았나 생각합니다. 1. 도메인 모델 패턴이 좀 더 객체지향적임 2. DDD의 일부 개념을 차용하였기 때문 저는 현재 파이썬으로 개발을 하고있는데 파이썬 진영에서는 흔치않는 Layered architecture를 채택해서 진행하다보니 많은 혼란이 오는 것 같습니다. 내용이 조금 더 길어졌는데 질문을 요약하자면, 1. 도메인 모델 패턴을 사용하신 이유가 위에서 말씀드린 1, 2번때문이 맞을까요? 2. 서비스 레이어에 로직을 몰아넣고 필요할 때 쓰는 방식도 응집도를 높여 중복을 방지하고 재사용성을 높일 수 있다고 보는데 어떻게 생각하시나요? 이 부분에 대해 영한님의 생각을 듣고 싶습니다 :)
-
미해결C#과 유니티, 실전 게임으로 제대로 시작하기 (저자 직강)
c# 클래스의 형 변환
삭제된 글입니다
-
미해결자바스크립트 비기너: 튼튼한 기본 만들기
forEach() 문 내부에서 delete로 특정 인덱스를 삭제했을 경우
안녕하세요 선생님. 질문이 있어 이렇게 올리게 됐습니다. var list = [1,2,3]; var fn = function(el, index, all){ if(index === 0){ delete list[2]; }; console.log(el); }; list.forEach(fn); 위 코드에서 delete list[2]를 사용하고 있습니다. 제가 기억하는바론 splice로 배열에서 엘리먼트 삭제시 완전히 삭제되는반면, delete로 엘리먼트 삭제시 값만 지우고 undefined가 그 자리를 채우는 것으로 기억합니다. 따라서 delete list[2]가 시행되면 value = [1, 2, undefined]가 되고, forEach 구문으로 해당 배열을 나열시 1 2 undefined 가 결과로 출력돼야하는 것 아닌가요??! console.log(value[2]); 를 해보면 undefined가 출력되는데 forEach 문으로 돌렸을 땐 왜 undefined가 출력되지 않는지 궁금합니다! 훌륭한 강의 너무 잘 듣고 있습니다. 감사합니다 :)
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일대일 관계에서 mappedBy를 지정하지 않으면 어떻게 되나요?
제가 이해가 부족해서 OneToOne 관계에서 서로 단방향?을 걸어버린 구조가 있는데요. 실제 구조로 보면 이렇게 돼있습니다. 실제론 FK를 사용하지 않아서 FK가 걸려있진 않습니다. 구조만 서로 Id를 DB에서 갖고 있습니다. 코드는 서로 @OneToOne에 @JoinColumn을 걸었습니다. Member와 Locker 둘다요. 이렇게 되면 발생할 수 있는 문제가 어떤게 있을까요..? 그리고 이렇게 하면 양방향에서 EAGER만 되는걸 해결할 수 있는지도 궁금합니다.
-
미해결SharePoint로 회사 파일 서버를 대체할 인트라넷 사이트 만들기
권한 설정 문의(계속)
강사님, 아래 질문에 대해 추가 문의입니다. 말씀하신데로 Microsoft 365 그룹을 설정한게 맞구요. 질문의 요점은 문서 라이브러리에 'A' 라는 Microsoft 365 그룹을 읽기 권한을 주었을때 새로 입사하는 직원이 A 그룹에 편입될 경우 추가로 새로 입사한 직원에 대해서는 권한 설정을 안해줘도 되는 거지요? 'A' 그룹에 편입되면 해당 그룹에 주어진 권한이 나중에 편입된 구성원들에게도 반영되는지 궁금합니다.