묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결그림으로 배우는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
8.6 강의 중 sysnet4admin/chk-info 이미지 bash 이슈
질문 답변을 제공하지만, 강의 비용에는 Q&A는 포함되어 있지 않습니다. 다만 실습이 안되거나, 잘못된 내용의 경우는 알려주시면 가능한 빠르게 조치하겠습니다![질문 전 답변]1. 강의에서 다룬 내용과 관련된 질문인가요? [예 | 아니요]2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? [예 | 아니요]3. 질문 잘하기 법을 읽어보셨나요? [예 | 아니요](https://www.inflearn.com/blogs/1719)4. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.5. vagrant up 에서 발생하는 문제는 주로 호스트 시스템(Windows, MacOS)과 연관된 다양한 조건에 의해 발생합니다. 따라서 이를 모두 제가 파악할 수 없어서 해결이 어렵습니다. vagrant up으로 진행이 어렵다면 제공해 드리는 가상 머신(VM) 이미지를 import해서 진행하시기 바랍니다. (https://www.inflearn.com/questions/992407/comment/281901)[질문 하기]안녕하세요. 어제 tardy-nginx 이미지와 같은 이슈인것 같은데요.sysnet4admin/chk-info 이미지도 bash가 없습니다.$ k exec deploy-podselector-int-only-78f84d76f6-mdks5 -it -- /bin/bash error: Internal error occurred: Internal error occurred: error executing command in container: failed to exec in container: failed to start exec "87fc9a16c37309940a9369f3128784a6beaba14bf2781064500b8876ad3653ca": OCI runtime exec failed: exec failed: unable to start container process: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown *일단은 /bin/sh 로 접속해 nc 명령어로 통신 확인만 했습니다.
-
미해결스프링 핵심 원리 - 기본편
스프링관련 로그가 뜨지않습니다
강의에서는 스프링관련 로그 (Bean)들이 뜨던데저는 뜨지않습니다 뭐가 잘못된 걸까요?? 물론 코드는 오류없이 동작합니다
-
미해결[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
train과 test의 카테고리가 동일하지않은경우에도 똑같이 통용되는 코드인가요?
학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!질문과 관련된 영상 위치를 알려주면 더 빠르게 답변할 수 있어요먼저 유사한 질문이 있었는지 검색해보세요
-
미해결
three.js에 json파일의 데이터를 보이게 하려면
let imageInfo = {}; fetch('/img.json') .then(response => response.json()) .then(data => { imageInfo = data.images.reduce((acc, img) => { acc[img.id] = img; return acc; }, {}); fetchAndBuildInfo(); console.log(imageInfo); }) .catch(error => console.error('Error loading img.json:', error)); const fetchAndBuildInfo = async () => { await fetch('/uploaded-images', { method: 'GET' }) .then(response => { if (!response.ok) { throw new Error('Failed to fetch images'); } return response.json(); }) .then(data => { const { fileUrls } = data; if (!Array.isArray(fileUrls)) { throw new Error('Response does not contain an array of image URLs'); } fileUrls.forEach((fileUrl, i) => { const frame = new MeshObject({ scene, cannonWorld, cannonMaterial: defaultCannonMaterial, mass: 0, // 중력 영향을 받지 않음 loader: textureLoader, name: `frame_${i}`, width: frameWidth, height: frameHeight, depth: frameDepth, x: i * frameSpacing - ((fileUrls.length - 1) * frameSpacing) / 2, y: 1.5, z: -9.9, mapSrc: fileUrl }); if (frame.cannonBody) { frame.cannonBody.type = CANNON.Body.STATIC; // 고정 } const id = fileUrl.split('/').pop(); const info = imageInfo[id]; console.log(`${imageInfo} : ${id} : ${info}`) if (info) { createInfoBox(info, frame); } else console.log("no info"); cannonObjects.push(frame); }); }) .catch(error => { console.error('Error fetching images:', error); }); } three.js를 이용해서 전시회 공간을 만들어보고 있습니다. 앞선 페이지에서 img에 대한 정보를 img.json파일에 저장하면 이를 three.js캔버스 공간에 불러와서 보이게 하고 싶은데 어떤 방법을 써야할까요? 현재 업로드된 파일 개수만큼 액자가 자동생성되게 해놓았는데 이 프레임을 클릭하거나 커서를 갖다대면 그림에 대한 information이 뜨게 하고 싶어요...ㅠㅠㅠ 계속 여기서 헤매고 있습니다.
-
미해결BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
[인프런 빅쿼리 빠짝스터디 3주차] 리텐션 분석
✅ 연습문제 (1) weekly retention--1) weekly retention WITH base AS ( -- 날짜 데이터 전처리 -- DATE도 실제 날짜와 일치하지 않을 수 있으니, 다시 확인하기 -- DATETIME(TIMESTAMP_MICROS(timestamp데이터),'대륙/국가') 기억하고 사용하기 SELECT DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul') AS event_datetime, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul')) AS event_date, event_name, user_pseudo_id FROM `bigquery-432401.avdanced.app_logs_temp` ) -- 일자 간 차이 구하기 , cal_week AS ( SELECT DISTINCT user_pseudo_id, -- 최초일(week 단위로) 구하기 DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, -- 원본 날짜 데이터에서 주차 데이터로 구하기 DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM base ), cal_diff AS ( -- 주차데이터간 차이 구하기 SELECT *, DATE_DIFF(event_week, first_week,WEEK) AS diff_week FROM cal_week ), user_count AS ( -- 주차별 user 수 구하기 SELECT diff_week, COUNT(distinct user_pseudo_id) as user_cnt FROM cal_diff GROUP BY diff_week ) -- 출력 SELECT *, ROUND(SAFE_DIVIDE(user_cnt, first_week_user_cnt),2) AS retention_rate FROM ( SELECT diff_week, user_cnt, FIRST_VALUE(user_cnt) OVER(ORDER BY diff_week) AS first_week_user_cnt FROM user_count ) 아직 익숙하지 않아서 중간중간 다시 코드 보고 작성했다. 점점 더 익숙해지길! (2) Retain UserWITH base AS ( -- 날짜 데이터 전처리 -- DATE도 실제 날짜와 일치하지 않을 수 있으니, 다시 확인하기 -- DATETIME(TIMESTAMP_MICROS(timestamp데이터),'대륙/국가') 기억하고 사용하기 SELECT DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul') AS event_datetime, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul')) AS event_date, event_name, user_pseudo_id FROM `bigquery-432401.avdanced.app_logs_temp` WHERE event_date BETWEEN "2022-08-01" AND "2022-11-03" ) , cal_diff AS ( -- 날짜데이터 간 차이 구하기 SELECT *, DATE_DIFF("2022-11-03", event_date,DAY) AS diff_date FROM base ), user_type AS ( -- user type 구하기 -- 0. 해당없음 -- 1. new : 첫번째 접속 --2. current : 최근 30일내에 접속 -- 3. resurrected : 30일 이상 활동이 없고, 최근 7일 이내 다시 접속한 사용자 -- 4. dormant : 최근 60일 간 접속기록 없음 SELECT *, CASE -- 첫 번째 접속 => 'new' WHEN diff_date = FIRST_VALUE(diff_date) OVER(PARTITION BY user_pseudo_id ORDER BY event_date) THEN 'new' -- 최근 30일 내에 접속한 사용자 => 'current' WHEN diff_date <= 30 THEN 'current' -- 30일 이상 활동이 없고, 최근 7일 이내 다시 접속한 사용자 => 'resurrected' WHEN diff_date > 30 AND diff_date <= 37 THEN 'resurrected' -- 60일 이상 접속하지 않은 사용자 => 'dormant' WHEN diff_date > 60 THEN 'dormant' ELSE 'none' END AS type FROM cal_diff GROUP BY all ORDER BY user_pseudo_id,diff_date ) SELECT * FROM user_type나름 user를 나눈다고 나눴는데, 잘 못 나눠진 느낌이 든다! 현업에는 어떻게 나눌지 궁금하다(3) 어떤 user가 많은가?WITH base AS ( -- 날짜 데이터 전처리 SELECT DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul') AS event_datetime, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp),'Asia/Seoul')) AS event_date, event_name, user_pseudo_id FROM `bigquery-432401.avdanced.app_logs_temp` WHERE event_date BETWEEN "2022-08-01" AND "2022-11-03" ), cal_diff AS ( -- 날짜데이터 간 차이 구하기 SELECT *, DATE_DIFF("2022-11-03", event_date, DAY) AS diff_date FROM base ), user_type AS ( -- user type 구하기 SELECT distinct user_pseudo_id, CASE WHEN diff_date = FIRST_VALUE(diff_date) OVER(PARTITION BY user_pseudo_id ORDER BY event_date) THEN 'new' WHEN diff_date <= 30 THEN 'current' WHEN diff_date > 30 AND diff_date <= 37 THEN 'resurrected' WHEN diff_date > 60 THEN 'dormant' ELSE 'none' END AS type FROM cal_diff ), cal_cnt AS ( -- 각 type별 사용자 수 계산 SELECT type, COUNT(user_pseudo_id) AS user_cnt FROM user_type GROUP BY type ) SELECT type, user_cnt, ROUND(user_cnt * 100.0 / (SELECT COUNT(*) FROM user_type), 2) AS ratio FROM cal_cnt ORDER BY ratio DESC new인 사용자가 69.87 %로 전체의 대다수를 차지한다. 그다음이 최근에 7일 내에 접속한 유저가 21.83%, resurrected : 30일 이상 활동이 없고, 최근 7일 이내 다시 접속한 사용자가 2.59%, 최근 60일 간 접속기록 없는 사용자가 1.25%를 차지하였다.2022-11-03일 기준 "2022-08-01" 에서 "2022-11-03" 기간 동안 서비스를 이용하는 대다수의 사람들은 신규 가입자들이 많다는 것을 알 수 있다.또한, current User가 많은 것으로 보아, 최근 7일이내에 서비스를 사용한 사람들의 비율이 두번째로 높다.현재 신규이용자의 수가 대다수를 차지함으로 이 신규 사용자를 current user로 전환하기 위한 전략을 고안해야 할 것으로 보인다.none이 resurrected, dormant보다 많은데, type을 나누는 기준을 수정하면 더 효율적이게 나눌 수 있지 않을까 생각된다.(4) core event를 click_payment로 놓았을 때 Weekly retentionWITH base AS ( SELECT event_name, user_pseudo_id, DATE(DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul')) AS event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_time FROM `bigquery-432401.avdanced.app_logs_temp` WHERE event_name = "click_payment" ), week_diff AS ( SELECT *, DATE_DIFF(event_week, first_week, WEEK) AS diff FROM ( SELECT DISTINCT user_pseudo_id, DATE_TRUNC(MIN(event_date) OVER(PARTITION BY user_pseudo_id), WEEK(MONDAY)) AS first_week, DATE_TRUNC(event_date, WEEK(MONDAY)) AS event_week FROM base ) ), user_counts AS ( SELECT diff, COUNT(DISTINCT user_pseudo_id) AS user_cnt FROM week_diff GROUP BY diff ) SELECT *, ROUND(SAFE_DIVIDE(user_cnt, first_week_user_cnt), 2) AS retention_rate FROM ( SELECT diff, user_cnt, FIRST_VALUE(user_cnt) OVER(ORDER BY diff ASC) AS first_week_user_cnt FROM user_counts )1주차 이후로 사용자의 수가 급감. 2주차 부터는 계속 0.01을 유지. 15주차부터 24주차까지는 0 retention rate를 유지.사용자가 1주차 이후로 대거 이탈함을 볼 수 있음. 15주차부터 0.01에서 0.0으로 감소. 1주차에 이벤트 혹은 서비스 런칭으로 사용자수가 급격히 증가하였으나, 서비스 경험이 사용자에게 매력적으로 다가오지 못하여 바로 그 다음주부터 급격하게 감소하는 것을 볼 수 있음.따라서, core_event에 대한 근본적인 개선이 필요할 것으로 보임. ✅ 배운점 및 느낀점 리텐션 분석에 대한 전반적인 지식을 얻을 수 있었다. 아직, 데이터에서 리텐션 분석을 하는 것이 익숙치 않아 학습을 더 해야 할 것 같다. user type을 나누는 부분에서 더 짜임새 있는? 기준이 뭔지, 현업에서는 어떤 기준으로 사용자를 나누는지 궁금하다!고객을 분석하기 위해서는 어떤 부분을 더 봐야하는 지 아직 크게 감이 없는데, 다른 레퍼런스를 보는 것이 필요할 것 같다는 생각이 들었다
-
해결됨직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
엑셀의 2행에서 7행의 데이터를 다루는데 for row in range(2, 8): 으로 해야하는 이유는?
2-4. [응용] 엑셀문서 값을 필드에 입력하기 관련입니다. 강의 내용 중 for문 안에 ws.Range를 넣어, 엑셀문서의 모든 행을 출력해보는 내용이 있습니다.여기서 다루는 엑셀의 데이터는 아래와 같습니다. 여기서 다루는 범위는 2행(마크, 남 ...)부터 7행(슬아, 여, ...)이므로,for row in range(2,7):이라고 해야 맞는 게 아닌가 싶은데,for row in range(2,7):로 해보면 아래와 같이 원하는 결과가 아닙니다.실제 7행인 ['리사', '여', '1969년 11월 7일', '게임'] 가 빠진 결과가 나옵니다.for row in range(2,7): data = list( ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value[0] ) data[2] = data[2].strftime("%Y년 %#m월 %#d일") print(data) ['마크', '남', '1984년 5월 14일', 'VR'] ['빌', '남', '1955년 10월 28일', '기부'] ['일론', '남', '1971년 6월 28일', '트위터'] ['제프', '남', '1964년 1월 12일', '독서'] ['리사', '여', '1969년 11월 7일', '게임'] 반면에,for row in range(2,8):이라고 해야만 아래와 같이 엑셀의 2행부터 7행의 데이터가 원하는대로 출력이 됩니다.for row in range(2,8): data = list( ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value[0] ) data[2] = data[2].strftime("%Y년 %#m월 %#d일") print(data) ['마크', '남', '1984년 5월 14일', 'VR'] ['빌', '남', '1955년 10월 28일', '기부'] ['일론', '남', '1971년 6월 28일', '트위터'] ['제프', '남', '1964년 1월 12일', '독서'] ['리사', '여', '1969년 11월 7일', '게임'] ['슬아', '여', '1983년 6월 16일', '쇼핑'] 2행부터 7행의 데이터를 출력하는데 왜for row in range(2,8): 로 하는 것이 맞는 것인지 궁금합니다.
-
해결됨한 입 크기로 잘라 먹는 리액트(React.js) : 기초부터 실전까지
12.11 invalid Date 오류
따라서 하고 있었는데 다음 그림과 같이 invalid Date 라는 값이 떠서 관련 질문 드립니다. 강의 몇번 돌려보면서 오타가 있나 봤는데 도저히 모르겠어서 질문 드립니다...// App.jsx import "./App.css"; import { Routes, Route, Link, useNavigate } from "react-router-dom"; import Home from "./pages/Home"; import Diary from "./pages/Diary"; import New from "./pages/New"; import Edit from "./pages/Edit"; import Notfound from "./pages/Notfound"; import { useReducer, useRef, createContext } from "react"; const mockData = [ { id: 1, createdDate: new Date("2024-11-13").getTime(), emotionId: 1, content: "1번 일기 내용", }, { id: 2, createdDate: new Date("2024-11-10").getTime(), emotionId: 2, content: "2번 일기 내용", }, { id: 3, createdDate: new Date("2024-10-11").getTime(), emotionId: 3, content: "3번 일기 내용", }, ]; function reducer(state, action) { switch (action.type) { case "CREATE": return [action.data, ...state]; case "UPDATE": return state.map((item) => String(item.id) === String(action.data.id) ? action.date : item ); case "DELETE": return state.filter((item) => String(item.id) !== String(action.id)); default: return state; } } export const DiaryStateContext = createContext(); export const DiaryDispatchContext = createContext(); function App() { const [data, dispatch] = useReducer(reducer, mockData); const idRef = useRef(3); const onCreate = (createdDate, emotionId, content) => { dispatch({ type: "CREATE", data: { id: idRef.current++, createdDate, emotionId, content, }, }); }; const onUpdate = (id, createdDate, emotionId, content) => { dispatch({ type: "UPDATE", data: { id, createdDate, emotionId, content, }, }); }; const onDelete = (id) => { dispatch({ type: "DELETE", id, }); }; return ( <> <DiaryStateContext.Provider value={data}> <DiaryDispatchContext.Provider value={{ onCreate, onDelete, onUpdate }}> <Routes> <Route path="/" element={<Home />} /> <Route path="/new" element={<New />} /> <Route path="/diary/:id" element={<Diary />} /> <Route path="/edit/:id" element={<Edit />} /> <Route path="*" element={<Notfound />} /> </Routes> </DiaryDispatchContext.Provider> </DiaryStateContext.Provider> </> ); } export default App; //Home.jsx import { useState, useContext } from "react"; import { DiaryStateContext } from "../App"; import DiaryList from "../components/DiaryList"; import Header from "../components/Header"; import Button from "../components/button"; const getMonthlyData = (pivotDate, data) => { const beginTime = new Date( pivotDate.getFullYear(), pivotDate.getMonth(), 1, 0, 0, 0 ).getTime(); const endTime = new Date( pivotDate.getFullYear(), pivotDate.getMonth() + 1, 0, 23, 59, 59 ).getTime(); return data.filter( (item) => beginTime <= item.createdDate && item.createdDate <= endTime ); }; const Home = () => { const data = useContext(DiaryStateContext); const [pivotDate, setPivotDate] = useState(new Date()); const monthlyData = getMonthlyData(pivotDate, data); console.log(monthlyData); const onIncreaseMonth = () => { setPivotDate(new Date(pivotDate.getFullYear(), pivotDate.getMonth() + 1)); }; const onDecreaseMonth = () => { setPivotDate(new Date(pivotDate.getFullYear(), pivotDate.getMonth() - 1)); }; return ( <div> <Header title={`${pivotDate.getFullYear()}년 ${pivotDate.getMonth() + 1}월`} leftChild={<Button onClick={onDecreaseMonth} text={"<"} />} rightChild={<Button onClick={onIncreaseMonth} text={">"} />} /> <DiaryList data={monthlyData} /> </div> ); }; export default Home; //diaryList.jsx import Button from "./button"; import "./DiaryList.css"; import DiaryItem from "./DiaryItem"; const DiaryList = ({ data }) => { return ( <div className="DiaryList"> <div className="menu_bar"> <select> <option value={"latest"}>최신순</option> <option value={"oldest"}>오래된 순</option> </select> <Button text={"새 일기 쓰기"} type={"POSITIVE"} /> </div> <div className="list_wrapper"> {data.map((item) => ( <DiaryItem key={item.id} {...item} /> ))} </div> </div> ); }; export default DiaryList; //DiaryItem.jsx import { getEmotionImage } from "../util/get-emotion-image"; import Button from "./button"; import "./DiaryItem.css"; const DiaryItem = (id, emotionId, createdDate, content) => { return ( <div className="DiaryItem"> <div className={`img_section img_section_${emotionId}`}> <img src={getEmotionImage(1)} /> </div> <div className="info_seciton"> <div className="created_date"> {new Date(createdDate).toLocaleDateString()} </div> <div className="content">{content}</div> </div> <div className="button_section"> <Button text={"수정하기"} /> </div> </div> ); }; export default DiaryItem;
-
미해결
견적서 문의
안녕하세요수강을 희망하는 학생입니다. 제가 연구실 소속이라 강의를 결제하려면 견적서가 필요한데"문의하기"란이 안보여 글 남깁니다."한국에서 제일 쉬운 리눅스 커널 강의"강의 견적서를 받을 수 있을까요?강의 주소남깁니다.https://www.inflearn.com/course/%ED%95%9C%EA%B5%AD%EC%97%90%EC%84%9C-%EC%A0%9C%EC%9D%BC%EC%89%AC%EC%9A%B4-%EB%A6%AC%EB%88%85%EC%8A%A4%EC%BB%A4%EB%84%90-%EA%B0%95%EC%9D%98
-
미해결AI로 돈 버는 법 - 사례로 알아보는 AI Transformation
강의 영상 오류
섹션4의 'AI Transformation에 필요한 단계별 과정' 강의와섹션6의 'AI 직군별 요구 역량 강의'가 똑같은 것 같습니다.
-
해결됨직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
한글 표의 필드명 표시방법이 있을까요?
한글문서 표 안에 셀 별로 필드명을 지정했습니다.일반 문서의 필드명은 누름틀 이름이 나오는데셀의 필드명은 표시가 되지 않더라구요..셀의 필드명 확인하기가 번거로운데 혹시 방법이나 팁이 있나 싶어 여쭤봅니다
-
미해결
할인율 태그가 부분적으로 없는 상황에서의 할인율 크롤링
안녕하세요~^^쇼핑몰에서 가격과 할인율을 전처리 하려고 합니다. 그런데 할인율의 경우 할인을 안 하는 상품에서 아예 클래스가 없어서 if문을 사용해 그 상품의 할인율에 0%를 추가하고 싶은데 적용이 되지 않습니다. 어떤 방법을 사용해야 할 지 궁금합니다. 코드는 아래의 두 가지 방법으로 짜보았습니다. 도와주세요... # 할인율 추출 (없으면 0%로 처리) discount = element.text.strip() if element.text.strip() else '0%' # 비어있으면 '0%'로 설정 if not discount: # Check if discount is empty discount ='0%' # Set to '0%' if no discount is found
-
미해결
파이썬 어플을 웹프로그래밍으로 변환하려면 어떤 과정을 배우면 될까요?
안녕하세요 파이썬 어플을 하나 만들었을때 이것을 브라우저 환경에서 구동하도록 만들려면 어떤 과정을 배우면 될까요? 검색해보니 백엔드, 프론트엔드, 장고, 플라스크 이런 용어가 나오는데.풀스택은 이 모든 것을 포함하는 것 일까요? 어떤 과정 또는 과정들을 배우면 가장 빠르게 파이썬 어플을 웹 어플리케이션으로 변환해서 서비스가 가능할지 문의드립니다. 감사합니다
-
해결됨직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
data = list( ~~~ .Value) 일 경우 오류 발생 이유?
2-4. [응용] 엑셀문서 값을 필드에 입력하기 관련입니다.※ 원 질문글 올린 이후, 공부해서 이 글에 자문자답하였습니다. 검토 부탁드립니다. 감사합니다. 질문을 드리기 위하여 파이썬 콘솔(IPython 적용)에서 진행한 코드를 아래에 먼저 제시 후 말씀드리겠습니다.excel = win32.gencache.EnsureDispatch("Excel.Application") excel.Visible = True wb = excel.Workbooks.Open(r"c:\Users\user\desktop\취미.xlsx") ws = wb.Worksheets(1) row = 2 data = list(ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value[0]) print(data[2]) 1984-05-14 00:00:00+00:00 row = 2 data = list(ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value) print(data[2]) Traceback (most recent call last): File "C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages\IPython\core\interactiveshell.py", line 3577, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-9-a5cbf3d139c3>", line 1, in <module> print(data[2]) IndexError: list index out of range # 아래는, data = ~~~.value[0] 일 경우의 데이터 형태를 출력해 보기 위함. data = list(ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value[0]) print(data) ['마크', '남', pywintypes.datetime(1984, 5, 14, 0, 0, tzinfo=TimeZoneInfo('GMT Standard Time', True)), 'VR'] # 아래는, data = ~~~.value 일 경우의 데이터 형태를 출력해 보기 위함. data = list(ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value) print(data) [('마크', '남', pywintypes.datetime(1984, 5, 14, 0, 0, tzinfo=TimeZoneInfo('GMT Standard Time', True)), 'VR')] # 위에서 확인 결과, data = ~~~.value[0] 일 경우와 data = ~~~.value 일 경우에, # print로 데이터 출력한 결과는 거의 비슷하나, # data = ~~~.value 일 경우에는 대괄호 안에 괄호가 하나 더 있음. 위의 과정에서 아래와 같이 진행하면 물론 정상적으로 출력됩니다.row = 2 data = list(ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value[0]) print(data[2]) 1984-05-14 00:00:00+00:00 하지만 아래와 같이 진행하면 오류가 납니다. 원 코드에서 ~~~.Value 뒤에 [0] 만 빼 본 것입니다.row = 2 data = list(ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value) print(data[2]) Traceback (most recent call last): File "C:\Users\user\AppData\Local\Programs\Python\Python310\lib\site-packages\IPython\core\interactiveshell.py", line 3577, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-9-a5cbf3d139c3>", line 1, in <module> print(data[2]) IndexError: list index out of range row = 2 로 지정했으므로,data = list(ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value) 은엑셀의 (2,1)부터 (2,4)의 값을 리스트로 가져오는 것일테고,원 코드인 data = list(ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value[0]) 도 역시,지정한 범위의 값들 중 첫번째 행의 값만 가져오므로,엑셀의 (2,1)부터 (2,4)의 값을 리스트로 가져오는 것은 두 경우에 같아 보이는데,[질문 1]왜 원 코드에서는 print(data[2]) 입력했을 때 정상적으로 출력이 되고,원 코드에서 [0] 만 뺀 경우에는 print(data[2]) 입력했을 때 오류가 나는 것이지요?__________________________________________________________________________________P.S. _1 --- 이 질문글 올리고 천천히 강의내용을 다시 읽어 보니,위 코드의 두 번째 라인을 보면, 리턴되는 값을 리스트로 변환하는 코드가 들어 있습니다.기본적으로 ws.Cells나 ws.Range가 리턴하는 값은 튜플인데,이 중 특정 값을 수정하기 위해 튜플을 수정 가능한 리스트 자료형으로 변환을 해 주었습니다.라는 글이 눈에 들어오네요.(※ 처음 읽었을 때는 무슨 말인지 잘 몰랐는데, 강의 내용에 다 써 있는데 제가 이해를 못했던 부분이 많네요.)[('마크', '남', pywintypes.datetime(1984, 5, 14, 0, 0, tzinfo=TimeZoneInfo('GMT Standard Time', True)), 'VR')]요러한 형태가 말씀하신 튜플이라는 것이죠? 이런 형태의 data는 값을 수정할 수 없다는 말씀이죠?반면에,['마크', '남', pywintypes.datetime(1984, 5, 14, 0, 0, tzinfo=TimeZoneInfo('GMT Standard Time', True)), 'VR']요러한 형태는 튜플이 아닌 리스트 자료형이라는 것이죠? 이런 형태만이 data 값을 수정할 수 있다는 말씀이죠?[질문 2]튜플 형태의 데이터에 대하서는 data 값을 수정할 수 없는 것 뿐만 아니라 0, 1, 2번째의 데이터를 선택하는data[0]data[1]data[2]이러한 형태의 명령어조차도 쓸 수 없는 것이죠?제가 쓴 이 내용들이 맞는지만 확인 부탁드립니다.__________________________________________________________________________________ P.S. _2 --- 왕초보들이 더 쉽게 이해할 수 있게 개선의견을 말씀드리면, 아래와 같은 간단한 언급을 추가해주시면 더 좋지 않을까 합니다. (아래 쓴 내용이 맞다면요.) 튜플 형태의 data는 값을 수정할 수 없는데,튜플 형태의 data를 print(data) 했을 때는 [( ~~~~ )] 형태로 확인되고,리스트 형태의 data는 값을 수정할 수 있는데,리스트 형태의 data를 print(data) 했을 때는, 괄호 ( ) 가 없이 [ ~~~ ] 형태로 확인되니 참고하세요.참고로 튜플 형태의 data에 대해서는 data[2] 와 같은 형태로 데이터를 선택하는 명령어도 사용 불가능합니다. 튜플 형태의 data를 리스트 형태의 데이터로 바꿔야만 data[0] 와 같이 데이터를 선택하는 명령어를 사용 가능합니다.확인 부탁드립니다. 감사합니다. ____________________________________________________________________________________________________________________________________________________________________ 위 질문 글을 쓴 이후에 더 공부해 보고 아래와 같이 원인을 추정했습니다. 아래 내용이 위 [질문 1] 과 [질문 2]에 대한 답이 맞나요? 일코님이 바쁘실텐데 낮은 수준의 질문에 답변하느라 애쓰실 것에 죄송하여 그 사이에 자문자답(?)을 해보았습니다. [질문 1] Value[0]을 사용한 경우에는 정상적으로 출력되고, Value만 사용한 경우에는 오류가 발생하나요? [원인 분석]엑셀에서 win32com을 사용하여 특정 셀 범위의 값을 가져올 때, Range.Value는 튜플 형태로 반환됩니다. 이때 반환된 값은 2차원 배열처럼 행(row) 단위로 묶여있습니다.ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value는 튜플 안의 튜플 형태로 데이터를 반환합니다.예를 들어, (2,1)부터 (2,4)까지의 값을 가져오면 결과는 다음과 같습니다:(('마크', '남', datetime 객체, 'VR'),)반면에 ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value[0]은 첫 번째 행의 값을 선택하는 것이므로, 단일 튜플이 됩니다:('마크', '남', datetime 객체, 'VR')따라서 data = list(ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value)의 경우 data는 튜플 안에 또 다른 튜플이 있는 상태입니다. 이때 data[2]를 호출하면 "IndexError"가 발생하는 이유는 data가 한 개의 튜플을 포함하고 있기 때문입니다. 즉, data 안에는 튜플이 있고, 실제 데이터는 그 튜플 안에 들어 있기 때문입니다.반면에 data = list(ws.Range(ws.Cells(row,1), ws.Cells(row,4)).Value[0])을 사용하면 튜플 중 첫 번째 행의 데이터를 직접 리스트로 변환하므로 data[2]를 정상적으로 호출할 수 있습니다. [위 내용 요약] Value[0] 사용하면 첫 번째 행의 데이터를 직접 가져오기 때문에 인덱싱이 가능하지만, Value만 사용하면 전체 범위가 튜플로 감싸져 있어 인덱싱 시 오류가 발생합니다. [질문 2] 튜플 형태의 데이터에서 값을 수정하거나 인덱싱할 수 있나요? [내용 추정]튜플은 불변(immutable) 자료형이기 때문에 한 번 생성된 후에는 그 값을 수정할 수 없습니다.하지만 튜플 내의 요소들을 조회하는 것은 가능합니다.즉,수정 불가: 튜플 내의 데이터를 변경하거나 삭제할 수 없습니다.mytuple = (1, 2, 3) mytuple[0] = 100 # TypeError 발생조회 가능: 튜플 내 특정 인덱스의 데이터를 조회하는 것은 가능합니다.mytuple = (1, 2, 3) print(mytuple[0]) # 출력: 1따라서 질문에서 언급한 것처럼 튜플 형태의 데이터에서는 값을 수정할 수 없지만, 인덱싱을 통해 특정 요소에 접근하는 것은 가능합니다.즉:data[0] # 가능 data[1] # 가능 data[2] # 가능따라서 인덱스 접근은 가능하지만 수정은 불가능합니다. 다만, 주의할 점은 위에서data[0] # 가능이라고 하였지만, 이것은 data가 튜플일 경우입니다.data가 튜플 내에 튜플인 경우, 즉 이중 튜플인 경우에는,data[0] # IndexError 발생 [위 내용 요약] 튜플은 불변 자료형으로 값을 수정할 수 없지만, 인덱스를 통해 요소를 조회하는 것은 가능합니다. 다만, 이중 튜플인 경우 인덱스를 통해 요소를 조회 시도 시 IndexError가 발생합니다.
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
여러 태그 제어하는 방법 강의 질문입니다
여러 태그 제어하는 방법 강의 질문입니다해당 강의에서 알려주신대로 gmarket 에서 작업하면 봇으로 인식해서진행이 안 됩니다.사람인지 확인하는 절차가 나오는데이 부분에서 더 이상 진행되지 않습니다.강의를 위해서 만드신 사이트 말고 실제 gmarket 같은 곳에서할 수 있는 방법을 알려주세요
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
무한 스크롤 처리하기 강의에서 실행이 안 됩니다.
안녕하세요 무한 스크롤 처리하기 강의에서 실행이 안 됩니다.06:45 부분입니다.이 code 수정한 영상 다시 올리셔야 할 것 같습니다.바쁘셔서 강의 영상 다시 촬영하시기 힘드시면소스 수정해야 한다고 자막으로라도 올려주세요처음 수강하는 사람 입장에서 시간 낭비가 심합니다.부탁합니다. last_height = driver.execute_script('return document.body.scrollHeight')while True:driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')time.sleep(1)new_height = driver.execute_script('return document.body.scrollHeight')if new_height == last_height: breaklast_height = new_height 강의에서 알려주신 대로 실행하면한 번에 맨 마지막까지 scroll 됩니다.강의에서 보여주시는 대로 되지 않습니다.어떻게 해야 하는지 자세하게 알려주세요
-
미해결
강의 자료
강의 자료 링크가 동작이 안되는데 확인 부탁 드립니다!
-
미해결김영한의 실전 자바 - 중급 1편
engine = new Engine(this) 는 어떤 식으로 인스턴스화가 이루어지나요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. private String model; private int chargeLevel; private Engine engine; public Car(String model, int chargeLevel) { this.model = model; this.chargeLevel = chargeLevel; engine = new Engine(this); }Car 를 생성하는 도중에 Engine 객체를 생성하기 위해 this 로 자기 자신을 넘겨주게 되면 어떤 순서로 객체가 만들어지는 건가요?- 초기화가 제대로 이루어지지 않은 Car 객체를 Engine에 넘겨주는 건가요?- 아니면 객체의 필드를 초기화하고 생성하기 이전에 참조 값만 생성해서 넘겨주는 건가요?
-
미해결수학 없이 시작하는 인공지능 첫걸음: 기초부터 최신 트렌드까지
강의 재생이 안되요
동영상 재생이 아예 안됩니다.
-
미해결그림으로 배우는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
드디어 맥에서도 virtualbox가 지원 됩니다.
드디어 맥에서도 virtualbox가 지원 됩니다. 맥으로도 virtual box 강의를 들어도 될까요?아니면 업데이트 예정이 있으실까요?[질문 전 답변]1. 강의에서 다룬 내용과 관련된 질문인가요? [예 | 아니요]2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? [예 | 아니요]3. 질문 잘하기 법을 읽어보셨나요? [예 | 아니요](https://www.inflearn.com/blogs/1719)4. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.5. vagrant up 에서 발생하는 문제는 주로 호스트 시스템(Windows, MacOS)과 연관된 다양한 조건에 의해 발생합니다. 따라서 이를 모두 제가 파악할 수 없어서 해결이 어렵습니다. vagrant up으로 진행이 어렵다면 제공해 드리는 가상 머신(VM) 이미지를 import해서 진행하시기 바랍니다. (https://www.inflearn.com/questions/992407/comment/281901)[질문 하기]
-
미해결그림으로 배우는 쿠버네티스(v1.30) - {{ x86-64, arm64 }}
8.3강의 set-ctx-pod-admin.sh 수정 요청
질문 답변을 제공하지만, 강의 비용에는 Q&A는 포함되어 있지 않습니다. 다만 실습이 안되거나, 잘못된 내용의 경우는 알려주시면 가능한 빠르게 조치하겠습니다![질문 전 답변]1. 강의에서 다룬 내용과 관련된 질문인가요? [예 | 아니요]2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? [예 | 아니요]3. 질문 잘하기 법을 읽어보셨나요? [예 | 아니요](https://www.inflearn.com/blogs/1719)4. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.5. vagrant up 에서 발생하는 문제는 주로 호스트 시스템(Windows, MacOS)과 연관된 다양한 조건에 의해 발생합니다. 따라서 이를 모두 제가 파악할 수 없어서 해결이 어렵습니다. vagrant up으로 진행이 어렵다면 제공해 드리는 가상 머신(VM) 이미지를 import해서 진행하시기 바랍니다. (https://www.inflearn.com/questions/992407/comment/281901)[질문 하기]안녕하세요.8.3 강의 진행 중 set-ctx-pod-admin.sh 해당 스크립트가 제대로 동작하지 않아 확인해보니TOKENNAME=`kubectl -n $NAMESPACE get serviceaccount $SERVICEACCOUNT -o jsonpath={.secrets[0].name}`해당 부분에서 값을 못 가져와서 동작을 못 하고 있었습니다.이미 해당 부분 위에서 값이 설정되어 있는거 같아TOKENNAME='sa-pod-admin-token'kubectl 부분 주석처리하여 정상 동작 하였습니다. 따라서.. 원활한 실습을 위해TOKENNAME=`kubectl -n $NAMESPACE get serviceaccount $SERVICEACCOUNT -o jsonpath={.secrets[0].name}`해당 부분 주석처리해서 소스 업데이트 부탁드리겠습니다.