안녕하세요, 강의 잘 보고 있습니다. 강의 영상에 설명해주신 대로 사이킷런을 1.0.2 버전을 설치하려고 했으나, 주피터 노트북에선 1.6.2버전으로 나와 해결 방법을 찾아보던 중 파이썬을 다운 3.9버전으로 다운 그레이드하면 된다는 답변을 받았습니다. 다만, 파이썬을 다운 그레이드 후 사이킷런을 다시 설치하면 주피터 노트북에서 sklearn이라는 모듈이 없다는 오류가 발생합니다.. 혹시 아나콘다 프롬프트를 관리자 권한으로 실행 후 파이썬을 다운 그레이드 하고, 사이킷런을 1.0.2 버전으로 설치할 수 있는 방법을 알 수 있을까요?
21:09 지금 까지 이해한 포인터의 방법은 주소 사용할때는 & 또는 생략, 값을 사용할때는 *로 이해하고 있습니다. 해당 printf("%s\n", arr[0][0]); 라는 구문에 질문이 있습니다. 포인터 변수로 해당 문자열의 주소를 각 맵핑하였고 배열에 맞게 출력하는걸로 해석이 되는데 이때 왜 값을 안 가져오고 주소를 가져오는지 궁금합니다. 또한 %s로 출력하고 해서 주소대신에 값으로 가져오는지 궁금합니다.
유형 9번에서 처음에 Child obj = new Child(); 의 뜻이 Child 타입의 새로운 생성자를 생성하는 것이고, 이 생성자의 자식 class로 갔는데, 생성자가 없고, 부모에도 생성자가 없어서 출력되는 값은 없는 것이고, 그 뒤의 obj.display()코드를 실행해 display의 메서드에서 부모로부터 상속받아 Parent display, Child display가 답이 되는것이 맞을까요?
안녕하세요! 18강 전체적으로 cache 에 값을 세팅하기 전후로 lock 이나 semaphore 등을 이용해서 GCD 에서 thread safe 를 구현하는 방법에 대한 예시를 들어준것 확인했습니다 이때 removeAll() 의 앞뒤로는 따로 처리가 되어있지않아서, 정말 필요가 없어서 작성되어있지 않은건지, 아니면 단순 예시라서 여기까지는 적용하지 않은건지 궁금합니다 func clearAll() { cache.removeAll() } 두번째로, 이건 주제와 좀 동떨어진 질문이긴한데요..! (혹시 강의 성격과 너무 벗어났다 싶으면 무시해주세요!) 예시를 NSCache 로 들어주셨는데, NSCache 문서에 보면 캐시를 직접 잠그지 않고도 다양한 스레드에서 캐시에 항목을 추가, 제거 및 쿼리할 수 있다고 나와있는걸 확인했습니다. You can add, remove, and query items in the cache from different threads without having to lock the cache yourself 즉, 문서를 통해 자체적으로 thread safe 하게 뭔가를 하고 있구나..를 유추할 수 있기 때문에 (내부적으로는 NSLock 을 사용하고 있긴하지만요) 이럴때는 저희쪽에서 @unchecked Sendable 만 사용해도 무방할까요? 하지만 이런 문서 등을 확인하지 않는 이상 정확히 NSCache 가 thread safe 하게 뭔가를 처리한다는걸 확인할 수 없기 때문에, 예시처럼 @uncheked Sendable 명시와 동시에 자체적으로 semaphore 나 lock 을 걸어줘야하는건지..? 앨런님은 어떻게 생각하시는지 궁금합니다! 감사합니다~
12강 16분 즘에, Task 의 클로저에 value type 의 프로퍼티를 캡처 리스트로 명시하면 아래와 같은 코드에서는 에러가 나지 않는다고 되어있습니다. struct ValueCounter { var value = 0 mutating func increment() -> Int { value = value + 1 return value } } func test() { var valueCounter = ValueCounter() Task { print(valueCounter.increment()) print(valueCounter.value) } Task { [valueCounter] in var newValueCounter = valueCounter print(newValueCounter.increment()) print(newValueCounter.value) } } 하지만 제가 Xcode 26.0.1 에서 확인했을때는 해당 코드의 첫번째 Task 에서 다음과 같은 컴파일 에러가 발생했습니다 Sending value of non-Sendable type '() async -> ()' risks causing data races 이에 추가로 이것 저것 확인해보다가, 아래와 같이 캡처 리스트를 사용하는 Task 를 먼저 작성하면, 에러가 발생하지 않는것을 확인했습니다. // 캡처 리스트 사용하는 Task 순서 변경하니 정상 func test2() { var valueCounter = ValueCounter() Task { [valueCounter] in var newValueCounter = valueCounter print(newValueCounter.increment()) print(newValueCounter.value) } Task { print(valueCounter.increment()) print(valueCounter.value) } } 이와 같은 현상을 어떻게 설명할 수 있을지 궁금합니다. 첫번째 예시의 두번째 Task 에서는 [valueCounter] in 으로 현재 값을 캡처하려고해도, 이미 첫번째로 정의된 Task 에서 valueCounter.increment() 를 호출하면서 다른 스레드 (편의상) 에서 값을 변경하고 있기 때문에, 동일 시점에 딱 한개의 쓰레드에서의 접근이 깨져서 이런 에러가 발생하는 걸까요? (그렇다기엔 에러 위치는 첫번째 Task 정의에서 떠서... 아닌가 싶기도하고요..) 두번째 예시의 첫번째 Task 에서는 캡처 리스트로 값을 캡처해서 valueCounter.increment() 를 호출하고, 두번째 Task 는 valueCounter.increment() 를 하려고해도 이 시점에서 valueCounter 를 참조하고 있는건 이곳 뿐이기 때문에 (첫번째 Task 에서는 캡처해서 사용), 동일 시점에 딱 한개의 쓰레드에서의 접근이 보장되어서 에러가 발생하지 않는걸까요? 결과를 기준으로 나름대로 고민을 해봤는데, 어쨌든 다 추측이라서.. 혹시 이와 같은 현상을 어떻게 이해하면 될지 궁금합니다 감사합니다.
안녕하세요 제가 책보면서 공부중인데 코딩을 할 때 아래와 같이 코딩을 하다보니 에러가 뜨더라구요 result = df['차이'].min()에서 ['차이'] 이거를 빼고 하니까 되던데... 컬럼명을 넣고 안넣고에서 어떤 차이가 있는건가요..? import pandas as pd df = pd.read_csv("delivery_time.csv") # df.info() df['실제도착시간']=pd.to_datetime(df['실제도착시간']) df['주문시간']=pd.to_datetime(df['주문시간']) # df.info() df['차이']=(df['실제도착시간']-df['주문시간']).dt.total_seconds()/60 df = df.groupby('앱종류')['차이'].mean() df result = df['차이'].min() print(result)
강의에 보면 확인버튼의 폰트 색상을 화이트로 줄 때 .background() 부분의 상단 또는 하단 측에 스타일을 줘도 된다고 하셨는데요. 하단 측에 .foregroundStyle(Color.white)를 주게 되면 확인 글자가 나타나지 않더라구요. 상단에만 줘야하는 것 아닌지 여쭤 봅니다.