묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결타입 파이썬! 올바른 class 사용법과 객체지향 프로그래밍
데코레이터 관련 질문입니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. def copyright(func): #이 func 인자에는 여러 함수가 들어갈 수 있을 것임 def new_func(): print("@") func() return new_func def smile(): print("^0^") def angry(): print("ff") def love(): print("love") copyright(smile()) copyright(angry()) copyright(love()) 왜 이 코드를 실행하면, @는 같이 붙어있지 않고, ^0^ ff love만 결과로 나오는 것인가요?
-
미해결따라하며 배우는 도커와 CI환경 [2023.11 업데이트]
default.conf 의 중복과 관련하여 궁금합니다.
안녕하세요. 프론트엔드와, 전체 proxy로 총 두 번의 nginx 의 설정 파일을 저장합니다. 그런데 그 경로가 동일합니다. 그럴 경우 덮어쓰기가 되는건가요? 아니면 다른 이름으로 저장되나 다르게 작동하여 두 개가 따로 문제 없이 진행되는 건가요? 만약 그렇다면 각각 nginx를 따로 사용하게 되는지 궁금합니다. 감사합니다! 각 각의 경로 : COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf COPY ./default.conf /etc/nginx/conf.d/default.conf
-
해결됨게임 프로그래머 취업 전략 가이드
DirectX 공부 필수? 선택?
안녕하세요. 덕분에 궁금했던 점이 많이 풀렸습니다 ㅎㅎ... 프로그래밍 공부에 대한 태도도 많이 달라졌습니다. 저는 먼저 2년의 시간을 가지고 중견이상의 회사의 취업을 목표로 공부 하려고 합니다. [독학vs게임 학원]강의를 보고 학원을 가는게 맞겠다고 생각이 들어서 학원상담을 받았습니다. 이미 저는 C# MMORPG 시리즈를 완강하고 거기에 퀘스트, 레이드, 전직 등등 컨텐츠 들을 붙여 나름 포트폴리오를 하나 만들었습니다. c++과 STL은 따로 서적을 사서 공부를 어느정도 했고, 유명 학원의 커류큘럼을 보니 다음은 DirectX를 공부하는게 좋겠다고 생각했습니다. 지방에 새로 생긴 스브스아카데미학원을 갓습니다. 거기서는 기존에 나와있는 언리얼, 유니티 엔진이 너무 잘 되어있기 때문에 엔진을 공부하는 것 아니면 DirectX를 굳이 공부를 안 해도 된다고 하더군요. 그 시간에 언리얼, 유니티 숙련도를 늘려서 취업하는게 전략적이라구요. 그 학원의 커류큘럼에는 DirectX는 없었습니다. 인터넷을 좀 찾아보니 이부분도 약간 분분하더군요. 쥬신과 다른 학원의 포트폴리오를 보면 대부분 DirectX이던데, DirectX에 대한 지식이 전무해서 이게 맞는 말인지... 장사를 하는건지 판단이 안서서 루키스님 의견은 어떤지 궁금해서 질문드립니다. DirectX과정이 있는 학원을 다니는게 맞을까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part5: 데이터베이스
Hash조인을 사용시 데이터가 엄청나게 많다면
잘 사용하는 쿼리가 아닐경우 해시조인을 사용할 때 양쪽 다 데이터가 많아서 HashTable bucket 안의 데이터도 많아졌다고 가정했을 때 NL을 사용하면 엄청난 비효율을 보여줄테고 Merge를 사용하면 데이터가 너무 많아 정렬에 비용을 많이 사용하게 될텐데 이렇게 되면 Hash조인을 사용하는게 더 좋은 선택인가요? 아니면 데이터를 정렬해주고 Merge조인을 사용해야 하는건가요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part5: 데이터베이스
데이터가 많을 때 Hash 를 사용?이 이해가 잘 안됩니다
join할 데이터베이스 양쪽 다 데이터가 많다면 Hash도 비용이 많이들어 효율이 낮아지는게 아닌가요? 만약 이럴땐 어떤 조인을 사용해야 할까요? NL을 사용하면 엄청난 비효율일 것 같고 Merge를 사용하기엔 데이터가 너무 많고 이래도 그냥 Hash를 사용하는것이 셋중에서 더 좋은 방법인가요?
-
미해결프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)
파이썬이랑 연동이 안되네요.. 파란색 꽃무늬로 되야 디버깅이 되는것 같은데 어떻게 할 까요 ㅠㅠ
(사진)
-
미해결자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비
시간 복잡도
안녕하세요. 강의 잘 보고 있습니다. 많은 도움이 되는 것 같습니다. 한 가지 궁금한 것이 시간 제한이 1000MS인데요. 3중 for문을 쓰면 빅오가 n^3이 나오는데 어떻게 테스트 케이스를 통과하는지 궁금합니다. 1000ms면 데이터 연산이 몇 번까지 허용되는건가요?
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
Http request data의 검증과 컨트롤러에서 엔티티 객체 생성
영한님 안녕하세요 현재 강의 queryDSL까지 듣고 요즘 개인프로젝트 진행중입니다. 진행하면서 생긴 궁금증에 대해 여쭤보려고 합니다. http request가 오는데, 특정 값의 범위에 대한 validating은 어느 계층에서 하면 되나요? 예로들어서 회원가입 기능을 만드는데 비밀번호에 대소문자 특수기호가 있어야합니다. 그러면 비밀번호의 값 validating은 Service계층에서 하는게 맞을까요? 제가 생각하는 controller 계층은 HTTP request를 받고 핵심 비즈니스 로직에게 dto를 던져주고 service 계층으로부터 받은 결과를 적당한 http status code, header, body를 통해서 클라이언트에게 전달하는 역할이라고 생각합니다. 이 계층은 HTTP 요청을 받고 전달하는게 주된 역할이라고 생각합니다. 만약, controller에서 검증 하게된다면 회원가입 API가 추가될때마다 controller에 매번 검증 로직을 넣어야하는데 Service에 넣으면 그럴필요가 없다고 생각합니다. 그래서 Service계층에서 검증하는게 맞다고 생각하는데 적절한 논리인가요? Controller 계층에서 엔티티 객체 생성? or dto를 전달하여 service에서 생성? Controller에서 엔티티를 생성하고 service계층으로 넘기면 dto를 전달할 필요가 없어서 좋고 dto를 전달하면 controller가 비즈니스로직에 관여하지 않아서 좀더 controller의 역할이라고 생각이 듭니다. (하지만 service의 파라미터도 dto로 의존하게 되어 다른 controller에서 호출할 때 같은 service의 함수를 이용할 수 없게 된다고 생각합니다) 여기서 주로 영한님은 어느 방법을 이용하시나요? (강의에서는 전자의 방법을 자주 이용하시는 것 같은데)
-
미해결RPA로 자동화 천재되기 (UiPath 응용편)
For Each Row in Data Table 함수 문의
Input Dialog > Keyword 입력 > 데이터 스크래핑 > 컬럼명 : "검색어"로 저장 까지는 진행되었는데요 메모장에 Hash 값들이 입력이 안되고 robot이 종료됩니다. For Each Row in Data Table에 문제가 있는것 같은데 검토 부탁드립니다. ※메모장은 오픈해놓은 상태입니다.
-
미해결대세는 쿠버네티스 (초급~중급편)
Node Scheduling 이론 강의 영상이 누락된 것 같은데 확인 부탁드립니다.
[중급] Pod - Node Scheduling 이론 영상을 틀어도 실습 영상(13분44초)이 나옵니다. (Pod - Node Scheduling [실습] 영상을 틀어도 마찬가지로 중복된 13분 44초 강의 영상이 나옵니다.) 이론 영상이 누락된 것으로 보이는데 이론 영상 업로드 해주실 수 있나요? 확인 부탁드립니다.
-
미해결Nuxt.js 시작하기
v-model 사용시 $emit 키워드도 정해지나요?
props를 이용하여 데이터를 연동할때 v-model로 변경하게 되면 props의 키워드를 value로 변경 해야 했습니다. 이 경우 하위 컴포넌트로 받던 $emit도 input이라는 예약어(?)로 정해져 있나요? props의 키로 searchKeyword를 사용하면 @input="$emit('evtName', $event.target.value)" @evtName='somethingMethod' 이렇게 잘 동작했는데 props의 키를 value로 변경하게 되면 evtName로 바인딩이 안되고(물론 바인딩 할 대상이 없기도 하지만...) @input="$emit('input, $event.target.value)" 만 잘 동작 하네요. $emit 안에 있는 'input'이 정해진 규칙인건가요?
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
Cannot read property 'Likers' of null
고생이 많으십니다. 위 에러가 났는데 찾기가 너무 어려워서 올렸습니다. 찾는다고 찾았는데 두개의 이메일로 각각 게시글을 10개씩 썼는데도 막상 해당 post 주소로 들어가게 되면 이렇게 존재하지 않는 게시글(404)이라고 표시되고 있습니다. 그리고 콘솔창에 계속해서 Internal Server Error 500 에러 렌더링이 반복되고 있습니다. 코드는 routes/ post.js const express = require('express') const multer = require('multer') const path = require('path') const fs = require('fs') const { Post, Image, Comment, User, Hashtag } = require('../models') const { isLoggedIn } = require('./middlewares') const router = express.Router() try { fs.accessSync('uploads') } catch (error) { console.log('uploads 폴더가 없으므로 생성합니다.') fs.mkdirSync('uploads') } const upload = multer({ storage: multer.diskStorage({ destination(req, file, done) { done(null, 'uploads') }, filename(req, file, done) { // 제로초.png const ext = path.extname(file.originalname) // 확장자 추출(.png) const basename = path.basename(file.originalname, ext) // 제로초 done(null, basename + '_' + new Date().getTime() + ext) // 제로초15134314.png } }), limits: { fileSize: 20 * 1024 * 1024 } // 20mb }) router.post('/', isLoggedIn, upload.none(), async (req, res) => { // POST /post try { const hashtags = req.body.content.match(/#[^\s#]+/g) const post = await Post.create({ content: req.body.content, UserId: req.user.id }) if (hashtags) { const result = await Promise.all(hashtags.map((tag) => Hashtag.findOrCreate({ where: { name: tag.slice(1).toLowerCase() } }))) // [[노드, true], [리액트, true]] await post.addHashtags(result.map((v) => v[0])) } if (req.body.image) { if (Array.isArray(req.body.image)) { // 이미지를 여러개 올리면 image: [제로초.png, 부기초.png] const images = await Promise.all(req.body.image.map((image) => Image.create({ src: image }))) await post.addImages(images) } else { // 이미지를 하나만 올리면 image: 제로초.png const image = await Image.create({ src: req.body.image }) await post.addImages(image) } } const fullPost = await Post.findOne({ where: { id: post.id }, include: [{ model: Image }, { model: Comment, include: [{ model: User, // 댓글 작성자 attributes: ['id', 'nickname'] }] }, { model: User, // 게시글 작성자 attributes: ['id', 'nickname'] },{ model: User, // 좋아요 누른사람 as: 'Likers', attributes: ['id'] }] }) res.status(201).json(fullPost) } catch (error) { console.error(error) next(error) } }) router.post('/images', isLoggedIn, upload.array('image'), (req, res, next) => { // POST /post/images console.log(req.files) res.json(req.files.map((v) => v.filename)) }) router.post('/:postId/comment', isLoggedIn, async (req, res, next) => { // POST /post/1/comment try { const post = await Post.findOne({ where: { id: req.params.postId } }) if (!post) { return res.status(403).send('존재하지 않는 게시글입니다.') } const comment = await Comment.create({ content: req.body.content, PostId: parseInt(req.params.postId, 10), UserId: req.user.id }) const fullComment = await Comment.findOne({ where: { id: comment.id }, include: [{ model: User, attributes: ['id', 'nickname'] }] }) res.status(201).json(fullComment) } catch (error) { console.error(error) next(error) } }) router.get('/:postId', async (req, res, next) => { // GET /post/1 try { const post = await Post.findOne({ where: { id: req.params.postId } }) if (!post) { return res.status(404).send('존재하지 않는 게시글입니다.') } const fullPost = await Post.findOne({ where: { id: post.id }, include: [{ model: Post, as: 'Retweet', include: [{ model: User, attributes: ['id', 'nickname'] }] }, { model: User, attributes: ['id', 'nickname'] }, { model: Image }, { model: Comment, include: [{ model: User, attributes: ['id', 'nickname'] }] }, { model: User, as: 'Likers', attributes: ['id'] }, { model: Post, as: 'Retweet', include: [{ model: User, attributes: ['id', 'nickname'] }, { model: Image }] }] }) res.status(200).json(fullPost) } catch (error) { console.error(error) next(error) } }) router.post('/:postId/retweet', isLoggedIn, async (req, res, next) => { // POST /post/1/retweet try { const post = await Post.findOne({ where: { id: req.params.postId }, include: [{ model: Post, as: 'Retweet' }] }) if (!post) { return res.status(403).send('존재하지 않는 게시글입니다.') } if (req.user.id === post.UserId || (post.Retweet && post.Retweet.UserId === req.user.id)) { return res.status(403).send('자신의 글은 리트윗할 수 없습니다.') } const retweetTargetId = post.RetweetId || post.id const exPost = await Post.findOne({ where: { UserId: req.user.id, RetweetId: retweetTargetId } }) if (exPost) { return res.status(403).send('이미 리트윗했습니다.') } const retweet = await Post.create({ UserId: req.user.id, RetweetId: retweetTargetId, content: 'retweet' }) const retweetWithPrevPost = await Post.findOne({ where: { id: retweet.id }, include: [{ model: Post, as: 'Retweet', include: [{ model: User, attributes: ['id', 'nickname'] }] }, { model: User, attributes: ['id', 'nickname'] }, { model: Image }, { model: Comment, include: [{ model: User, attributes: ['id', 'nickname'] }] }, { model: User, as: 'Likers', attributes: ['id'] }, { model: Post, as: 'Retweet', include: [{ model: User, attributes: ['id', 'nickname'] }, { model: Image }] }] }) res.status(201).json(retweetWithPrevPost) } catch (error) { console.error(error) next(error) } }) router.patch('/:postId/like', isLoggedIn, async (req, res, next) => { // PATCH /post/1/like try { const post = await Post.findOne({ where: { id: req.params.postId }}) if (!post) { return res.status(403).send('게시글이 존재하지 않습니다.') } await post.addLikers(req.user.id) res.json({ PostId: post.id, UserId: req.user.id }) } catch (error) { console.error(error) next(error) } }) router.delete('/:postId/like', isLoggedIn, async (req, res, next) => { // DELETE /post/1/like try { const post = await Post.findOne({ where: { id: req.params.postId }}) if (!post) { return res.status(403).send('게시글이 존재하지 않습니다.') } await post.removeLikers(req.user.id) res.json({ PostId: post.id, UserId: req.user.id }) } catch (error) { console.error(error) next(error) } }) router.delete('/:postId', isLoggedIn, async (req, res, next) => { // DELETE /post/10 try { await Post.destroy({ where: { id: req.params.postId, UserId: req.user.id } }) res.json({ PostId: parseInt(req.params.postId, 10) }) } catch (error) { console.error(error) next(error) } }) module.exports = router reducers/ post.js import produce from 'immer' export const initialState = { mainPosts: [], singlePost: null, imagePaths: [], hasMorePosts: true, likePostLoading: false, likePostDone: false, likePostError: null, unlikePostLoading: false, unlikePostDone: false, unlikePostError: null, loadPostLoading: false, loadPostDone: false, loadPostError: null, loadPostsLoading: false, loadPostsDone: false, loadPostsError: null, addPostLoading: false, addPostDone: false, addPostError: null, removePostLoading: false, removePostDone: false, removePostError: null, addCommentLoading: false, addCommentDone: false, addCommentError: null, uploadImagesLoading: false, uploadImagesDone: false, uploadImagesError: null, retweetLoading: false, retweetDone: false, retweetError: null } export const UPLOAD_IMAGES_REQUEST = 'UPLOAD_IMAGES_REQUEST' export const UPLOAD_IMAGES_SUCCESS = 'UPLOAD_IMAGES_SUCCESS' export const UPLOAD_IMAGES_FAILURE = 'UPLOAD_IMAGES_FAILURE' export const LIKE_POST_REQUEST = 'LIKE_POST_REQUEST' export const LIKE_POST_SUCCESS = 'LIKE_POST_SUCCESS' export const LIKE_POST_FAILURE = 'LIKE_POST_FAILURE' export const UNLIKE_POST_REQUEST = 'UNLIKE_POST_REQUEST' export const UNLIKE_POST_SUCCESS = 'UNLIKE_POST_SUCCESS' export const UNLIKE_POST_FAILURE = 'UNLIKE_POST_FAILURE' 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 LOAD_POST_REQUEST = 'LOAD_POST_REQUEST' export const LOAD_POST_SUCCESS = 'LOAD_POST_SUCCESS' export const LOAD_POST_FAILURE = 'LOAD_POST_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 RETWEET_REQUEST = 'RETWEET_REQUEST' export const RETWEET_SUCCESS = 'RETWEET_SUCCESS' export const RETWEET_FAILURE = 'RETWEET_FAILURE' export const REMOVE_IMAGE = 'REMOVE_IMAGE' export const addPost = (data) => ({ type: ADD_POST_REQUEST, data }) export const addComment = (data) => ({ type: ADD_COMMENT_REQUEST, data }) const reducer = (state = initialState, action) => { return produce(state, (draft) => { switch (action.type) { case REMOVE_IMAGE: draft.imagePaths = draft.imagePaths.filter((v, i) => i !== action.data) break case RETWEET_REQUEST: draft.retweetLoading = true draft.retweetDone = false draft.retweetError = null break case RETWEET_SUCCESS: { draft.retweetLoading = false draft.retweetDone = true draft.mainPosts.unshift(action.data) break } case RETWEET_FAILURE: draft.retweetLoading = false draft.retweetError = action.error break case UPLOAD_IMAGES_REQUEST: draft.uploadImagesLoading = true draft.uploadImagesDone = false draft.uploadImagesError = null break case UPLOAD_IMAGES_SUCCESS: { draft.imagePaths = action.data draft.uploadImagesLoading = false draft.uploadImagesDone = true break } case UPLOAD_IMAGES_FAILURE: draft.uploadImagesLoading = false draft.uploadImagesError = action.error break case LIKE_POST_REQUEST: draft.likePostLoading = true draft.likePostDone = false draft.likePostError = null break case LIKE_POST_SUCCESS: { const post = draft.mainPosts.find((v) => v.id === action.data.PostId) post.Likers.push({ id: action.data.UserId }) draft.likePostLoading = false draft.likePostDone = true break } case LIKE_POST_FAILURE: draft.likePostLoading = false draft.likePostError = action.error break case UNLIKE_POST_REQUEST: draft.unlikePostLoading = true draft.unlikePostDone = false draft.unlikePostError = null break case UNLIKE_POST_SUCCESS: { const post = draft.mainPosts.find((v) => v.id === action.data.PostId) post.Likers = post.Likers.filter((v) => v.id !== action.data.UserId) draft.likePostLoading = false draft.likePostDone = true break } case UNLIKE_POST_FAILURE: draft.unlikePostLoading = false draft.unlikePostError = action.error break case LOAD_POST_REQUEST: draft.loadPostLoading = true draft.loadPostDone = false draft.loadPostError = null break case LOAD_POST_SUCCESS: draft.singlePost = action.data draft.loadPostLoading = false draft.loadPostDone = true break case LOAD_POST_FAILURE: draft.loadPostLoading = false draft.loadPostError = action.error break case LOAD_POSTS_REQUEST: draft.loadPostsLoading = true draft.loadPostsDone = false draft.loadPostsError = null break case LOAD_POSTS_SUCCESS: draft.mainPosts = draft.mainPosts.concat(action.data) draft.loadPostsLoading = false draft.loadPostsDone = true draft.hasMorePosts = action.data.length === 10 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.mainPosts.unshift(action.data) draft.addPostLoading = false draft.addPostDone = true draft.imagePaths = [] 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.PostId) 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(action.data) draft.addCommentLoading = false draft.addCommentDone = true break } case ADD_COMMENT_FAILURE: draft.addCommentLoading = false draft.addCommentError = action.error break default: break } }) } export default reducer sagas/ post.js import axios from 'axios' import { all, delay, put, takeLatest, fork, throttle, call } from "redux-saga/effects"; import shortId from 'shortid'; import { ADD_POST_FAILURE, ADD_POST_SUCCESS, ADD_COMMENT_SUCCESS, ADD_COMMENT_FAILURE, ADD_POST_REQUEST, ADD_COMMENT_REQUEST, REMOVE_POST_FAILURE, REMOVE_POST_REQUEST, REMOVE_POST_SUCCESS, LOAD_POSTS_REQUEST, LOAD_POSTS_SUCCESS, LOAD_POSTS_FAILURE, LIKE_POST_REQUEST, UNLIKE_POST_REQUEST, LIKE_POST_SUCCESS, LIKE_POST_FAILURE, UNLIKE_POST_SUCCESS, UNLIKE_POST_FAILURE, UPLOAD_IMAGES_REQUEST, UPLOAD_IMAGES_SUCCESS, UPLOAD_IMAGES_FAILURE, RETWEET_REQUEST, RETWEET_SUCCESS, RETWEET_FAILURE, LOAD_POST_REQUEST, LOAD_POST_SUCCESS, LOAD_POST_FAILURE } from '../reducers/post' import { ADD_POST_TO_ME, REMOVE_POST_OF_ME } from '../reducers/user'; function addPostAPI(data) { return axios.post('/post', data) } function* addPost(action) { try { const result = yield call(addPostAPI, action.data) const id = shortId.generate() yield put({ type: ADD_POST_SUCCESS, data: result.data }) yield put({ type: ADD_POST_TO_ME, data: result.data.id }) } catch (err) { yield put({ type: ADD_POST_FAILURE, error: err.response.data }) } } function retweetAPI(data) { return axios.post(`/post/${data}/retweet`, data) } function* retweet(action) { try { const result = yield call(retweetAPI, action.data) yield put({ type: RETWEET_SUCCESS, data: result.data }) } catch (err) { yield put({ type: RETWEET_FAILURE, error: err.response.data }) } } function uploadImagesAPI(data) { return axios.post(`/post/images`, data) } function* uploadImages(action) { try { const result = yield call(uploadImagesAPI, action.data) yield put({ type: UPLOAD_IMAGES_SUCCESS, data: result.data }) } catch (err) { yield put({ type: UPLOAD_IMAGES_FAILURE, error: err.response.data }) } } function likePostAPI(data) { return axios.patch(`/post/${data}/like`) } function* likePost(action) { try { const result = yield call(likePostAPI, action.data) yield put({ type: LIKE_POST_SUCCESS, data: result.data }) } catch (err) { yield put({ type: LIKE_POST_FAILURE, error: err.response.data }) } } function unlikePostAPI(data) { return axios.delete(`/post/${data}/like`) } function* unlikePost(action) { try { const result = yield call(unlikePostAPI, action.data) yield put({ type: UNLIKE_POST_SUCCESS, data: result.data }) } catch (err) { yield put({ type: UNLIKE_POST_FAILURE, error: err.response.data }) } } function loadPostsAPI(lastId) { return axios.get(`/posts?lastId=${lastId || 0}`) } function* loadPosts(action) { try { const result = yield call(loadPostsAPI, action.lastId) yield put({ type: LOAD_POSTS_SUCCESS, data: result.data }) } catch (err) { yield put({ type: LOAD_POSTS_FAILURE, error: err.response.data }) } } function loadPostAPI(data) { return axios.get(`/post/${data}`) } function* loadPost(action) { try { const result = yield call(loadPostAPI, action.data) yield put({ type: LOAD_POST_SUCCESS, data: result.data }) } catch (err) { yield put({ type: LOAD_POST_FAILURE, error: err.response.data }) } } function removePostAPI(data) { return axios.delete(`/post/${data}`) } function* removePost(action) { try { const result = yield call(removePostAPI, action.data) yield put({ type: REMOVE_POST_SUCCESS, data: result.data }) yield put({ type: REMOVE_POST_OF_ME, data: action.data }) } catch (err) { yield put({ type: REMOVE_POST_FAILURE, error: err.response.data }) } } function addCommentAPI(data) { return axios.post(`/post/${data.postId}/comment`, data) // POST /post/1/comment } function* addComment(action) { try { const result = yield call(addCommentAPI, action.data) yield put({ type: ADD_COMMENT_SUCCESS, data: result.data }) } catch (err) { console.error(error) yield put({ type: ADD_COMMENT_FAILURE, error: err.response.data }) } } function* watchRetweet() { yield takeLatest(RETWEET_REQUEST, retweet) } function* watchUploadImages() { yield takeLatest(UPLOAD_IMAGES_REQUEST, uploadImages) } function* watchLikePost() { yield takeLatest(LIKE_POST_REQUEST, likePost) } function* watchUnlikePost() { yield takeLatest(UNLIKE_POST_REQUEST, unlikePost) } function* watchAddPost() { yield takeLatest(ADD_POST_REQUEST, addPost) } function* watchLoadPosts() { yield throttle(5000, LOAD_POSTS_REQUEST, loadPosts) } function* watchLoadPost() { yield takeLatest(LOAD_POST_REQUEST, loadPost) } function* watchRemovePost() { yield takeLatest(REMOVE_POST_REQUEST, removePost) } function* watchAddComment() { yield takeLatest(ADD_COMMENT_REQUEST, addComment) } export default function* postSaga() { yield all([ fork(watchRetweet), fork(watchUploadImages), fork(watchLikePost), fork(watchUnlikePost), fork(watchAddPost), fork(watchLoadPosts), fork(watchLoadPost), fork(watchRemovePost), fork(watchAddComment) ]) } pages/post/ [id].js import axios from "axios" import { useRouter } from "next/router" import { useSelector } from "react-redux" import { END } from 'redux-saga' import AppLayout from "../../components/AppLayout" import PostCard from "../../components/PostCard" import { LOAD_POST_REQUEST } from "../../reducers/post" import { LOAD_MY_INFO_REQUEST } from "../../reducers/user" import wrapper from "../../store/configureStore" const Post = () => { const router = useRouter() const { id } = router.query const { singlePost } = useSelector((state) => state.post) return ( <AppLayout> <PostCard post={singlePost} /> </AppLayout> ) } export const getServerSideProps = wrapper.getServerSideProps(async (context) => { const cookie = context.req ? context.req.headers.cookie : ''; console.log(context) axios.defaults.headers.Cookie = ''; if (context.req && cookie) { axios.defaults.headers.Cookie = cookie } context.store.dispatch({ type: LOAD_MY_INFO_REQUEST }) context.store.dispatch({ type: LOAD_POST_REQUEST, data: context.params.id }) context.store.dispatch(END) await context.store.sagaTask.toPromise() }) export default Post 입니다
-
해결됨15일간의 빅데이터 파일럿 프로젝트
머하웃 진행 단계 확인
강사님이 진행하실때는 10분 정도 걸린 것으로 확인이 되는데 제 컴퓨터에서 위의 상태에서 1시간이 지나도 넘어가질 않습니다. 뭔가 문제가 있는 것 같아서 로그를 보려고 하는데 어디로 가서 봐야할까요? 아니면 다른 머하웃 추천시스템의 진행 상태를 확인하는 방법이 있을까요?
-
미해결팝스타 공식 뮤비 제작 & 유튜브 2천만 뷰 크리에이터의 애니메이트 X 이모티콘 클래스
안녕하세요. 혹시 카카오톡 이모티콘 만들 때, 파일 정리하는 꿀팁이 있을까요?
안녕하세요 그리네모님 ! 평소 애니메이트를 배워보고 싶었는데 좋은 강의가 있어서 보면서 습득중인 수강생입니다! 애니메이트로 이모티콘을 만들어보려는데 파일을 어떻게 정리하면 좋을지 감이 잘 안와서 질문드려봅니다. 24개 시안을 만들면 시안 개수만큼 애니메이트 fla 파일을 24개 만들어서 파일 관리하는 방법밖에는 없는건가요? 아니면 장면 기능을 이용해서 한개의 파일 안에 24개의 장면을 만들어 24개의 시안을 만들어도 되나요? .. 애니메이트는 아직 잘 모르는 단계라 애니메이트로 이모티콘 만들어보신 그리네모님께 질문 드려봅니다 아 그리고 혹시 어도비 일러스트레이터의 대지같은 기능은 없는지 궁금합니다! 그럼 천천히 답변주시면 감사하겠습니다!
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 유튜브 사이트 만들기
깃허브 웹호스팅 배포관련
완강했습니다 그런데 이 작품을 깃허브 웹호스팅으로 배포하고싶은데 배포하면 root 디렉토리의 리드미파일만 배포되더라구요. 어떻게 해야되나요..
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
프로젝트 생성 시 오류
안녕하세요 강사님 가장 초반부 설정 강의를 듣고 있는데 프로젝트 파일 생성 하면 디버깅 시작 & 디버그 하지 않고 시작 버튼도 비활성화 되어있고 솔루션 탐색기 창에도 0개 프로젝트라고 해서 아무것도 보이지 않습니다. 여기저기 검색해봐도 해결책이 나오지 않아 여기에 질문 남깁니다.
-
해결됨[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
custom dataset을 생성할 때 annotation 관련 질문
강사님 안녕하세요! 특정 장애물(바위)을 detect 하기 위해서 CVAT 툴을 이용해 custom dataset을 생성하려고 합니다. 1. 학습을 위한 이미지 내의 모든 장애물들을 모두 annotate하지 않고 일부 개수만 annotate 하게 되면 annotate 되지 않은 것들 때문에 학습에 악영향을 끼칠 수 있을까요? 2. 그리고 이 장애물만 detect 하면 돼서 클래스 1개로 학습을 진행하려 하고 있는데, 클래스 수를 늘린다고 해서 학습 성능이 더 좋아질 가능성도 혹시 이론적으로 있나요? 유익한 강의 감사드립니다!
-
미해결홍정모의 따라하며 배우는 C언어
구조체 포인터 선언의 기억공간 할당 여부
구조체 설계 struct guy { char favfood[10], char job[10] }; 일 때는 기억공간을 아직 할당받지 않은 상태이고 구조체 변수 선언 혹은 선언 동시 초기화 할 때 메모리에 공간을 할당받는다고 이해했습니다. struct guy barney; 이 때 기억공간을 할당받는다 포인터는 새로운 구조체를 생성하지 않고 기존의 동일 구조체를 가리킨다고 하셨는데, 구조체 포인터 변수는 구조체 포인터 변수 선언 시 메모리에 공간을 할당 받나요? struct person* someone; [정리]구조체 포인터 변수의 메모리 할당 시점이 궁금합니다.
-
미해결홍정모의 따라하며 배우는 C언어
1.8 C언어와 함수 강의의 14:15 16:50 부분 질문있습니다.
안녕하세요. 강의 유익하게 잘 보고있습니다. 14:15, 16:50 부분 관련 질문있습니다. 14:15의 설명에서 return 뒤에 쓰이는 숫자가 exited with code 뒤에 출력으로 오는 것을 알 수 있고 16:50의 설명에서 int 와 7이 관련이 있다 하셔서 개인적으로 실험을 하나 해봤습니다. 강의의 코드를 float main() { return 7.7777; } 로 바꾸어서 실행하면 7.7777이 나올 것으로 생각했는데 실제 출력되는 숫자는 다른 숫자가 나옵니다. 혹시 return 함수가 실수형은 받지 않아서 이런 현상이 나타나는 건가요?
-
미해결비전공자를 위한 진짜 입문 올인원 개발 부트캠프
코드 작성법 질문
function makNewList_P(allProducts){ var newListProducts = []; for(var i=0; i<allProducts.length;i++){ if(allProducts[i].price>60000){ newListProducts.push(allProducts[i]);}} return newListProducts; } const over60000Products=makNewList_P(allProducts); 최종문제에 대해서 이렇게 먼저 작성해보고 답을 봤는데 if전에 var product = products[i]; var price = product.price; 이런식으로 변수를 미리 저장하시는데 이유가 있을까요? 잘못된 습관 가질까봐 질문드립니다 ㅠㅠ