학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요. 1:N 관계에서 1을 기준으로 페이지네이션 조회에 대해 질문드립니다. 강의에서는 N을 기준으로 조회 lazy loading을 이용한 성능을 포기한 조회 @BatchSize를 이용한 방법 이 세 가지가 제안되었습니다. 만약 이 페이지네이션에서 강의 초반부 예시처럼 N쪽에 조건문이 걸려야 해서 그에 대한 결과물을 가져와야 하는 경우 E.g. where m.age = 10 1번 방법으로 조회를 해야할 것 같은데 1번 방법에서 N:1임에도 1 입장에서 페이지네이션 개수 그대로 데이터를 추출할 수 있는 방법이 떠오르지 않아 질문드립니다. N:1로 바꿔서 PAGE_SIZE를 10이라고 가정할 때 조회 (memberId가 10개가 나온다) teamId:1, memberId:1 teamId:1, memberId:2 teamId:1, memberId:3 teamId:2, memberId:4 teamId:2, memberId:5 teamId:2, memberId:6 teamId:2, memberId:7 teamId:3, memberId:8 teamId:3, memberId:9 teamId:3, memberId:10 실제 기대하는 조회 (team 이 10개가 나오기를 기대) teamId:1, memberId:1 teamId:1, memberId:2 teamId:2, memberId:3 teamId:2, memberId:4 teamId:3, memberId:5 teamId:3, memberId:6 teamId:4, memberId:7 teamId:5, memberId:8 teamId:5, memberId:9 teamId:5, memberId:10 teamId:6, memberId:11 teamId:6, memberId:12 teamId:7, memberId:13 teamId:7, memberId:14 teamId:8, memberId:15 teamId:8, memberId:16 teamId:8, memberId:17 teamId:9, memberId:18 teamId:9, memberId:19 teamId:10, memberId:20 teamId:10, memberId:20
안녕하세요 선생님 좋은 강의 만들어주셔서 감사합니다. 수강중에 질문이 있습니다. 예를들어 char ch = 'a'; 라고 했을때 이름이 ch이고 크기가 1바이트인 변수가 OS에 의해 메모리에 할당되고 그 공간에 'a' 값 저장된다 그리고 &ch는 메모리의 주소 라는것 까지 이해했습니다. 제가 궁금한것은 그렇다면 'ch' 라는 변수명(문자 자체)은 어디에 저장되며, 컴퓨터는 어떻게 'ch'라는 변수명을 인식할 수 있는지 궁금합니다.
3분 20초에 singular.php 파일은 포스트, 북 등 모든 파일을 보여주는 페이지라서 북 상세용 파일인 single-book.php 파일을 만드시고 바로 북 상세 파일로 적용됐습니다. 여기서 궁금한점이 어떻게 어떤 설정 없이 single-book.php 파일이 자동적으로 북 상세페이지 전용 파일로 지정될 수 있나요? single-{key].php 로 하면 key의 전용페이지가 되는 규칙이 있는 건지 궁금합니다.
dfs 방식으로 풀었는데 메모리초과가 발생해 질문드립니다. 재귀함수이다보니 함수호출이 잦아 발생하는거 같은데, 해당 위치에서, 해당 위치에 도달하는 경로 중 가장 많이 이동한 경로만을 탐색하는 방식으로 진행했음에도 불구하고 메모리초과가 발생하다보니 어디가 문제인지 모르겠어서 질문드립니다 ㅜㅜ... #include <bits/stdc++.h> using namespace std; enum { E, S, W, N, }; // moves : 해당 위치에 도착했을 때, 지금까지 내가 몇번 움직였는지를 저장한다. int table[51][51], moves[51][51]; int n, m; int dy[4] = {0,1,0,-1}, dx[4] = {1,0,-1,0}; // dfs, 이동 가능한 방향으로 이동하는 함수 void go(int fy, int fx, int y, int x, int cnt) { // 움직인 횟수 저장 moves[y][x] = cnt; for(int i = E; i < N; i++) { int ny = y + dy[i]*table[y][x], nx = x + dx[i]*table[y][x]; // 최대 횟수로 이동한 경로만 통과 가능 if(ny < 0 || nx < 0 || ny >= n || nx >= m || table[ny][nx] == 0 || cnt + 1 < moves[ny][nx]) continue; // 무한 루프에 빠지게 될 경우, 탈출 if(fy == ny && fx == nx) { exit(0); } go(y, x, ny,nx, cnt + 1); } } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> n >> m; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { char tmp; cin >> tmp; if(tmp == 'H') { tmp = '0'; } table[i][j] = tmp - '0'; } } go(0,0,0,0,1); cout << *max_element(moves[0], moves[0] + 51*51); return 0; }
저는 문제를 읽고 객체를 만들어야겠다는 생각은 전혀 하지 못해서... 객체를 만드셔야겠다고 생각하신 이유가 궁금합니다 물론 객체를 만들지 않고 작성해도 괜찮다고 하셨는데 객체를 만들겠다는 생각은 제가 아예 하지 못한 생각이어서 문제 요구사항을 기준으로 어떤 부분이 객체를 만들어야겠다고 도출해 낼 수 있는 부분일까요? 나중에 회사에 가서도 비즈니스 요구사항에 따라 코드를 작성해야 할 텐데 글을 코드로 바꾸는 실력이 부족해서 경험의 영역일 수 있지만 요구사항을 변수와 함수, 객체로 도출해 낼 때 꿀팁 있다면 궁금합니다!!
궁금한 점이 있어서 질문드립니다. 강의 소스에서, 다음 코드를 보면, retrieval_chain 변수에 {context} 결정 값이 있을 것으로 예상하고 있는데요. retrieval_chain = create_retrieval_chain(retriever, document_chain) response = retrieval_chain.invoke({"input" : "질문" }) retrieval_chain.invoke() 하기 전에, {context} 값을 확인하는 방법이 있을지요? llm 모델을 바꿔가며 실험해보니, retrieval_chain.invoke() 후 response['context'] 내용이 llm 모델마다 많이 달라지는 것을 관찰했어요. gpt-3.5-turbo-16k-0613, gpt-3.5-turbo-0125, gpt-4, gpt-4-turbo 모델에서 실험해봤습니다. 그렇다면, llm 모델에 따라 제출할 {context} 내용이 달라질 수도 있다고 이해하면 맞을까요? {input} 값으로 벡터 검색한 내용이 {context} 값이 되는 단순한 방식은 아닌 것으로 이해했습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 기본 키 매핑에서 @GeneratedValue 전략으로 IDENTITY, SEQUENCE, TABLE, AUTO의 특징은 이해했습니다. 하지만 어떤 경우에 어떤 전략이 유리할지 모르겠습니다. AUTO를 사용하지 않고 명시적으로 IDENTITY 또는 SEQUENCE 전략을 채택해야하는 경우가 있을까요?
q1_cols = answer["Q1"].value_counts().sort_index().index.tolist() def show_countplot_by_qno(qno, fsize=(10, 6), order=None): if not order: order = answer[qno].value_counts().index.tolist() plt.figure(figsize=fsize) sns.countplot(data=answer, y=qno, order=order,palette="Blues_r" ).set_title(question[qno]) show_countplot_by_qno("Q1", order=q1_cols) not order 일 때는 tolist() 안해도 출력이 되는데 왜 order를 변수로 넣을 때는 tolist() 안하면 에러가 발생하는지 궁금합니다. tolist() 붙여봐도 달라진게 없는것 같은데 어떤 방식인지 모르겠습니다.
안녕하세요 카일님 🙂 지표에 대해 항상 어렵게 생각하였는데, 쉽게 강의해주셔서 많은 도움이 되고 있습니다.감사합니다. 연습문제에 대한 답변은 아래와 같습니다. 각 기능들이 잘 동작하는지 확인을 하려면 CTR(클릭률) 대비 메인page > 상세page로 가는 PV의 전환률의 퍼센트가 높은지 확인해야 할 것 같습니다. 페이지 전환률이 높다면 해당 기능이 잘 작동한다고 볼 수 있을 것 같습니다. 고객이 검색이란 ACTION 이후 나온 필터된 페이지 내에서 CTR(클릭률)이 높다면 검색 기능에 만족했다고 생각합니다. 기능에 불만족 스러웠다면 스크롤 후 백그라운드로 이동 또는 스크롤 후 재검색 또는 앱이탈 비율이 높을 것이라고 생각합니다. 검색필터기능의 활성화 지표를 확인하기 위해서는 검색 후 나온 페이지 내 필터 클릭률(CTR / PV)로 확인할 수 있을 것 같습니다. 또한, 고객이 필터를 몇 번 클릭했는지에 따라 필터 기능이 잘 사용되는지 확인할 수 있을 것 같습니다. 리텐션이 가장 중요할 것 같습니다. 왜냐하면 셀러(가게), 바이어(이용자), 중간업체(배송대행사)가 유지되어야 해당 서비스가 꾸준하게 이용될 수 있기 때문입니다. 이용자의 리텐션을 높이기 위해서는 서비스(배송의 퀄리티, CS, 음식의 퀄리티)를 유지해야 구매율도 유지되고 서비스 제공자(가게, 배송대행사)도 유지될 수 있다고 생각합니다. 알고리즘 성능을 확인하기 위하여 기존서비스 대비 추천 알고리즘의 클릭률(CTR)/PV과 구매전환률을 확인해야 할 것 같습니다. 왜냐하면 알고리즘이 정확하지 않다면 해당 영역을 클릭하거나 구매로 전환될 가능성이 적을 것 같다고 생각합니다. 리텐션, WAU 이라고 생각합니다. 예를들어 '쿠팡' 또는 '유튜브' 서비스를 빗대자면 고객이 일주일에 1번 이상은 들어와야 서비스를 해지하지 않고 사용한다고 생각하기 때문입니다. 그 외에 확인해야 할 지표는 체류시간과 가입전환율을 볼 것 같습니다. 온보딩 과정 중 온보딩의 효과를 파악하기 위하여 튜토리얼 퍼널을 조사해볼 것 같습니다. 슬랙을 예시로 들자면 어느 단계에서 사람들이 스킵을 하는지, 이탈률이 생기는 지를 확인하여 지표를 볼 것 같습니다.
Quest System 구현 강의 마지막에 Quest System Test를 실습하던중 제대로 작동하지 않아 문의 드립니다. 디버그를 찍어봤는데 Task Script의 IsTarget() 함수에서 targets.Any(x=>x.IsEqual(target))부분에서 false가 된것이 원인이었습니다. 자세히 보니 QuestSystemTest에서 Target을 TaskTarget형태로 넘겨주고, TaskTarget의 IsEqual에서 TaskTarget형식으로 받아서 문제가 된것이었습니다. 이를 방지하기 위해 아래와 같이 TaskTarget인지를 먼저 검사해야된다고 생각하는데, 혹시 제가 놓친부분이 있다면 알려주세요 public override bool IsEqual(object target) { if(target.Equals(this))return true; string targetAsString = target as string; if (targetAsString == null) return false; return value == targetAsString; }
안녕하세요! socket관련한 서비스를 진행해보고 싶어서 제로초님의 강의를 들은 수강생입니다. 현재 nest & flutter를 이용하고 있는데, flutter에서의 연결 및 다른 tool에서 socket io 연결이 되지 않으며 “외부 사이트로는 접근이 불가능한 오류” 가 생겨서 조심스럽게 여쭤봅니다. 현재 로직은 채팅을 생성시, 채팅을 보여주는 리스트가 실시간으로 새로고침이 되는 부분을 작업중입니다. 하지만, postman, httpie, hoppscotch의 부분에서 연결이 되지 않는 문제가 발생합니다. 많은 방법을 찾아봤지만, 터미널에서 socket io cli를 통해서 로그는 볼 수 있지만, 다른 tool에서는 이용이 불가능한 방법에 대해서 알고 싶어서 질문드립니다! Socket io를 통해서 local, dev서버 연결 완료 하지만 postman의 socket io기능을 통해서 테스트를 진행하려고 할 때, postman으로 연결 local에서는 문제가 없이 연길이 되지만, dev서버에서는 이러한 에러가 발생합니다. 또한 flutter 앱에서 연결을 하려면 다음과 같은 에러가 발생합니다. 오류 메시지 "WebSocketException: Connection to ' http://~~~~.com:81/socket.io/?EIO=4&transport=websocket# ' was not upgraded to websocket"는 클라이언트가 WebSocket 연결을 시도하였으나, 서버가 해당 연결을 WebSocket 프로토콜로 업그레이드하지 않았다는 것을 의미합니다. 이는 여러 가지 원인에 의해 발생할 수 있습니다: upgrade가 되지 않았다고 나와서 ,ngnix의 socket 부분에서 upgrade부분도 잘 넣어줬는데, 오류가 해결되지 않아서... 고민 끝에 질문 올립니다. Ngnix 설정부터 2주정도 시간을 들였지만, 해결이 되지 않아서…여쭤봅니다. 방화벽도 해제가 되어 있는데 연결이 안되고 있습니다.. 다음은 nest에서 작성한 코드 입니다! [chat.gateway.ts] import { WebSocketGateway, WebSocketServer, SubscribeMessage, OnGatewayConnection, OnGatewayDisconnect, OnGatewayInit, ConnectedSocket, MessageBody, } from '@nestjs/websockets'; import { Server, Socket } from 'socket.io'; @WebSocketGateway() export class ChatGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect { @WebSocketServer() server: Server; afterInit(server: Server) { console.log('WebSocket initialized'); } handleConnection(client: Socket) { console.log(`Client connected: ${client.id}`); // 수정: client 객체 직접 출력 대신 id 출력 } handleDisconnect(client: Socket) { console.log(`Client disconnected: ${client.id}`); } @SubscribeMessage('sendMessage') handleMessage( @ConnectedSocket() client: Socket, @MessageBody() data: { message: string } ): void { console.log(`Received message from ${client.id}: ${data.message}`); this.server.emit('newMessage', data); // 모든 클라이언트에게 메시지 전송 console.log(`Received message: ${data.message}`); } } [main.ts] import { ConfigService } from '@nestjs/config'; import { NestFactory } from '@nestjs/core'; import { NestExpressApplication } from '@nestjs/platform-express'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { join } from 'path'; import { AppModule } from './app.module'; import { HttpExceptionFilter } from './common/exceptions/http-exception.filter'; import { SuccessInterceptor } from './common/interceptors/success.interceptor'; import { IoAdapter } from '@nestjs/platform-socket.io'; import { CustomIoAdapter } from './adapters/custom-io.adapter'; async function bootstrap() { const app = await NestFactory.create<NestExpressApplication>(AppModule); app.useWebSocketAdapter(new CustomIoAdapter(app)); const configService = app.get(ConfigService); const port = configService.get('server.port'); const mongoUrl = configService.get('DB.MONGO_URL'); console.log('MongoDB URL:', mongoUrl); app.enableCors({ origin: true, credentials: true, }); app.useStaticAssets(join(__dirname, '..', 'client'), { prefix: '/api/v1/client', }); app.useGlobalInterceptors(new SuccessInterceptor()); app.useGlobalFilters(new HttpExceptionFilter()); app.setGlobalPrefix('api/v1'); const swagger_options = new DocumentBuilder() .setTitle('Nyam-Docs') .setDescription('API description') .setVersion('2.0.1') .addApiKey( { type: 'apiKey', name: 'x-token', in: 'header', description: 'Enter token', }, 'x-token', ) .addApiKey( { type: 'apiKey', name: 'x-type', in: 'header', description: 'Enter type', }, 'x-type', ) .build(); const document = SwaggerModule.createDocument(app, swagger_options); SwaggerModule.setup('api-docs', app, document); await app.listen(port, '0.0.0.0'); console.log(`Application Listening on Port : ${port}`); } bootstrap(); 다음은 custom한 io입니다 [custom.io.adpter.ts] import { IoAdapter } from '@nestjs/platform-socket.io'; import { INestApplication, Injectable } from '@nestjs/common'; import { ServerOptions } from 'socket.io'; @Injectable() export class CustomIoAdapter extends IoAdapter { constructor(app: INestApplication) { super(app); } createIOServer(port: number, options?: ServerOptions): any { const serverOptions: ServerOptions = { ...options, cors: { origin: '*', // 모든 도메인에서 접근 허용 methods: ['GET', 'POST', 'PUT', 'DELETE'], credentials: true }, transports: ['websocket', 'polling'], //pooling 없으면 연결 안 됨(socket) allowEIO3: true // Engine.IO 3.x 버전 클라이언트 허용 }; return super.createIOServer(port, serverOptions); } } 혹시 해결방법을 아시거나, 도움을 주실만한 정보가 있으시다면 알려주시면 정말 감사하겠습니다!
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 자바로 작성했는데, 시간 초과가 납니다. 어느 부분이 잘 못 작성한건지 궁금합니다. import java.io.*; import java.util.*; class Node implements Comparable<Node>{ int idx; char team; int power; Node(int idx, char team, int power){ this.idx = idx; this.team =team; this.power = power; } @Override public int compareTo(Node o) { return this.power - o.power; } } public class Main { public static void main(String[] argvs) { Scanner sc = new Scanner(System.in); int n=sc.nextInt(); int[] answer = new int[n+1]; ArrayList<Node> list = new ArrayList<>(); for(int i=1; i<=n; i++) { char a = sc.next().charAt(0); int b=sc.nextInt(); list.add(new Node(i,a,b)); } Collections.sort(list); //정렬 HashMap<Character, Integer> map = new HashMap<>(); int j=0,total=0; for(int i=1; i<n; i++) { for(;j<n; j++) { if(list.get(j).power<list.get(i).power) { total+=list.get(j).power; //쫓아오는 학생의 파워를 누적합 char x =list.get(j).team; //쫓아오는 학생의 팀을 표시 map.put(x, map.getOrDefault(x, 0)+list.get(j).power); //해싱해준다. } else break; } answer[list.get(i).idx] = total - map.getOrDefault(list.get(i).team, 0); //전체 누적합에서 자신의 팀이 있다면 그 점수는 빼준다. } for(int i=1; i<=n; i++) System.out.println(answer[i]); } }