묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
5:57에 printEven은 true지만 !printEven은 true가 아닌것(!)이라서 false라고 설명해주신건가요? 그래야 &&조건이 둘다 참이여야해서 볼 필요도 없다고 하신거겠죠..?
질문은 동영상 강의에서 오른쪽에 커뮤니티 버튼을 통해 해주세요. 그렇게 해주셔야어떤 강좌에서 질문하셨는지 알 수 있습니다.영상에서 몇 분 몇 초 대를 알려주셔야 한 번에 확인이 가능합니다.이미 다른 누군가가 질문을 한 이력이 있을 수 있습니다. 질문 게시판을 한 번 확인 부탁드립니다.질문을 올릴 때 이 글은 모두 지우고 내용을 입력해주세요.
-
미해결설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
설치 오류
수정 하는 부분에서 초록색으로 뜨고 수정이 안됩니다.아무리 해도 해당 내용들이 수정이 안되요.
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
강의 자료 파일을 열 수 없습니다.
윈도우 사용자입니다. 첨부파일을 다운로드 받았는데, 압축파일 풀기를 하면 아래와 같이 오류 메시지가 나오는데요. 어떻게 해결하면 좋을까요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
연관 관계 저장 시 궁금한 점.
영한님 안녕하세요. 강의를 잘 듣고 있습니다!학습 중 궁금한 점이 있어 질문 드립니다.엔티티를 저장할 때에는 연관된 엔티티가 모두 영속 상태여야 한다고 알고 있습니다. 다음 코드에서 현재 user와 연관된 teamB는 영속 상태가 아닙니다. 따라서 실행 시 에러가 발생할 것으로 예상했습니다. 그러나 에러 없이 잘 동작하였고, DB를 확인해 보니 user의 team이 현재 연관된 teamB가 아니라 teamA로 되어 있었습니다.@Entity @Table(name="users") public class User { @Id @GeneratedValue @Column(name="user_id") private Long id; private String username; @ManyToOne @JoinColumn(name="team_id") private Team team; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Team getTeam() { return team; } public void setTeam(Team team) { this.team = team; } }@Entity public class Team { @Id @GeneratedValue @Column(name="team_id") private Long id; private String teamName; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getTeamName() { return teamName; } public void setTeamName(String teamName) { this.teamName = teamName; } }public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); try{ Team teamA = new Team(); teamA.setTeamName("teamA"); System.out.println(" =====[1]===== "); System.out.println("teamA = " + teamA); System.out.println("teamA.getId() = " + teamA.getId()); System.out.println("teamA.getTeamName() = " + teamA.getTeamName()); System.out.println(" 영속? = " + em.contains(teamA)); System.out.println(" ============= "); System.out.println(); em.persist(teamA); System.out.println(" =====[2]===== "); System.out.println("teamA = " + teamA); System.out.println("teamA.getId() = " + teamA.getId()); System.out.println("teamA.getTeamName() = " + teamA.getTeamName()); System.out.println(" 영속? = " + em.contains(teamA)); System.out.println(" ============= "); System.out.println(); Team findMyTeam = em.find(Team.class, teamA.getId()); System.out.println(" =====[3]===== "); System.out.println("findMyTeam = " + findMyTeam); System.out.println("findMyTeam.getId() = " + findMyTeam.getId()); System.out.println("findMyTeam.getTeamName() = " + findMyTeam.getTeamName()); System.out.println(" 영속? = " + em.contains(findMyTeam)); System.out.println(" ============= "); System.out.println(); Team teamB = new Team(); teamB.setId(findMyTeam.getId()); teamB.setTeamName("teamB"); System.out.println(" =====[4]===== "); System.out.println("teamB = " + teamB); System.out.println("teamB.getId() = " + teamB.getId()); System.out.println("teamB.getTeamName() = " + teamB.getTeamName()); System.out.println(" 영속? = " + em.contains(teamB)); System.out.println(" ============= "); System.out.println(); User user = new User(); user.setUsername("username"); user.setTeam(teamB); System.out.println(" =====[5]===== "); System.out.println("user.getTeam() = " + user.getTeam()); System.out.println("teamB = " + teamB); System.out.println("teamB.getId() = " + teamB.getId()); System.out.println("teamB.getTeamName() = " + teamB.getTeamName()); System.out.println(" 영속? = " + em.contains(teamB)); System.out.println(" ============= "); System.out.println(); em.persist(user); System.out.println(" =====[6]===== "); System.out.println("user.getTeam() = " + user.getTeam()); System.out.println("teamB = " + teamB); System.out.println("teamB.getId() = " + teamB.getId()); System.out.println("teamB.getTeamName() = " + teamB.getTeamName()); System.out.println(" 영속? = " + em.contains(teamB)); System.out.println(" ============= "); System.out.println(); tx.commit(); System.out.println(" =====[7]===== "); System.out.println("user.getTeam() = " + user.getTeam()); System.out.println("teamB = " + teamB); System.out.println("teamB.getId() = " + teamB.getId()); System.out.println("teamB.getTeamName() = " + teamB.getTeamName()); System.out.println(" 영속? = " + em.contains(teamB)); System.out.println(" ============= "); System.out.println(); }catch(Exception e){ e.printStackTrace(); tx.rollback(); }finally{ em.close(); } emf.close(); } =====[1]===== teamA = hellojpa.Team@fa5f81c teamA.getId() = null teamA.getTeamName() = teamA 영속? = false ============= =====[2]===== teamA = hellojpa.Team@fa5f81c teamA.getId() = 1 teamA.getTeamName() = teamA 영속? = true ============= =====[3]===== findMyTeam = hellojpa.Team@fa5f81c findMyTeam.getId() = 1 findMyTeam.getTeamName() = teamA 영속? = true ============= =====[4]===== teamB = hellojpa.Team@dd4aec3 teamB.getId() = 1 teamB.getTeamName() = teamB 영속? = false ============= =====[5]===== user.getTeam() = hellojpa.Team@dd4aec3 teamB = hellojpa.Team@dd4aec3 teamB.getId() = 1 teamB.getTeamName() = teamB 영속? = false ============= =====[6]===== user.getTeam() = hellojpa.Team@dd4aec3 teamB = hellojpa.Team@dd4aec3 teamB.getId() = 1 teamB.getTeamName() = teamB 영속? = false ============= =====[7]===== user.getTeam() = hellojpa.Team@dd4aec3 teamB = hellojpa.Team@dd4aec3 teamB.getId() = 1 teamB.getTeamName() = teamB 영속? = false ============= 궁금한 점은 다음과 같습니다:1. teamB가 영속 상태가 아닌데 어떻게 user가 저장될 수 있었는지 궁금합니다.2. user는 현재 teamB와 연관되어 있는데, 왜 DB에는 teamA가 나오는지 궁금합니다.좋은 강의 감사합니다!!
-
미해결김영한의 실전 자바 - 중급 1편
타입 안전 열거형 패턴 질문 입니다.
package enumeraion.ref1; public class ClassGrade { public static final ClassGrade BASIC = new ClassGrade(10); public static final ClassGrade GOLD = new ClassGrade(20); public static final ClassGrade DIAMOND = new ClassGrade(30); private final int discountPercent; private ClassGrade(int discountPercent) { this.discountPercent = discountPercent; } public int getDiscountPercent() { return this.discountPercent; } }문득 궁금한게 저런식으로 자기 자신을 호출 하면 이제 다시 각각의 필드에 인스턴스가 생성될텐데 그럼 그 인스턴스가 무한으로 인스턴스를 생성하지는 않는건지 갑자기 그부분이 헷갈려 질문 드립니다.정적필드가 아닐경우에는 더욱이 인스턴스가 생성됨가 동시에 각각의 멤버변수의 인스턴스가 또 인스턴스를 생성하는 형태는 아닌지 궁금합니다.
-
해결됨[리뉴얼] 처음하는 SQL과 데이터베이스(MySQL) 부트캠프 [입문부터 활용까지]
인덱스 관련 질문!
인덱스에 대해서 약간의 의문을 질문드립니다. 인덱스가 조회의 성능 향상을 위한다는 점은 이해가 갑니다만..특정한 인덱스의 이름을 설정하는 부분이 약간 헷갈립니다. 가령 std_id 라는 인덱스를 학번을 저장 하는 column에 만들었을 때를 예시로 들겠습니다. 제가 학번의 데이터를 조회 하는경우 자체 프로그램에서 std_id의 인덱스만을 쉽게 찾는다는 의미이며, 이름설정은 단순 사용자들의 이해를 편하게 하기 위함인지가 궁금합니당
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-D 뭐가 문제인지 잘 모르겠습니다..
안녕하세요 선생님강의 잘 보고 있습니다.아래의 코드가 왜 탈락하는 지 잘 모르겠습니다..ㅜ/****************************************************************************** Welcome to GDB Online. GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl, C#, OCaml, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog. Code, Compile, Run and Debug online from anywhere in world. *******************************************************************************/ #include <iostream> #include <queue> #include <vector> #include <string> #include <cmath> std::string map[1000]; bool visited[1000][1000]; bool visitedFire[1000][1000]; int personMap[1000][1000]; int fireMap[1000][1000]; int exitY, exitX; int cnt; #define INF 420000000 void bfsFire(const int y, const int x, const int R, const int C) { std::queue<std::pair<int, int>> que; que.push({y, x}); visitedFire[y][x] = true; int newX, newY, currX, currY; int dx[4] = {1, -1, 0, 0}; int dy[4] = {0, 0, 1, -1}; while(que.empty() != true) { currY = que.front().first; currX = que.front().second; que.pop(); for(int i = 0; i < 4; ++i) { newY = currY + dy[i]; newX = currX + dx[i]; if (newX >= 0 && newX < C && newY >= 0 && newY < R && !visitedFire[newY][newX] && map[newY][newX] != '#') { que.push({newY, newX}); fireMap[newY][newX] = std::min(fireMap[currY][currX] + 1, fireMap[newY][newX]); visitedFire[newY][newX] = true; } } } } void bfs(const int y, const int x, const int R, const int C) { std::queue<std::pair<int, int>> que; que.push({y, x}); visited[y][x] = true; int newX, newY, currX, currY; int dx[4] = {1, -1, 0, 0}; int dy[4] = {0, 0, 1, -1}; while(que.empty() != true) { currY = que.front().first; currX = que.front().second; que.pop(); if (currY == R - 1 || currX == C - 1) { cnt = personMap[currY][currX]; return; } for(int i = 0; i < 4; ++i) { newY = currY + dy[i]; newX = currX + dx[i]; if (newX >= 0 && newX < C && newY >= 0 && newY < R && !visited[newY][newX] && map[newY][newX] == '.') { if (fireMap[newY][newX] > personMap[currY][currX] + 1) { que.push({newY, newX}); personMap[newY][newX] = personMap[currY][currX] + 1; } visited[newY][newX] = true; } } } } bool isPossible(int R, int C) { for (int i = 0; i < R; ++i) { if (personMap[i][0] < fireMap[i][0]) return true; if (personMap[i][C - 1] < fireMap[i][C - 1]) return true; } for (int i = 0; i < C; ++i) { if (personMap[0][i] < fireMap[0][i]) return true; if (personMap[R - 1][i] < fireMap[R - 1][i]) return true; } return false; } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); int R, C; std::cin >> R >> C; std::vector<std::pair<int, int>> fire; exitX = C; exitY = R; int y, x; std::fill(&fireMap[0][0], &fireMap[999][1000], INF); for(int i = 0; i < R; ++i) { std::cin >> map[i]; for (int j = 0; j < C; ++j) { if (map[i][j] == 'J') { y = i; x = j; personMap[i][j] = 1; } else if (map[i][j] == 'F') { fireMap[i][j] = 1; fire.push_back({i, j}); } } } bfs(y, x, R, C); for(int i = 0; i < fire.size(); ++i) bfsFire(fire[i].first, fire[i].second, R, C); if (!isPossible(R, C)) cnt = 0; if(cnt == 0) { std::cout << "IMPOSSIBLE" << std::endl; } else { std::cout << cnt << std::endl; } return 0; }
-
해결됨(2025) 일주일만에 합격하는 정보처리기사 실기
22년 3회 문제 질문
반복문 돌리다가 궁금해진게 있어서 질문드립니다.다중 for문에서 저렇게 여러개의 변수가 중간에 껴있는 경우에 내부 for문을 한 사이클 돌고나면 외부 for문에서 ++해서 다음 사이클 돌릴 경우에 변수들이 다시 초기화가 되나요? 그러니까 n=6일 때 한 사이클을 돌리고 나니 s=6 , el=1 값이 이렇게 나왔는데, n=7, 8, 9.... 이렇게 그 다음 사이클로 갈 때마다 다시 s=0, el=0 부터 시작하는건지 아니면 값이 남아있는건지 궁금합니다.+해설을 보고 나서 완전수라는 걸 알았네요 ㅎㅎ
-
해결됨스프링 핵심 원리 - 기본편
localhost 8080 서버 안 뜸 문제
https://drive.google.com/file/d/1Napy4xVoywSNcyohTGH3kevfrdSkgfWg/view?usp=sharingrequest 스코프 예제 만들기 중 스프링부트 돌려보니 서버가 열리지 않습니다. 로그를 보니 repository 주입을 뭘 해야할지 모른다 되어있는데 어느부분을 고쳐야 할지 알려주심 감사하겠습니다!
-
미해결따라하면서 배우는 Power Apps
파워엡스에서 Share Point 테이블 Dataverse 로 변환
안녕하십니까? 질문 드립니다.엑셀파일을 Share Point 로 가져와서 테이블을 만들고 파워엡스에서 만들어진 Share Point 테이블을 Dataverse 로 변환하면 300개 전체 레코드가 생성되지 않고 매번 20개 레코드만 생성이 되는데 왜 그런지 도무지 알수가 없습니다. ..
-
해결됨[리뉴얼] 맛집 지도앱 만들기 (React Native & NestJS)
캐싱 데이터 질문
getCalendarPosts()는 [queryKeys.POST,queryKeys.GET_CALENDAR_POSTS,year,month] 4개의 캐싱키를 이용해서 데이터를 캐싱하고 있고, 포스트를 삭제할 시 성공하면 [queryKeys.POST,queryKeys.GET_CALENDAR_POSTS] 캐싱키로 저장한 캐싱데이터를 무효화하는데 getCalendarPosts()로 받아온 데이터가 무효화되고 최신 데이터(삭제된 포스트를 제외한 나머지 포스트)를 다시 받아올 수 있는건가요?<EventList/> 에서 보여주는 포스트 데이터는 4개의 캐싱키를 이용해서 받아온 왔으니, 그 데이터를 무효화 하기 위해선 삭제할 때도 동일한 캐싱키를 이용해야하지 않나요?
-
해결됨Next + React Query로 SNS 서비스 만들기
compose modal 관련 질문입니다. history stack에 강제로 url을 추가 하는 방법이 있나요?
만약 새창에서 /compose/tweet을 열었을 때 X버튼을 누르면 back()으로 동작되어 창이 닫히지 않거나, 이 전페이지 (트위터 창이 아닌 다른 창)으로 이동하는 이슈가 발생하여 x.com은 어떻게 동작되는지 확인했는데, 이미지 처럼 새창에서 /compose/tweet을 열었을 때, history에 home url이 추가가 되어 뒤로가기를 눌렀을 때 홈으로 돌아가는 것 같습니다.이렇게 hitory url을 제어하는 방법이 있을까요? 구글링해도 정보를 얻을 수 없어 글 올립니다ㅠ
-
미해결김영한의 실전 자바 - 중급 2편
제네릭 메서드, 와일드카드
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]제네릭 메서드에서는 <Dog>가 타입추론으로 생략이 가능하다고 하셨는데WildCardEx.<Dog>printGenericV1(dogBox); 와일드 카드의 경우에는 <타입> 해당 부분에 대해서는 설명을 안해주셨는데 와일드카드의 경우에는 "<타입>" 은 어떻게 되는 건가요?? 항상 생략인건가요..???WildCardEx.printWildCardV1(dogBox);
-
해결됨직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피
셀필드 코드로 수정하기
안녕하세요 일코님. 늘 많은 도움 감사합니다.셀필드명을 표에 차례대로 부여하는데,매크로 녹화를 이용해서아래와 같이 코드를 짜보았습니다.hwp.move_to_field("답안") index = 1 while hwp.TableLowerCell(): hwp.HAction.Run("TableCellBlock"); hwp.HAction.GetDefault("TablePropertyDialog", hwp.HParameterSet.HShapeObject.HSet); hwp.HParameterSet.HShapeObject.ShapeTableCell.CellCtrlData.Name = f"{index}" hwp.HAction.Execute("TablePropertyDialog", hwp.HParameterSet.HShapeObject.HSet) hwp.Run("Cancle") index += 1 그런데 이렇게 실행하였을 때,AttributeError: '<win32com.gen_py.HwpObject 1.0 Type Library.HCtrlData instance at 0x2683750010768>' object has no attribute 'Name' 위와 같이 오류가 나는데요..매크로 스크립트를 잘 복붙한거 같은데 어떻게 수정할 수 있을까요?감사합니다!
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI)
몽고Db 기초 질문
안녕하세요 강사님mongoDB를 이번에 처음 사용하는데,세팅하는 과정에서 궁금한게 생겨 질문 남깁니다.저는 지금까지 mysql로 토이프로젝트를 진행했었는데요~fastAPI 기반의 프로그램을 실행시키기 전에 항상 mysql 을 구동시켜 놓았었습니다.그런데 이번 mongoDB의 경우엔, 별도로 mongoDB 를 실행시키지 않고 바로 app을 실행시키더군요 !몽고DB도 결국 별도의 프로그램이기에, webapp이 띄워지기 전에 미리 프로세스로 올라온 상태이어야할 것 같은데, 맞을까요? 그렇다면 mongoDB가 프로세스로 띄워지는 순간은 언제인가요?혹시 __init__.py 에서 connect() 함수에서 프로그램을 띄우고 연결하는 작업을 진행하는걸까요?
-
미해결설계독학맛비's 실전 FPGA를 이용한 HW 가속기 설계 (LED 제어부터 Fully Connected Layer 가속기 설계까지)
7~8장 질문드립니다
실습 다 해봤는데, vitis HLS 작성하는건 따로안알려주시고 코드는 복붙만 하면 되는건가요?수강 후, 스스로 할 수 있어진다 보단 이 코드가 "있으면" vivado 및 vitis 조작하는 정도만 할 수 있을것 같은데이런 부분은 실무에서 배워야 하는 건가요? 나중에 이러이러한 방식으로 'axi4 lite를 이용하는 경험을 해봤고 이해를 하였다'라고 하기엔 혼자 짤 수가 없으니 무리가 있어 보이는데...사실 vivado및 vitis 조작 부분에서도 이거 누르고 이거 누르고 하면 된다 하시는데, 그거 말고 다른 옵션을 눌렀을때는 어떻게 되는건지, 또는 예를들어 zynq ip에서 안쓰는 부분이니까 끈다고 하는데 안끄면 무슨일이 일어나는건지처럼 좀더 자세했으면 좋겠어요.. 이 파트에서는 그냥 이런식으로 제어가 가능하고 시리얼통신으로 받아오는 것 까지가 "가능하다" 정도만 배우면 되는건가요?
-
미해결모두를 위한 대규모 언어 모델 LLM(Large Language Model) Part 2 - 랭체인(LangChain)으로 나만의 ChatGPT 만들기
하이퍼클로바 X 랭체인
GPT api말고 하이퍼클로바X api를 이용하는 방법이 있는지 궁금합니다.
-
해결됨하루만에 배우는 AWS REDIS
강사님께서 보고있는 파일은 어디서 볼 수 있나요?
다음과 같은 양식으로 남겨주세요.질문을 한 배경 : 자료가 어디있는지 못찾겠습니다질문내용 : 강사님이 보고계신 AWS Serverless 파일은 어디서 볼 수 있나요?
-
해결됨BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)
퍼널별 유저들의 새로운 세션 시작 횟수의 총합 _ 윈도우 함수 마지막 문제 응용
안녕하세요. 저는 이번에 마지막 문제를 응용해서, 퍼널별로 유저들의 새로운 세션 시작 횟수의 총합을 계산해보았습니다.[결과 그래프]새로운 세션 시작 기준: 이전 세션 시간 대비 20초 이상이 지나면, 새로운 세션을 활성화했다고 가정 (강의 내용과 동일)첫번째 강의에서 배운, UNNEST 문법과 PIVOT 을 하는 방법을 활용해서, event_params에 있는 firebase_screen의 string_value 값을 새로운 열인 firebase_screen 이라고 만듭니다. 전체 데이터를 조회하면, 쿼리 비용이 많이 들기 때문에, where 조건 절로 값을 작게 명시해줍니다.WITH base AS ( SELECT event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_timestamp, event_name, user_pseudo_id, MAX(IF(ep.key = 'firebase_screen', ep.value.string_value, NULL)) AS firebase_screen FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS ep WHERE event_date = '2022-08-18' AND user_pseudo_id = '5464646449.4088767327' GROUP BY ALL )LAG() 함수를 사용하여, 이전 날짜 값을 가져옵니다. 이 때, 퍼널별로 구해야하기 때문에, PARTITION BY에 firebase_screen 을 써줍니다. 그 후, DATETIMEDIFF 함수를 사용해서, 현재값과 이전값의 차이를 계산합니다.WITH base AS ( SELECT event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_timestamp, event_name, user_pseudo_id, MAX(IF(ep.key = 'firebase_screen', ep.value.string_value, NULL)) AS firebase_screen FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS ep WHERE event_date = '2022-08-18' AND user_pseudo_id = '5464646449.4088767327' GROUP BY ALL ), diff_funnel_time AS ( SELECT *, DATETIME_DIFF(event_timestamp, prev_event_timestamp, SECOND) AS second_diff FROM ( SELECT *, LAG(event_timestamp, 1) OVER(PARTITION BY firebase_screen ORDER BY event_timestamp) AS prev_event_timestamp FROM base ) ) SELECT * FROM diff_funnel_time3. ROW_NUMBER() 함수를 사용해서, 퍼널별로 순서를 매깁니다. 그 후, second_diff 의 값이 NULL인 경우는 해당 퍼널의 첫 시작 위치를 가리키므로 1을 넣어주고, rn > 1이고 second_diff >= 20인 경우는 1을 넣어줍니다. 이 때 funnel_per_session_start 컬럼은 퍼널별로 새로운 세션이 시작했는지 여부를 가리킵니다. , funnel_start AS ( SELECT *, CASE WHEN second_diff IS NULL THEN 1 WHEN rn > 1 AND second_diff >= 20 THEN 1 ELSE 0 END AS funnel_per_session_start FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY firebase_screen ORDER BY event_timestamp) AS rn FROM diff_funnel_time ) )이제, 퍼널별로 세션 시작 여부를 SUM()하고, GROUP BY를 해줍니다.SELECT firebase_screen, SUM(funnel_per_session_start) AS funnel_per_session_start_cnt FROM funnel_start GROUP BY ALL ORDER BY 2 DESC;WHERE 조건절을 주석처리하고, 전체 데이터에 대해서, 집계해봅니다. WITH base AS ( SELECT event_date, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_timestamp, event_name, user_pseudo_id, MAX(IF(ep.key = 'firebase_screen', ep.value.string_value, NULL)) AS firebase_screen FROM advanced.app_logs CROSS JOIN UNNEST(event_params) AS ep -- WHERE -- event_date = '2022-08-18' -- AND user_pseudo_id = '5464646449.4088767327' GROUP BY ALL ), diff_funnel_time AS ( SELECT *, DATETIME_DIFF(event_timestamp, prev_event_timestamp, SECOND) AS second_diff FROM ( SELECT *, LAG(event_timestamp, 1) OVER(PARTITION BY firebase_screen ORDER BY event_timestamp) AS prev_event_timestamp FROM base ) ) , funnel_start AS ( SELECT *, CASE WHEN second_diff IS NULL THEN 1 WHEN rn > 1 AND second_diff >= 20 THEN 1 ELSE 0 END AS funnel_per_session_start FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY firebase_screen ORDER BY event_timestamp) AS rn FROM diff_funnel_time ) ) SELECT firebase_screen, SUM(funnel_per_session_start) AS funnel_per_session_start_cnt FROM funnel_start GROUP BY ALL ORDER BY 2 DESC;
-
해결됨Jenkins를 이용한 CI/CD Pipeline 구축
window에서 docker minikube 사용하시는 분들... ssh 접속 ping 테스트 공유
https://learn.microsoft.com/ko-kr/windows-server/administration/openssh/openssh_install_firstuse?tabs=powershell를 따라서 window ssh 서버 클라이언트 설치하고ansinble-server와 윈도우 pc(쿠버네티스 돌아갈 host)에 python 3.9로 설치해줬고,ansible-server에서 pip install pywinrm 설치linux에서 ssh-keygen 한 것 윈도우 pc에 authorized_key에 직접 복사해줬음https://github.com/AlbanAndrieu/ansible-windows/blob/master/files/ConfigureRemotingForAnsible.ps에서 파일 직접 받아서파워쉘에서powershell.exe -ExecutionPolicy ByPass -File C:\Users\user\Downloads\ConfigureRemotingForAnsible.ps1파워쉘에서 실행ansible-server에서 vi /ect/ansible/host[local] localhost [docker] 172.17.0.3 [windows] 본인 컴퓨터(윈도우) host pc의 ip입력 [windows:vars] ansible_password='본인 컴퓨터((윈도우) host pc 비밀번호 입력' ansible_connection=winrm ansible_winrm_server_cert_validation=ignore ansible_user=user ansible_port=5986를 작성해서 저장ansible windows -m win_ping -u userwin_ping으로 핑 테스트 하면 정상 동작함➕ ./k8s/hosts파일 에서 [kubernetes]도 [kubernetes:vars] 위와 같이 작성해줘야 -i ./k8s/hosts kubernetes 로 win_ping 보냈을 때 응답 받을 수 있어요