묻고 답해요
161만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[코드캠프] 강력한 CSS
15:41에 나오는 grid 예시
안녕하세요 수업을 듣다가 15:41에 나오는 예시가 잘못된것같아서 질문남겨봅니다! 강사님이 써준 코드대로면 grid-column이 적용되는 범위가 첫번째 1fr과 두번째 2fr 사이까지가 아닌가요?그림으로 보여드리자면파랑색 부분이지 않나요?답변해주시면 감사하겠습니다! ++++++ 좋은 강의감사합니다 재밌게 공부중입니다!
-
미해결실전! 스프링부트 상품-주문 API 개발로 알아보는 TDD
.ast
안녕하세요 강사님테스트하실 때 .ast를 활용하여 assertThat()을 활성화하시던데 방법을 알 수 있을까요?postfix 를 활용하시는 것 같은데 어떻게 하는지 정확히 궁금합니다!
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
선생님 세그멘테이션관련 질문을 드립니다 ㅎ
선생님 안녕하세요이번에 선생님강의 머신러닝2개, 컴퓨터비젼2개를 모두 완강한 열혈팬 회사원입니다 ㅎㅎㅎ선생님 강의 덕분에 이번에 회사에서 세그멘테이션을 담당하게 되엇는데, 세그멘테이션강의관련 질문이 잇어서 이렇게 메일을 드립니다 ㅎ 바쁘시겟지만 조언 좀 부탁드리겟습니다<배경>이번에 검출할 객체(첨부파일)는 바늘과 같이 아주 가늘고 긴 객체(섬유)인데 이미지1장당 객체전체면적이 0.5 - 2%밖에 없는 아주 미세한 객체입니다. 실제원본데이터에서도 객체는 눈으로 자세히 보아야 검출할수 잇을정도입니다 ㅎ (학습데이터30장, 학습마스크영상 30장, 테스트데이터 5장 ). 사용모델은 깃헙에서 공개한 U-NET모델로 세그멘테이션을 수행햇는데, 첫epoch부터 정확도가 90%이상, 로스가 0.1이하로 상당히 높은 성능을 보엿는데 예측결과이미지영상에는 아무것도 검출이 안된 상태(완전검은영상)입니다. 참고로 다른 이미지데이터를 가지고 U-NET모델로 세그멘테이션을 수행해본결과 예측결과도 상당히 잘되어서 모델에는 문제가없는것으로 판단햇습니다.여기서 조언을 좀 부탁드리겠습니다.1> 정확도는 90%이상, 로스가 0.1이하인데 아무것도 검출이 안되엇다는 것은 , 객체가 너무미세해서 검출을 못한걸로 이해해도 되는지요?2> 이런경우 성능을 올리기 위한방법으로 오그멘테이션방법도 잇는데, 특히 사용해야할 오그멘테이션방법이 잇는지요? 참고로 확대기능등을 사용햇습니다.3> 다른방법으로 선생님CNN강의에서사용한 mark-rcnn 방법도 해볼려고 하는데, 어떻게 생각하시는지요?글을 적다보기 글이 너무 길어져서 죄송합니다, 바쁘시겟지만 조언 좀 부탁드리겟습니다 ㅎ
-
미해결자바 스프링부트 활용 웹개발 실무용
E03 Swagger 설치 + 게시판 API 문서화
Swagger 설치 후, 접속 url이http://localhost:7777/swagger-ui.html인가요?
-
미해결스프링 핵심 원리 - 기본편
discount 에 대해서.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]1. discount 메서드가 제가 제대로 이해한게 맞나요?public int discount(Member member, int price, String discountCode) { DiscountPolicy discountPolicy = policyMap.get(discountCode); // map 에서 해당 key 값을 주입 System.out.println("discountCode = " + discountCode); System.out.println("discountPolicy = " + discountPolicy); return discountPolicy.discount(member,price); }DiscountPolicy discountPolicy = policyMap.get(discountCode);이 부분이 policyMap 에 있는 key값이 스프링 빈 이름이고 그에 해당하는 value를 가져와서 부모인 DiscountPolicy discountPolicy 에 구현체인 fix나 rate 값을 넣고 discountPolicy.discount(member,price); }fix나 rate discountPolicy 를 실행하기 위한 값member,price 값을 넣어주는 메서드가 맞을까요 ? 2. list, policies를 이용한 discount 실행 시 코드 DiscountService discountService = ac.getBean(DiscountService.class);실행 시 DiscountService에 있는 출력 결과가 fix는 key, value 값을 제대로 조회해 주는데 policyMap = {fixDiscountPolicy=hello.core.discount.FixDiscountPolicy@246f8b8b, rateDiscountPolicy=hello.core.discount.RateDiscountPolicy@278bb07e}rate의 경우 value 만 출력이 되는데 private final List<DiscountPolicy> policies;policies를 사용 시 어떻게 코드를 짜야 할까요 ??int listNum = 0; if(discountCode == "fixDiscountPolicy"){ listNum = 0; }else{ listNum = 1; } DiscountPolicy discountPolicy = policies.get(listNum);list 등록 순서를 알아서 이렇게 짜긴 했는데 더 간단한 방법이 있나 질문 남깁니다.
-
해결됨실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
jar 빌드시 오류가 뜹니다
jar 빌드 부분에서 Build Failed라고 뜨는데 원인이 무엇인지 잘모르겠어요
-
미해결UIKit - iOS14 실무 가이드 <iOS앱 진짜 개발자 되기>
UIKit 요소에 대하여...
해당 강의에서 Swift 문법 하나는 체계적으로 공부할 수 있었습니다.[문제]그러나, UIkit에 관련된 내용들은 클론 프로젝트를 만들며 간간히 나오는 개념을 그때그때 익히고 있습니다. 즉, 강의에서 UIkit 요소들을 따로 가르쳐주지는 않습니다.[솔루션 질의]UIkit의 요소와, 요소가 가진 property들을 체계적으로(정리된) 공부하고 싶습니다.참고할만한 사이트가 있을까요?
-
해결됨디자인 시스템 with 피그마
aos에서의 line height 관련 질문드립니다
안녕하세요 선생님. 좋은 강의 감사합니다. 1.토큰 스튜디오를 통해 Line height 토큰을 만들었는데요! AOS의 경우 android:lineSpacingExtra 를 행간에 사용하고, 피그마와 동일 수치를 입력할 시 뷰에 적용된 모습에는 차이가 있는 상황입니다. 현재는 임의로 위아래에 패딩을 추가해 개발하고 있어요. 그래서 하나의 Line height 토큰을 aos에 적용할 시 피그마 시안과 달라 보이는 문제가 생기는데 이런 문제는 어떻게 해결할 수 있을까요? 2. 칩버튼 만들 때 boxradius를 세로값의 50%를 주면 된다는 답변을 보았는데, 세로값이 고정이 아니고 변수일 경우 토큰 플러그인의 계산식 등록을 어떻게 해야 할까요? {height} /2 는 적용이 안 되네요... 감사합니다.
-
해결됨[코드캠프] 부트캠프에서 만든 고농축 프론트엔드 코스
section 02 quiz 네번째 관련 질문입니다!
Int cannot represent non-integer value에러 404가 발생하면 네트워크 콘솔 창에서 해당 오류가 계속 발생한다고 뜹니다. 아마 가격을 제대로 입력받지 못해서 뜨는 오류같은데 어떻게 해결하는지 모르겠습니다 ㅠimport { gql, useMutation } from '@apollo/client' import { Fragment, useState } from 'react' const CREATE_PRODUCT = gql` mutation createProduct($seller: String, $createProductInput: CreateProductInput!){ createProduct(seller: $seller, createProductInput:$createProductInput){ _id number message } } ` export default function Graphql_Mutation2(){ const [seller, setSeller] = useState('') const [name, setName] = useState('') const [detail, setDetail] = useState('') const [price, setPrice] = useState(0) const [myFunction] = useMutation(CREATE_PRODUCT) const onClickSubmit = async () => { const result = await myFunction({ variables:{ seller:seller, createProductInput:{ name:name, detail:detail, price:price } } }) console.log(result) console.log(seller, name, detail, price) alert(result.data.createProduct.message) } const onChangeSeller = (e) => { setSeller(e.target.value) } const onChangeName = (e) => { setName(e.target.value) } const onChangeDetail = (e) => { setDetail(e.target.value) } const onChangePrice = (e) => { parseInt(setPrice(e.target.value)) } return( <Fragment> 판매자: <input type='text' onChange={onChangeSeller} /><br /> 판매 제품: <input type='text' onChange={onChangeName} /><br /> 간략한 소개: <input type='text' onChange={onChangeDetail} /><br /> 가격: <input type='number' onChange={onChangePrice} /><br /> <button onClick={onClickSubmit}>GRAPHQL-API(동기) 요청하기</button> </Fragment> ) }
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
빌드 및 실행 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]제가 이해한 것이 맞는지 확인 차 질문 드립니다.빌드하고 실행하기 영상에서 cmd 창에 ./gradlew build 명령어를 통해 파일을 빌드하고 실행하였습니다 따라서 폴더에 build 파일이 만들어졌고 외부에 배포할 때는 이것을 사용한다고 배웠습니다. 이와 같이 cmd 창에서 빌드하고 실행한 것과 intellij idea 내에서 Application을 실행한 것이 위치만 다르지 같은 의미일까요?말을 좀 이상하게 했는데 둘 다 빌드하고 실행하는 역할을 하는 것이 맞는지 궁금하여 질문 드립니다. 답변 부탁드립니다. 감사합니다
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part1: C# 기초 프로그래밍 입문
TextRPG EnterField 부분
using System; //ref : 기존 변수를 메서드에서 수정할 때 사용 //out : 메서드 내에서 생성된 값을 반환할 때 사용 namespace TextRPG_1 { class Program { enum ClassType { None = 0, Knight = 1, Archer = 2, Mage = 3 } struct Player { public int hp; public int attack; } static ClassType ChooseClass() { Console.WriteLine("직업을 선택하세요"); Console.WriteLine("[1] 기사"); Console.WriteLine("[2] 궁수"); Console.WriteLine("[3] 법사"); ClassType choice = ClassType.None; string input = Console.ReadLine(); switch (input) { case "1": choice = ClassType.Knight; break; case "2": choice = ClassType.Archer; break; case "3": choice = ClassType.Mage; break; } return choice; } static void CreatePlayer(ClassType choice, out Player player) { switch (choice) { case ClassType.Knight: player.hp = 100; player.attack = 10; break; case ClassType.Archer: player.hp = 75; player.attack = 12; break; case ClassType.Mage: player.hp = 50; player.attack = 15; break; default: player.hp = 0; player.attack = 0; break; } } enum MonsterType { None = 0, Slime = 1, Orc = 2, Skeleton = 3 } struct Monster { public int hp; public int attack; } static void CreateRandomMonster(out Monster monster) { Random rand = new Random(); int type = rand.Next(1, 4); switch (type) { case (int)MonsterType.Slime: Console.WriteLine("슬라임이 스폰되었습니다"); monster.hp = 20; monster.attack = 2; break; case (int)MonsterType.Orc: Console.WriteLine("오크가 스폰되었습니다"); monster.hp = 40; monster.attack = 4; break; case (int)MonsterType.Skeleton: Console.WriteLine("스켈레톤이 스폰되었습니다"); monster.hp = 30; monster.attack = 3; break; default: monster.hp = 0; monster.attack = 0; break; } } static void EnterGame(ref Player player) { while (true) { Console.WriteLine("마을에 접속했습니다"); Console.WriteLine("[1] 필드로 간다"); Console.WriteLine("[2] 로비로 돌아가기"); string input = Console.ReadLine(); switch (input) { case "1": EnterField(ref player); break; case "2": return; } } } static void EnterField(ref Player player) { while (true) { Console.WriteLine("필드에 접속했습니다"); Monster monster; CreateRandomMonster(out monster); Console.WriteLine("[1] 전투 모드로 돌입"); Console.WriteLine("[2] 일정 확률로 마을로 돌아가기"); String input = Console.ReadLine(); if (input == "1") { Fight(ref player, ref monster); } else if (input == "2") { Random rand = new Random(); int per = rand.Next(0, 101); if (per > 33) { Console.WriteLine("도망에 실패했습니다. 전투 모드로 돌입합니다."); Fight(ref player, ref monster); } else { Console.WriteLine("도망치는 데 성공했습니다"); EnterGame(ref player); } } } } static void Fight(ref Player player, ref Monster monster) { while (true) { monster.hp -= player.attack; if (monster.hp <= 0) { Console.WriteLine("승리했습니다!"); Console.WriteLine($"hp:{player.hp}"); break; } player.hp -= monster.attack; if (player.hp <= 0) { Console.WriteLine("패배했습니다!"); break; } } } static void Main(string[] args) { while (true) { ClassType choice = ChooseClass(); if(choice != ClassType.None) { Player player; CreatePlayer(choice, out player); EnterGame(ref player); } } } } }해당 코드를 실행했을 때 처음 직업 선택 후 마을 접속 -> 로비로 돌아가기를 누르면 정상적으로 직업 선택 창으로 이동할 수 있는데,한번 필드에 접속하면 [2] 일정확률로 마을로 돌아가기 <를 성공해서 EnterGame()에 다시 접속하는 경우에는 로비를 돌아가기를 눌러도 계속해서 몬스터가 생성이 됩니다. 코드에서 어떤 부분을 고쳐야 해결할 수 있을까요? ㅠㅠ
-
미해결스프링 프레임워크는 내 손에 [스프1탄]
34강 조회수 증가가 새로고침을 해야만 되네요
있는 그대로 타이핑 하고 업뎃까지 한다음에 실행을 해주었는데 열고닫고 할때는 조회수가 증가가 안되지만 새로고침을 해야만 증가가 되네요 왜그러는건가요?
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
ArgumentResolver가 어떻게 사용되는지를 보고싶어요
customArgumentResolvers로 검색을 해보면 customArgumentResolvers을 사용해서 무언가 처리를 하는곳이 없는것같은데.. 어디서 처리를하는걸까요 저는 이 그림에서 1번의 과정을 눈으로 확인하고 싶은거예요RequestMapping핸들러 어댑터는 handle이라는 메서드도 가지고 있지 않아서.. 어떻게 핸들러를 호출하는지도 잘 모르겠네요
-
미해결Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
127.0.0.1:8000/order-service/fcec75e5-6858-4112-8659-34000efd1988/orders
본 챕터 강의에 있는 모든 코드를 정상적으로 입력하였는데, 포스트맨으로 테스트시 에러가 발생합니다. --- 포스트맨 입력 값 ---POST 127.0.0.1:8000/order-service/fcec75e5-6858-4112-8659-34000efd1988/orders{ "productId": "CATALOG-001", "qty": 10, "unitPrice": 1500 }--- 포스트맨 반환 값 ---{ "timestamp": "2023-01-30T12:44:33.233+00:00", "status": 404, "error": "Not Found", "message": "No message available", "path": "/order-service/fcec75e5-6858-4112-8659-34000efd1988/orders" }
-
미해결[유니티 레벨 업!] 모듈식으로 개발하는 퀘스트&업적 시스템
QuestSystemSaveTest 수강 후 오류
안녕하세요 선생님강의를 열심히 따라 듣고있던 중 세이브 & 로드 구현하고 테스트하는 와중 에러메세지 때문에 몇일 고민하다가 도저히 안되겠어서 글 남깁니다어딘가 오타가있는건 아닌지 꼼꼼히 확인해봤는데 제눈엔 도저히 찾질 못하겠습니다 ㅜㅜ우선 에러메세지는 다음과 같습니다세이브 테스트 오브젝트에 스크립트도 잘 부착하였구요스크립터블 오브젝트도 강의와 똑같이 만들고 부착하였습니다어느 스크립트가 문제인지 몰라 Quest, QuestSystem, QuestSystemSaveTest세가지 스크립트 작성하여 등록하겠습니다Quest.csusing System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; using System.Diagnostics; using Debug = UnityEngine.Debug; public enum QuestState { Inactive, Running, Complete, Cancel, WaitingForCompletion // 퀘스트 완료시 자동으로 완료되는게 아닌, 사용자가 퀘스트 완료를 눌러야 완료되는 상태 } [CreateAssetMenu(menuName = "Quest/Quest", fileName ="Quest_")] public class Quest : ScriptableObject { #region Event public delegate void TaskSuccessChangeHandler(Quest quest, Task task, int currentSuccess, int prevSuccess); public delegate void CompleteHandler(Quest quest); public delegate void CancelHandler(Quest quest); public delegate void NewTaskGroupHandler(Quest quest, TaskGroup currentTaskGroup, TaskGroup prevTaskGroup); #endregion [SerializeField] private Category category; [SerializeField] private Sprite icon; [Header("Text")] [SerializeField] private string codeName; [SerializeField] private string displayName; [SerializeField, TextArea] private string description; [Header("Task")] [SerializeField] private TaskGroup[] taskGroups; [Header("Reward")] [SerializeField] private Reward[] rewards; [Header("Condition")] [SerializeField] private Condition[] acceptionConditions; [SerializeField] private Condition[] cancelConditions; [Header("Option")] [SerializeField] private bool useAutoComplete; [SerializeField] private bool isCancelable; // 캔슬 불가능한 퀘스트를 위한 변수 [SerializeField] private bool isSaveable; private int currentTaskGroupIndex; #region 프로퍼티들 public Category Category => category; public Sprite Icon => icon; public string CodeName => codeName; public string DisplayName => displayName; public string Description => description; public QuestState State { get; private set; } public TaskGroup CurrentTaskGroup => taskGroups[currentTaskGroupIndex]; public IReadOnlyList<TaskGroup> TaskGroups => taskGroups; public IReadOnlyList<Reward> Rewards => rewards; public bool IsRegistered => State != QuestState.Inactive; public bool IsCompletable => State == QuestState.WaitingForCompletion; public bool IsComplete => State == QuestState.Complete; public bool IsCancel => State == QuestState.Cancel; public virtual bool IsCancelable => isCancelable && cancelConditions.All(x=>x.IsPass(this)); public bool IsAcceptable => acceptionConditions.All(x => x.IsPass(this)); public virtual bool IsSaveable => isSaveable; #endregion public event TaskSuccessChangeHandler onTaskSuccessChanged; public event CompleteHandler onCompleted; public event CancelHandler onCanceled; public event NewTaskGroupHandler onNewTaskGroup; // Awake 역할의 함수로 Quest가 System에 등록되면 실행될 함수 public void OnRegister() { // 퀘스트를 중복 등록했을경우 에러 발생 Debug.Assert(!IsRegistered, "This quest has already been registered."); foreach (var taskGroup in taskGroups) { taskGroup.Setup(this); foreach (var task in taskGroup.Tasks) task.onSuccessChanged += OnSuccessChanged; } State = QuestState.Running; CurrentTaskGroup.Start(); } public void ReceiveReport(string category, object target, int successCount) { Debug.Assert(IsRegistered, "This quest has already been registered."); Debug.Assert(!IsCancel, "this quest has been canceled"); if (IsComplete) return; CurrentTaskGroup.ReceiveReport(category, target, successCount); if (CurrentTaskGroup.IsAllTaskComplete) { if (currentTaskGroupIndex + 1 == taskGroups.Length) // 다음 taskGroup이 없다면 { State = QuestState.WaitingForCompletion; if (useAutoComplete) Complete(); } else { var prevTaskGroup = taskGroups[currentTaskGroupIndex++]; prevTaskGroup.End(); CurrentTaskGroup.Start(); onNewTaskGroup?.Invoke(this, CurrentTaskGroup, prevTaskGroup); } } else State = QuestState.Running; } public void Complete() { CheckIsRunning(); foreach (var taskGroup in taskGroups) taskGroup.Complete(); State = QuestState.Complete; foreach (var reward in rewards) { reward.Give(this); } onCompleted?.Invoke(this); onTaskSuccessChanged = null; onCompleted = null; onCanceled = null; onNewTaskGroup = null; } public virtual void Cancel() { CheckIsRunning(); Debug.Assert(IsCancelable, "this quest can't be canceled"); State = QuestState.Cancel; onCanceled?.Invoke(this); } public Quest Clone() { var clone = Instantiate(this); clone.taskGroups = taskGroups.Select(x => new TaskGroup(x)).ToArray(); return clone; } public QuestSaveData ToSaveData() { return new QuestSaveData { codeName = codeName, state = State, taskGroupIndex = currentTaskGroupIndex, taskSuccessCounts = CurrentTaskGroup.Tasks.Select(x => x.CurrentSuccess).ToArray() }; } public void LoadFrom(QuestSaveData saveData) { State = saveData.state; currentTaskGroupIndex = saveData.taskGroupIndex; for (int i = 0; i < currentTaskGroupIndex; i++) { var taskGroup = taskGroups[i]; taskGroup.Start(); taskGroup.Complete(); } for (int i = 0; i < saveData.taskSuccessCounts.Length; i++) { CurrentTaskGroup.Start(); CurrentTaskGroup.Tasks[i].CurrentSuccess = saveData.taskSuccessCounts[i]; } } private void OnSuccessChanged(Task task, int currentSuccess, int prevSuccess) => onTaskSuccessChanged?.Invoke(this, task, currentSuccess, prevSuccess); [Conditional("UNITY_EDITOR")] // 유니티 에디터로 시행할때만 작동하도록 함 private void CheckIsRunning() { Debug.Assert(IsRegistered, "This quest has already been registered."); Debug.Assert(!IsCancel, "this quest has been canceled"); Debug.Assert(!IsComplete, "this quest has already been completed"); } } QuestSystem.csusing System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; using Newtonsoft.Json.Linq; public class QuestSystem : MonoBehaviour { #region Save Path private const string kSaveRootPath = "questSystem"; private const string kActiveQuestsSavePath = "activeQuests"; private const string kCompletedQuestsSavePath = "completedQuests"; private const string kActiveAchievementsSavePath = "activeAchievements"; private const string kCompletedAchievementsSavePath = "completedAchievements"; #endregion #region Events public delegate void QuestRegisteredHandler(Quest newQuest); public delegate void QuestCompletedHandler(Quest quest); public delegate void QuestCanceledHandler(Quest quest); #endregion private static QuestSystem instance; private static bool isApplicationQuitting; public static QuestSystem Instance { get { if(!isApplicationQuitting && instance == null) { instance = FindObjectOfType<QuestSystem>(); if(instance == null) { instance = new GameObject("Quest System").AddComponent<QuestSystem>(); DontDestroyOnLoad(instance.gameObject); } } return instance; } } private List<Quest> activeQuests = new List<Quest>(); private List<Quest> completedQuests = new List<Quest>(); private List<Quest> activeAchievements = new List<Quest>(); private List<Quest> completedAchievements = new List<Quest>(); private QuestDatabase questDatabase; private QuestDatabase achievementDatabase; public event QuestRegisteredHandler onQuestRegistered; public event QuestCompletedHandler onQuestCompleted; public event QuestCanceledHandler onQuestCanceled; public event QuestRegisteredHandler onAchievementRegistered; public event QuestCompletedHandler onAchievementCompleted; public IReadOnlyList<Quest> ActiveQuests => activeQuests; public IReadOnlyList<Quest> CompletedQuests => completedQuests; public IReadOnlyList<Quest> ActiveAchievements => activeAchievements; public IReadOnlyList<Quest> CompletedAchievements => completedAchievements; private void Awake() { questDatabase = Resources.Load<QuestDatabase>("QuestDatabase"); achievementDatabase = Resources.Load<QuestDatabase>("AchievementDatabase"); if(!Load()) // 저장된 데이터가 없다면 업적에 등록 { foreach (var achievement in achievementDatabase.Quests) Register(achievement); } } private void OnApplicationQuit() { isApplicationQuitting = true; Save(); } public Quest Register(Quest quest) { var newQuest = quest.Clone(); if(newQuest is Achievement) { newQuest.onCompleted += OnAchievementCompleted; activeAchievements.Add(newQuest); newQuest.OnRegister(); onAchievementRegistered?.Invoke(newQuest); } else { newQuest.onCompleted += OnQuestCompleted; newQuest.onCanceled += OnQuestCanceled; activeQuests.Add(newQuest); newQuest.OnRegister(); onQuestRegistered?.Invoke(newQuest); } return newQuest; } // 내부용 private void ReceiveReport(List<Quest> quests, string category, object target, int successCount) { foreach (var quest in quests.ToArray()) quest.ReceiveReport(category, target, successCount); } //외부용 public void ReceiveReport(string category, object target, int successCount) { ReceiveReport(activeQuests, category, target, successCount); ReceiveReport(activeAchievements, category, target, successCount); } public void ReceiveReport(Category category, TaskTarget target, int successCount) => ReceiveReport(category.CodeName, target.Value, successCount); // 수업자료 보고 추가한 메서드 public void CompleteWaitingQuests() { foreach (var quest in activeQuests.ToList()) { if (quest.IsCompletable) quest.Complete(); } } public bool ContainsInActiveQuests(Quest quest) => activeQuests.Any(x => x.CodeName == quest.CodeName); public bool ContainsInCompletedQuests(Quest quest) => completedQuests.Any(x => x.CodeName == quest.CodeName); public bool ContainsInActiveAchievements(Quest quest) => activeAchievements.Any(x => x.CodeName == quest.CodeName); public bool ContainsInCompletedAchievements(Quest quest) => completedAchievements.Any(x => x.CodeName == quest.CodeName); private void Save() { var root = new JObject(); root.Add(kActiveQuestsSavePath, CreateSaveDatas(activeQuests)); root.Add(kCompletedQuestsSavePath, CreateSaveDatas(completedQuests)); root.Add(kActiveAchievementsSavePath, CreateSaveDatas(activeAchievements)); root.Add(kCompletedAchievementsSavePath, CreateSaveDatas(completedAchievements)); PlayerPrefs.SetString(kSaveRootPath, root.ToString()); PlayerPrefs.Save(); } private bool Load() { if (PlayerPrefs.HasKey(kSaveRootPath)) { var root = JObject.Parse(PlayerPrefs.GetString(kSaveRootPath)); LoadSaveDatas(root[kActiveQuestsSavePath], questDatabase, LoadActiveQuest); LoadSaveDatas(root[kCompletedQuestsSavePath], questDatabase, LoadCompletedQuest); LoadSaveDatas(root[kActiveAchievementsSavePath], achievementDatabase, LoadActiveQuest); LoadSaveDatas(root[kCompletedAchievementsSavePath], achievementDatabase, LoadCompletedQuest); return true; } else return false; } private JArray CreateSaveDatas(IReadOnlyList<Quest> quests) { var saveDatas = new JArray(); foreach (var quest in quests) { if(quest.IsSaveable) saveDatas.Add(JObject.FromObject(quest.ToSaveData())); // SaveData를 Json형태로 변환하여 JsonArray에 넣어줌 } return saveDatas; } private void LoadSaveDatas(JToken datasToken, QuestDatabase database, System.Action<QuestSaveData, Quest> OnSuccess) { var datas = datasToken as JArray; foreach (var data in datas) { var saveData = data.ToObject<QuestSaveData>(); var quest = database.FindQuestBy(saveData.codeName); OnSuccess.Invoke(saveData, quest); } } private void LoadActiveQuest(QuestSaveData saveData, Quest quest) { var newQuest = Register(quest); newQuest.LoadFrom(saveData); } private void LoadCompletedQuest(QuestSaveData saveData, Quest quest) { var newQuest = quest.Clone(); newQuest.LoadFrom(saveData); if (newQuest is Achievement) completedAchievements.Add(newQuest); else completedQuests.Add(newQuest); } #region Callback private void OnQuestCompleted(Quest quest) { activeQuests.Remove(quest); completedQuests.Add(quest); onQuestCompleted?.Invoke(quest); } private void OnQuestCanceled(Quest quest) { activeQuests.Remove(quest); onQuestCanceled?.Invoke(quest); Destroy(quest, Time.deltaTime); } private void OnAchievementCompleted(Quest achievement) { activeAchievements.Remove(achievement); completedAchievements.Add(achievement); onAchievementCompleted?.Invoke(achievement); } #endregion } QuestSystemSaveTest.csusing System.Collections; using System.Collections.Generic; using UnityEngine; public class QuestSystemSaveTest : MonoBehaviour { [SerializeField] private Quest quest; [SerializeField] private Category category; [SerializeField] private TaskTarget target; private void Start() { var questSystem = QuestSystem.Instance; if(questSystem.ActiveQuests.Count == 0) { Debug.Log("Register"); var newQuest = questSystem.Register(quest); } else { questSystem.onQuestCompleted += (quest) => { Debug.Log("Complete"); PlayerPrefs.DeleteAll(); PlayerPrefs.Save(); }; } } private void Update() { if (Input.GetKeyDown(KeyCode.Space)) QuestSystem.Instance.ReceiveReport(category, target, 1); } } 이상입니다..
-
미해결유니티 머신러닝 에이전트 완전정복 (기초편)
경로 생성
안녕하세요 DDPG 부분까지 재밌게 수강했습니다.드론이 랜덤하게 생성되는 particle (goal)에 도달하는 것 말고 유니티 상에서 경로를 생성해 준 후 그 경로를 goal이라고 지정한 후에, 그 경로를 잘 따라가게끔 하는 것을 실습해보고자 합니다.혹시, 유니티에서 경로를 생성하게끔 해주는 툴을 알고 계신가요?강의 내용과는 거리가 있지만, 알고 계시다면 답변 부탁드립니다.
-
미해결스프링 시큐리티 OAuth2
무한리디렉션 궁금증
안녕하세요 선생님 강의 잘듣고 있습니다 오늘 처음으로 spring 시큐리티와 keycloak 와 사용해서 간단한 RestController 을 만들어서 keycloak 로 로그인하는 강의를 들었는데 궁금점이 생겼습니다 applition.yml redirect 구성하실때 http://localhost:8081/login/oauth2/code/keycloak이 주소가 시큐리티 ouath2 로그인 고유 주소인가요? 제가 테스트한다고 oauth2 에 다른 문자열을 넣고 돌리면 리디렉션이 너무 많다고 크롬 , 엣지에서 오류가 발생합니다 ex1) clientId - OAuth2-client-appredirectUri=http://localhost:8081/login/oauth2/code/keycloakex2)clientId - OAuth2-client-appredirectUri=http://localhost:8081/login/OAuth2-client-app/code/keycloak 이렇게 비교를 해보았는데 1번은 로그인이 잘되고 2번은 계속 무한 리디렉션이 나옵니다 그래서 ex1) 번을 크롬 개발자 도구로 쫒아 가보니 1) http://localhost:8081/oauth2/authorization/keycloak status :302 Location: http://localhost:8080/realms/spring-security-OAuth2/protocol/openid-connect/auth?response_type=code&client_id=OAuth2-client-app&scope=openid%20email%20profile&state=wNz-VZFRvu_Nr8KUFYjRshELNLOFbUZVO9vWdcEQrs4%3D&redirect_uri=http://localhost:8081/login/oauth2/code/keycloak&nonce=ehS4VAjQJBrDf7APtHtUbWuzwdOnCJAOd8BhRhSohoU 2) http://localhost:8080/realms/spring-security-OAuth2/protocol/openid-connect/auth?response_type=code&client_id=OAuth2-client-app&scope=openid%20email%20profile&state=wNz-VZFRvu_Nr8KUFYjRshELNLOFbUZVO9vWdcEQrs4%3D&redirect_uri=http://localhost:8081/login/oauth2/code/keycloak&nonce=ehS4VAjQJBrDf7APtHtUbWuzwdOnCJAOd8BhRhSohoUstatus : 302 Location: http://localhost:8081/login/oauth2/code/keycloak?state=wNz-VZFRvu_Nr8KUFYjRshELNLOFbUZVO9vWdcEQrs4%3D&session_state=0e8d5564-fa24-4521-9bd9-bd931d42beb7&code=58d084f3-272e-4e31-ad4d-edc808fde122.0e8d5564-fa24-4521-9bd9-bd931d42beb7.e3344d0f-ca0d-44fd-8993-08b7b90ca190 3) http://localhost:8081/login/oauth2/code/keycloak?state=wNz-VZFRvu_Nr8KUFYjRshELNLOFbUZVO9vWdcEQrs4%3D&session_state=0e8d5564-fa24-4521-9bd9-bd931d42beb7&code=58d084f3-272e-4e31-ad4d-edc808fde122.0e8d5564-fa24-4521-9bd9-bd931d42beb7.e3344d0f-ca0d-44fd-8993-08b7b90ca190status : 302 Location: http://localhost:8081/ 스프링 시큐리티 안에서 oauth2 가 가지는 고유의 엔드포인트 라고 생각을 해야 하는게 맞는거겠죠? 무한리디렉션이 생기는 이유는 솔직히 모르겠습니다 아마 로그인 권한은 획득했는데.. 그 이후는 잘 모르겠습니다.
-
미해결처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 (쉽게! 기본부터 챗GPT 핵심 트랜스포머까지) [데이터분석/과학 Part3]
Prepare dataset 부분에서 코드 오류가 납니다 ㅠㅠ
첨부해주신 코드를 복사 붙여넣기 했는데, 오류가 나네요.. ㅠㅠ오류명은 : ---> 21 class CustomDataset(Dataset): 22 def init(self, file_list, transform=None): 23 self.file_list = file_listTypeError: str() argument 'encoding' must be str, not tupledataset_train = CustomDataset(train_list, transform=transforms_for_train) dataset_valid = CustomDataset(val_list, transform=transforms_for_val_test) dataset_test = CustomDataset(test_list, transform=transforms_for_val_test)CustomDataset 클래스를 통해, train, valid, test를 만들어주는 과정에서, str() arguments를 받아야 한다는 것 같은데.. 왜 오류가 나는지 잘 모르겠습니다.from torchvision import transforms input_size = 224 transforms_for_train = transforms.Compose([ transforms.RandomResizedCrop(input_size, scale=(0.5, 1.0)), transforms.RandomHorizontalFlip(), transforms.RandomVerticalFlip(), transforms.RandomRotation(10), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) transforms_for_val_test = transforms.Compose([ transforms.Resize(input_size), transforms.CenterCrop(input_size), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) #class Dataset class CustomDataset(Dataset): def __init__(self, file_list, transform=None): self.file_list = file_list self.transform = transform def __len__(self): return len(self.file_list) def __getitem__(self, idx): img_path = self.file_list[idx] if img_path.split('/')[-1][-3:] == 'jpg': img = Image.open(img_path) if self.transform is not None: img_transform = self.transform(img) label = img_path.split('/')[-1].split('.')[0] if label == 'dog': label = 1 elif label == 'cat': label = 0 return img_transform, label dataset_train = CustomDataset(train_list, transform=transforms_for_train) dataset_valid = CustomDataset(val_list, transform=transforms_for_val_test) dataset_test = CustomDataset(test_list, transform=transforms_for_val_test) # from torch.utils.data import DataLoader # 데이터 로더 클래스 # # train_batches = DataLoader(dataset=dataset_train, batch_size=8, shuffle=True) # val_batches = DataLoader(dataset=dataset_valid, batch_size=8, shuffle=False) # test_batches = DataLoader(dataset=dataset_test, batch_size=8, shuffle=False)강의 내용과 같이 len(train_list), len(val_list)가 잘 출력이 됨을 볼 수 있고, Reference 항목에서 특정 img의 사이즈를 출력해볼 떄도, (500, 374) 라고 잘 출력됨을 알 수 있었습니다.train할 데이터와 test 데이터는 강의 중에 배운 os 명령어 및 with zip 명령어를 사용해서<오류 화면 입니다.>전체 작성한 코드 첨부드립니다.import zipfile Dataset = 'dogs-vs-cats-redux-kernels-edition' with zipfile.ZipFile('../BecomeProfessional/' + Dataset + ".zip", "r") as z: z.extractall(".")import pandas as pd import numpy as np import warnings warnings.filterwarnings('ignore') from PIL import Image import torch import torch.nn as nn from torch.utils.data import DataLoader, Subset from torchvision import datasets, transforms from sklearn.model_selection import train_test_split from copy import deepcopy import matplotlib.pyplot as plt import os, shutilimport random import os #device 설정 device = 'cuda' if torch.cuda.is_available() else 'cpu' print(device) seed = 42 # seed값 설정 random.seed(seed) # 파이썬 난수 생성기 os.environ['PYTHONHASHSEED'] = str(seed) # 해시 시크릿값 고정 np.random.seed(seed) # 넘파이 난수 생성기 torch.manual_seed(seed) # 파이토치 CPU 난수 생성기 torch.backends.cudnn.deterministic = True # 확정적 연산 사용 설정 torch.backends.cudnn.benchmark = False # 벤치마크 기능 사용 해제 torch.backends.cudnn.enabled = False # cudnn 기능 사용 해제 if device == 'cuda': torch.cuda.manual_seed(seed) torch.cuda.manual_seed_all(seed)original_data_path = './Dog_Cat/' os.makedirs('dogsvscats', exist_ok=True) import zipfile with zipfile.ZipFile(os.path.join(original_data_path, 'train.zip')) as train_zip: train_zip.extractall('./Dog_Cat/dogsvscats') with zipfile.ZipFile(os.path.join(original_data_path, 'test.zip')) as test_zip: test_zip.extractall('./Dog_Cat/dogsvscats')import glob print(glob.glob('./Dog_Cat/dogsvscats/train/*'))출력: ./Dog_Cat/dogsvscats/train\\cat.11346.jpg', './Dog_Cat/dogsvscats/train\\cat.11347.jpg', './Dog_Cat/dogsvscats/train\\cat.11348.jpg', './Dog_Cat/dogsvscats/train\\cat.11349.jpg', ' .... (엄청 많이 출력됩니다)train_dir = './Dog_Cat/dogsvscats/train' test_dir = './Dog_Cat/dogsvscats/test' all_train_files = glob.glob(os.path.join(train_dir, '*.jpg')) test_list = glob.glob(os.path.join(test_dir, '*.jpg')) train_labels = [path.split('/')[-1].split('.')[0] for path in all_train_files] train_list, val_list = train_test_split(all_train_files, test_size=0.1, stratify=train_labels, random_state=seed) print(len(train_list), len(val_list))출력: 22500 2500train_list[0]출력: './Dog_Cat/dogsvscats/train\\cat.4814.jpg'img = Image.open('./Dog_Cat/dogsvscats/train/cat.4814.jpg') img.size출력: (500, 374)import IPython image1 = IPython.display.Image(filename='./Dog_Cat/dogsvscats/train/cat.4814.jpg') display(image1)from torchvision import transforms input_size = 224 transforms_for_train = transforms.Compose([ transforms.RandomResizedCrop(input_size, scale=(0.5, 1.0)), transforms.RandomHorizontalFlip(), transforms.RandomVerticalFlip(), transforms.RandomRotation(10), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) transforms_for_val_test = transforms.Compose([ transforms.Resize(input_size), transforms.CenterCrop(input_size), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) #class Dataset class CustomDataset(Dataset): def __init__(self, file_list, transform=None): self.file_list = file_list self.transform = transform def __len__(self): return len(self.file_list) def __getitem__(self, idx): img_path = self.file_list[idx] if img_path.split('/')[-1][-3:] == 'jpg': img = Image.open(img_path) if self.transform is not None: img_transform = self.transform(img) label = img_path.split('/')[-1].split('.')[0] if label == 'dog': label = 1 elif label == 'cat': label = 0 return img_transform, label dataset_train = CustomDataset(train_list, transform=transforms_for_train) dataset_valid = CustomDataset(val_list, transform=transforms_for_val_test) dataset_test = CustomDataset(test_list, transform=transforms_for_val_test)오류 발생
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
파이어베이스 한도 추가
계정의 프로젝트 한도에 도달했습니다. 기존 프로젝트에 Firebase를 추가하거나 한도 상향을 요청할 수 있습니다.이렇게 나오길래 이동해서 몇가지 작성해서 보냈습니다그 후 이런 메일이 왔는데 어떤 것을 추가로 회신해야 할까요?
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
이 강의를 듣고 JETPACK 개론 강의로 넘어가도 괜찮을까요?
https://www.inflearn.com/questions/760208/comment/237501여기서 알려주신데로 다른 곳에서 Room을 이용하여 만드는 메모장 앱을 따라 만들어봤는데바인딩같은 개념을 잘 모르니까 따라해도 이해가 안가고 어렵더라구요 ..왕초보편 듣고 바로 제트팩 개론 강의로 넘어가도 될까요 ??