묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
props
FollowList.prototype={ header:prototype.string.isRequired, data:prototype.array.isRequired, } 해당 영상 까지만 봤을 때 Followlist, _app.js, AppLayout.js 이렇게 세 곳에서 위 코드를 사용하시는데 해당 코드를 어떨때 사용 하나요 ? 즉, props-types 를 어느 상황에 써야하는 지 잘 모르겠습니다. 자식 component 에게 넘겨주기만 하다기에는 그냥 props 를 넘겨주면 될거같은데 ..ㅜㅜ 나중에 혼자 개발 할때 어느상황에 써야하는지 정확하게 모를거 같아서 질문 남깁니다 ㅜㅜ
-
미해결애플 웹사이트 인터랙션 클론!
innerWidth에 대해 / 캔버스 드로우 애니메이션 1 강의부분
늘 강의 감사히 듣고있습니다. 캔버스 드로우 애니메이션1 에 21:33 부분에서 innerWidth가 스크롤바를 포함한다고 하신부분이 검색해보니 innerWidth는 스크롤바를 포함하지않는크기라고 나오더라구요 https://webclub.tistory.com/105 제가 잘못알고있는걸까요?; 중복질문이면 죄송합니다.
-
미해결자바 프로그래밍 입문 강좌 (renew ver.) - 초보부터 개발자 취업까지!!
18강 상속에서요
부모가 private일때 상속되지 않고 접근이 불가능하다고 하는데, 이걸 getter setter로 접근이 가능하게끔 만들 수 있는건가요?
-
미해결데브옵스(DevOps)를 위한 쿠버네티스 마스터
AWS EKS 사용법도 만들어주실 수 있나요?
강의 신청부터 하고 질문 남깁니다^^; 저는 AWS EKS를 이용하여 서비스 운영을 해보려고해요, 혹시 EKS 강의도 올려주실 수 있을까요? 혹은 강의 다 보고 실습하면 EKS 셋팅 정도는 수월하게 할 수 있을지 궁금합니다!!
-
미해결Vue.js 끝장내기 - 실무에 필요한 모든 것
토큰값을 axios 인터셉트에서 불러올때 store.state.token 으로 하는게 맞나요?
스토어에 저장된 토큰값을 axios 인터셉트에서 불러올때store.state.token 으로 하는게 맞나요? 안되네요?참고로 개발자 툴(vuex)에서 확인해보면 token값은 존재합니다.소스는 아래와 같습니다.import axios from 'axios';import store from '@/store/index';// axios 인스턴스를 생성합니다.const instance = axios.create({baseURL: process.env.VUE_APP_API_URL,// timeout: 1000,});instance.interceptors.request.use(function(config) {// 요청 성공 직전 호출됩니다.// axios 설정값을 넣습니다. (사용자 정의 설정도 추가 가능)console.log('token', store.state.token);// const token = this.$store.state.token;config.headers.Authorization = store.state.token;return config;},function(error) {// 요청 에러 직전 호출됩니다.return Promise.reject(error);},);
-
[리뉴얼] React로 NodeBird SNS 만들기
쿠키 공유는 되는데 로그인 유지가 안되여
삭제된 글입니다
-
미해결MQTT 사물인터넷 통신 프로젝트 (Arduino, MQTT, Node.js, mongoDB, Android)
npm install 시 .. 에러
안녕하세요 선생님 강의 잘듣고있습니다. 다름이 아니라 초기 개발환경설정 시에 package.json -> npm install 시 자꾸 에러가나옵니다.... 에러 메세지는 다음과 같습니다. ================================= audited 101 packages in 1.246s found 4 vulnerabilities (3 low, 1 critical) run `npm audit fix` to fix them, or `npm audit` for details ================================= 처음에 환경 바꿀시 이런 메세지가 나오는데 관련이 있는지요,, 답변 부탁드립니다.. Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.) C:\Users\gjrjs\AppData\Roaming\npm\express -> C:\Users\gjrjs\AppData\Roaming\npm\node_modules\express-generator\bin\express-cli.js + express-generator@4.16.1 updated 1 package in 0.555s
-
미해결남박사의 파이썬으로 실전 웹사이트 만들기
pymongo.errors.operationfailure 에러는 왜 발생할까요??
아래 스크립트 실행 하였고 from flask import Flask from flask import request from flask import render_template from flask_pymongo import PyMongo app = Flask(__name__) app.config["MONGO_URI"] = "mongodb://localhost:27017/myweb" mongo = PyMongo(app) @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, contents, title) board = mongo.db.board post = { "name": name, "title": title, "contents": contents, } board.insert_one(post) return "" else: return render_template("write.html") if __name__ == "__main__": app.run(host="0.0.0.0", debug=True, port=9000) 웹페이지에서 값 입력 후 제출 버튼 누르면 아래 에러가 발생합니다. 왜 이러는 걸까요?? 혹시 robo3T에서 어드민을 설정해서 이런걸까요?? 뭐 하나 할때마다 이런 에러가 나네요...ㅜㅜ
-
미해결현존 최강 크롤링 기술: Scrapy와 Selenium 정복
크롤링 후 가공에서 원이랑 , 빼는 부분에서 되는 열이 있고 안되는 열이 있는데 왜 그런지 몰르겠어요
크롤링 후 가공에서 원이랑 , 빼는 부분에서 되는 열이 있고 안되는 열이 있는데 왜 그런지 몰르겠어요
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
선생님 ㅠㅠ 질문이요
로그인 기능 구현중 빨간줄로 오류가 나서 서버 스타트를 하지 못하는 상황인데.. 전 선생님과 코드를 똑같이 진행했는데 왜 오류가 나는 걸까요?ㅠㅠ 단순 오류 같은데 못찾겠어서 이렇게 질문 드립니다.. 그리고 무료로 좋은 강의 해주셔서 감사합니다 !!
-
미해결예제로 배우는 스프링 입문 (개정판)
localhost:8080으로 접속하였으나
스프링 프레임워크를 처음 시작한 사람입니다. 강의를 보면서 차근차근 따라해보고 있는데,,, 어째서인지 강의에서 보여준 화면과 다르게 위 사진처럼 나옵니다ㅠㅠ 혹시 제가 중간에 빠트린 부분이 있는지, 아니면 뭘 잘못건드린건지 잘 모르겠습니다ㅠ.ㅠ
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
GPUs 할당량 변경이 안됩니다.
구글측에서 이런 답변만 계속오는데 어떻게 해야하나요
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
풀스택 개발의 경우 어떤 순서로 개발을 하나요?
현재 배포 전까지의 강의를 복습을 하고 있는 중입니다. 저는 일단 db를 디자인 하고 swagger로 api를 작성하고 있습니다. 그런데 하다보니 이런 순서로 하는게 맞나 하는 생각이 드네요. 지금이야 백엔드 구조를 알고 있으니 이렇게 하고 있지만 몰라도 이렇게 했을까 생각중입니다. 먼저 프론트를 만들면서 필요한 백엔드에 대한 swagger api를 같이 작성하고 그 다음에 백엔드를 만드는게 더 깔끔한게 아닌가 싶네요. 제로초님은 풀스택 개발을 하실 때 어떤 순서로 진행하시나요?
-
미해결비개발자를 위한 RPA 강의 (UiPath 입문편)
오케스트라연동말고 별도 실행방법???
안녕하세요 강의로 많은 도움을 받았습니다. 이번 강의와는 약간 별개로 여쭈어보는데 혹시 uipath를 이용하여 프로세스를 개발완료했는데 이것을 오케스트라연동으로 실행이 아닌 사용자가 직접 사이트를 이용하지않고 URL 이라든지 프로세스등을 이용하여 실행할 수 있는방법이 있을까요 ? 예로 작업자가 필요할 경우에만 프로세스를 실행할 수 있는 방법이 필요합니다.
-
해결됨[리뉴얼] React로 NodeBird SNS 만들기
문의 드립니다. 팔로우 언팔로우 부분을 끝으로 강의해주신 부분을 테스트중에 회원 가입 부분을 실행해보니 아래와 같은 오류가 발생합니다. 런타임
회원 가입페이지 자체가 열리지 않습니다. AppLayout.js import React from "react"; import PropTypes from 'prop-types'; import Link from 'next/link'; import { Menu, Input, Row, Col } from 'antd'; import styled from 'styled-components'; import { useSelector} from 'react-redux'; import UserProfile from '../components/UserProfile'; import LoginForm from '../components/LoginForm'; const SearchInput = styled(Input.Search)` vertical-align: middle; `; const AppLayout = ({children}) => { const me = useSelector((state) => state.user.me?.id); // const inputStyle = useMemo(() => ({ verticalAlign: 'middle' }), []); return ( <div> <Menu mode="horizontal"> <Menu.Item> <Link href="/"><a>노드버드</a></Link> </Menu.Item> <Menu.Item> <Link href="/profile"><a>프로필</a></Link> </Menu.Item> <Menu.Item> <SearchInput enterButton /> </Menu.Item> <Menu.Item> <Link href="/signup"><a>회원가입</a></Link> </Menu.Item> </Menu> <Row gutter={8}> <Col xs={24} md={6}> {me ? <UserProfile /> : <LoginForm />} </Col> <Col xs={24} md={12}> {children} </Col> <Col xs={24} md={6}> </Col> </Row> </div> ); }; AppLayout.propTypes = { children: PropTypes.node.isRequired, }; export default AppLayout; signup.js import React, { useCallback, useState, useEffect } from 'react'; import { Form, Input, Checkbox, Button } from 'antd'; import { useDispatch, useSelector } from 'react-redux'; import Router from 'next/router'; import Head from 'next/head'; import styled from 'styled-components'; import { SIGN_UP_REQUEST } from '../reducers/user'; import useInput from '../hooks/useInput'; import AppLayout from '../components/AppLayout'; const ErrorMessage = styled.div` color: red; `; const Signup = () => { const dispatch = useDispatch(); const [ signUpLoading, me, signUpDone ] = useSelector((state) => state.user); const [email, onChangeEmail] = useInput(''); const [nickname, onChangeNickname] = useInput(''); const [password, onChangePassword] = useInput(''); const [passwordCheck, setPasswordCheck] = useState(''); const [passwordError, setPasswordError] = useState(false); const [term, setTerm] = useState(false); const [termError, setTermError] = useState(false); useEffect(() => { if (me) { alert('로그인했으니 메인페이지로 이동합니다.'); Router.push('/'); } }, [me && me.id]); useEffect(() => { if (signUpDone) { Router.replace('/'); } }, [signUpDone]); const onSubmit = useCallback(() => { if (password !== passwordCheck) { return setPasswordError(true); } if (!term) { return setTermError(true) } console.log(email, nickname, password ) return dispatch({ type: SIGN_UP_REQUEST, data: { email, password, nickname }, }); }, [email, password, passwordCheck, term]) const onChangePasswordCheck = useCallback((e) => { setPasswordCheck(e.target.value); setPasswordError(e.target.value !== password); }, [password]); const onChangeTerm = useCallback((e) => { setTerm(e.target.checked); setTermError(false); }, []); return ( <AppLayout> <Head> <meta charSet="utf-8" /> <title>회원가입 | NodeBird</title> </Head> <Form onFinish={onSubmit} style={{ padding: 10 }}> <div> <label htmlFor="user-email">이메일</label> <br /> <Input name="user-email" type="email" value={email} required onChange={onChangeEmail} /> </div> <div> <label htmlFor="user-nickname">닉네임</label> <br /> <Input name="user-nickname" value={nickname} required onChange={onChangeNickname} /> </div> <div> <label htmlFor="user-password">비밀번호</label> <br /> <Input name="user-password" type="password" value={password} required onChange={onChangePassword} /> </div> <div> <label htmlFor="user-password-check">비밀번호 체크</label> <br /> <Input name="user-password-check" type="password" value={passwordCheck} required onChange={onChangePasswordCheck} /> {passwordError && <ErrorMessage style={{ color: 'red'}}> 비밀번호가 일치하지 않습니다. </ErrorMessage> } </div> <div> <Checkbox name="user-term" checked={term} onChange={onChangeTerm}> 제로초 말을 잘 들을 것을 동의합니다. </Checkbox> {termError && <ErrorMessage style={{ color: 'red' }}> 약관에 동의하셔야 합니다. </ErrorMessage> } </div> <div style={{ marginTop: 10 }}> <Button type="primary" htmlType="submit" loading={signUpLoading}>가입하기</Button> </div> </Form> </AppLayout> ); }; export default Signup; reducers/user.js import produce from 'immer'; export const initialState = { logInLoading: false, // 팔로우 시도중.. 로딩창을 띄운다. logInDone: false, logInError: null, logOutLoading: false, // 언팔로우 시도중.. 로딩창을 띄운다. logOutDone: false, logOutError: null, followLoading: false, // 로그인 시도중.. 로딩창을 띄운다. followDone: false, followError: null, unfollowLoading: false, // 로그인 시도중.. 로딩창을 띄운다. unfollowDone: false, unfollowError: null, signUpLoading: false, // 회원가입 시도중.. 로딩창을 띄운다. signUpDone: false, signUpError: null, changeNicknameLoading: false, // 닉네임 변경 시도중.. 로딩창을 띄운다. changeNicknameDone: false, changeNicknameError: null, isLoggingIn: false, isLoggedIn: false, isLoggingOut: false, me: null, signUpData: {}, loginData: {}, }; export const LOG_IN_REQUEST = 'LOG_IN_REQUEST'; export const LOG_IN_SUCCESS = 'LOG_IN_SUCCESS'; export const LOG_IN_FAILURE = 'LOG_IN_FAILURE'; export const LOG_OUT_REQUEST = 'LOG_OUT_REQUEST'; export const LOG_OUT_SUCCESS = 'LOG_OUT_SUCCESS'; export const LOG_OUT_FAILURE = 'LOG_OUT_FAILURE'; export const SIGN_UP_REQUEST = 'SIGN_UP_REQUEST'; export const SIGN_UP_SUCCESS = 'SIGN_UP_SUCCESS'; export const SIGN_UP_FAILURE = 'SIGN_UP_FAILURE'; export const CHANGE_NICKNAME_REQUEST = 'CHANGE_NICKNAME_REQUEST'; export const CHANGE_NICKNAME_SUCCESS = 'CHANGE_NICKNAME_SUCCESS'; export const CHANGE_NICKNAME_FAILURE = 'CHANGE_NICKNAME_FAILURE'; export const FOLLOW_REQUEST = 'FOLLOW_REQUEST'; export const FOLLOW_SUCCESS = 'FOLLOW_SUCCESS'; export const FOLLOW_FAILURE = 'FOLLOW_FAILURE'; export const UNFOLLOW_REQUEST = 'UNFOLLOW_REQUEST'; export const UNFOLLOW_SUCCESS = 'UNFOLLOW_SUCCESS'; export const UNFOLLOW_FAILURE = 'UNFOLLOW_FAILURE'; export const ADD_POST_TO_ME = 'ADD_POST_TO_ME'; export const REMOVE_POST_OF_ME = 'REMOVE_POST_OF_ME'; export const ADD_COMMENT_TO_ME = 'ADD_COMMENT_TO_ME'; export const REMOVE_COMMENT_OF_ME = 'REMOVE_COMMENT_OF_ME'; const dummyUser = (data) => ({ ...data, nickname: '제로초', id: 1, // sequlize 에서 합쳐주는 데이터라서 앞글자가 대문자 이다. Posts: [{ id: 1 }], // 내가 쓴 게시글 Followings: [{nickname: '부기초' }, { nickname: 'Chanho Lee' }, { nickname: 'neue zeal'}], // 내 팔로윙들... Followers: [{nickname: '부기초' }, { nickname: 'Chanho Lee' }, { nickname: 'neue zeal'}], // 내 팔로워들... }); export const loginAction = (data) => { return { type: LOG_IN_REQUEST, data, }; }; export const logoutAction = () => { return { type: LOG_OUT_REQUEST, }; }; export const changeNickname = () => { return { type: CHANGE_NICKNAME_REQUEST, }; }; // return 이 생략된다. // const reducer = (state = initialState, action) => return produce (state, (draft) => { const reducer = (state = initialState, action) => produce (state, (draft) => { switch (action.type) { case FOLLOW_REQUEST: draft.followLoading = true; draft.followError = null; draft.followDone = false; break; case FOLLOW_SUCCESS: draft.followLoading = false; draft.me.Followings.push({ id: action.data }); draft.followDone = true; // me: action.data, => me: { ...action.data, nicname: 'zerocho' }, => dummyUser{ action.data }, break; case FOLLOW_FAILURE: draft.followLoading = true; // isLoggingOut: true, => logOutLoading: true, draft.followError = action.error; // logInError: action.error, => logOutDone: false, break; case UNFOLLOW_REQUEST: draft.unfollowLoading = true; draft.unfollowError = null; draft.unfollowDone = false; break; case UNFOLLOW_SUCCESS: draft.unfollowLoading = false; draft.unfollowDone = true; draft.me.Followings = draft.me.Followings.filter((v) => v.id !== action.data); // me: action.data, => me: { ...action.data, nicname: 'zerocho' }, => dummyUser{ action.data }, break; case UNFOLLOW_FAILURE: draft.unfollowLoading = true; // isLoggingOut: true, => logOutLoading: true, draft.unfollowError = action.error; // logInError: action.error, => logOutDone: false, break; case CHANGE_NICKNAME_REQUEST: draft.changeNicknameLoading = true; // 닉네임 변경 시도중이니까 => 버튼 로딩 O draft.changeNicknameDone = false; // 닉네임 변경중 draft.changeNicknameError = null; break; case CHANGE_NICKNAME_SUCCESS: draft.changeNicknameLoading = false; // 닉네임 변경 요청이 성공했으니까 => 버튼 로딩 X draft.changeNicknameDone = true; // 닉네임 변경 완료 break; case CHANGE_NICKNAME_FAILURE: draft.changeNicknameLoading = false; // 닉네임 변경 요청이 끝났으니까 => 버튼 로딩 X draft.changeNicknameError = action.error; break; case SIGN_UP_REQUEST: draft.signUpLoading = true; // 회원가입 시도중이니까 => true isLoggingOut: true, => logInLoading: true, draft.signUpDone = false; draft.signUpError = null; break; case SIGN_UP_SUCCESS: draft.signUpLoading = false; // 회원가입 요청이 성공했으니까 => false isLoggingOut: false, => logOutLoading: false, draft.signUpDone = true; // isLoggedIn: false, => logOutDone: true, break; case SIGN_UP_FAILURE: draft.signUpLoading = false; // 회원가입 요청이 끝났으니까 => false isLoggingOut: false, => logOutLoading: false, draft.signUpError = action.error; // 추가 break; case LOG_IN_REQUEST: draft.logInLoading = true; draft.logInError = null; draft.logInDone = false; break; case LOG_IN_SUCCESS: draft.logInLoading = false; draft.logInDone = true; draft.me = dummyUser(action.data); // me: action.data, => me: { ...action.data, nicname: 'zerocho' }, => dummyUser{ action.data }, break; case LOG_IN_FAILURE: draft.logInLoading = true; // isLoggingOut: true, => logOutLoading: true, draft.logInError = action.error; // logInError: action.error, => logOutDone: false, break; case LOG_OUT_REQUEST: draft.logOutLoading = true; // 로그아웃 시도중이니까 => true draft.logOutDone = false; draft.logOutError = null; break; case LOG_OUT_SUCCESS: draft.logOutLoading = false; // 로그아웃 요청이 성공했으니까 => false isLoggingOut: false, => logOutLoading: false, draft.logOutDone = true; // isLoggedIn: false, => logOutDone: true, draft.me = null; break; case LOG_OUT_FAILURE: draft.isLoggingOut = false; // 요청이 끝났으니까 => false isLoggingOut: false, => logOutLoading: false, draft.logOutError = action.error; // 추가 break; case ADD_POST_TO_ME: draft.me.Posts.unshift({ id: action.data }); break; // me: { // ...state.me, // Posts: [{ id: action.data }, ...state.me.Posts], // }, // }; case REMOVE_POST_OF_ME: draft.me.Posts = draft.me.Posts.filter((v) => v.id !== action.data); break; // return { // ...state, // me: { // ...state.me, // Posts: state.me.Posts.filter((v) => v.id !== action.data), // }, // }; // case ADD_COMMENT_TO_ME: // break; // me: { // ...state.me, // Posts: [{ id: action.data }, ...state.me.Posts], // }, // }; // case REMOVE_COMMENT_OF_ME: // break; // me: { // ...state.me, // Posts: state.me.Posts.Comments.filter((v) => v.id !== action.data), // }, // }; default: break; // default: // return state; // default: { // return { // ...state, // }; // } } }); export default reducer; sagas/user.js // all fork call put delay debounce throttle takeLatest tabkeEvery takeLeding taekMaybe import { all, put, fork, takeLatest, delay } from 'redux-saga/effects'; import axios from 'axios'; import { LOG_IN_REQUEST, LOG_IN_SUCCESS, LOG_IN_FAILURE, LOG_OUT_REQUEST, LOG_OUT_SUCCESS, LOG_OUT_FAILURE, SIGN_UP_REQUEST, SIGN_UP_SUCCESS, SIGN_UP_FAILURE, FOLLOW_REQUEST, FOLLOW_SUCCESS, FOLLOW_FAILURE, UNFOLLOW_REQUEST, UNFOLLOW_SUCCESS, UNFOLLOW_FAILURE, } from '../reducers/user'; function followAPI(data) { return axios.post('/api/follow', data); } function* follow(action) { try { // yield put({ // type: 'FOLLOW_REQUEST', // }); // const result = yield call(followAPI, action.data); // ex> const result = yield call(logInAPI, action.data, a, b, c); a, b, c 인자를 추가시 yield delay(1000); // throw new Error('') // 아래 catch 로 넘어간다. yield put({ type: FOLLOW_SUCCESS, data: action.data, }); } catch (err) { yield put({ // put => dispatch 다. type: FOLLOW_FAILURE, data: err.response.data, }); } } function unfollowAPI(data) { return axios.post('/api/unfollow', data); } function* unfollow(action) { try { // yield put({ // type: 'UNFOLLOW_REQUEST', // }); // const result = yield call(unfollowAPI, action.data); // ex> const result = yield call(logInAPI, action.data, a, b, c); a, b, c 인자를 추가시 yield delay(1000); // throw new Error('') // 아래 catch 로 넘어간다. yield put({ type: UNFOLLOW_SUCCESS, data: action.data, }); } catch (err) { yield put({ // put => dispatch 다. type: UNFOLLOW_FAILURE, data: err.response.data, }); } } function signUpAPI(data) { return axios.post('/api/logout', data); } function* signUp(action) { try { // yield put({ // type: 'LOG_IN_REQUEST', // }); // const result = yield call(signUpAPI, action.data); // ex> const result = yield call(logInAPI, action.data, a, b, c); a, b, c 인자를 추가시 yield delay(1000); // throw new Error('') // 아래 catch 로 넘어간다. yield put({ type: SIGN_UP_SUCCESS, data: action.data, }); } catch (err) { yield put({ // put => dispatch 다. type: SIGN_UP_FAILURE, data: err.response.data, }); } } function logOutAPI() { return axios.post('/api/logout'); } function* logOut() { try { // yield put({ // type: 'LOG_OUT_REQUEST', // }); // const result = yield call(logOutAPI); yield delay(1000); yield put({ type: LOG_OUT_SUCCESS, }); } catch (err) { yield put({ // put => dispatch 다. type: LOG_OUT_FAILURE, error: err.response.data, }); } } function* logIn(action) { try { console.log('saga logIn'); // yield put({ // type: 'LOG_IN_REQUEST', // }); // const result = yield call(logInAPI, action.data); // ex> const result = yield call(logInAPI, action.data, a, b, c); a, b, c 인자를 추가시 yield delay(1000); yield put({ type: LOG_IN_SUCCESS, data: action.data, }); } catch (err) { yield put({ // put => dispatch 다. type: LOG_IN_FAILURE, error: err.response.data, }); } } {/* takeLeading - 1번째 클릭만 실행 takeLatest - 마지막 클릭만 실행 ( [프론트 서버에서만] 먼저 실행한 부분은 놔두고 동시에 여러게가 실행된 경우만 마지막 이벤트만을 실행한다. ) takeEvery - 1번 사용하면 사라지는 take 대신... while 문(반복문)을 사용하지 않고도.. 계속 재사용할수 있도록 해준다. */} function* watchFollow() { yield takeLatest(FOLLOW_REQUEST, follow); // take =>logIn 액션이 실행될때까지 기다리겠다. } function* watchUnFollow() { yield takeLatest(UNFOLLOW_REQUEST, unfollow); // take =>logIn 액션이 실행될때까지 기다리겠다. } function* watchLogIn() { yield takeLatest(LOG_IN_REQUEST, logIn); // take =>logIn 액션이 실행될때까지 기다리겠다. } function* watchLogOut() { yield takeLatest(LOG_OUT_REQUEST, logOut); } function* watchSignUp() { yield takeLatest(SIGN_UP_REQUEST, signUp); // take =>logIn 액션이 실행될때까지 기다리겠다. } {/* all 은 배열을 받아서 배열안에 있는 명령들을 한번에 실행 시켜준다. fork 함수를 실행해준다. call도 있다. fork[비동기] - 결과를 기다리지 않고 다음 명령 실행을 진행한다. [논블로킹] call[동기] - 응답을 기다렸다가 응답을 받고 다음 명령을 실행 [블로킹] */} export default function* userSaga() { yield all([ fork(watchFollow), fork(watchUnFollow), fork(watchLogIn), fork(watchLogOut), fork(watchSignUp), ]); }
-
미해결자바 프로그래밍 입문 강좌 (renew ver.) - 초보부터 개발자 취업까지!!
선생님 이클립스 어떤거 다운받아야하나요?
쌤 "자바 프로그래밍 입문 강좌(renew ver.) - 초보부터 개발자 취업까지!!" 강좌 듣는 학생이에요. 색션 0. OT 영상 중간부분 28:45부분에서 "Eclipse IDE for Developers" 다운받으라고 하셨는데 선생님이 다운받으라고 하셨던 "Eclipse IDE for Developers"가 없고 지금 이클립스에는 "Eclipse IDE for enterprise Java Developers"로 올라와있는데 이거 다운받으면 되는거겠죠?
-
미해결파이썬 무료 강의 (기본편) - 6시간 뒤면 나도 개발자
pickle 에러
import pickle profile_file = open("profile.pickle", "rb") profile = pickle.load(profile_file) # file에 있는 정보를 profile에 불러오기 print(profile) profile_file.close() 이 부분에서 에러가 Traceback (most recent call last): File "/Users/terrykwag/Documents/PythonWorkspace/7. 입출력/pickle.py", line 4, in <module> import pickle File "/Users/terrykwag/Documents/PythonWorkspace/7. 입출력/pickle.py", line 13, in <module> profile = pickle.load(profile_file) # file에 있는 정보를 profile에 불러오기 AttributeError: partially initialized module 'pickle' has no attribute 'load' (most likely due to a circular import) 이렇게 뜨는데 왜 안되는걸까요? write는 잘 됐는데 ㅠㅠ
-
미해결생활코딩 - React
chrome extension 오류입니다.
This page doesn’t appear to be using React. If this seems wrong, follow the troubleshooting instructions. 라는 오류가 나서 access to url file 을 active 상태로 바꿨는데도 되지 않습니다.......
-
해결됨[라즈베리파이] IoT 딥러닝 Computer Vision 실전 프로젝트
vnc viewer 연결오류
해당 강의 다른 질문에서도 확인하였는데 vnc viewer 가 연결되기 위해서는 같은 무선네트워크에 접속해야한다고 하셨는데 만약 viewer를 데스크탑에 설치하여 랜선으로 연결되어있다면 연결은 불가능한건가요? 노트북으로 할때는 잘 되었는데 데스크탑 컴퓨터로 접속하니 timed out waiting for a response from a computer 라는 오류가 뜨며 연결이 안되네요
-
해결됨반응형 웹사이트 포트폴리오(Architecture Agency)
모바일에서 font-size, padding, width, margin등 질문있습니다.
보통 퍼블리셔들은 반응형만들때 psd를 보고하자나요.아이폰6기준 넓이 375라고하면 웹디자이너들은 375 * 2기준으로 디자인을 하거나 *3으로 디자인할때 padding이나 font-size는 어떻게 줘야하는지 em이나 rem에 대한 설명부분이 있엇으면 좋겠어요.