3강 강의를 듣다가 궁금하게 생겼습니다. 일단 저는 다음과 같이 이해하였습니다. '어떤 Actor가 통신을 하려면 Owner를 따라가봤을때 Connection을 소유해야 하며, 일반적으로 Actor 통신 시 Connection을 가지는 PlayerController의 Connection을 이용하여 통신을 진행한다.' 통신에는 RPC, Property Replicate가 속한다고 생각합니다. 그런데, 제가 AGameState에서 Replicate와 RPC를 사용했던 적이 있어서, 이건 어떻게 통신할까? 혹시 서버의 PlayerController가 Owner일까? 궁금했습니다. 그래서 다음과 같이 AGameState의 HandleBeginPlay에서 람다로 충분한 시간을 준 뒤 Owner를 출력해보았으나, void AABGameState::HandleBeginPlay() { AB_LOG(LogABNetwork, Log, TEXT("%s"), TEXT("Begin")); Super::HandleBeginPlay(); AB_LOG(LogABNetwork, Log, TEXT("%s"), TEXT("End")); FTimerHandle handle; GetWorld()->GetTimerManager().SetTimer(handle, [this]() { AB_LOG(LogABNetwork, Log, TEXT("Owner : %s"), *Owner->GetName()); }, 10.f, false); } Owner 접근 시 크래시가 나는것을 확인하였습니다. 그렇다면, AGameState는 어떻게 Connection을 사용할 수 있는 것인가요? 제가 잘못 이해한 것일까요? 특별한 Connection을 가지는 Actor가 따로 있나요? 아니면 AGameState가 자체적으로 Connection을 가지게 되나요? 혹시 이후 강의에 다루는데 제가 아직 3강까지 밖에 안 봐서 모르는 것일까요..?
13강 MiniRPG를 만들면서 보면 Player가 Monster의 주변을 클릭하면 공격하지 않고 이동하는 경우가 있습니다. (Raycast가 monster에 맞지 않고 근처 땅에 맞은 경우라고 생각하고 있습니다.) 그때 Player가 사선으로 기우는 경우가 생깁니다. Player의 Rigidbody.Constraints.FreezeRotation을 x, y, z를 모두 체크해도 Player가 사선으로 기울게 됩니다. Q1. 왜 Player가 사선으로 기울게 되는지 알 수 있을까요? 그런데 언젠가 부터 원기둥(캡슐 콜라이더는 아닌듯한)이 생겨있어요. 이 원기둥 때문에 사선이여도 뒤로 넘어지지 않는것 같은데, 이 Q2. 원기둥이 뭘까요? Monster(Moving 상태)와 Player(Moving 상태)의 콜라이더를 비교한 샷도 같이 올립니다. Player가 공격 기능을 넣을때부터 계속 나온 이슈인데, 해결이 되지 않고 있습니다. 설명 부탁드립니다. 13강 MiniRPG를 만들면서 보면 Player가 Monster의 주변을 클릭하면 공격하지 않고 이동하는 경우가 있습니다. (Raycast가 monster에 맞지 않고 근처 땅에 맞은 경우라고 생각하고 있습니다.) 그때 Player가 사선으로 기우는 경우가 생깁니다. Player의 Rigidbody.Constraints.FreezeRotation을 x, y, z를 모두 체크해도 Player가 사선으로 기울게 됩니다. Q1. 왜 Player가 사선으로 기울게 되는지 알 수 있을까요? 그런데 언젠가 부터 원기둥(캡슐 콜라이더는 아닌듯한)이 생겨있어요. 이 원기둥 때문에 사선이여도 뒤로 넘어지지 않는것 같은데, 이 Q2. 원기둥이 뭘까요? Monster(Moving 상태)와 Player(Moving 상태)의 콜라이더를 비교한 샷도 같이 올립니다. Player가 공격 기능을 넣을때부터 계속 나온 이슈인데, 해결이 되지 않고 있습니다. 설명 부탁드립니다. (혹시나 해서 관련샷 추가합니다.)
<select name="where" title="초급" class="sel_auto" th:field="*{beginnerCount}"> <option value="0">초급</option> <option th:each="num: ${#numbers.sequence(1, 10)}" th:text="${num + '명'}" th:value="${num}">1</option> </select> 위와같이 numbers.sequence로 1~10까지 select로 만들었는데 서버에서 th:field=*{beginnerCount} 값을 받아와서 만약 받아온 값이 5라고 하면 5가 선택되어지도록 하고 싶은데 이럴 경우에는 어느부분을 수정을 해야 서버에서 받은 값이 선택이 되어질까요?
[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
타입 변환에 관한 질문이며 문자열을 정수로, 정수를 문자열로 변환하는 과정 중에 int(), str() 함수를 사용하여 데이터 타입 변환 후 변수에 할당하였을 때는 print(type())을 출력하면 변환된 타입이 출력되어 결과값이 확인되지만, 그렇지않고 print()함수 안에서 int(),str() 함수를 사용하여 변환시에는 위의 사진과 같이 type()함수로 확인 시 int(), str()함수를 썻음에도 불고하고, 출력값이 변환되지않고 나오게됩니다. type을 변환하기 위해서는 따로 변수를 만들어서 int(), str() 함수를 써서 변수에 할당해주어야하나요??
안녕하세요 강의 도움이 많이되고 있어 감사말씀드립니다. 제가 FCM을 사용한 그룹 알림 발송 배치 API 를 개발 중에 있습니다. processor 에서 그룹에 속한 알림에 대해서 fcm 전송을 하는데 trcy catch 로 성공일 경우 알림성공 업데이트를 위한 객체를 생성하고 실패일 경우 알림실패 업데이트를 위한 객체 따로따로 생성하고 있습니다. 그 다음으로 writer 로 던집니다. 문제는 stepListener 에서 총 몇개에서 총 몇건 전송했고, 성공, 실패 로깅하는 방법을 모르겠습니다. 또 stepListener 에서 모두 다 실패했으면 알림 그룹의 상태 값을 전송 실패 그 외 성공으로 변경하는 로직이 있습니다. 추가 + 일단 StepSynchronizationManager 를 사용해서 ExecutionContext 에 저장해서 stepListener 에서 아래와 같이 사용하고 있습니다. 올바르게 사용한건지 궁금합니다. int successCount = stepExecution.getExecutionContext().getInt("successCount", 0); int failureCount = stepExecution.getExecutionContext().getInt("failureCount", 0);
안녕하세요 강사님 :) 1:12 부근에서 "ARM은 메모리를 높은 주소부터 낮은 방향으로 쓴다" 고 말씀하셨는데, 이것은 리틀 엔디안 방식을 이용한다는 것을 의미하는 것일까요?? 그리고 맞다면 인터넷에 검색해보니 ARM은 리틀 엔디안 or 빅 엔디안 중 선택해서 사용한다고 나와 있는 것을 봤는데 모든 ARM processor가 리틀 엔디안을 쓰는 것이 맞을까요..??
안녕하세요! 다른분꺼 내용 보고 해답을 찾을 뻔 했다가 무한스크롤이 50번째에서 멈추는 현상을 발견했습니다 ㅠㅠ 저는 크롬 브라우저를 띄우지 않고 진행하니까 500개까지 크롤링이 되었는데, 크롬 브라우저를 띄우고 진행하고싶은데 어떻게 해결해야할까요,,? 로딩시간 2초정도 할당했는데 진행이 안되서 질문 남깁니다! from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import urllib.request # 크롬 드라이버 자동 업데이트 from webdriver_manager.chrome import ChromeDriverManager import time import pyautogui import os # 브라우저 꺼짐 방지 chrome_options = Options() chrome_options.add_experimental_option("detach", True) # 크롬창 안뜨게 함 chrome_options.add_argument('--headless') # headless 모드 활성화 chrome_options.add_argument('--disable-gpu') # GPU 가속 비활성화 # Mozilla 웹 브라우저에서 온 것처럼 인식 / 자동화된 요청을 감지하고 차단하는 것을 우회 chrome_options.add_argument("--user-agent=Mozilla/5.0") # 불필요 메세지 없애기 chrome_options.add_experimental_option("excludeSwitches", ["enable-logging"]) # 드라이버 업데이트 service = Service(executable_path=ChromeDriverManager().install()) # 옵션 적용 browser = webdriver.Chrome(service=service, options=chrome_options) keyword = pyautogui.prompt('검색어를 입력하세요.') # 폴더 만들기 if not os.path.exists(f'크롤링/심화2/{keyword}모음'): os.mkdir(f'크롤링/심화2/{keyword}모음') # path = f'https://www.google.co.kr/search?tbm=isch&hl=ko&source=hp&biw=&bih=&q={keyword}' # 구글 path = f'https://search.naver.com/search.naver?where=image&sm=tab_jum&query={keyword}' # 네이버 browser.implicitly_wait(5) browser.maximize_window() browser.get(path) before_h = browser.execute_script("return window.scrollY") # 무한스크롤 while True: time.sleep(2) # 맨 아래로 스크롤을 내림 browser.find_element(By.CSS_SELECTOR,"body").send_keys(Keys.END) # 스크롤 후 높이 after_h = browser.execute_script("return window.scrollY") # 스크롤 높이가 맨 아래와 같다면 무한루프 탈출 if after_h == before_h: break # 스크롤 높이 업데이트 before_h = after_h # 이미지 태그 추출 imgs = browser.find_elements(By.CSS_SELECTOR, '._image._listImage') for i, img in enumerate(imgs, 1): # 각 이미지 태그의 주소 추출 link = img.get_attribute('src') # 이미지 저장 urllib.request.urlretrieve(link, f'크롤링/심화2/{keyword}모음/{i}.png') print(f'img {i}개: {link}') print('\nDvlp.H.Y.C.Sol\n')
세션세그먼트에 '국가ID가 미국과 정확히 일치'하는 경우와 '국가 ID가 미국과 정확히 일치하지 않는'경우 두가지 세그먼트를 만들었는데 두 세그먼트사이에 중복값이 존재합니다. 제가 이해한 바로는 세션의 국가 ID가 미국인 경우 세션이 시작될 때 IP 주소가 미국입니다. 세션의 국가 ID가 미국이아닌 경우 세션이 시작 될 때 IP 주소가 미국이 아닙니다. 그런데 어떻게 미국세션과 미국이외의 국가 세션에 중복값이 나올 수 있는지 모르겠습니다. 미국 유저 = 항상 IP가 미국이었던 유저 미국 외유저 = 한번이라도 IP가 미국이 아니었던 유저 미국 세션 = 유저가 구매한 당시 세션이 미국인 경우 미국 외 세션 = 유저가 구매한 당시 세션이 미국이 아닌경우 이렇게 이해했는데 제가 어떤점을 잘못 이해한걸까요?
const state = observable({ name: "zero", age: 28, married: false, }); autorun(() => { console.log("autorun : " + state.name); }); reaction( () => state.name, () => { console.log("reaction : name changed"); } ); runInAction(() => { state.name = "nureongi"; state.age = 26; }); const action1 = action(() => { state.married = true; }); const action2 = action(() => { state.married = false; }) action1(); action2(); /** autorun : zero autorun : nureongi reaction : name changed **/ 안녕하세요! 강의 잘 듣고 있습니다. 제가 궁금한 것은 강의에서 autorun 은 observable에 담긴 모든 state가 변경될 때 마다 실행된다고 하셨는데 실제 실험해보니 결과가 조금 다르게 나온 것 같았습니다. 그래서 확인해보니 다음과 같이 동작한다는 사실을 알게 되었습니다. autorun이 정의될 때 한 번 실행 autorun 함수 내부에서 참조하고 있는 observable state가 변경될 때 실행 아마 버전이 업데이트 되면서 바뀐 것 같은데 제가 알게 된 사실이 맞을까요?