묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨확률과 통계 기초
중고등학교 수학 후속 강의로 고려해주실수 있나요?
성인이지만 중고등학교 수학을 까먹거나 미진했어서 다시 복습해야하는 경우가 있습니다그래야 선대, 미적, 확통을 다시 보기에 수월해져서 다시 복습해야할수 밖에 없는 경우가 있습니다 ㅜ조범희님이 강의를 정성스럽게 만들어주셔서 믿고 볼수 있습니다.혹시 괜찮으시다면 추후에 만들어주시는 강의로 재고해주실 수 있을까요?한 개 강의 시간도 혹시 가능하시다면 쪼개서 10분대이면 직장인 등 성인들이 보기에 좋을거 같습니다글 읽어주셔서 고맙습니다:)
-
미해결만들면서 배우는 프론트엔드 DO IT 코딩 (Next.js, Typescript)
로그인 버튼 클릭시 auth/auth-domain-config-required 에러 발생
안녕하세요. 로그인 버튼 클릭시 콘솔창에 다음과 같은 에러가 발생합니다.rebaseError: Firebase: Error (auth/auth-domain-config-required). at createErrorInternal (index-16e22603.js:497:1) at _assert (index-16e22603.js:503:1) at getIframeUrl (index-16e22603.js:9318:1) at _openIframe (index-16e22603.js:9343:1) at async BrowserPopupRedirectResolver.initAndGetManager (index-16e22603.js:9609:1) w https://firebase.google.com/docs/reference/js/v8/firebase.auth.Auth공식 문서를 보니 authDomain configuration is not provided 일때 발생하는 에러라고 합니다.auth/auth-domain-config-requiredThrown if authDomain configuration is not provided when calling firebase.initializeApp(). Check Firebase Console for instructions on determining and passing that field.아래는 로그인버튼 컴포넌트에 onClick입니다.코드상에는 에러가 발생하지 않았습니다.<GoogleLoginButton onClick={() => { signInWithPopup(FirebaseClient.getInstance().Auth, provider) .then((result) => { console.info(result.user); }) .catch((error) => { console.error(error); }); }} />루트 폴더에 .env 파일도 잘 있구요 ㅜㅜ아래는 루트 폴더에 next.config.js 파일입니다.module.exports = { reactStrictMode: true, publicRuntimeConfig: { publicApiKey: process.env.publicApiKey || '', authDomain: process.env.FIREBASE_AUTH_HOST || '', projectId: process.env.projectId || '', }, }; 로그인 버튼 컴포넌트도 강사님 코드와 일치합니다..아래는 models/firebase_client.ts 입니다.원인이 뭘까요!?import { initializeApp, getApps } from 'firebase/app'; import { Auth, getAuth } from 'firebase/auth'; import getConfig from 'next/config'; const { publicRuntimeConfig } = getConfig(); /** 환경변수는 node.js이기 때문에 서버에서 사용할 수 있고, 클라이언트에서 바로 접근할 수 없기 때문에 config 설정을 해주고 * 아래처럼 가져와서 쓸 수 있도록 해준다. */ const FirebaseCredentials = { apiKey: publicRuntimeConfig.apiKey, authDomain: publicRuntimeConfig.authDomain, projectId: publicRuntimeConfig.projectId, }; /** Firebase의 Authentication 모듈을 사용하기 위해 FirebaseClient 클래스를 정의하는 코드 */ export default class FirebaseClient { private static instance: FirebaseClient; private auth: Auth; /** 이미 초기화된 Firebase 애플리케이션이 있는지 검사하고, 없다면 FirebaseCredentials를 사용하여 Firebase 애플리케이션을 초기화 */ public constructor() { /** 앱이 몇 개 있는지 찾는 것 */ const apps = getApps(); /** 앱이 한 번도 초기화되지 않았다면 초기화를 시작 */ if (apps.length === 0) { console.info('firebase client init start'); initializeApp(FirebaseCredentials); } /** 초기화가 되었으면 Auth를 가져와서 할당 */ this.auth = getAuth(); console.info('firebase auth'); } /** 인스턴스를 가져옴 */ public static getInstance(): FirebaseClient { if (FirebaseClient.instance === undefined || FirebaseClient.instance === null) { FirebaseClient.instance = new FirebaseClient(); } return FirebaseClient.instance; } /** auth를 반환 */ public get Auth(): Auth { return this.auth; } }
-
미해결실전! Querydsl
SearchTest 질문입니다
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]@Test public void searchTest() { Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Member("member2", 20, teamA); Member member3 = new Member("member3", 30, teamB); Member member4 = new Member("member4", 40, teamB); em.persist(member1); em.persist(member2); em.persist(member3); em.persist(member4); MemberSearchCondition condition = new MemberSearchCondition(); condition.setAgeGoe(35); condition.setAgeLoe(40); condition.setTeamName("teamB"); List<MemberTeamDto> result = memberJpaRepository.searchByBuilder(condition); Assertions.assertThat(result).extracting("username").containsExactly("member4"); }테스트를 돌렸는데 member4만 가지고있다고 밑의 에러가 발생했습니다 . jparepository의 메서드 문제일까요?? 아래는 memberjparepository입니다public List<MemberTeamDto> searchByBuilder(MemberSearchCondition condition) { BooleanBuilder builder = new BooleanBuilder(); if(hasText(condition.getUsername())){ builder.and(member.username.eq(condition.getUsername())); } if(hasText(condition.getTeamName())){ builder.and(team.name.eq(condition.getTeamName())); } if(condition.getAgeGoe() != null) { builder.and(member.age.goe(condition.getAgeGoe())); } if(condition.getAgeGoe() != null) { builder.and(member.age.goe(condition.getAgeLoe())); } return queryFactory .select(new QMemberTeamDto( member.id.as("memberId"), member.username, member.age, team.id.as("teamId"), team.name.as("teamName") )) .from(member) .leftJoin(member.team, team) .fetch(); }
-
미해결실전! Querydsl
delete 후에도 em.flush, clear 가 필요한가요 ?
@Test public void bulkDelete() { long count = queryFactory .delete(member) .where(member.age.gt(18)) .execute(); System.out.println("----------- bulk 연산 직후 / em.flush, clear 전 1 -----------"); List<Member> result = queryFactory .selectFrom(member) .fetch(); for (Member member : result) { System.out.println("member = " + member); } System.out.println("----------- bulk 연산 직후 / em.flush, clear 전 2 -----------"); // em.flush(); // em.clear(); System.out.println("----------- em.flush, clear 후 1 -----------"); List<Member> result2 = queryFactory .selectFrom(member) .fetch(); for (Member member2 : result2) { System.out.println("member2 = " + member2); } System.out.println("----------- em.flush, clear 후 2 -----------"); }update와 달리 delete에서 출력해봤을 때,em.flush 하기 전에도 10살이 회원 한명만 뜨는데delete bulk 연산 후에는 update와 달리 flush, clear가 없어도 상관없나요 ?
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
3-K 코드 질문입니다
저는 문제를 풀 때 한 백조의 위치에서 다른 백조의 위치까지 얼음의 개수를 센 후(cnt), 얼음이 하루 지날때마다 2개씩 없어지므로 나누기 2를 한 후 얼음이 짝수개 일 때와 홀수개 일 때마다 값(ret)을 다르게 출력하도록 하였습니다. http://boj.kr/770d46a0591d4fe7a3f03dc5e00876c4플러드 필을 나름 사용한다고 했지만 어느 곳이 부족한지 알려주시면 감사하겠습니다.
-
해결됨조코딩의 코딩 기초와 웹 풀스택 개발
왜 user/:id 에서 id 앞에 : 을 붙이는 걸까요?
감사합니다
-
미해결[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)
CardStackView 에러발생
OhJunYoung21/Dating_app (github.com) 위 링크안에 제 소스코드들이 담겨있습니다. 노션에 써놓으신 것처럼 gradle파일에 설정까지 완료했으나, no speakable text present라는 에러가 발생합니다. 아예 yuyakaido.cardstackview를 인식하지 못하는 듯합니다. 지금 버전은 Android Studio 2022.2.1 최신버전 사용중입니다.
-
해결됨실무자가 알려주는 CANoe (For CAN 통신)
CAPL 언제 나오노?
마 니 최고다
-
미해결만들면서 배우는 프론트엔드 DO IT 코딩 (Next.js, Typescript)
@types/react를 인식하지 못하는 에러
강사님 안녕하세요. 이 전 질문에 대한 답변으로 get 요청에 대한 문제는 해결했습니다 감사합니다^^그런데 이후 다음과 같은 문제가 발생하였습니다. package-lock.json 삭제하고, node_modules 폴더도 삭제한 뒤 yarn 으로 패키지 재설치하였고,yarn dev, yarn build 등 명령어를 입력하면 다음과 같은 에러 메시지가 출력되면서 localhost:3000에 진입할 수 없습니다.@types/react를 최신버전으로 다시 설치해봤고, 강의에서 사용중인 버전인 ^17.0.37으로도 다시 설치해봤고, vscode 종료 후 재실행하여도 동일한 에러메시지가 계속 출력됩니다.해당 에러 메시지는 npm run dev 명령어를 입력해도 @types/react를 설치하라는 에러가 발생합니다.자체 해결https://stackoverflow.com/questions/71843307/next-js-is-not-recognizing-types-react위 스택오버플로우 답변을 보고 @types/react 버전을 18.0.1 버전으로 변경했습니다. 결과적으로 문제는 해결되었습니다.그러나 의문점은, 강의에서 사용하는 버전은 ^17.0.37인데 저의 경우만 18.0.1버전으로 변경해야 작동하는 것인지?아니면 다른 분들도 작동하지 않으시는지? 저만 그런것이라면 원인이 무엇일지 궁금합니다. ready - started server on 0.0.0.0:3000, url: http://localhost:3000 info - Loaded env from /Users/hanair/dev/blahx2/.env It looks like you're trying to use TypeScript but do not have the required package(s) installed. Please install @types/react by running: yarn add --dev @types/react If you are not trying to use TypeScript, please remove the tsconfig.json file from your package root (and any TypeScript files in your pages directory). error Command failed with exit code 1. info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command. package.json 파일은 다음과 같습니다.{ "name": "blahx2", "private": true, "scripts": { "dev": "next dev", "build": "next build", "start": "next start", "lint": "next lint" }, "dependencies": { "@chakra-ui/react": "1.8", "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", "firebase": "^9.20.0", "firebase-admin": "^11.7.0", "framer-motion": "^6.5.1", "next": "12.0.7", "react": "17.0.2", "react-dom": "17.0.2", "styled-components": "^5.3.3" }, "devDependencies": { "@types/node": "^16.11.13", "@types/react": "^17.0.58", "@types/styled-components": "^5.1.18", "@typescript-eslint/eslint-plugin": "^5.8.0", "@typescript-eslint/parser": "^5.8.0", "babel-eslint": "^10.1.0", "babel-plugin-styled-components": "^2.0.2", "eslint": "8.4.1", "eslint-config-airbnb": "^19.0.2", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^16.1.0", "eslint-config-next": "12.0.7", "eslint-config-prettier": "^8.3.0", "eslint-plugin-babel": "^5.3.1", "eslint-plugin-import": "^2.25.3", "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-react": "^7.27.1", "eslint-plugin-react-hooks": "^4.3.0", "prettier": "^2.5.1", "typescript": "^4.5.4" } }
-
해결됨[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)
인코딩 관련 질문
범주형 데이터 인코딩을 하는데, 강사님이 사용하신 for문을 사용하지 않고, 수치형 데이터 스케일링 하는 방법과 같이 코딩을 하였는데 에러가 발생했습니다. 원인과 수정 방법이 무엇인가요?코딩 : from sklearn.preprocessing import LabelEncoder le = LabelEncoder() display(c_train.head(2)) c_train[cols] = le.fit_transform(c_train[cols]) c_test[cols] = le.transform(c_test[cols]) display(c_train.head(2)) 에러메시지 : ValueError: y should be a 1d array, got an array of shape (29304, 8) instead.
-
해결됨카프카 완벽 가이드 - 커넥트(Connect) 편
Incrementing 모드로 JDBC Source Connector 생성하기 질문
고생하십니다.질문은 해당 강의 진행중에 에러가 발생하여 질문드립니다. vi ~/connector_configs/mysql_jdbc_om_source_00.json을 통한 사전 설정값{ "name": "mysql_jdbc_om_source_00", "config": { "connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector", "tasks.max": "1", "connection.url": "jdbc:mysql://localhost:3306/om", "connection.user": "connect_dev", "connection.password": "connect_dev", "topic.prefix": "mysql_om_", "topic.creation.default.replication.factor": 1, "topic.creation.default.partitions": 1, "catalog.pattern": "om", "table.whitelist": "om.customers", "poll.interval.ms": 10000, "mode": "incrementing", "incrementing.column.name": "customer_id" } } 명령실행값http POST http://localhost:8083/connectors @mysql_jdbc_om_source_00.json명령 결과값HTTP/1.1 201 Created Content-Length: 566 Content-Type: application/json Date: Tue, 25 Apr 2023 01:47:21 GMT Location: http://localhost:8083/connectors/mysql_jdbc_om_source_00 Server: Jetty(9.4.44.v20210927) { "config": { "catalog.pattern": "om", "connection.password": "connect_dev", "connection.url": "jdbc:mysql://localhost:3306/om", "connection.user": "connect_dev", "connector.class": "io.confluent.connect.jdbc.JdbcSourceConnector", "incrementing.column.name": "customer_id", "mode": "incrementing", "name": "mysql_jdbc_om_source_00", "poll.interval.ms": "10000", "table.whitelist": "om.customers", "tasks.max": "1", "topic.creation.default.partitions": "1", "topic.creation.default.replication.factor": "1", "topic.prefix": "mysql_om_" }, "name": "mysql_jdbc_om_source_00", "tasks": [], "type": "source" } 이렇게 post를 통해서 올렸을 때, CONNECT쪽에서 아래와 같은 문제가 계속 발생하고 있습니다. Either no records were produced by the task since the last offset commit, or every record has been filtered out by a transformation or dropped due to transformation or conversion errors. (org.apache.kafka.connect.runtime.WorkerSourceTask:484)connect에 에러가 발생해 일단 강의 진행을 멈춘 상태입니다. 제가 혹시 놓친 부분이 있을지 질문드립니다.
-
미해결선형대수학개론
2.6강의 example 4 find a basis for the null space of the following matrix
안녕하세요 선생님공부를 하다가 식이 어떻게 유도가 되었는지 잘 이해가 안가서 이렇게 질문을 드립니다 x2[2,1,0,0,0] +x4[1,0,-2,1,0] + x5[-3, 0, 2,0 ,1]여기 부분이 어떻게 유도가 되었는지 궁금합니다 +추가질문선생님 그리고 풀의를 보면 1열과 3열에 pivot postion을 확인하여 기저가 1열과 3열인 것 같은데위에 x2, x4, x5랑 다른 의미의 기저인가요? 아님 그냥 기저가 다양하게 있다보니 이렇게 나오는건가요? 감사합니다
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
unity ML-Agent 생성 모델 활용한 inference
unity에서 디지털 트윈환경을 구축하고 ML-Agent로 학습한 모델을실제 운영환경에 적용하여 inference하려고 할 때모델 input/output은 어떻게 구성할 수 있나요?참고할 만한 자료가 있을까요?
-
미해결
코딩할 때 용량차이 이미지 코드
코딩할 때 로딩속도 때문에 통이미지를 바로 넣기보다 html코드작성을 하는걸 더 선호하는데코드가 길어지면 또 그것도 느려지는거 아닌가 하는 의문이 문득 들어서요!통이미지가 많은 것 보다 코드작성이 훨씬 로딩에는 좋은게 맞을까요? 아 추가적으로svg보다 image로 넣는게 보통 용량이 더 큰가요?
-
해결됨팝스타 공식 뮤비 제작 & 유튜브 2천만 뷰 크리에이터의 애니메이트 X 이모티콘 클래스
심볼의 모션을 스프라이트시트로 생성할때..
선생님 안녕하세요.심볼의 모션 이미지 들을 스프라이트 시트로 생성하려고 하는데요다른 동작의 이미지로 바뀌게 되면서 처음 이미지보다 크기가 커지게 되면 이미지가 잘리게 됩니다. 심볼 내부로 가서 크기를 바꿔봤는데 안됩니다. 해결 방법이 있을까요? ㅠ.ㅠ;
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part3: 유니티 엔진
unitychan 프리팹에 Poolable 스크립크를 추가하면 nullreference 에러가 발생합니다.
pool manager #3강을 듣고 있습니다.유니티짱 프리팹에 Poolable을 삽입하고 실행하면NullReferenceException 에러가 발생합니다.코드는 아래와 같습니다.답변해주시면 감사하겠습니다. ㅜㅜ//Poolable.cs using System.Collections; using System.Collections.Generic; using UnityEngine; public class Poolable : MonoBehaviour { //오브젝트가 이 컴포넌트를 들고 있으면 메모리 풀링 적용 public bool isUsing; //풀링이 됐는지 확인 } //PoolManager.cs using System.Collections; using System.Collections.Generic; using UnityEngine; public class PoolManager { #region Pool class Pool { public GameObject Original { get; private set; } #region 설명 /*이 속성은 get 접근자를 가지고 있어 Original GameObject을 가져올 수 있습니다. 또한 private set 접근자를 가지고 있어 Original GameObject을 Pool 클래스 내부에서만 설정할 수 있습니다. private set 접근자가 있는 속성을 사용하면 값을 읽을 수는 있지만 클래스 외부에서 그 값을 변경할 수 없습니다. 이렇게 하면 Original GameObject은 Pool 클래스의 lnit() 메서드로만 설정할 수 있으므로 풀을 특정 GameObject로 초기화할 수 있습니다.*/ #endregion public Transform Root { get; set; } #region 설명 /* //이 코드는 Pool 클래스의 Root 속성을 나타냅니다. 이 속성은 해당 풀에 속한 오브젝트들을 담을 게임 오브젝트의 Transform 컴포넌트입니다. get 접근자와 set 접근자를 모두 가지고 있으므로, 해당 속성은 읽기 및 쓰기가 가능합니다. Root 속성이 null인 경우, 새로운 게임 오브젝트의 Transform 컴포넌트를 만들어 Root 속성으로 할당합니다. */ #endregion Stack<Poolable> _poolStack = new Stack<Poolable>(); #region 설명 /* Pool 클래스 내부에 Stack<Poolable> 타입의 _poolStack 멤버 변수를 선언합니다. 이 스택은 풀링을 위해 사용되며, Poolable 객체의 인스턴스들을 담아 놓습니다*/ #endregion public void lnit(GameObject original, int count = 5) #region 설명 /*인자로 original, count를 받아서 Original, Root를 초기화합니다. Original은 Pool 클래스 내에서 사용되는 GameObject 변수이며, Root는 Pool 내에서 생성된 객체들의 부모 객체로 사용됩니다. 그리고 for문을 사용하여 count만큼 Create 함수를 호출하여 Poolable 객체들을 생성하고 Push 메서드를 호출하여 Stack에 추가합니다. Push 메서드는 Pool 클래스 내부에 구현되어 있으며, Poolable 객체를 Stack에 추가하고 비활성화합니다. */ #endregion { Original = original; Root = new GameObject().transform; Root.name = $"{original.name}_Root"; for (int i = 0; i < count; i++) { Push(Create()); } } Poolable Create() #region 설명 /*Create() 메소드는 새로운 객체를 생성하고, 이를 Poolable 컴포넌트를 추가한 뒤 반환합니다. 첫 번째로 Instantiate 메소드를 사용하여 Original 게임 오브젝트의 복사본을 만들어 go 변수에 할당합니다. 이후 go 변수의 이름을 Original 게임 오브젝트의 이름으로 변경합니다. 마지막으로 go.GetOrAddComponent<Poolable>() 메소드를 호출하여 Poolable 컴포넌트가 이미 추가되어 있으면 해당 컴포넌트를 반환하고, 추가되어 있지 않으면 새로운 Poolable 컴포넌트를 추가한 뒤 반환합니다. 이렇게 반환된 Poolable 컴포넌트가 Push 메소드에서 사용됩니다. */ #endregion { GameObject go = Object.Instantiate<GameObject>(Original); // 복사본은 go에 저장 go.name = Original.name; return go.GetOrAddComponent<Poolable>(); } public void Push(Poolable poolable) #region 설명 /*Push 함수는 Poolable 객체를 받아서 _poolStack 스택에 저장합니다. 이 함수는 객체 풀링의 핵심입니다. 먼저 poolable이 null인 경우, 즉 재활용할 객체가 없는 경우 함수를 바로 종료합니다. 그렇지 않으면, poolable의 transform의 parent를 Root로 설정하여 원본 객체의 하위 개체로 추가합니다. 그리고 gameObject를 비활성화하고, Poolable.isUsing 변수를 false로 설정하여 해당 객체가 사용 중이 아님을 나타냅니다. 마지막으로, poolable을 _poolStack 스택에 푸시합니다. 이렇게 되면 풀에 객체 가 추가되고, 다음에 필요할 때 재활용할 수 있습니다.*/ #endregion { if (poolable == null) return; poolable.transform.parent = Root; #region 설명 /* transform은 Unity 게임 오브젝트의 구성 요소 중 하나로, 게임 오브젝트의 위치, 회전 및 크기를 관리합니다. transform.parent 속성은 해당 게임 오브젝트의 부모 객체의 transform을 나타냅니다. 따라서 poolable.transform.parent = Root; 코드는 poolable 게임 오브젝트의 transform의 부모를 Root로 설정하여, Root 아래에 생성된 모든 게임 오브젝트가 Root의 자식으로서 계층 구조적으로 관리되도록 합니다.*/ #endregion poolable.gameObject.SetActive(false); #region 설명 /* 인자로 전달된 poolable 객체의 게임 오브젝트를 비활성화합니다. 이것은 해당 객체가 풀에 반환되어 사용 가능한 상태가 되었음을 의미합니다.*/ #endregion //업데이트문을 받지않고 수면상태 poolable.isUsing = false; _poolStack.Push(poolable); } public Poolable Pop(Transform parent) #region 설명 /*Pop 함수는 오브젝트 풀에서 사용 가능한 Poolable 객체를 꺼내서 반환하는 함수입니다. parent 매개변수는 반환된 Poolable 객체를 부모로 하는 Transform을 설정할 때 사용됩니다. 함수는 다음과 같은 동작을 수행합니다: _poolStack 스택에서 사용 가능한 Poolable 객체를 가져옵니다. _poolStack 스택에 사용 가능한 Poolable 객체가 없으면 Create() 함수를 호출하여 새로운 Poolable 객체를 만듭니다. 가져온 혹은 새로 만든 Poolable 객체를 활성화합니다. parent 매개변수로 받은 Transform을 부모로 하는 Poolable 객체의 Transform을 설정합니다. isUsing 변수를 true로 설정하여 해당 객체가 사용 중임을 나타냅니다. Poolable 객체를 반환합니다.*/ #endregion { Poolable poolable; if (_poolStack.Count > 0) poolable = _poolStack.Pop(); else poolable = Create(); poolable.gameObject.SetActive(true); poolable.transform.parent = parent; poolable.isUsing = true; return poolable; } } #endregion Dictionary<string, Pool> _pool = new Dictionary<string, Pool>(); #region 설명 /*Dictionary는 key-value pair를 저장할 수 있는 C#의 데이터 구조 중 하나입니다 이 코드는 Dictionary<string, Pool> 타입의 _pool 변수를 선언합니다. Dictionary는 key-value 쌍의 컬렉션으로, 각각의 key에 대응하는 value를 저장합니다. 여기서 key는 string 타입이고 value는 Pool 타입입니다. 따라서 _pool 변수는 string 타입의 key와 Pool 타입의 value를 가지는 Dictionary입니다. 이 변수는 나중에 게임 오브젝트를 풀링할 때 사용됩니다.*/ #endregion //다른곳에 기생 리소스 매니저 보조 Transform _root; #region 설명 /*_root 라는 이름의 Transform 타입 변수를 선언하고 있습니다. Transform은 Unity Engine에서 게임 오브젝트의 위치, 회전, 크기 등의 정보를 담고 있는 컴포넌트입니다. _root 변수는 풀링된 객체들이 모여있는 루트 오브젝트를 가리키는 역할을 합니다. 이 변수는 lnit() 함수에서 생성됩니다.*/ #endregion //트렌스폼은 게임 오브젝트와 연결 public void lnit() #region 설명 /*lnit 함수는 Pool 클래스가 생성될 때 호출되며, Pool 클래스 내부에서 사용되는 변수인 _root를 초기화합니다. _root는 Pool 클래스에서 생성된 모든 객체들이 생성될 때 사용되는 부모 객체입니다. 먼저 if문을 사용하여 _root가 null인지 확인합니다. null이라면, _root가 존재하지 않으므로 새로운 GameObject를 생성하고 _root 변수에 할당합니다. GameObject가 생성되면 해당 GameObject의 이름을 "@Pool_Root"으로 설정하고, Object.DontDestroyOnLoad 함수를 사용하여 게임 오브젝트를 씬 전환시 파괴되지 않도록 합니다. 이렇게 함으로써, Pool 클래스는 게임이 실행되는 동안 계속해서 _root 객체를 사용할 수 있으며, 필요한 경우 Poolable 객체들을 _root 객체의 하위에 위치시켜 관리할 수 있습니다.*/ #endregion { if (_root == null) { _root = new GameObject { name = "@Pool_Root" }.transform; Object.DontDestroyOnLoad(_root); } //게임이 실행된이후로 영구적으로 존재 //풀링이 필요하면 pool_root 산하로 이동해서 보관 } public void CreatePool(GameObject original, int count = 5) #region 설명 /*이 함수는 GameObject을 이용해서 새로운 객체 풀을 생성하는 역할을 합니다. 함수 인자로 original과 count를 받습니다. original은 객체 풀링을 위해 복제할 원본 게임 오브젝트를 의미합니다. count는 생성할 초기 오브젝트 개수를 나타냅니다. 함수 내부에서는 Pool 객체를 생성하고 lnit() 메소드를 이용해 생성한 original과 count를 초기화합니다. 그리고 이 Pool 객체의 Root 프로퍼티를 _root의 자식으로 설정합니다. 마지막으로, _pool 딕셔너리에 original의 이름과 pool을 추가합니다. 따라서, CreatePool() 메소드를 호출하여 객체 풀을 생성하면 해당 원본 게임 오브젝트를 original로 하는 Pool 객체가 생성되고, 이 Pool 객체는 _root 아래에 생성된 후, _pool 딕셔너리에 추가됩니다. 이렇게 생성된 객체 풀은 나중에 필요할 때 GetPool() 메소드를 이용하여 언제든지 접근할 수 있습니다.*/ #endregion { Pool pool = new Pool(); pool.lnit(original, count); pool.Root.parent = _root; //루트를 pool_root에 연결 _pool.Add(original.name, pool); } public void Push(Poolable poolable) #region 설명 /*위 코드는 입력받은 Poolable 객체를 다시 풀에 반환하는 메서드입니다. 입력받은 Poolable 객체의 GameObject 이름을 키로 사용하여, 해당 GameObject의 프리팹이 풀에 존재하는지 검사합니다. ContainsKey 메서드는 Dictionary 클래스에 있는 메서드로, 지정된 키가 Dictionary 컬렉션에 포함되어 있는지 여부를 확인합니다. 여기서는 _pool 딕셔너리에 입력받은 Poolable 객체의 GameObject 이름이 존재하지 않으면, 해당 객체의 게임 오브젝트를 파괴하고 메서드를 종료합니다. 만약 프리팹이 존재하면 해당 객체를 다시 Push 메서드를 이용하여 해당 프리팹의 Pool 객체에 반환합니다.*/ #endregion //풀에다가 푸시하는 함수 //다 사용한다음에 반환하는 작업 { string name = poolable.gameObject.name; if (_pool.ContainsKey(name) == false) #region 설명 /*ContainsKey는 Dictionary<TKey, TValue>에 키가 포함되어 있는지 여부를 반환하는 메서드입니다. 키가 포함되어 있으면 true를, 그렇지 않으면 false를 반환합니다. 예를 들어, Dictionary<string, int> 인스턴스 dict가 있다고 가정해보겠습니다. 이 경우 dict.ContainsKey("apple")은 dict에 "apple"이라는 키가 포함되어 있는지 확인하고, 있으면 true를, 없으면 false를 반환합니다.*/ #endregion { GameObject.Destroy(poolable.gameObject); return; } _pool[name].Push(poolable); } public Poolable Pop(GameObject original, Transform parent = null) #region 설명 /*해당 함수는 풀에서 객체를 꺼내는 역할을 수행하는 함수입니다. 먼저, _pool이 해당 original 객체의 키를 가지고 있는지 확인합니다. 만약 해당 original 객체의 키가 없으면, CreatePool 함수를 통해 새로운 풀을 생성합니다. 그러나 해당 함수에서는 객체를 반환하지 않고, null을 반환하고 있습니다. 객체를 반환하기 위해서는 Pool 클래스의 Pop 함수를 호출해야 합니다. 또한, Transform parent 인자를 활용하여, 해당 객체를 생성한 후, 지정된 부모 객체의 자식으로 추가할 수 있습니다.*/ #endregion // 꺼내는 함수 // parent는 없을 수 도 있다고 체크함. { if (_pool.ContainsKey(original.name) == false) //풀에 오리지날 네임이 있는지 확인 CreatePool(original); return null; } public GameObject GetOriginal(string name) #region 설명 /*이 코드는 이름이 name인 GameObject가 포함된 풀의 Original GameObject를 가져오는 함수입니다. name: 가져오려는 GameObject의 이름 _pool Dictionary에 name을 key로 가지는 Pool이 있는지 검사합니다. 없다면 null을 반환합니다. 있다면 해당 Pool의 Original GameObject를 반환합니다. 이를 통해 필요한 GameObject를 재사용할 수 있습니다.*/ #endregion { if (_pool.ContainsKey(name) == false) return null; return _pool[name].Original; } //@@신이동할때 캐시를 날린다. public void Clear() { foreach (Transform child in _root) #region 설명 /* _root의 자식들에 대해 반복문을 실행하는 코드입니다. _root는 Transform 타입의 변수이며, 생성한 Pool 객체들의 Root Transform을 담고 있는 부모 객체입니다. 즉, _root의 자식들은 Pool 객체의 Root Transform입니다. 따라서 이 코드는 생성한 모든 Pool 객체들의 Root Transform에 대해 반복문을 실행합니다.*/ #endregion //루트 산하에 접근 GameObject.Destroy(child.gameObject); _pool.Clear(); //풀 초기화 } }
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
안녕하세요 질문이 있습니다
C++에관한 질문이 아니라 죄송합니다훌륭한 언리얼 개발자를 위해 강의를 수강하고 있습니다.작은규모의 회사에서 진행중인 프로젝트가 언리얼 기반으로 진행중인데 언리얼에서 html5가 최신버전에선 지원을 안한다고 유니티로 바꾸는게 어떻냐는 의견이 나옵니다.1.실제로 아예 최신버전에선 html5를 지원을 안하고 사용할 수 없을까요?2.언리얼에도 아직 미숙한데 유니티를 다시 처음부터 배우게면서 두마리 토끼를 잡으려고 하면 초보인 저에게는 힘든일이될까요? 감사합니다
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
세션 타임아웃 설정이 안됩니다.
안녕하세요.로그인 처리1 마지막 부분 세션 타임아웃 설정부분.pdf 41page가 안됩니다.application.properties 파일에서server.servlet.session.timeout=10이렇게 해보기도 하고SessionInfoController에서session.setMaxInactiveInterval(10);이렇게 해보아도 타임아웃이 되지 않습니다.제가 기대하는 것은 10초 뒤에는 세션아웃이 되어서 로그인이 필요한 페이지에 접근이 않되는 것인데요.제가 잘못이해하거나 설정이 안된 부분이 있다면 알려주시면 감사하겠습니다.제가 작성한 프로젝트는 여기에 올렸습니다.https://drive.google.com/file/d/1q1VbFHc21BpUgeTIjCvCd5WmXW-abwHm/view?usp=share_link
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
BaseListView 클래스의 get 메서드는 언제/누가 호출하나요?
BaseListView 클래스 get 메서드 로직은 대체로 이해가 가는데 ListView클래스 기반 뷰 내부로직에서 어디에서 이 get메서드를 호출하는지 궁금합니다.
-
해결됨파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트
페이징 처리 매개변수와 페이징처리과정 의문
Q1, Q2, Q3 이 있는데 Q1은 해결한것 같습니다(?) Q1강의 슬라이드에서필기 해주실때paginate_by=10 넘겨줄때 page=3 이라고 하셨는데paginate_by = ~개씩 보기page = 몇 페이지에서의 (현재 보는 페이지)라는 의미라면page 라는 이름의 매개변수까지 전달해주면 혹시 어디로 전달되나요? page라는 값은 쿼리할때도 응답받으로때도 계속 코드에서 기억하고 있어야 할 것 같은데 안보이고있네요..ㅎㅎ살펴보고있는데 page라는 변수는 클래스변수에도 없고 위 그림의 paginate_queryset 메서드의 인자로도 없고 그래서요 (물론 리턴값으로는 나오지만..)자문자답아 paginate_queryset 메서드 상단에 있었네요.(그전 DetailView에서 pk, slug 식별자가 디폴트였던것처럼) page 매개변수도 page_kwargs 클래스변수로 있고 그 값을 룩업 해서 self.kwargs 라는 딕셔너리 클래스변수에서 먼저 뒤지고없다면 아예 HttpRequest 객체에서 뒤지고그래도 없다면 1(첫페이지) 로 하드코딩해서 초기화 하네요 Q2그리고 pagination_queryset 메서드의 page_size 매개변수는 어떤 의미 인가요? 보니깐 get_paginate_by(self, queryset) 로 그냥 단순 paginate_by (몇개씩 볼껀지) 클래스변수를 그대로 getter 해오고 page_size 라는 get_context_data메서드 내 지역변수로 쓰고 버리던데...? 궁금합니다자문자답-> 조회한 전체 qs 수 군요~ Q3get_paginate_by 메서드에 왜 QuerySet 객체가 있을까요? 분명히 이렇게 설계한 이유가 있을꺼 같은데?왜냐면 get_context_data 메서드 안에서get_paginate_by(queryset: QuerySet) 호출한번하는데사실상 API는 get_paginate_by 메서드는 단순하게 클래스변수인 self.paginate_by 를 리턴해주고 있어서 여쭤봅니다.