묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결게임 프로그래머 취업 전략 가이드
루키스님의 면접관 경험에 비추어서 여쭤보고 싶습니다.
안녕하세요 저번에 루키스님의 강의를 보고 학원에 대한 무조건 안 좋은 인식만 가지고 있다가 생각을 바꾸어서 괜찮다고 하신 학원의 DX2D과정부터 시작하고 있습니다. 그런데 강의 도중에 선생님께서 전공자 분들은 DX2D 포폴 만들고 나서 그걸로 일단 서류 넣어보라고 하시더군요 가능성이 있다고 하시면서요. 일단 제 스펙은 SPK 컴공 졸업 학점 3.3/4.3게임과는 관련이 없지만 누구나 아는 IT 대기업에서 진행한 AI개발자 교육의 컴퓨터 비전 트랙을 수료했습니다. 그 후 몸이 너무 안 좋아서 취준을 중단하고 쉬다가 이제 28살이 되었습니다.이걸 굳이 얘기해야 하나 싶지만일단 코딩테스트는 그다지 걱정하고 있지 않습니다.(과거 네카라 지원했을때도 코테는 코딩테스트 합격자들 중에서도 잘 본 편이었습니다. 지금도 감 잃지 않도록 계속 준비하고 있고요)컴퓨터 공학 지식은 조금 가물가물한 부분도 있지만 학부 수준의 지식은 거의 숙지하고 있습니다. 꾸준히 계속 복습 중입니다.하지만 상용엔진 경험 + DX3D를 안해봤다는 점이 마음에 걸립니다. 이 상태로 대기업, 준대기업의 면접까지 갈 수 있을까요?
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
no element
마지막 no element 수업중에 코드를 수정해도no element 에러화면이 계속 나오네요 ㅠㅠ데이터를 받아오는것같은데 어디가 문제인지 하루종일 봐도 안되네요 아직 부족한것같습니다 지금 빌드 구문부터 실행이 되지않는데 한번 확인 부탁드려도될까요?https://github.com/JacksonBanco/dust_app
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
ADD_COMMENT_FAILURE 에러
error - ./sagas/post.jsAttempted import error: 'ADD_COMMENT_FAILURE' is not exported from '../reducers/post'.와 같이 오류 코드가 뜹니다. 간단한 문제인거 같은데 해결이 안되네요.아래는 두 코드입니다. ./reducer/post.jsimport shortId from 'shortid'; import faker from 'faker'; import produce from '../util/produce'; 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, }; // -> index.js export const generateDummyPost = (number) => Array(number).fill().map(() => ({ id: shortId.generate(), User: { id: shortId.generate(), nickname: faker.name.findName(), }, content: faker.lorem.paragraph(), //아무런 글자 Images: [{ src: faker.image.image(), //공간만 차지할꺼면 placeholder }], Comments: [{ User: { id: shortId.generate(), nickname: faker.name.findName(), }, content: faker.lorem.sentence(), }], })); 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 addPost = (data) => ({ type: ADD_POST_REQUEST, data, }); export const addComment = (data) => ({ type: ADD_COMMENT_REQUEST, data, }); const dummyPost = (data) => ({ id: data.id, content: data.content, User: { id: 1, nickname: '제로초', }, Images: [], Comments: [], }); const dummyComment = (data) => ({ id: shortId.generate(), content: data, User: { id: 1, nickname: '제로초', }, }); // 이전 상태를 액션을 통해 다음 상태로 만들어내는 함수(불변성은 지키면서) const reducer = (state = initialState, action) => produce(state, (draft) => { switch (action.type) { //state를 draft로 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 < 50; //50개로 제한 게시글 50개만 보겠다. 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.removePostLoading = false; draft.removePostDone = true; draft.mainPosts = draft.mainPosts.filter((v) => v.id !== action.data); 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.content)); draft.addCommentLoading = false; draft.addCommentDone = true; break; // const postIndex = state.mainPosts.findIndex((v) => v.id === action.data.postId); // const post = { ...state.mainPosts[postIndex] }; // post.Comments = [dummyComment(action.data.content), ...post.Comments]; // const mainPosts = [...state.mainPosts]; // mainPosts[postIndex] = post; // return { // ...state, // mainPosts, // addCommentLoading: false, // addCommentDone: true, // }; } case ADD_COMMENT_FAILURE: draft.addCommentLoading = false; draft.addCommentError = action.error; break; default: break; } }); export default reducer;./sagas/post.jsimport axios from 'axios'; import shortId from 'shortid'; import { all, delay, fork, put, takeLatest, throttle } from 'redux-saga/effects'; import { ADD_COMMENT_FAILURE, ADD_COMMENT_REQUEST, ADD_COMMENT_SUCCESS, ADD_POST_FAILURE, ADD_POST_REQUEST, ADD_POST_SUCCESS, generateDummyPost, LOAD_POSTS_FAILURE, LOAD_POSTS_REQUEST, LOAD_POSTS_SUCCESS, REMOVE_POST_FAILURE, REMOVE_POST_REQUEST, REMOVE_POST_SUCCESS, } from '../reducers/post'; import { ADD_POST_TO_ME, REMOVE_POST_OF_ME } from '../reducers/user'; function loadPostsAPI(data) { return axios.get('/api/posts', data); } function* loadPosts(action) { try { // const result = yield call(loadPostsAPI, action.data); yield delay(1000); yield put({ type: LOAD_POSTS_SUCCESS, data: generateDummyPost(10), }); } catch (err) { console.error(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); yield delay(1000); //서버를 구현하기 전까지 딜레이로 구현하는 효과 const id = shortId.generate(); yield put({ type: ADD_POST_SUCCESS, data: { id, content: action.data, }, }); yield put({ type: ADD_POST_TO_ME, data: id, }); } catch (err) { console.error(err); yield put({ type: ADD_POST_FAILURE, data: err.response.data, }); } } function removePostAPI(data) { return axios.delete('/api/post', data); } function* removePost(action) { try { // const result = yield call(removePostAPI, action.data); yield delay(1000); yield put({ type: REMOVE_POST_SUCCESS, data: action.data, }); yield put({ type: REMOVE_POST_OF_ME, data: action.data, }); } catch (err) { console.error(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) { try { // const result = yield call(addCommentAPI, action.data); yield delay(1000); yield put({ type: ADD_COMMENT_SUCCESS, data: action.data, }); } catch (err) { yield put({ type: ADD_COMMENT_FAILURE, data: err.response.data, }); } } //takeevery function* watchLoadPosts() { yield throttle(5000, LOAD_POSTS_REQUEST, loadPosts); //5초동안은 post request 한 번만 실행 } function* watchAddPost() { //클릭 실수 2번했을때(동시에 로딩 중일때) 마지막 클릭만 실행되게 every는 두 번 다 실행 yield takeLatest(ADD_POST_REQUEST, addPost); } function* watchRemovePost() { yield takeLatest(REMOVE_POST_REQUEST, removePost); } function* watchAddComment() { yield takeLatest(ADD_COMMENT_REQUEST, addComment); } export default function* postSaga() { yield all([ fork(watchAddPost), fork(watchLoadPosts), fork(watchRemovePost), fork(watchAddComment), ]); }제로초님 강의와 깃허브 보면서 제 코드에 문제가 있는지 찾아보고 수정도 해봤습니다.import export둘다 잘 들어 갔는데 다른 문제 일까요? 아니면 install이 안된게 있는 걸까요?
-
미해결jQuery로 구현하는 NFT 마켓플레이스 (이더리움, 폴리곤)
리믹스이더리움 > 환경셀렉바에 javascript (VM)이 없어서,,RemixVM
- 리믹스이더리움 > 환경셀렉바에 javascript (VM)이 없어서,,RemixVM로 설정해놓고 사용해도됄까요;;; 그리고 contract폴더안 artifacts폴더가 없는데상관없을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 매니저 동시성
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)일반적으로 스프링 컨테이너는 싱글톤 기반으로 동작하기에 빈은 모든 쓰레드가 공유합니다. 그런데@PersistenceContext을 통해 주입 받은 EntityManager는 동시성 문제가 발생하지 않는다고 해서 의문이 생겼습니다. 따라서 관련된 내용을 공부하던 중 아래 질문의 영한님 답변을 봤습니다. https://www.inflearn.com/questions/158967/%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94-entitymanager%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B6%81%EA%B8%88%ED%95%9C-%EC%A0%90%EC%9D%B4-%EC%9E%88%EC%96%B4-%EC%A7%88%EB%AC%B8-%EB%82%A8%EA%B9%81%EB%8B%88%EB%8B%A4제가 이해한 바로는 private final EntityManager em;를 통해 주입 받은 엔티티매니저는 싱글톤 빈이지만 일반적인 빈들과는 다릅니다.공통점 : 일반적인 스프링 빈과 엔티티 매니저는 모두 프록시 객체를 주입받는다. 그리고 이는 모두 싱글톤이다.차이점 : 일반적인 스프링 빈은 호출될때마다 에플리케이션 전체를 대상으로 해당 빈이 스프링 컨테이너에 등록되어 있는지 찾고 있으면 스프링 컨테이너에서 찾아 반환, 없으면 빈을 생성하고 등록(CGLIB 기술)반면 엔티티매니저는 이해가 가지 않습니다. 책 581 페이지를 보면 A, B 코드에서 호출한 엔티티 매니저는 서로 다르며 , 582에서 멀티 쓰레드에서 같은 코드에서 호출한 엔티티 매니저는 서로 같습니다. 일반적인 싱글톤 빈들이나 엔티티 매니저 모두 싱글톤이며 프록시 객체를 주입 받는 것 같은데 그 안의 원리들이 조금 다른 것 같은데 이 점이 궁금합니다.
-
미해결냉동코더의 알기 쉬운 Modern Android Development 입문
안녕하세요. 용어에 대해 질문이 있어 글 남깁니다.
안녕하세요. 강의 잘듣고 있습니다.다만, 제가 이 강의부터 시작해서 그런지 용어에 대한 개념이 헷갈립니다. util 디렉토리와 source.kt 파일의 역할은 정확히 무엇인가요?util 디렉토리에 들어가는 파일들의 내용은 무엇이고,DataSource의 역할이 무엇인지 궁금합니다 !감사합니다..
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
path 메소드는 sys에만 사용 가능한가요?
마지막 과제로 6-2챕터를import해서 사용해보라고 하셔서 사용해 봤습니다.import한 모듈의 경로를 추적하려면 path메소드를 사용해야 한다고 배워서 실습하려 했는데 has no attribute 'path'라는 에러가 나네요.import math를 해 보고print(math.path)를 해봐도 에러가 납니다import한 모듈의 경로를 추적하는 메소드가 있을까요?
-
미해결[백문이불여일타] 데이터 분석을 위한 중급 SQL 문제풀이
4번 BST 문제 틀리는 이유
4번 bst 문제와 관련해서 아래와 같이 쿼리 했는데 틀리네요 ㅠㅠ이유를 모르겠습니다SELECT DISTINCT BST.N, CASE WHEN BST.P IS NULL THEN 'Root' WHEN B2.N IS NULL THEN 'Leaf' ELSE 'Inner' END FROM BST LEFT JOIN BST B2 ON BST.N = B2.PORDER BY BST.N
-
미해결비전공 기획자 및 관리자를 위한 IT 필수 지식
강의 자료 요청
안녕하세요, 필기 및 공부를 위해 강의 자료를 요청 드립니다.메일 주소는 fyoo2829@gmail.com 입니다.
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
중복된 닉네임
중복된 닉네임할때 const exUser = await User.findOne({ where: { email: req.body.email, nickname: req.body.nickname, }, });이렇게 추가 해주면 되나요? 아니면 따로 만들어줘야하나요?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-H질문
http://boj.kr/f1f1a8da0bf348f18816f1df97c07baf어디가 틀린건지 도저히 모르겠습니다....ㅠㅠ 제가 짠 코드에다가 선생님이 MAX로 설정하신 부분 해서 했는데 답은 나오는데 틀렷다고 뜨는데 어디가 문제인지 모르겠습니다. 그리고 n == m일 경우 어떻게 출력해야하나요...? 일단 시간은 0인것은 알겠는데 그다음에 공백을 출력을 해야할지 아니면 n을 출력을 해야할지를 모르겠습니다.
-
미해결문제로 배우는 C언어
20번 소수 판별하기에서 질문 있습니다.
3:14부터 설명하시는 내용에 대해서 질문 있습니다. 다른 부분은 예외로 치고 반복문에서만 봤을 때,반복문이 최대한 조금 돌아가게 만드는 게 효율성이 높고 좋은 코드라고 볼 수 있는건가요?? 그런 의미에서 21번 최대공약수 문제에서 for (i = 1; i <= a && i <= b; i++) { if (a % i == 0 && b % i == 0) max = i; } printf("%d", max);이렇게 작성하였는데 코드를 최대한 간결하게 작성하는 것에 중점을 두었습니다. 그런데 의문인 점이a, b 중 작은 값이 30이라면 반복문이 무조건 30번 돌아가기 때문에 선생님께서 작성하신 코드에 비해 비효율적이고 안좋은 코드라고 볼 수 있을까요?그렇다면 앞으로 반복문이 들어가는 코드를 작성 할 때 반복횟수를 고려하면서 작성하는 게 좋은 습관을 만드는 길인걸까요? 아니면 이렇게까지 신경 쓸 필요는 없나요? 궁금합니다!
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
로컬스토리지에 대한 질문입니다!!
안녕하세요 강사님!! 다름이 아니라 로컬스토리지에 대해 질문을 드리려고 합니다!!강사님께서 첨부하신 boiler-plate을 사용하지 않고, 이전의 boiler-plate 강의 수강 후 직접 작성한 파일을 그대로 가져와서 youtube 강의를 듣고 있습니다.로그인 페이지에서 로그인을 하게 되면, 로컬스토리지에 userId가 저장될 수 있게 기능을 구현하려 하는데, 아래와 같이 어딘가로 저장은 되지만 어플리케이션 탭의 로컬스토리지에는 표시가 되지 않습니다. 혹시 어떤 이유 때문에 이러 일이 일어나는지 알려주실 수 있으실까요!!ㅠㅠ--------------------------------------------------------------------------------------------------------------------------------------확인해보니 크롬 브라우저에는 위 사진과 같이 저장된 데이터가 표시되지 않았지만 브레이브 브라우저에서는 아래와 같이 정상적으로 표시 됐습니다!! 특이사항이 있다면 크롬 브라우저에서 로그인 할 때, 암호가 유출되었을 수도 있다는 알림이 뜨는데 그것 때문인지 궁금합니다!!
-
미해결YOLO 구현으로 배우는 딥러닝 논문 구현 with TensorFlow 2.0
object_exists_cell_i 계산식
object_exists_cell_i, object_exists_cell_j = int(cell_size * ycenter / input_height), int(cell_size * xcenter / input_width) loss.py 강의의 18:13s에서 계산식 "cell_size * ycenter / input_height" 에서 ycenter가 0.4(normalized)이고, cell_size가 4 -> 두개를 곱하면 1.6이고, int형변환되어 1이라서 Grid Cell , input_height 값을 계산식에서 제외하신것 같습니다.
-
해결됨그림으로 쉽게 배우는 운영체제
컴파일 과정
컴파일 과정에서 생기는 .i .s .o 의 파일을 직접 열어보고 싶은데 어떻게 볼 수 있을까요.?
-
해결됨기출로 대비하는 개발자 전공면접 [CS 완전정복]
노션 자료 이메일 잘못 입력했어요..
cs 면접강의랑 코딩테스트 all in one 강의 두 개를 수강중인데,제가 노션을 구글계정을 사용중인데, 구글폼에 실수로 네이버 이메일을 작성해버려서 네이버로 로그인해야지만 자료를 볼 수가 있네요...죄송한데 구글 계정으로 다시 보내주실 수 있나요..? 구글 이메일은 두 강의 모두 구글폼에 다시 작성했어요...ㅠㅠ
-
미해결실전! Querydsl
test
test할때는 log.info잘 사용 안하나요?
-
해결됨토비의 스프링 부트 - 이해와 원리
BeanClassLoaderAware 인터페이스가 궁금하여 질문드립니다.
BeanClassLoaderAware 를 통해 ClassLoader 를 주입을 받는다고 가정할 때public class MyAutoConfigImportSelector implements DeferredImportSelector, BeanClassLoaderAware { private ClassLoader classLoader; @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { List<String> autoConfigs = new ArrayList<>(); ImportCandidates.load(MyAutoConfiguration.class, classLoader) .forEach(autoConfigs::add); return autoConfigs.toArray(new String[0]); } @Override public void setBeanClassLoader(ClassLoader classLoader) { this.classLoader = classLoader; } } MyAutoConfigImportSelector 는 스프링에서 사용하는 공유되는 클래스로더에 의해서 로딩되는 것으로 확인하였습니다. (this.getClass().getClassLoader() 로 해도 같은동작)그렇다면 BeanClassLoaderAware 인터페이스를 스프링에서 제공하는 이유는 무엇일까 궁금하여 질문드립니다.또한 BeanClassLoaderAware javadoc 에서 framework classes 가 구현하도록 의도되었다고하는데 framework classes 의 의미는 무엇일까요?
-
미해결메타스플로잇(Metasploit) 활용한 취약점 분석(초중급과정)
쉬운말로 상대방 IPtable에서 DNS설정을 바꾼다는 말 아닌가요??
좀 그렇군요...알려주실려면 다 알려주셔야하는거 아닌가요??(_ _)
-
미해결메타스플로잇(Metasploit) 활용한 취약점 분석(초중급과정)
실슬-MSF 공격코드2는 ppt로 작성해서 올려주세요
무슨 말인지 혼동됩니다...어디가 웹서버이고 어디가 공격자이고 어디가 희생자이고...웹서비시엔 뭐가 올라가 있어야 하고....희생자는 무슨 취약한 소프트웨어를 사용하고 있어야 하고...공격자 PC에선 무슨 설정이 되어있어야 한느지 혼동됩니다... ppt로 잘 정리된 자료 요청합니다