묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결Vue.js 완벽 가이드 - 실습과 리팩토링으로 배우는 실전 개념
권한 요청드립니다.
인프런 아이디 : exem.ai2.front 인프런 이메일 : exem.ai2.front@gmail.com 깃헙 아이디 : nomadwendy11@gmail.com 깃헙 Username : nomadwendy11
-
미해결
기간만료 강의
기간만료 예정인 강의의 강의노트에 작성한 글은 기간이 만료되면 볼 수 없게 되나요? 아니면 강의만 볼 수 없고 강의노트는 볼 수 있는건가요?
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
안녕하세요 No tests found for given includes: [jpabook.jpashop.MemberRepositoryTest](--tests filter) 이 에러가 나서 도움을 요청합니다.
MemberRepositoryTest을 실행 했는데 아래와 같이 에러가 나옵니다 Execution failed for task ':test'.> No tests found for given includes: [jpabook.jpashop.MemberRepositoryTest](--tests filter) * Try:> Run with --stacktrace option to get the stack trace.> Run with --info or --debug option to get more log output.> Run with --scan to get full insights. MemberRepositoryTest코드 package jpabook.jpashop;import static org.junit.Assert.*;import jpabook.jpashop.Member;import jpabook.jpashop.MemberRepository;import org.assertj.core.api.Assertions;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.annotation.Rollback;import org.springframework.test.context.junit4.SpringRunner;import org.springframework.transaction.annotation.Transactional;import javax.persistence.EntityManager;@RunWith(SpringRunner.class)@SpringBootTestpublic class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional @Rollback(false) public void testMember() { Member member = new Member(); member.setUsername("memberA"); Long savedId = memberRepository.save(member); Member findMember = memberRepository.find(savedId); Assertions.assertThat(findMember.getId()).isEqualTo(member.getId()); Assertions.assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); Assertions.assertThat(findMember).isEqualTo(member); //JPA 엔티티 동일성 보장 }} application.yml코드 spring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: true format_sql: truelogging.level: org.hibernate.SQL: debug# org.hibernate.type: trace build.gradle코드 plugins { id 'org.springframework.boot' version '2.7.2' id 'io.spring.dependency-management' version '1.0.12.RELEASE' id 'java'}group = 'jpabook'version = '0.0.1-SNAPSHOT'sourceCompatibility = '11'configurations { compileOnly { extendsFrom annotationProcessor }}repositories { mavenCentral()}dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-devtools' implementation 'junit:junit:4.13.1' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test'}tasks.named('test') { useJUnitPlatform()}인프런 질문에도 찾아보고 구글링도 해봤는데 뭐때문인지 몰라 질문을 합니다 도와주세요ㅠ아래는 제코드 구글드라이브 공유링크입니다. https://drive.google.com/drive/folders/1h5v97WrZW3rjxwzl_G2_73a17sXsQYpw?usp=sharing
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
1분 54초 질문 있습니다.
동영상에서는 빨간 줄로 에러가 표시되는데 저는 표시가 되지 않습니다. 추가로 플러그인 설치가 필요한건가요?
-
미해결배달앱 클론코딩 [with React Native]
좀 다른 질문인데 RN은 소셜로그인은
안녕하세요. 제로초님. 이 강좌를 들으면서 개인 프로젝트를 같이 진행하고있습니다. 좀 다른 질문이지만, RN 같은 경우는 소셜로그인 개발할 때 라이브러리를 사용하나요? 실제 프로덕 개발에 있어서 어떤 라이브러리들을 쓰는지 궁금합니다. https://www.npmjs.com/package/react-native-app-auth
-
미해결지금 바로 React 시작하기
코드 한번만 봐주실수 있나요 ?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Anton&family=Edu+VIC+WA+NT+Beginner&family=Indie+Flower&family=Permanent+Marker&family=Shadows+Into+Light&display=swap" rel="stylesheet"> <script src="https://cdnjs.cloudflare.com/ajax/libs/redux/4.0.1/redux.js"></script> </head> <body> <style> #Container{ border: 3px solid black; display: flex; justify-content: center; align-items: center; flex-wrap: wrap; margin-top: 10px; } #Container div { box-sizing: border-box; border: 5px solid orange; height:200px; width:32%; margin:5px; padding: 20px; font-size: 30px; } </style> <div id="actionBox"> <input type="text" placeholder="Type anything"> <button onclick="clickMe()">Click Me!</button> <button onclick="changeRadius(10)">Rounded</button> <button onclick="changeRadius(15)">Circle!</button> <button onclick="changeRadius(0)">Rectangle!</button> <button onclick="changeColor('red')">Red!</button> <button onclick="changeColor('green')">Green!</button> <button onclick="changeColor('blue')">Blue!</button> </div> <div id="Container"> <div class="textBox" id="1"></div> <div class="textBox" style="font-family:'Anton'" id="2"></div> <div class="textBox" style="font-family:'Edu VIC WA NT Beginner'" id="3"></div> <div class="textBox" style="font-family:'Indie Flower'" id="4"></div> <div class="textBox" style="font-family:'Permanent Marker'" id="5"></div> <div class="textBox" style="font-family:'Shadows Into Light'" id="6"></div> </div> <script> let divs = document.querySelectorAll('.textBox') function reducer(state, action) { console.log(state, action); if (state === undefined) { return { color: 'orange' } } var newState; if (action.type === 'CHANGE_COLOR') { return{ ...state, color: action.color } } else if (action.type === 'CHANGE_TEXT'){ return{ ...state, text: action.text } } else if (action.type === 'CHANGE_RADIUS'){ return{ ...state, radius: action.radius } } } var store = Redux.createStore( reducer, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__() ); function clickMe(){ let text = document.querySelector('input') store.dispatch({type:'CHANGE_TEXT', text:`${text.value}`}) var state = store.getState(); divs.forEach((e) => { e.innerText = `${state.text}` }) text.value = ""; } function changeColor(e){ store.dispatch({type:'CHANGE_COLOR', color:e}) var state = store.getState(); divs.forEach((e) => { e.style.border = ` 5px solid ${state.color}` }) } function changeRadius(r){ store.dispatch({type:'CHANGE_RADIUS', radius:r}) var state = store.getState(); divs.forEach((e) => { e.style.borderRadius = `${state.radius}px` }) } </script> </body> </html> 이런식으로 onclick 시 함수 호출하면서 값을 전달해주고, 함수내에서 dispatch를 실행하고 foreach로 속성바꿔주는 식으로 했는데, 꼭 onclick할때 dispatch를 해줘야하는건가요 ? 이런식으로 하니까, subscribe는 필요없는거같아서요. 아마 일괄적으로 바꿔주는 방식이라서 제가 이렇게 가능했던거 같은데, 개별적으로 값을 바꿔주는 과제였다면 좀 달라졌을까요?
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
마지막 페이지 오류 + class 명 오류
안녕하십니까 선생님 최근에 마지막 페이지 오류를 해결하는 방법을 질문드렸는데, 친절히 답변주셔서 감사합니다. 수정해주신 코드로는 크롤링이 정상적으로 작동이 되는 것을 확인했습니다. 강사님께서 수정해주신 버튼 html 코드는 다음과 같습니다. isLastPage = soup.select_one('a.btn_next').attrs['aria-disabled'] 그러나, 1 of 3. 네이버에 "미옹이"를 검색한 다음, 페이지를 이동하는 버튼의 html을 보면, btn_next라는 class는 사진에 보이듯이 하나밖에 없고, 하나밖에 없는 해당 태그는 a가 아니라 button으로 나옵니다.어느 부분에서 강사님께서는 해당 태그가 a태그로 판단하신 것인지 궁금합니다.button 위에 있는 a태그는 옆으로 이동하는 버튼의 태그가 아니라, 1페이지, 2페이지의 a태그여서 버튼과는 관계없다고 생각합니다. # 네이버 "미옹이" 검색결과의 html 2 of 3. class 명을 일부만 적는 것이 이해되지 않습니다. 강사님께서 미옹이의 코드를 작성하실 때, class가 btn_next dimmed임에도 불구하고, btn_next만 명령어에 입력하셨습니다. 마찬가지로, 위 사진에 나와 있는 네이버 지도 크롤링 과정에서도 class 태그 4개 중에 input_search만 명령어에 입력하셨는데, search = browser.find_element(By.CSS_SELECTOR, "input.input_search") 전체 class인 input.input_search.ng-valid.ng-dirty.ng-touched를 입력하면 오류가 발생합니다. search = browser.find_element(By.CSS_SELECTOR, "input.input_search.ng-valid.ng-dirty.ng-touched") input.input_search와 input.input_search.ng-valid.ng-dirty.ng-touched 모두 html 상에서 검색했을 때 동일하게 1 of 1이 뜨는것을 확인했는데도 왜 전체 class태그를 입력한 것에서 오류가 발생하는지 궁금합니다. 정리하자면, class 태그를 full로 완전히 입력할때는 오류가 뜨더니(input.input_search.ng-valid.ng-dirty.ng-touched), class의 일부인 input.input_search를 넣으면 오류가 뜨지 않습니다. 따라서 어느 상황에서 class를 일부만 사용하고, 또는 전체를 사용해야 하는지 판단하는데 어려움이 있습니다. 아래는 발생하는 오류입니다. >>> search = browser.find_element(By.CSS_SELECTOR, "input.input_search.ng-valid.ng-dirty.ng-touched") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 857, in find_element return self.execute(Command.FIND_ELEMENT, { File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 435, in execute self.error_handler.check_response(response) File "C:\Users\rnrxh\AppData\Local\Programs\Python\Python310\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"input.input_search.ng-valid.ng-dirty.ng-touched"} (Session info: chrome=103.0.5060.134) Stacktrace: Backtrace: Ordinal0 [0x00575FD3+2187219] Ordinal0 [0x0050E6D1+1763025] Ordinal0 [0x00423E78+802424] Ordinal0 [0x00451C10+990224] Ordinal0 [0x00451EAB+990891] Ordinal0 [0x0047EC92+1174674] Ordinal0 [0x0046CBD4+1100756] Ordinal0 [0x0047CFC2+1167298] Ordinal0 [0x0046C9A6+1100198] Ordinal0 [0x00446F80+946048] Ordinal0 [0x00447E76+949878] GetHandleVerifier [0x008190C2+2721218] GetHandleVerifier [0x0080AAF0+2662384] GetHandleVerifier [0x0060137A+526458] GetHandleVerifier [0x00600416+522518] Ordinal0 [0x00514EAB+1789611] Ordinal0 [0x005197A8+1808296] Ordinal0 [0x00519895+1808533] Ordinal0 [0x005226C1+1844929] BaseThreadInitThunk [0x75C96739+25] RtlGetFullPathName_UEx [0x77A28FEF+1215] RtlGetFullPathName_UEx [0x77A28FBD+1165] >>> search.click() Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'search' is not defined >>> time.sleep(1) >>> # 검색어 입력 >>> >>> search.send_keys("강남역 맛집") Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'search' is not defined >>> search.send_keys(Keys.ENTER) # 검색어를 입력하고, 엔터를 치라는 명령어 Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'search' is not defined >>> time.sleep(2) 아래는 제가 작성한 코드입니다. # 셀레니움 기본설정 import imp from lib2to3.pgen2 import driver from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time # 크롬 드라이버 자동 업데이트 from webdriver_manager.chrome import ChromeDriverManager # 브라우저 자동으로 꺼짐 방지 chrome_options = Options() chrome_options.add_experimental_option("detach", True) # 불필요한 에러 메시지 삭제 chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) # 셀레니움으로 웹브라우저 자동으로 띄우기 # ChromeDriverManager를 통해서 ChromeDriver를 설치하고, Service라는 객체를 만든 뒤, service라는 변수에 저장한다 service = Service(executable_path=ChromeDriverManager().install()) browser = webdriver.Chrome(service=service, options=chrome_options) # 특정 웹페이지 주소로 이동 browser.implicitly_wait(5) # 웹페이지가 로딩 될때까지 5초는 기다려준다 browser.maximize_window() # 화면 최대화 browser.get('https://map.naver.com/v5/?c=14141023.2182021,4522932.8702864,15,0,0,0,dh') # 검색 배너 클릭 search = browser.find_element(By.CSS_SELECTOR, "input.input_search.ng-valid.ng-dirty.ng-touched") search.click() time.sleep(1) # 검색어 입력 search.send_keys("강남역 맛집") search.send_keys(Keys.ENTER) # 검색어를 입력하고, 엔터를 치라는 명령어 time.sleep(2) 3 of 3. 왜 id를 사용하지 않으셨는지 궁금합니다. 사진에는 class 뿐만 아니라 해당 태그의 고유값인 id도 있습니다. 그러나, id를 사용하기 위해 아래와 같이 copy selector를 입력했음에도 불구하고 오류가 발생합니다. search = browser.find_element(By.CSS_SELECTOR, "#input_search1658797242706") 긴 질문 읽어주셔서 정말 감사합니다.
-
해결됨파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
Time Limit Exceed 관련 질문드립니다.
아래와 같이 코드를 작성했는데 강사님의 강의와 다른 점은 set대신 list를 사용하고 L == K일때 , 정답으로 가능한 리스트 안에 현재 추의 sum이 없으면 추가한다는 조건으로 if문을 작성해주었는데 Case#5에서 계속 Time Limit이 뜹니다. 이전 질문에서 리스트와 set에 원소 할당할 때 시간복잡도 차이가 없다고 하셨는데 if문을 한줄에 여러 조건을 추가할 수록 식나이 추가되는걸까요? import sys input = sys.stdin.readline K = int(input()) weights = list(map(int,input().split())) possible = [] max = sum(weights) def dfs(L,sum): if L == K: if 0 < sum <= max and sum not in possible: possible.append(sum) return dfs(L+1,sum+weights[L]) dfs(L+1,sum-weights[L]) dfs(L+1,sum) dfs(0,0) print(max-len(possible))
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
Mac vscode Hyperopt 무한로딩
다른 코드들은 지금까지 잘 작동했는데 Hyperopt 에서 fmin함수 코드 작성하고 실행하면 무한로딩이 되네요... 같은 코드로 코랩에서 실행했을 땐 문제가 없었는데 무엇 때문에 이런지 도움받을 수 있을까 싶어 글 남깁니다! 버전도 0.2.7버전 맞구요 vscode 재설치도 해봤습니다.... ㅜㅠ
-
미해결홍정모의 따라하며 배우는 C++
이해가 잘 가지 않습니다..도와주세요
교수님께서 if 구문에서 smallestIndex=currentIndex 코드를 작성하시고 서로 봐뀐다라고 표현 하셨는데 이것은 대입아닌가요...?
-
미해결반응형 웹사이트 포트폴리오(Architecture Agency)
1. 모바일 화면에서 menu a 클릭하여 다른 project 화면이나 다른 화면으로 전환할 경우 화면이 걸치는 문제, 2. 홈 화면 모바일 전환시 메뉴화면이 자동 적용되는 문제
강사님 강의 잘 듣고 잘 배웠습니다~^^ 첫번째 질문: 모바일 화면에서 다른 화면으로 바로 가기위해 menu a 를 클릭할 경우 화면에 정확히 맨 윗 부분부터 보이지 않고 아바로 전 화면 밑 부분이 보이거나 아님 전환된 화면 윗부분이 짤려 보입니다. menu a 클릭하여 다른 화면으로 전화시 정확히 전환된 화면의 맨 윗 부분부터 찾아가 보이게 하려면 어떻게 해야 하느지 알려 주시기 바랍니다. 두번째 질문: 모바일 전환시 home 화면의 메뉴가 자동으로 적용이 되어 메인 이미지를 가립니다. index.html 파일에서 강사님 코딩과 제 코딩에 차이는 첨부 이미지 처럼 active 클래스가 있고 없고 차이 입니다. 강사님 코딩처럼 active 클래스를 제거하니 잘 문제가 해결 되었습니다. html에서 active 클래스를 지정 안해도 css에서 header.active 나 .gnb.active가 실행 되는게 js에서 클릭시 강제로 add 기능으로 toggleClass 'active' 와 remove기능으로 removeClass 'active' 적용 해줄 경우 html에서 굳이 별도의 .active 클래스를 안해줘도 css에 적용되어 실행 되는 건지 설명 부탁 드립니다.
-
미해결운영체제 공룡책 강의
교수님 fork()함수에 대해 질문이 있습니다.
fork() 함수를 호출하면 부모 process의 주소공간을 그대로 복사한다고 했는데, 자식 프로세스에서 pid = fork(); 명령을 수행하는것인지, 아니면 그 다음줄 부터 수행하는것인지 해깔립니다. 만약 자식프로세스가 pid = fork()를 수행하면 자식 프로세스가 또 자식프로세스를 만들어서 프로세스가 무한으로 증식되지 않을까 하는 걱정때문에 다음줄부터 수행하는것이 아닌가 생각됩니다. 그렇다면 자식 프로세스의 pid변수가 0을 같는 이유는 초기화가 안되어서 0이 되는것이라고 추측할수 있을텐데, 교수님이 중간에 자식프로세스는 pid= fork() 명령은 0을 리턴받는다고 말씀하셔서 해깔립니다.
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
500 Server Error for HTTP GET "/catalog-service/health-check"
위 사진은 gateway (.yml) 내용입니다. 위 사진은 eureka_server.yml 입니다. catalog.yml 내용입니다. user.yml 내용입니다. 그리고 아래는 문제의 에러 로그입니다. 포스트맨으로 API 호출을 하면 저렇게 에러 메세지가 뜹니다. GATEWAY.yml에서 uri: lb://CATALOG-SERVIER 로 하지 않고, uri: http://localhost:지정한포트번호 로 하면은 정상적으로 API호출이 되는데, uri: lb://CATALOG-SERVIER 이렇게 설정 하면 안 됩니다. 로드밸런싱 설정 문제인거 같은데... 어디가 잘 못 된건지 잘 모르겠습니다... (꽤 오래 헤매이고 있는 중입니다.)
-
미해결[초급편] 안드로이드 커뮤니티 앱 만들기(Android Kotlin)
intro 화면
안녕하세요!! 강의 내용을 쭉 따라했는데 애뮬레이터에서 splash 화면 다음 intro 화면이 뜨지 않습니다. intro 화면이 안 떠서 activity_intro.xml의 코드를 activity_main.xml 화면으로 옮기니까 그제서야 화면이 나오는데 이 상태로 쭉 앱 제작을 진행해도 될까요..?
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
banner 재질문
banner.js 파일 첨부해드립니다. 콘솔 창을 위해서 몇가지 코드가 추가되어있습니다. 콘솔 창은 f5 이후로 아무것도 건드리지 않았습니다. return 직전에 console.log("hi")를 넣었습니다. 콘솔에 실행해본 결과 return 이전의 코드가 실행되기도 전에 hi가 실행된 것을 확인할 수 있었습니다. 왜 이전의 코드가 실행되기도 전에 hi와 return이 먼저 실행되는 걸까요? 아무것도 누르지 않은 상태인데 useEffect(() => { fetchData(); }, []); 에서 dep list가 빈 배열이기 때문에 banner.js 가실행되는 때 딱 한번만 실행된다고 생각했습니다. 하지만 콘솔 창을 보니 다 log가 두번씩 찍혀있는데 이게 왜 그런건가요? import axios from "../api/axios"; import React, { useEffect, useState } from "react"; import requests from "../api/requests"; import "./Banner.css"; import styled from "styled-components"; export default function Banner() { const [movie, setMovie] = useState([]); const [isClicked, setIsClicked] = useState(false); useEffect(() => { fetchData(); }, []); const fetchData = async () => { // 현재 상영중인 영화 정보를 가져오기(여러 영화) const request = await axios.get(requests.fetchNowPlaying); console.log("1. request.data",request.data) // 여러 영화 중 영화 하나의 ID를 가져오기 const movieId = request.data.results[ Math.floor(Math.random() * request.data.results.length) ].id; // 특정 영화의 더 상세한 정보를 가져오기(비디오 정보도 포함) const { data: movieDetail } = await axios.get(`movie/${movieId}`, { params: { append_to_response: "videos" }, }); setMovie(movieDetail); console.log("2. request.data",request.data) // console.log("movieDetail",movieDetail) // console.log("movie",movie) }; const truncate = (str, n) => { return str?.length > n ? str.substr(0, n-1) + "..." : str; } console.log('hi') if(!isClicked){ return ( <header className="banner" style={{ backgroundImage: `url("https://image.tmdb.org/t/p/original/${movie?.backdrop_path}")`, backgroundPosition: "top center", backgroundSize: "cover", }} > <div className="banner__contents"> <h1 className="banner__title"> {movie.title || movie.name || movie.original_name} </h1> <div className="banner__buttons"> <button className="banner__button play" onClick = {() => setIsClicked(true)}>Play </button> <button className="banner__button info">More Information</button> </div> <h1 className="banner__description">{truncate(movie.overview, 100)}</h1> </div> <div className="banner--fadeBottom" /> </header> ); }else{ return <div> <Container> <HomeContainer> <Iframe> src={`https://www.youtube.com/embed/${movie?.videos?.results[0]?.key}?controls=0&autoplay=1&loop=1&mute=1&playlist=${movie?.videos?.results[0]?.key}`} width = "640" height = "360" frameborder = "0" allow = "autoplay; fullscreen" </Iframe> </HomeContainer> </Container> </div> } } const Container = styled.div` display : flex; justify-content : center; align-items : center; flex-direction : column width : 100%; height : 100vh; ` const HomeContainer = styled.div` width : 100%; height : 100%; ` const Iframe = styled.iframe` width : 100%; height : 100%; z-index : -1; opacity : 0.65; border : none; &::after{ content : ""; position : absolute; top : 0; left : 0; width : 100%; height : 100%; }`
-
미해결타입스크립트 입문 - 기초부터 실전까지
안녕하세요 Eslint 설정 문제인지 궁금합니다.
변수에 타입을 지정해주려고 하는데 저장만 하면 계속 오류가 발생합니다. 위 사진처럼 설정파일까지 다 지정해줬는데 계속해서 영상처럼 동작하지 않습니다 혹시 어떻게 해야하는지 알 수 있을까요 예제로 있는 파일에서도 오류가 발생합니다.
-
미해결홍정모의 따라하며 배우는 C언어
강의 12:24
강의에서는 my_print_functions.c 파일에서 #include "my_print_functions.h" 하라했는데 my_print_functions.c 파일에 #include "my_print_functions.h" 가 없어도 정상 작동되는데 왜그런가요?
-
미해결따라하며 배우는 리액트 A-Z[19버전 반영]
안녕하세요 선생님~~
.SearchPage폴더 안의 index.js의 렌더부분에서 질문이 있습니다 rafce단축키를 사용하면 자동으로 리턴부분이 만들어지고 리턴 밑에 렌더할 태그들을 만들어서 렌더링을 하였는데(기존에 하던 방식) 검색페이지 부분은 함수를 따로 만들어서 함수 안에 렌더부분을 정의를 하고 밖에서 그 함수를 리턴을 하여 렌더링을 하였는데 이렇게 한 이유가 있을까요?
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
faker사용시 이미지가 동일하게 출력되는데 오류가 있는걸까요?
안녕하세요 제로초님 강의 잘 듣고있습니다. faker를 사용해서 더미데이터를 출력해봤는데 제로초님과는 다르게 이미지가 같은 이미지로 출력되더라고요 제가 코드를 잘못작성해서인건지, 아니면 faker라이브러리의 문제인건지 혹시 이유를 알 수 있을까요? // pages/index.js import React, { useCallback, useEffect } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { Button } from 'antd'; import { PlusCircleOutlined } from '@ant-design/icons'; import Link from 'next/link'; import { HomeWrapper, HomeLogoHeader, HomeLogoText, PageMainText, PageSubText, HomeInputWrapper } from '../pagestyles'; import { LOAD_POSTS_REQUEST } from '../reducers/post'; import AppLayout from '../components/AppLayout'; import PostList from '../components/HomePost/PostList'; const Home = () => { const dispatch = useDispatch(); const { me } = useSelector((state) => state.user); const { mainPosts, hasMorePosts, loadPostsLoading } = useSelector((state) => state.post); const onSearch = useCallback((value) => { console.log(value); }, []); useEffect(() => { dispatch({ type: LOAD_POSTS_REQUEST }); }, []); useEffect(() => { function onScroll() { console.log(window.scrollY, document.documentElement.clientHeight, document.documentElement.scrollHeight); if (window.scrollY + document.documentElement.clientHeight > document.documentElement.scrollHeight - 300) { if (hasMorePosts && !loadPostsLoading) { dispatch({ type: LOAD_POSTS_REQUEST }); } } }; window.addEventListener('scroll', onScroll); return () => { window.removeEventListener('scroll', onScroll); } }, [hasMorePosts, loadPostsLoading]); return ( <AppLayout> <HomeWrapper> <HomeLogoHeader> <HomeLogoText> <PageMainText>Recipe.io</PageMainText> <PageSubText>Have a delicious meal today</PageSubText> </HomeLogoText> {me && <Link href='/posting'><a><Button type='primary' size='large' icon={<PlusCircleOutlined />} >Create Recipe</Button></a></Link>} </HomeLogoHeader> <HomeInputWrapper placeholder="Search for Recipe" size='large' allowClear="true" enterButton onSearch={onSearch} /> <PostList mainPosts={mainPosts} /> </HomeWrapper> </AppLayout> ) }; export default Home; // reducers/post.js import produce from 'immer'; import shortId from 'shortid'; import { faker } from '@faker-js/faker'; export const initialState = { mainPosts: [], imagePaths: [], hasMorePosts: true, loadPostsLoading: false, loadPostsDone: false, loadPostsError: null, addPostLoading: false, addPostDone: false, addPostError: null, removePostLoading: false, removePostDone: false, removePostError: null, addCommentLoading: false, addCommentDone: false, addCommentError: null, removeCommentLoading: false, removeCommentDone: false, removeCommentError: null, }; export const generateDummyPost = (num) => Array(num).fill().map(() => ({ id: shortId.generate(), User: { id: shortId.generate(), nickname: faker.name.findName(), }, title: faker.lorem.slug(), desc: faker.lorem.sentence(), content: [{ ingredient: faker.lorem.paragraphs(), }, { recipes: faker.lorem.paragraphs(), }, { tips: faker.lorem.paragraphs(), }], Images: [{ id: shortId.generate(), src: faker.image.food(), }, { id: shortId.generate(), src: faker.image.food(), }, { id: shortId.generate(), src: faker.image.food(), }], tag: '맛있을것같아요 #hashtag1 짱짱맨!! #hashtag2 ##hashtag3', Comments: [{ id: shortId.generate(), User: { id: shortId.generate(), nickname: faker.name.findName(), }, content: faker.lorem.sentence(), }, { id: shortId.generate(), User: { id: shortId.generate(), nickname: faker.name.findName(), }, content: faker.lorem.sentence(), }] })); export const dummyPost = (data) => ({ id: data.id, User: { id: 2, nickname: 'Mirrer', }, title: data.content.title, desc: data.content.desc, content: [{ ingredient: data.content.ingredient, }, { recipes: data.content.recipes, }, { tips: data.content.tips, }], tag: data.content.tags, Images: [{ id: shortId.generate(), src: faker.image.food(), }, { id: shortId.generate(), src: faker.image.food(), }], Comments: [{ id: shortId.generate(), User: { id: shortId.generate(), nickname: faker.name.findName(), }, content: faker.lorem.sentence(), }], }); const dummyComment = (data) => ({ id: data.id, User: { id: 2, nickname: 'Mirrer', }, content: data.commentText, }); export const LOAD_POSTS_REQUEST = 'LOAD_POSTS_REQUEST'; export const LOAD_POSTS_SUCCESS = 'LOAD_POSTS_SUCCESS'; export const LOAD_POSTS_FAILURE = 'LOAD_POSTS_FAILURE'; export const ADD_POST_REQUEST = 'ADD_POST_REQUEST'; export const ADD_POST_SUCCESS = 'ADD_POST_SUCCESS'; export const ADD_POST_FAILURE = 'ADD_POST_FAILURE'; export const REMOVE_POST_REQUEST = 'REMOVE_POST_REQUEST'; export const REMOVE_POST_SUCCESS = 'REMOVE_POST_SUCCESS'; export const REMOVE_POST_FAILURE = 'REMOVE_POST_FAILURE'; export const ADD_COMMENT_REQUEST = 'ADD_COMMENT_REQUEST'; export const ADD_COMMENT_SUCCESS = 'ADD_COMMENT_SUCCESS'; export const ADD_COMMENT_FAILURE = 'ADD_COMMENT_FAILURE'; export const REMOVE_COMMENT_REQUEST = 'REMOVE_COMMENT_REQUEST'; export const REMOVE_COMMENT_SUCCESS = 'REMOVE_COMMENT_SUCCESS'; export const REMOVE_COMMENT_FAILURE = 'REMOVE_COMMENT_FAILURE'; export const addPostRequestAction = (data) => { return { type: ADD_POST_REQUEST, data, } }; export const removePostRequestAction = (data) => { return { type: REMOVE_POST_REQUEST, data, } }; export const addCommentRequestAction = (data) => { return { type: ADD_COMMENT_REQUEST, data, } }; export const removeCommentRequestAction = (data) => { return { type: REMOVE_COMMENT_REQUEST, data, } }; const reducer = (state = initialState, action) => { return produce(state, (draft) => { switch (action.type) { case LOAD_POSTS_REQUEST: draft.loadPostsLoading = true; draft.loadPostsDone = false; draft.loadPostsError = null; break; case LOAD_POSTS_SUCCESS: draft.loadPostsLoading = false; draft.loadPostsDone = true; draft.mainPosts = action.data.concat(draft.mainPosts); draft.hasMorePosts = draft.mainPosts.length < 30; break; case LOAD_POSTS_FAILURE: draft.loadPostsLoading = false; draft.loadPostsError = action.error; break; case ADD_POST_REQUEST: draft.addPostLoading = true; draft.addPostDone = false; draft.addPostError = null; break; case ADD_POST_SUCCESS: draft.addPostLoading = false; draft.addPostDone = true; draft.mainPosts.unshift(dummyPost(action.data)); break; case ADD_POST_FAILURE: draft.addPostLoading = false; draft.addPostError = action.error; break; case REMOVE_POST_REQUEST: draft.removePostLoading = true; draft.removePostDone = false; draft.removePostError = null; break; case REMOVE_POST_SUCCESS: draft.mainPosts = draft.mainPosts.filter((v) => v.id !== action.data); draft.removePostLoading = false; draft.removePostDone = true; break; case REMOVE_POST_FAILURE: draft.removePostLoading = false; draft.removePostError = action.error; break; case ADD_COMMENT_REQUEST: draft.addCommentLoading = true; draft.addCommentDone = false; draft.addCommentError = null; break; case ADD_COMMENT_SUCCESS: { const post = draft.mainPosts.find((v) => v.id === action.data.postId); post.Comments.unshift(dummyComment(action.data)); draft.addCommentLoading = false; draft.addCommentDone = true; break; } case ADD_COMMENT_FAILURE: draft.addCommentLoading = false; draft.addCommentError = action.error; break; case REMOVE_COMMENT_REQUEST: draft.removeCommentLoading = true; draft.removeCommentDone = false; draft.removeCommentError = null; break; case REMOVE_COMMENT_SUCCESS: { // action.data = { postId: 1, commentId: '댓글id'} const post = draft.mainPosts.find((v) => v.id === action.data.postId); draft.removeCommentLoading = false; draft.removeCommentDone = true; break; } case REMOVE_COMMENT_FAILURE: draft.removeCommentLoading = false; draft.removeCommentError = action.error; break; default: break; } }); }; export default reducer; // sagas/post.js import { all, fork, delay, put, takeLatest } from 'redux-saga/effects'; import shortId from 'shortid'; // import axios from 'axios'; import { LOAD_POSTS_REQUEST, LOAD_POSTS_SUCCESS, LOAD_POSTS_FAILURE, generateDummyPost, ADD_POST_REQUEST, ADD_POST_SUCCESS, ADD_POST_FAILURE, REMOVE_POST_REQUEST, REMOVE_POST_SUCCESS, REMOVE_POST_FAILURE, ADD_COMMENT_REQUEST, ADD_COMMENT_SUCCESS, ADD_COMMENT_FAILURE, REMOVE_COMMENT_REQUEST, REMOVE_COMMENT_SUCCESS, REMOVE_COMMENT_FAILURE, } from '../reducers/post'; import { BOARD_ADD_POST_TO_ME, BOARD_REMOVE_POST_OF_ME } from '../reducers/user'; // function addPostAPI(data) { // return axios.post('/api/post', data); // } function* loadPosts(action) { try { // const result = yield call(addPostAPI, action.data); yield delay(1000); yield put({ type: LOAD_POSTS_SUCCESS, data: generateDummyPost(10) }) } catch(err) { yield put({ type: LOAD_POSTS_FAILURE, data: err.response.data }) } } // function addPostAPI(data) { // return axios.post('/api/post', data); // } function* addPost(action) { try { // const result = yield call(addPostAPI, action.data); const id = shortId.generate(); yield delay(1000); yield put({ type: ADD_POST_SUCCESS, data: { id, content: action.data, } }) yield put({ type: BOARD_ADD_POST_TO_ME, data: { id, content: action.data, } }) } catch(err) { yield put({ type: ADD_POST_FAILURE, data: err.response.data }) } } // function addPostAPI(data) { // return axios.post('/api/post', data); // } function* removePost(action) { try { // const result = yield call(addPostAPI, action.data); yield delay(1000); yield put({ type: REMOVE_POST_SUCCESS, data: action.data, }) yield put({ type: BOARD_REMOVE_POST_OF_ME, data: action.data, }) } catch(err) { yield put({ type: REMOVE_POST_FAILURE, data: err.response.data }) } } // function addCommentAPI(data) { // return axios.post(`/api/post/${data.postId}/comment`, data); // } function* addComment(action) { const id = shortId.generate(); try { // const result = yield call(addCommentAPI, action.data); yield delay(1000); yield put({ type: ADD_COMMENT_SUCCESS, data: { id, postId: action.data.postId, commentText: action.data.commentText, } }) } catch(err) { yield put({ type: ADD_COMMENT_FAILURE, data: err.response.data }) } } // function addPostAPI(data) { // return axios.post('/api/post', data); // } function* removeComment(action) { try { // const result = yield call(addPostAPI, action.data); yield delay(1000); yield put({ type: REMOVE_COMMENT_SUCCESS, data: { postId: action.data.postId, commentId: action.data.commentId, }, }) } catch(err) { yield put({ type: REMOVE_COMMENT_FAILURE, data: err.response.data }) } } function* watchLoadPosts() { yield takeLatest(LOAD_POSTS_REQUEST, loadPosts); } function* watchAddPost() { yield takeLatest(ADD_POST_REQUEST, addPost); } function* watchRemovePost() { yield takeLatest(REMOVE_POST_REQUEST, removePost); } function* watchAddComment() { yield takeLatest(ADD_COMMENT_REQUEST, addComment); } function* watchRemoveComment() { yield takeLatest(REMOVE_COMMENT_REQUEST, removeComment); } export default function* postSaga() { yield all([ fork(watchLoadPosts), fork(watchAddPost), fork(watchRemovePost), fork(watchAddComment), fork(watchRemoveComment), ]); }
-
미해결C# 입문부터 Xamarin Forms(자마린 폼즈) + Maui(마우이) 안드로이드, 윈도우 앱(UWP) 동시에 만들기
if (i > 10) thread1.Abort(); Console.WriteLine("첫번째 쓰레드 {}",i); 에서 오류가 발생해요
(사진)