묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지
failureRedirect와 successRedirect
안녕하세요 kakao 로그인중에 궁금한게 생겨서 이렇게 여쭤보게 됬습니다. router.get( '/kakao/callback', passport.authenticate('kakao', { failureRedirect: '/', // 실패시 }), (req, res) => { // 성공시 res.redirect('/'); }); 지금 여기에 카카로 로그인 실패시는 passport.authenticate의 두번째 매개변수의 옵션인 failureRedirect에 있는 /로 리다이렉트가 되고 성공한다면 "성공시"라고 주석되어있는 부분의 미들웨어로 가서 결국 /로 또 리다이렉트가 되는걸로 알고있습니다. 실패할때의 리다이렉션 옵션이있다면 성공도 있을거같아서 공식문서를 찾아보았는데요 http://www.passportjs.org/docs/authenticate/ 여기가 주소입니다! 강의해서 해주신것처럼 "성공시" 주석에있는 미들웨어를 한개 더 추가하지 않고 저렇게 옵션으로 주어도 무방할까요 ??혹시 성공과 실패를 미들웨어와 옵션으로 따로 주신 이유가 있다면 그것도 궁금합니다 감사합니다.
-
해결됨게임 프로그래머 취업 전략 가이드
면접관 질문의 의도는 무엇인가요?
면접관들이 마지막으로 물어볼 것이 있냐고 말하는 건 무슨 의도가 있나요? 진짜 궁금한 것을 물어봐도 되나요? 물어보면 실례가 될 내용이나 예의 없어 보이는 질문은 어떤 것이 있나요? 물어볼 것이 없다고 말하면 부정적으로 보나요?
-
해결됨홍정모의 따라하며 배우는 C++
함수 출력 값
아래 함수를 출력하면 7이 나와야 할거 같은데... 1이 출력이 됩니다... namespace work3::work33::work3333 //컴파일러 버전 17적용해야됨 { int a(1); void doSomething() { a += 6; } } int main() { work3::work33::work3333::a; work3::work33::work3333::doSomething; cout << work3::work33::work3333::a << endl; cout << work3::work33::work3333::doSomething << endl; }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
jdk 환경변수
%JAVA_HOME%\bin 을 제일위로 올려도 안되는데 어떻게해야할까요 ..
-
미해결it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비
맥북(mac os) 자동 채점 방법을 고민해보았습니다.
출력값이 긴 파일은 하나씩 눈으로 보고 체크하기가 어려워서 방법을 찾아보았습니다. 별다른 설치 파일 필요 없이 그냥 리눅스 명령어로 만들어진 쉘 스크립트만 생성해주면 되므로 간단합니다. 다른 언어로 개설된 강의를 듣는 mac유저들도 쉘 스크립트로 빠르게 채점이 가능할 듯합니다. 1. 쉘 스크립트 생성 작성한 코드가 있는 폴더에서 run.sh 파일을 생성합니다. 해당 파일을 열어서 아래 내용을 붙여넣어줍니다. 실행할 cpp 파일 명은 code.cpp로 바꾸어주세요. #!/bin/bash g++ code.cpp -o code "./code" "./test/in1.txt" "./test/result1.txt" "./code" "./test/in2.txt" "./test/result2.txt" "./code" "./test/in3.txt" "./test/result3.txt" "./code" "./test/in4.txt" "./test/result4.txt" "./code" "./test/in5.txt" "./test/result5.txt" echo "test1 :" && diff -w -s "./test/result1.txt" "./test/out1.txt"&& echo " " echo "test2 :" &&diff -w -s "./test/result2.txt" "./test/out2.txt"&& echo " " echo "test3 :" &&diff -w -s "./test/result3.txt" "./test/out3.txt"&& echo " " echo "test4 :" &&diff -w -s "./test/result4.txt" "./test/out4.txt"&& echo " " echo "test5 :" &&diff -w -s "./test/result5.txt" "./test/out5.txt"&& echo " " 2. 채점 파일 등록 해당 폴더에 test폴더를 생성하여 채점 파일에 있는 파일들을 넣어줍니다. 3. 메인 코드 수정 메인의 코드를 살짝 수정해주어야 합니다. code.cpp파일을 열어 아래와 같이 수정 해 줍니다. int main(int argc, char* argv[]){ freopen(argv[1], "rt", stdin); freopen(argv[2], "w", stdout); main함수에 매개 변수를 입력할것이므로 인자를 넣어주고 결과 파일을 작성할 코드도 추가합니다. 4. 실행 cpp 파일이 있는 폴더에서 쉘 스크립트를 실행합니다. $ sh run.sh 5. 결과 확인하는 법 성공 내가 작성한 코드의 결과값과 채점파일의 답이 일치하면 identical이라는 문구가 뜹니다. 실패 틀린 답은 해당 번호에 코드 출력 결과값을 보여줍니다. 구분선 --- 위쪽은 내가 작성한 코드의 출력값, 아래는 채점 파일의 출력값입니다. 실행시간 확인하기 c++코드에서 시간 라이브러리를 넣어 측정할 수 있지만 귀찮아서 시간 측정은 잘 안했는데 리눅스 명령어로도 확인이 가능하네요. #!/bin/bash g++ code.cpp -o code time "./code" "./test/in1.txt" "./test/result1.txt" time "./code" "./test/in2.txt" "./test/result2.txt" time "./code" "./test/in3.txt" "./test/result3.txt" time "./code" "./test/in4.txt" "./test/result4.txt" time "./code" "./test/in5.txt" "./test/result5.txt" 이렇게 실행 명령어 앞에 time 을 붙여주면 실행 시간을 출력해줍니다. 쉘 스크립트 문법을 몰라서 그냥 한줄 한줄 작성했는데 세련되어보이진 않지만 채점파일 추가,삭제는 직관적으로 가능하다는 장점이 있다고 우겨보겠슴다. 수정하고 싶은 부분은 간단한 검색으로도 많은 자료가 있으니 수정하셔서 사용하면 될 듯합니다. 궁금하거나 수정할 부분이 있다면 알려주세요.
-
미해결함수형 프로그래밍과 JavaScript ES6+ 응용편
함수형 추가 강의
1편 강의 수강중에, 재밌어서 미리 글 남겨요! 예제 코드 말고 실제 실무에서 함수형 중심으로 짜면 전체적인 구조나 코드가 어떨지 궁금해서요. 토이 프로젝트 제작을 함수형으로 진행하시는 강의는 계획에 없으신가요?
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
jdk 환경변수
설정 할때 이렇게 뜨는데 어디를 고쳐야 할까요? 그전에 egov oracle을 좀 공부해서.. 경로를 어떻게 해야할지 모르겠네요
-
해결됨설계독학맛비's 실전 FPGA를 이용한 HW 가속기 설계 (LED 제어부터 Fully Connected Layer 가속기 설계까지)
FC layer weight 관련 질문
안녕하세요, 이번 강의에서는 fully connected core에게 weight와 input 값을 정수 값만 주고 있습니다. 하지만 실제로 DNN의 weight값들은 보통 되게 작은 소수점을 가지는 값이 도출 된다고 알고 있습니다. 또한 실제로는 fully connected layer core에서 나온 output을 activation function (ex. sigmoid 함수)에 통과시켜야합니다. 궁금한 점은 아래와 같습니다. 1) 실제로는 소수점을 가지는 숫자를 fully connected core에 넣어줘야하는데 그때는 어떤 방식을 더 거쳐야하는지, 혹은 알려진 방법 중의 하나인 fixed point를 사용하는지, 2)현업에서 소수점을 다룰 때 단순히 fixed point로의 변환을 거쳐 이번 강의에서 만든 fully connected core와 같은 AI core를 통과시키는지, 아니면 다른 더 좋은 방법이 있는지, 3) activation function (시그모이드 함수)도 core로 구현하여 이번 강의에서 소개해주신 FC core 뒤에 붙이는지, 아니면 다른 현명한 방법이 있는지, 궁금합니다. 양질의 수업 항상 감사합니다.
-
미해결Vue.js - Django 연동 웹 프로그래밍 (실전편)
Forbidden (CSRF cookie not set.): /api/login/
저는 선생님의 오류와는 다르게 아래와 같이 Forbidden (CSRF cookie not set.): /api/login/ 위 오류가 발생되어집니다. 물론 axios.defaults.xsrfCookieName = "csrftoken";axios.defaults.xsrfHeaderName = "X-CSRFToken"; 위 코드는 첨부했는데도 오류가 발생되네요.. 다소 내용이 다른 csfr 오류인데 왜그럴까요 소스코드를 아무리 비교해도 다른 부분은 찾아지지가 않네요 ㅠ
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
리다이렉트 처리를 위한 메서드 삭제
안녕하세요!! 수업 듣던 중 궁금한점이 있어 질문 남깁니다. 1) URL이 변경되는 부분이 많아지게 되어 리다이렉트를 처리하는 메소드가 늘어나게 된다면 해당 메서드를 계속 유지하는지? 삭제한다면 어떤 기준으로 삭제하는지 궁금합니다. URL이 자주 변경되지는 않겠지만 만약 많은 부분이 변경되어 리다이렉트를 처리해야 하느 메소드가 늘어나게 되면 코드도 늘어나고 지저분해지지 않을까 싶어서요
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
jdk 버전
안녕하세요 다름이 아니라 jdk 8u281(os는 windows)를 쓰고 있는데 jdk 11로 바꿔야 할까요? 그리고 jdk11 학습용도 유료인가요?
-
미해결처음 배우는 리액트 네이티브
input 내용 관련 질문
Input에서 안드로이드에서는 add a task가 보이지 않고 또 안드로이드 ios둘다 input에 작성할 때 작성하는 글이 보이지 않는데 이거 이유가 왜그럴까요?
-
해결됨비전공자를 위한 진짜 입문 올인원 개발 부트캠프
코드 질문 있어요
#item-list > #item3 이런 코드를 짜셨는데 어차피 해당 파일에 item3는 한 개밖에 없는데 굳이 #item-list > 이걸 앞에 붙이는 이유가 있을까요 ? #item-list라는 것 안에 들어있는 item3를 지칭하는 것은 알겠는데 붙이는 이유가 있나요? 제가 #item-list > 이 부분을 제거해도 잘 작동되길래 질문 드립니다.
-
미해결스프링 핵심 원리 - 기본편
new memoryMemberRepository() 의 주소값 문의
public class AppConfig { public MemberService memberService() { return new MemberServiceImpl(new MemoryMemberRepository()); // MemberServiceImpl에 생성자 만들어서 넣어준다. Constructor Injection } public OrderService orderService() { return new OrderServiceImpl(new MemoryMemberRepository(), new FixDiscountPolicy()); // Constructor Injection }}여기서 new MemoryMemberRepository를 따로 했기 때문에 다른 주소값을 가지는게 아닌가요?? 그래서 MemberService와 OrderService는 다른 MemoryMemberRepository를가진다고 생각했었습니다.아니면 코드를 아래와 같이 써야한다고 생각했습니다. public class AppConfig { static MemberRepository memberRepository = new MemoryMemberRepository(); public MemberService memberService() { return new MemberServiceImpl(memberRepository); // MemberServiceImpl에 생성자 만들어서 넣어준다. Constructor Injection } public OrderService orderService() { return new OrderServiceImpl(memberRepository, new FixDiscountPolicy()); }}이렇게 해야 같은 주소값을 가지는 memberRepository객체를 만들 수 있다고 생각했습니다.제 생각이 틀린 건가요? 따로 new를 했는데 왜 같은 주소를 갖는지 모르겠습니다.
-
미해결[리뉴얼] 처음하는 파이썬 백엔드와 웹기술 입문 (파이썬 중급, flask[플라스크] 로 이해하는 백엔드 및 웹기술 기본) [풀스택 Part1-1]
결제 기능 연동하기 질문
강사님 안녕하세요, 강의 너무 잘 듣고 있습니다. 결제 기능 연동에 대한 질문드립니다. (질문) 참고할만한 결제 기능 연동 튜토리얼이나, 메뉴얼이 있을까요? 네이버페이, 아임포트, 그누보드 등 구글링해보았지만 Getting started 같은 예제는 따로 없고 단순 rest api 명령어 나열일 뿐이라, 제 수준에서 따라하기가 버거웠습니다. 어느 결제 모듈?을 사용해야 할지, 그리고 어떻게 구현해야할지 막막한 상황입니다. 적당한 모듈 추천, 참조 문서 등 방향 제시라도 해주신다면 큰 도움이 될 것 같습니다. 구현하고싶은 기능은 다음과 같습니다. 1. 웹페이지 내에 '구매하기' 버튼 추가 후, PG사 결제창 띄우기 2.회원의 결제 내역을 mysql DB에 저장하고, '마이페이지'에서 결제상태 변경하기 1강 48초에 보면, 완성된 웹페이지에서 결제화면이 나오는데, Part 1 강의를 모두 들어본 결과 해당부분 구현하는 것에 대한 코멘트를 찾지 못했습니다. ㅜㅜ 강의 자료 중 AWS 서버 연결하는 것에 대해서는 강의에서 다루진 않더라도 자료에 적어주셔서 너무 큰 도움이 되었습니다. 혹시 이런식으로 영상까진 아니더라도, 문서로 된 짧은 메뉴얼이라도 만들어주실 계획은 없으실까요? 혹시 해서 Part 2 내용인지 했는데, Part2에도 없는듯합니다. (아직 수강중이라서 혹시 다루셨다면 강의챕터 알려주시면 감사하겠습니다.) 감사합니다.
-
해결됨캐글 Advanced 머신러닝 실전 박치기
Group by Case When을 새로 작성해보았습니다.
안녕하세요 권철민 강사님!강의 매우 유익하게 듣고 있습니다!!강사님 강의만 총 6개정도 결제했습니다 ㅎㅎ파이썬 머신러닝 부터 CNN, 딥러닝심화, 캐글까지 섭렵하려합니다!! ------------------------------------------------ 강의 하신 내용 가운데 "Group by Case When" 부분을새로 만들어 보았습니다! (올린 사진이 좀 작네요 ㅠㅠ 죄송합니다) 같은 결과를 다르게 도출하는 방법이 있음을 알아가며,이렇게 하나씩 해보는게, 매우 큰 도움이 되고 있습니다. 감사합니다!!
-
미해결파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
debug_toolbar 세팅에 problem 메시지가 보입니다.
긴 설명보다 스크린 캡쳐 화면 붙여드립니다. 구글링을 했는데 마땅한 답변이 없어보여 질문드립니다. 미리 감사드립니다.
-
미해결모든 개발자를 위한 HTTP 웹 기본 지식
멱등 - 고려하지 않는다 라는 말의 의미
안녕하세요! 강의를 보다 이해가 잘 가지 않아 문의 드립니다. 멱등은 외부 요인으로부터 중간에 리소스가 변경되는 경우는 고려하지 않는다고 하셨는데요. 고려하지 않는다 라는 말의 의미를 사용자 1의 데이터가 사용자 2로 인해 값이 20에서 30으로 변경된 경우는, 결과적으로 값이 변경되었기 때문에 스펙상 GET은 멱등함에도 불구하고 멱등하지 않게 됐다는 말로 이해하면 될까요?
-
미해결애플 웹사이트 인터랙션 클론!
선생님 안녕하세요!
선생님 안녕하세요 canvas_opacity_out 실행되는 시점에 main.js:299 Uncaught TypeError: Failed to execute 'drawImage' on 'CanvasRenderingContext2D': The provided value is not of type '(CSSImageValue or HTMLCanvasElement or HTMLImageElement or HTMLVideoElement or ImageBitmap or OffscreenCanvas or SVGImageElement or VideoFrame)'. at playAnimation (main.js:299) at scrollLoop (main.js:389) at main.js:400 에러가 출력 됩니다. 혼자 해결해보려고 완성본 파일도 찾아보고 했지만 해결이 어려워 질문 드립니다. 감사합니다. (() => { let yOffset = 0 // window.pageYOffset 대신 사용할 변수 let prevScrollHeight = 0 // 현재 스크롤 위치(yOffset)보다 이전에 위치한 스크롤 섹션들의 스크롤 높이값의 합 let currentScene = 0 // 현재 활성하된(눈 앞에 보고 있는 ) 화면 let enterNewScene = false // 새로운 scene이 시작되는 순간 false const sceneInfo = [ { // 0 type: 'sticky', heightNum : 5, // 브라우저 높이의 5배로 scrollHeight 세팅 scrollHeight: 0, objects: { 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'), canvas: document.querySelector('#video-canvas-0'), context: document.querySelector('#video-canvas-0').getContext('2d'), videoImages: [] }, values: { videoImageCount: 578, imageSequence: [0, 577], canvas_opacity: [1,0,{ start: 0.9 , end: 1}], messageA_opacity_in: [0, 1, { start: 0.05, end: 0.15 }], messageB_opacity_in: [0, 1, { start: 0.25, end: 0.29 }], messageC_opacity_in: [0, 1, { start: 0.45, end: 0.5 }], messageD_opacity_in: [0, 1, { start: 0.7, end: 0.85 }], 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.1, end: 0.2 }], messageB_opacity_out: [1, 0, { start: 0.3, end: 0.31}], messageC_opacity_out: [1, 0, { start: 0.55, end: 0.6 }], messageD_opacity_out: [1, 0, { start: 0.9, end: 1.0 }], 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, objects: { container: document.querySelector('#scroll-section-1'), content: document.querySelector('#scroll-section-1 .description') } }, { // 2 type: 'sticky', heightNum : 5, scrollHeight: 0, objects: { 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'), canvas: document.querySelector('#video-canvas-1'), context: document.querySelector('#video-canvas-1').getContext('2d'), videoImages: [] }, values: { videoImageCount: 622, imageSequence: [0, 621], canvas_opacity_in: [0,1,{ start: 0, end: 0.1}], canvas_opacity_out: [1,0,{ start: 0.9, end: 0.95}], messageA_translateY_in: [20, 0, { start: 0.15, end: 0.2 }], messageB_translateY_in: [30, 0, { start: 0.5, end: 0.55 }], messageC_translateY_in: [30, 0, { start: 0.72, end: 0.77 }], messageA_opacity_in: [0, 1, { start: 0.15, end: 0.2 }], messageB_opacity_in: [0, 1, { start: 0.5, end: 0.55 }], messageC_opacity_in: [0, 1, { start: 0.72, end: 0.77 }], messageA_translateY_out: [0, -20, { start: 0.3, end: 0.35 }], messageB_translateY_out: [0, -20, { start: 0.58, end: 0.63 }], messageC_translateY_out: [0, -20, { start: 0.85, end: 0.9 }], messageA_opacity_out: [1, 0, { start: 0.3, end: 0.35 }], messageB_opacity_out: [1, 0, { start: 0.58, end: 0.63 }], messageC_opacity_out: [1, 0, { start: 0.85, end: 0.9 }], pinB_scaleY: [0.5, 1, { start: 0.6, end: 0.65 }], pinC_scaleY: [0.5, 1, { start: 0.87, end: 0.92 }], pinB_opacity_in: [0, 1, { start: 0.6, end: 0.65 }], pinC_opacity_in: [0, 1, { start: 0.87, end: 0.92 }], pinB_opacity_out: [1, 0, { start: 0.68, end: 0.73 }], pinC_opacity_out: [1, 0, { start: 0.95, end: 1 }] } }, { // 3 type: 'sticky', heightNum : 5, scrollHeight: 0, objects: { container: document.querySelector('#scroll-section-3'), canvasCaption: document.querySelector('.canvas-caption') }, values: { } } ] const setCanvasImages = () => { let imgElem for( let i = 0; i < sceneInfo[0].values.videoImageCount; i++) { imgElem = new Image() imgElem.src =`./video/IMG_${5555 + i}.jpg` sceneInfo[0].objects.videoImages.push(imgElem) } let imgElem2 for( let i = 0; i < sceneInfo[0].values.videoImageCount; i++) { imgElem2 = new Image() imgElem2.src =`./video/IMG_${6134 + i}.jpg` sceneInfo[2].objects.videoImages.push(imgElem2) } } setCanvasImages() const setLayout = () => { // 각 스크롤 섹션의 높이 세팅 for( let i = 0; i < sceneInfo.length; i++ ) { if( sceneInfo[i].type === 'sticky') { sceneInfo[i].scrollHeight = sceneInfo[i].heightNum * window.innerHeight sceneInfo[i].objects.container.style.height = `${sceneInfo[i].scrollHeight}px` } else if( sceneInfo[i].type === 'normal') { sceneInfo[i].scrollHeight = sceneInfo[i].objects.container.offsetHeight } sceneInfo[i].objects.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}`) const heightRatio = window.innerHeight / 1080 sceneInfo[0].objects.canvas.style.transform = `translate3d(-50%, -50%, 0) scale(${heightRatio})` sceneInfo[2].objects.canvas.style.transform = `translate3d(-50%, -50%, 0) scale(${heightRatio})` } const 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 } const playAnimation = () => { const objects = sceneInfo[currentScene].objects const values = sceneInfo[currentScene].values const currentYOffset = yOffset - prevScrollHeight const scrollHeight = sceneInfo[currentScene].scrollHeight const scrollRatio = currentYOffset / scrollHeight switch (currentScene) { case 0: let sequence = Math.round(calcValues(values.imageSequence, currentYOffset)) objects.context.drawImage(objects.videoImages[sequence], 0, 0) objects.canvas.style.opacity = calcValues(values.canvas_opacity, currentYOffset) if (scrollRatio <= 0.22) { // in objects.messageA.style.opacity = calcValues(values.messageA_opacity_in, currentYOffset); objects.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_in, currentYOffset)}%, 0)`; } else { // out objects.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objects.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.42) { // in objects.messageB.style.opacity = calcValues(values.messageB_opacity_in, currentYOffset); objects.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_in, currentYOffset)}%, 0)`; } else { // out objects.messageB.style.opacity = calcValues(values.messageB_opacity_out, currentYOffset); objects.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.62) { // in objects.messageC.style.opacity = calcValues(values.messageC_opacity_in, currentYOffset); objects.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_in, currentYOffset)}%, 0)`; } else { // out objects.messageC.style.opacity = calcValues(values.messageC_opacity_out, currentYOffset); objects.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.82) { // in objects.messageD.style.opacity = calcValues(values.messageD_opacity_in, currentYOffset); objects.messageD.style.transform = `translate3d(0, ${calcValues(values.messageD_translateY_in, currentYOffset)}%, 0)`; } else { // out objects.messageD.style.opacity = calcValues(values.messageD_opacity_out, currentYOffset); objects.messageD.style.transform = `translate3d(0, ${calcValues(values.messageD_translateY_out, currentYOffset)}%, 0)`; } break case 2: let sequence2 = Math.round(calcValues(values.imageSequence, currentYOffset)) objects.context.drawImage(objects.videoImages[sequence2], 0, 0) if (scrollRatio <= 0.5) { // in objects.canvas.style.opacity = calcValues(values.canvas_opacity_in, currentYOffset) } else { // out objects.canvas.style.opacity = calcValues(values.canvas_opacity_out, currentYOffset) } if (scrollRatio <= 0.25) { // in objects.messageA.style.opacity = calcValues(values.messageA_opacity_in, currentYOffset); objects.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_in, currentYOffset)}%, 0)`; } else { // out objects.messageA.style.opacity = calcValues(values.messageA_opacity_out, currentYOffset); objects.messageA.style.transform = `translate3d(0, ${calcValues(values.messageA_translateY_out, currentYOffset)}%, 0)`; } if (scrollRatio <= 0.57) { // in objects.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_in, currentYOffset)}%, 0)`; objects.messageB.style.opacity = calcValues(values.messageB_opacity_in, currentYOffset); objects.pinB.style.transform = `scaleY(${calcValues(values.pinB_scaleY, currentYOffset)})`; } else { // out objects.messageB.style.transform = `translate3d(0, ${calcValues(values.messageB_translateY_out, currentYOffset)}%, 0)`; objects.messageB.style.opacity = calcValues(values.messageB_opacity_out, currentYOffset); objects.pinB.style.transform = `scaleY(${calcValues(values.pinB_scaleY, currentYOffset)})`; } if (scrollRatio <= 0.83) { // in objects.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_in, currentYOffset)}%, 0)`; objects.messageC.style.opacity = calcValues(values.messageC_opacity_in, currentYOffset); objects.pinC.style.transform = `scaleY(${calcValues(values.pinC_scaleY, currentYOffset)})`; } else { // out objects.messageC.style.transform = `translate3d(0, ${calcValues(values.messageC_translateY_out, currentYOffset)}%, 0)`; objects.messageC.style.opacity = calcValues(values.messageC_opacity_out, currentYOffset); objects.pinC.style.transform = `scaleY(${calcValues(values.pinC_scaleY, currentYOffset)})`; } break case 3: break } } const 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) { if( currentScene === 0) return //모바일 바운스 때문에 enterNewScene = true currentScene -- document.body.setAttribute('id', `show-scene-${currentScene}`) } if( enterNewScene ) return playAnimation() } window.addEventListener('scroll',() => { yOffset = window.pageYOffset scrollLoop() }) window.addEventListener('load', () => { setLayout() sceneInfo[0].objects.context.drawImage(sceneInfo[0].objects.videoImages[0], 0, 0) }) window.addEventListener('resize', setLayout) })()
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
안녕하세요 Entity에서 Map 프로퍼티 질문입니다!
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 아니요2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요 강의를 다 듣고 따로 실습을 진행하다가 궁금함이 생겨 질문드립니다! 체스 게임을 구현 중 Board 클래스에 Map형태로 key값은 Position 클래스 value는 Piece 클래스로 설정하였고 @MapKeyJoinColumn어노테이션을 사용하여 연관관계 매핑하였습니다 생성한 board를 초기화할 때 Position과 Piece도 같이 초기화해주는데 Map부분 테이블이 Position보다 먼저 생성되어 오류가 발생합니다 확인해보니 hibernate에서 Map Key값을 cascade를 지원하지 않는다고 합니다 1. Key cascade를 지원하지 않으니 board 초기화할때 key를 생성하고 디비에 저장시키는 작업을 먼저 진행할 수 밖에 없는걸까요? 혹시 다른 방법이 있을까요? ( 위 코드에서는 BoardFactory에서 Position을 먼저 디비에 flush 시키는 코드 추가 ) 2. 현업에서는 엔티티에서 Map 속성을 종종 사용하는지 지양하는지 궁금합니다