묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
npm run start가 되지 않습니다.
안녕하세요. npm run start 입력 시 이런 오류가 뜹니다. 오류 사진 첨부합니다. 구글링하니 cached를 없애고 npm을 재설치해라 등등 하라는대로 해봤는데 안되네요... 조언 부탁드립니다. 감사합니다!
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
앤티티에서 두개의 같은 앤티티를 매핑하는 법에 대해 질문드립니다.
안녕하세요 선생님 선생님의 강의 덕분에 JPA 대해 많은것을 알게 되었습니다. 다름이 아니오라 JPA를 활용한 가벼운 프로젝트를 만들다 이럴때는 어떤 방식으로 하시는지 궁금해 질문드리게 되었습니다. 예를 들어 A팀과 B팀이라는 축구 팀이 있습니다. (Team 이라는 앤티티) 이 두팀의 서로 경기일정, 장소,경기 득점을 담는 경기일정 테이블이 있습니다. (Match 라는 앤티티) 여기서 Match라는 앤티티에 두팀을 매핑 시키는 방법에 대해 질문드리게 되었습니다. -------------------------------------------------------------------------------------------------------------- 첫번째 방법은 Match테이블에 두 앤티티를 받는 방법인데 생각한 방식은 홈팀과 어웨이 팀으로 해서 만드는 방식을 생각했습니다 그런데 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.MappingException: Repeated column in mapping for entity: com.springjpa.sample.soccorshop.domain.team.match.Match column: team_pkid (should be mapped with insert="false" update="false") 이 오류의 설명 처럼 insert="false" update="false"로 하는 것이 맞는지 모르겠습니다. 두개의 동일한 앤티티를 한 앤티티에 넣는 경험이 없어 맞는지 의심이 들어... --------------------------------------------------------------------------------------------------------------------- 두번째 생각한 방법은 한 Match 테이블에서 한쪽은 Team으로 다른쪽은 팀의 주장인 Member앤티티로 조회하는 방법 강의를 통해서 또는 다른 기능들을 구현하면서(예를 들어 한 회원이 팀에 들어가고 싶어 축구 팀에 가입 신청을 하면 팀에서 가입 요청 목록을 조회하여 그회원을 가입허가) Member(회원 ){1} ------- {N}JoinRequest(가입요청){M}----------{1}Team(팀) 다른 엔티티를 탐색하는 것에 익숙하다 보니 이방식으로 구현할수도 있다고 생각합니다. 경기가 끝나고 득점같은 것을 Match테이블에 기록하고 나중에 경기 결과 리스트를 만들때는 'homeTeam의 id와 소속한 팀의 id가 같거나 awayCaption의 id와 소속한 팀의 주장의 id와 같은 Match테이블'을 jpql로 해서 받을수 있지 않을까 생각합니다. ---------------------------------------------------------------------------------------------------------------- 세번째는 그냥 Member, Team 매핑 하지말고 그냥 String으로 두개의 팀이름으로 작성하자는 방법입니다. 이렇게 테이블을 작성하고 나중에 조회할때는 homeTeamName, awayTeamName 둘중 하나와 소속한 팀의 이름이 같은 Match테이블 리스트를 반환하는 방법입니다. 이 방법으로는 쉽게 구현할 수 있다고 생각하지만 디테일한 예전 기록을 볼려면 getter을 활용한 List를 반환 받을수 없다고는 생각합니다 세가지 방법을 생각해봤는데 2번째 방법은 다른 앤티티 탐색의 경험으로 저렇게 하면 되지 않을까 라는 생각이지만 굳이 저렇게 할 필요가 있나? 라는 생각도 있어 잘 모르겠습니다... 현업에서는 매칭 같은 것은 어떤 방식으로 구현하시는지 궁금해 여쭙게 되었고 혹시나 제가 생각한것과 다른 방식이 있는지 조언을 여쭙고자 글을 남기게 되었습니다. 혹시 설계의 기본도 없다고 말씀해 주셔도 감사히 새겨 듣겠습니다. 마지막으로 활용1,2 데이터 JPA, querydsl도 한번으로 끝내지 않고 여러번 정독하면서 제것으로 만들려고 하고 있습니다. 좋은 강의, 기술들을 쉽게 잘 설명해 주셔서 항상 감사드립니다.
-
미해결[백문이불여일타] 데이터 분석을 위한 중급 SQL
코드를 입력해서 올렸는데 이런 오류는 무엇일까요
제생각엔 저 코드가 맞다고 생각해서 테스트해보니 no response on stdout~ 뜨네요 https://share.getcloudapp.com/wbu7gkv7
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
혹시 이렇게 풀어도 되려나요..?
import sys sys.stdin=open('input.txt','rt') n=int(input()) a=list(map(int,input().split())) k=n b=[n] for i in range(-2,-n-1,-1): k-=1 b.insert(a[i],k) print(b) 뒤에서부터 접근하는 방식으로 풀어봤습니다.. 그리고 혹시나 해서 여쭤보는건데, k=n을 생략하고 그냥 쓰면 혹시 나중에 버그같은게 걸릴 수 있는지 궁금합니다. 마치 밑의 예시처럼요.. import sys sys.stdin=open('input.txt','rt') n=int(input()) a=list(map(int,input().split())) b=[n] for i in range(-2,-n-1,-1): n-=1 b.insert(a[i],n) print(b)
-
미해결애플 웹사이트 인터랙션 클론!
스크롤하이트가 정의되지않았다고 에러뜨는데 왜일까요,,??
(() => { let yOffset = 0; // window.pageYOffset 대신 쓸 변수 let prevScrollHeight = 0; // 현재 스크롤 위치 (yOffset) 보다 이전에 위치한 스크롤 섹션들의 스크롤 높이 합 let currentScene = 0; // 현재 활성화 된(눈 앞에 보고 있는) 씬 (scroll-section) let enterNewScene = false; // 새로운 씬이 시작 된 순간 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'), canvas: document.querySelector('#video-canvas-0'), context: document.querySelector('#video-canvas-0').getContext('2d'), videoImages: [] }, values: { videoImageCount: 300, imageSequenc: [0, 299], canvas_opacity: [1, 0, {start: 0.9, end: 1 }], 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 }], // 20=> translateY를 20%만큼 조정, %는 밑에 playAnimation()에서 붙여줄 거임 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, // type normal에서는 필요없음 scrollHeight: 0, objs: { container: document.querySelector('#scroll-section-1') } }, //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'), canvas: document.querySelector('#video-canvas-1'), context: document.querySelector('#video-canvas-1').getContext('2d'), videoImages: [] }, values: { videoImageCount: 960, imageSequenc: [0, 959], canvas_opacity: [1, 0, { start: 0.9, end: 1}], 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 setCanvasImages() { let imgElem; for (let i = 0; i < sceneInfo[0].values.videoImageCount; i++) { imgElem = new Image(); // imgElem = document.createElement('img'); imgElem.src = `./video/001/IMG_${6726 + i}.JPG`; sceneInfo[0].objs.videoImages.push(imgElem); } let imgElem2; for (let i = 0; i < sceneInfo[2].values.videoImageCount; i++) { imgElem2 = new Image(); imgElem2.src = `./video/002/IMG_${7027 + i}.JPG`; sceneInfo[2].objs.videoImages.push(imgElem2); } } 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}`); const heightRatio = window.innerHeight / 1080; // 디바이스 높이에 따라 이미지 조정 sceneInfo[0].objs.canvas.style.transform = `translate3d(-50%, -50%, 0) scale(${heightRatio})`; sceneInfo[2].objs.canvas.style.transform = `translate3d(-50%, -50%, 0) scale(${heightRatio})`; // translate3d로 가운데 정렬 후 scale로 이미지 크기 조정 } function calcValues(values, currentYOffset) { let rv; // 현재 씬(스크롤섹션)에서 스크롤 된 범위를 0~1 사이의 비율로 구하기 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 = yOffset / 현재 씬의 scrollHeight; const scrollRatio = currentYOffset / scrollHeight; switch (currentScene) { case 0: // console.log('0 play'); let sequence = Math.round(calcValues(values.imageSequenc, currentYOffset)); objs.context.drawImage(objs.videoImages[sequence], 0, 0); objs.canvas.style.opacity = calcValues(values.canvas_opacity, currentYOffset); 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 2: // console.log('2 play'); let sequence2 = Math.round(calcValues(values.imageSequenc, currentYOffset)); objs.context.drawImage(objs.videoImages[sequence2], 0, 0); 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 (enterNewScene) return; playAnimation(); } window.addEventListener('scroll', () => { yOffset = window.pageYOffset; scrollLoop(); }); // window.addEventListener('DOMcontentLoaded', setLayout) 이미지가 업로드 되기 전에 실행 window.addEventListener('load', () => { setLayout(); sceneInfo[0].objs.context.drawImage(sceneInfo[0].objs.videoImages[0], 0, 0); }); window.addEventListener('resize', setLayout); setCanvasImages(); })();
-
애플 웹사이트 인터랙션 클론!
안녕하세요 에러가 나오는데 어떻게 해결해야되나요?
삭제된 글입니다
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 쇼핑몰 사이트 만들기[전체 리뉴얼]
Mongodb
Mongo db 와 연결이 안되는지 npm run dev 를 입력하면 에러가 나는데 어떻게해야하나요ㅠㅠ
-
미해결[OpenCV] 파이썬 딥러닝 영상처리 프로젝트 2 - 불량사과를 찾아라!
소스코드는 어디서 다운로드 받나요?
소스코드는 어디서 다운로드 받나요?
-
미해결비전공자를 위한 개발자 취업 개론
데이터사이언티스트
안녕하세요~ 강의를 듣다가 궁금해서 글을 올려봅니다~ 데이터사이언티스트와 빅데이터 쪽은 다른건가요?? 강의에서 반년정도 공부하면 데이터 사이언티스트가 가능하다고 하셨는데 빅데이터쪽은 신입을 거의 안뽑는걸로 알고 있어서요 ~ 그리고 강의 들으면서 차근차근 알아가서 너무 좋습니다! 너무 많은 양의 정보들이 있어 뭐가 맞고 그른지 알 수 없었는데 선생님 강의를 듣고 명확해지고 있습니다~ 감사합니다^^
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
JdbcMemberRepository에서 import 문제
선생님 안녕하세요. 우선 정말 이 수업을 개설해 주셔서 정말정말 감사하다는 말씀 드립니다. 프로젝트 수업으로 스프링 프레임워크에서 스트레스를 엄청 받다가 선생님의 강의를 듣고 한줄기 희망이 생겼습니다!!! 지금 DB 파트 강의에서 순수 JDBC 듣는 중인데, 원래는 오라클 SQL을 사용하려다 import 하는 부분에서 막히길래, 역시 강의와 다른 걸 쓰려니 힘들구나 싶어서ㅜㅜ 우선은 그냥 수업에서 사용하시는 H2로 다시 시도하고 원리를 좀 깨친 다음에 오라클로 재시도 하려 했습니다만.... 결국은 똑같은 곳에서 문제가 생기길래 이렇게 질문을 드립니다. H2에서 DB 생성하고, build.gradle에서 의존성 주입했고, application.properties에 url, driver-class-name까지 설정은 완료한 상태입니다. 그러고나서 JdbcMemberRepository 코드를 작성했는데, 이상하게 이 부분만 import에서 오류가 생깁니다. import org.springframework.jdbc.datasource.DataSourceUtils;(밑줄 친 부분에 오류가 있다고 빨간 줄이 생김) 에러메시지는 "The import org.springframework.jdbc cannot be resolved" 라고 뜨고, 클래스를 새로 생성하라는 식으로만 나오고 있습니다 ㅜㅜ 강제로 실행시키면 다음 메시지가 나옵니다. "Description:Parameter 0 of constructor in hello.hellospring.SpringConfig required a bean of type 'javax.sql.DataSource' that could not be found. The following candidates were found but could not be injected: - Bean method 'dataSource' in 'JndiDataSourceAutoConfiguration' not loaded because @ConditionalOnClass did not find required class 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType' - Bean method 'dataSource' in 'XADataSourceAutoConfiguration' not loaded because @ConditionalOnClass did not find required class 'javax.transaction.TransactionManager' Action: Consider revisiting the entries above or defining a bean of type 'javax.sql.DataSource' in your configuration. " 사용 환경은 윈도10 / Eclipse EE / Spring boot 2.3.3. 입니다.수업을 착실히 들었다고 생각했는데 혹시 설정 같은 걸 빼먹은 게 아닌지 싶은데, 구글링해도 답을 얻을 수 없어 여쭤봅니다. 감사합니다 !!
-
미해결[백문이불여일타] 데이터 분석을 위한 고급 SQL
Window 함수를 이용한 누적 합 문의
안녕하세요. 좋은 강의 잘 들었습니다. window 관련한 누적 합 문의 드립니다. 예를들어 A, B, C 모델의 일별 판매량을 누적으로 구하고자 합니다. 1일 : 2개 , 1개, 2개 2일 : 2개 , 2개, 2개 3일 : 0개, 0개, 0개 4일 : 0개, 1개, 2개 각각 A B C의 판매량이 있을때, partition 모델명, order 날짜로 하면 - 중간에 0이 모두 있는 곳 혹은 - A라는 모델만 추출했으때 3일과 4일은 누적합의 리스트에 나오지 않는데.. 이를 해결하기 위한 팁이 있나요? 중간에 판매가 0이라도 전일 누적값이 그대로 출력되어 표현하고 싶습니다.
-
해결됨단 두 장의 문서로 데이터 분석과 시각화 뽀개기
시계열 데이터 전처리 질문입니다.
강사님 replace 설명중에([5/25] 시계열 데이터 전처리4:40) 에 string이 다 일치 하지 않는 다고 설명하셨는데, 자세하게 설명 부탁합니다. 해당 날짜는 전부 object 로 보여지는데, 그렇지 않아서 앞에 str를 붙인다고 하시니 이해가 되지 않아서요. 답변 미리 감사드리고 건강 조심하세요.
-
해결됨리액트로 나만의 블로그 만들기(MERN Stack)
AppNavBar에서 home으로 가는 링크와 Add post 버튼, 로그 아웃버튼에서 에러가 발생합니다
안녕하세요 강사님 AppNavBar에서 버튼을 클릭했을 때 동일한 에러가 발생하여 질문을 올립니다. 아래 사진을 첨부하겠습니다. 예를 들어 post 버튼을 눌렀을 때 아래와 같이 창이 뜨고 새로고침을 하면 정상적으로 글을 작성할 수 있도록 창이 나타납니다 로그아웃을 눌렀을 때 로그아웃이 잘 되지만 다시 다른 버튼을 누르려고 해도 창이 로그아웃 한 상태로 멈춰있습니다. Uncaught Could not find router reducer in state tree, it must be mounted under "router" 이런 에러가 발생을 공통적으로 발생하는데 어디에서 손을 대야할지 잘 모르겠습니다
-
미해결HTML+CSS+JS 포트폴리오 실전 퍼블리싱(시즌1)
button에 hover
안녕하세요! 강의에서 처럼 dorpdown에 hover를 주면 잘 작동하는데 왜 button에 주면 안될까요 ㅠ?
-
미해결3시간이면 충분히 입문자를 벗어날 수 있는 프리미어 프로
자막 쉽고 빠른 툴이 정확하게 뭐죠?
발음이 뭉개져서 알아 듣지 못하겠어요 툴을 알고싶은데 창을 위쪽으로 올려놔서 무슨 툴인지도 안보이고요
-
미해결윤재성의 Node.js 서버 프로그래밍 과정
new -> other -> javascript -> npminit가 없어요 ㅜㅜ
new -> other -> javascript -> npminit가 없어요 ㅜㅜ 어떻게 하면 좋을까요?
-
미해결자바스크립트로 알아보는 함수형 프로그래밍 (ES5)
memo = iter(memo, val)
안녕하세요. 05:00 에서 memo를 계속 덮어쓰는 memo = iter(memo, val) 구문이 처음 실행될 때, 좌변의 memo는 값이 없는 임의의 변수에서 0, 1이 더해진 1이 할당되는 거 맞나요?
-
미해결몇 줄로 끝내는 인터랙티브 웹 개발 노하우 [초급편]
예제파일
강의에서 예제파일보자고 하셨는데 어떻게 받나요?
-
미해결남박사의 파이썬으로 실전 웹사이트 만들기
게속 오류떠요
고쳐도 수용없어요 from flask import Flask from flask import request from flask import render_template from flask_pymongo import PyMongo from bson.objectid import ObjectId from flask import abort from datetime import datetime from flask import redirect from flask import url_for import time import math app = Flask(__name__) app.config["MONGO_URI"] = "mongodb://localhost:27017/myweb" mongo = PyMongo(app) # 메인 @app.route("/") def Main(): Myyy = """ <meta http-equiv="refresh" content="0;url=/list"> """ # return """<meta http-equiv="refresh" content="0;url=/write">""" return Myyy @app.template_filter("formatdatetime") # 시간 def format_datetime(value): if value is None: return " " now_timestamo = time.time() offset = datetime.fromtimestamp(now_timestamo) - datetime.utcfromtimestamp(now_timestamo) value = datetime.fromtimestamp((int(value) / 1000)) + offset return value.strftime('%Y-%m-%d %H:%M:%S') # 년/월/일 시/분/초 @app.route("/list") def lists(): # 중요 # 페이지 값 (값이 없는 경유 기본값은 1) page = request.args.get("page", 1, type=int) # 한페이지당 몇개의 게시물을 출력할지 limit = request.args.get("limit", 7, type=int) # 기본값은 10개이다 수정가능 search = request.args.get("search", - 1, type=int) keyword = request.args.get("keyword", type=str) # 최종적으로 완성된 쿼리를 만글 변수 query = {} # 검색어 상태를 추가할 리스트 변수 search_list = [] if search == 0: search_list.append({"title": {"$regex": keyword}}) elif search == 1: search_list.append({"contents": {"$regex": keyword}}) elif search == 2: search_list.append({"title": {"$regex": keyword}}) search_list.append({"contents": {"$regex": keyword}}) elif search == 3: search_list.append({"name": {"$regex": keyword}}) # 검색 대상이 1개하도 존재할 경우 query 변수 $or 리스트 쿼리 한다 if len(search_list) > 0: query = {"$or": search_list} # {"$and":[ # {"title": {"$regex": "파이썬"}}, # {"title": {"$regex": "파이썬"}}, # {"title": {"$regex": "안드로아드"}}, # ]} print(query) board = mongo.db.board # DB가져오기 datas = board.find(query).skip((page - 1) * limit).limit(limit) # 게시물의 총 갯수 tot_count = board.find(query).count() # 마지막 페이지의 수를 구합니다 last_page_num = math.ceil(tot_count / limit) # 페이지 블럭을 5개씩 표기 block_size = 5 # 변경 가능 # 현재 블럭의 위치 block_num = int((page - 1) / block_size) # 블럭 시작위치 block_start = int((block_size * block_num) + 1) # 블럭의 끝 위치 block_last = math.ceil(block_start + (block_size - 1)) return render_template("list.html", datas=datas, limit=limit, page=page, block_start=block_start, block_last=block_last, last_page_num=last_page_num, search=search, keyword=keyword) @app.route("/view/<idx>") def board_view(idx): # idx = request.args.get("idx") if idx is not None: board = mongo.db.board data = board.find_one({"_id": ObjectId(idx)}) if data is not None: result = { "id": data.get("_id"), "name": data.get("name"), "title": data.get("title"), "contents": data.get("contents"), "pubdate": data.get("pubdate"), "view": data.get("view"), } return render_template("view.html", result=result) return abort(404) @app.route("/write", methods=["GET", "POST"]) def board_write(): if request.method == "POST": name = request.form.get("name") title = request.form.get("title") contents = request.form.get("contents") print(name, title, contents) current_utc_time = round(datetime.utcnow().timestamp() * 1000) board = mongo.db.board post = { "name": name, "title": title, "contents": contents, "pubdate": current_utc_time, "view": 0, } x = board.insert_one(post) print(x.inserted_id) return redirect(url_for("board_view", idx=x.inserted_id)) else: return render_template("write.html") if __name__ == "__main__": app.run(host="0.0.0.0", debug=True, port=8501) html도 고쳐도 여전히 오류떠요 <script> function search() { var val_search = document.getElementById("search").value; var val_keyword = document.getElementById("keyword").value; if(val_search == "" || val_keyword == "") { return false; } else { self.location.href = "{{url_for('lists')}}?search=" + val_search + "&keyword=" + val_keyword; } } </script> {% if datas.count() > 0 %} <title>목록</title> <table> <thead> <tr> <td>번호</td> <td>제목</td> <td>이름</td> <td>날짜</td> <td>조회수</td> </tr> </thead> <tbody> <!--반복되는 구간--> {% for data in datas %} <tr> <td>{{loop.index + ((page - 1) * limit)}}</td> <!--게시물 번호--> <td><a href="{{url_for('board_view', idx=data._id, page=page, search=search, keyword=keyword)}}">{{data.title}}</a></td> <td>{{data.name}}</td> <td>{{data.pubdate | formatdatetime}}</td> <td>{{data.view}}</td> <!-- <td>{{data.title}}</td> <td>{{data.title}}</td> --> </tr> {% endfor %} <!--반복되는 구간 끝--> </tbody> </table> {% if block_start - 1 > 0 %} <a href="{{url_for('lists', page=block_start - 1, search=search, keyword=keyword)}}">[이전]</a> {% endif %} {% for i in range(block_start, block_last + 1) %} {% if i > last_page %} <!-- {{ i }} --> {% else %} {% if i == page %} <b>{{i}}</b> {% else %} <a href="{{url_for('lists', page=i, search=search, keyword=keyword)}}">{{ i }}</a> {% endif %} {% endif %} {% endfor %} {% if block_last < last_page %} <a href="{{url_for('lists', page=block_last + 1, search=search, keyword=keyword)}}">[다음]</a> {% endif %} <select name="search" id="search"> <option value="">검색대상</option> <option value="0">제목</option> <option value="1">내용</option> <option value="2">제목+내용</option> <option value="3">작성자</option> </select> <input type="text" name="keyword" id="keyword" > <input type="button" value="검색" onclick="search()"> {% else %} <h3>테이터가 없습니다</h3> {% endif %}
-
미해결자바 스프링 프레임워크(renew ver.) - 신입 프로그래머를 위한 강좌
프로젝트 import시
lec21pjt001 <--이렇게 나오지 않고 자꾸 lec21로 로드가 되네요 lec21pjt001이 저렇게 로드되니까 lec21pjt002도 lec21로 로드 되려고해서 같은 이름이라고 로드가 안됩니다