안녕하세요! 우선 어디에서도 볼 수 없었던 없는 흥미로운 강의 감사합니다. 덕분에 자동화의 매력에 눈을 떠서 하루하루 저만의 매크로를 만드는 재미를 느끼며 지내고 있습니다 :) 오늘 드리고 싶은 질문은 인트로에서 예시로 보여주셨던 것처럼 특정 상황에서 영문으로 고정되게 설정하는 방법을 알고싶어서 입니다! VS Code에서 readme 파일을 한글로 작성하다가 단축키를 이용해 teminal로 포커스를 옮기면 그 때 영문으로 자동 변환되도록 설정해보고 싶은데 그게 가능할지 trigger를 어떻게 주면 좋을지 모르겠어서 질문 남깁니다. 새해복 많이 받으세요!
Q1) A가 출력되지 않는 이유는? 영상 (02:40)에 나오듯이 scanf의 %c는 한 문자만 읽을 수 있음으로, "A 3 2"을 입력시, A만 호출되고 \n는 버퍼에 남겨지는 상태를 볼 수 있습니다. 그로 인하여, 다음 출력문으로 입력하였던 "B 1 2"대신에 (\n 3 2)가 먼저 출력되는 것을 확인할 수 있습니다. 여기서 우리는 실제 scanf(%c %d %d)버퍼에 입력된 값이 ('A', 3, 2, '\n')임을 알 수 있습니다. scanf(%c %d %d) ↔ ('A', 3, 2, '\n') 그래서 다음과 같은 테스트를 진행해보았습니다. 영상(02:40)와 달라진 점은 기존에 \n자리에 s가 들어가고, 바로 그 뒤에 '\n'이 붙는다는 점입니다. 즉, 현재 scanf(%c) 버퍼에는 'A', 's', '\n'가 들어가 있는 것이죠. 그렇다면 총 (A 3 2), (s 3 2), (\n 3 2)순으로 while문이 출력되어야 할 것이라는 것이 저의 예상이었습니다. 그러나 위 결과물처럼 'A'는 생략되고, 's'가 출력되는 것을 확인할 수 있습니다. 한편, 버퍼에 남아있던 '\n'는 잘 출력되는 것을 확인할 수 있습니다. ----------------------------------------------------------------------------------- 2) 영상 (05:10)의 오해. // 자문자답 (선생님의 코드와 동일합니다. "* 3 5 빈칸"을 입력하셔서 한 번 반복되신 것으로 확인됩니다. 아마 사람들은 빈칸을 못보고 지나간 다음에 스스로 테스트한 것과 달라서 의문이 생길 수 있으니 다음 분들은 참고해주세요!) 영상에 나온 코드로 "A 3 2"를 입력하면 while문은 종료하게 됩니다. 왜냐하면 while문의 조건이 (c = getchar()) != '\n')인데, 질문1 처럼 'A'과 함께 '\n'도 같이 입력이 되니, while싸이클을 한 번 돌고, 다시 올라오면 '\n'와 만나서 반복되지 않고 프로그램은 종료되는 것을 확인할 수 있습니다. 영상에서 보여진대로, 이는 while문 중간에 while (getchar() != '\n') continue;를 넣어주면 해결할 수 있습니다. 그 이유는 A 3 2를 입력하였을 때, getchar함수로 인하여 char c 변수에 'A' 문자 데이터가 저장되고, 버퍼에 남아있던 \n가 두 번째while문에서 읽혀지고 해당 while문 영역에서 벗어나면서 사라지기 때문입니다. ----------------------------------------------------------------------------------- Q3) \n는 어디로?? 본래, 저의 질문입니다. getchar을 청소해주는 while문을 주석처리해놓고, "# 3 2 빈칸"과 "% 1 2"를 입력해보았습니다. 얼핏보면 당연한 결과물이라고 생각할수도 있으나, 질문2 에서 확인했다시피 "# 3 2" 싸이클이 끝나면 해당 while문은 '빈칸 3 2'을 한번 더 돌리고, '\n'을 만나서 종료되어야 했습니다. 즉, '\n'의 다음 순서인 "% 1 2"는 실행되어서는 안됩니다. "# 3 2 빈칸"을 입력하는 순간, 버퍼에는 ['#', 3, 2, '빈칸' '\n']가 저장이 됩니다. 이는 while문은 총 (# 3 2), (빈칸 3 2) (\n 3 2)를 돌릴 수 있는 경우의 수를 가지게 됩니다. 이 때, (\n 3 2)는 while문 조건에 의하여 종료되고 실행되지는 않아야 합니다. ***디버깅 테스트: 1. "# 3 2"가 출력된다. 2. 두 번째 싸이클인 "빈칸 3 2"이 시작되면 scanf함수가 실행이 됩니다. 3. scanf함수에 입력한 "% 1 2"는 버퍼에 들어가게 됩니다. 위 이미지처럼 char c변수에는 getchar함수로 인하여 '#'부터 '빈칸', '\n', '%'순으로 문자를 하나씩 버퍼에서 꺼내옵니다. 그 와중에 \n은 어디에서 제거가 된 것인가요?
거듭되는 질문에 죄송합니다; 43강 수강중인데 기능은 제대로 구현됬으나, subscribe/list/로 접속할때 pycharm console창에 계속 아래와 같은 메세지가 나옵니다. 무슨 순서 관련인것 같긴한데 구독페이지 기능은 영상처럼 구현은 되고 있고 무엇이 문제인가요? filter 에 순서를 지정해줘야하는건가요?? 에러 내용: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unordered object_list: <class 'projectapp.models.Project'> QuerySet. return self.paginator_class(
제가 강의를 들으면서 새로 하나 다시 만들고있는데요 OpenAPI를 활용한 날씨앱을 만들고있습니다. Json파싱을 이용하고 있고요 파싱까지는 잘됩니다. 질문은 TableView -> Table View Cell (ex weather)이라는 걸 생성하고 거기에 파싱받는 값은 잘 넘어오고 있습니다. 그런데 Table View 안에 여러개의 Table View Cell를 이용하고 싶습니다. 각각 JSon파싱한 값을 뿌려주고 싶은데 numberofRowsInSection에서 return 값을 어찌해야할지 고민이네요 지금은 제가 1가지의 값만 얻고 싶어서 return 1;로만 지정해놓은 상태이긴한데 가장 상단에 만든 weather의 cell정보만 출력이되고 새로 만든 Cell의 정보는 출력이 되지않고있습니다. (NSLog로는 출력이 됩니다) View 에 출력을 가능하게 하려면 어느부분을 수정해야할까요 .?
안녕하십니까 영한님. 우선 항상 좋은 강의에 감사드리며 새해복 많이 받으시길 바랍니다! 다름이 아니라 제가 영한님 수업때 강조받기를 파라미터를 통해서 엔티티를 받지말고 항상 스펙에 알맞는 DTO를 만들어서 받으라고 이해했습니다. 1. 그렇다면 스펙이 아주 조금 다르더라도 (멤버 변수 하나 차이 정도?) 매번 DTO(커맨드 객체라고 표현해도 맞을까요?)를 별도로 만들어서 데이터를 바인딩 시켜줘야 할까요? 2. 그리고 이건 Spring Data JPA 관련 부분이긴 하지만 JpaRepository<> 에서 기본으로 제공하는 findAll() 의 경우 return type이 List<T> 로 되어 해당 엔티티 타입의 리스트로 반환이 됩니다. 엔티티를 노출 시키지 말라고 강조를 받은 저로써 이 부분은 어떻게 되는건지 의문이 생겨서요. Spring Data JPA 의 경우 뭔가 다른건지 아니면 이 리스트를 다시 DTO를 통해 걸러야하는건지 의문이 생겨 질문 남기도록 하겠습니다!
강의 보고 잠깐 혼동했던 개념이 1.global 객체는 전역으로 공유 된다 2.a.js에서 global.abc = "abc" 라고 하고 b.js에서 console.log(global.abc)라고 했을 때, "abc"가 찍힌다.로 이해했는데 실험을 해보니 undifinded가 뜹니다. ---- 조금더 실험을 해봤는데 아래의 결론이 맞을까요? b.js에 // const a = require("./a"); 를추가하니까 console.log(global.abc)가 출력됩니다. 제가 이해한 현 상태는 아래와 같습니다. require (해당파일) 해야만 동일한 글로벌 객체를 공유하게 되는건가요?? 강좌에서는 전역 객체이기 때문에 파일 간 global이 공유된다고 하셔서요..
while(true) { int expected = 0; int desired = 1; if (Interlocked.CompareExchange(ref _locked, desired, expected) == expected) break; Thread.Yield(); } 이 코드를 정리를 해보면 만약에 A 쓰레드가 있고, B쓰레드가 있다 A쓰레드가 공유 자원을 점유하고 있으면 lock이 0에서 1로 바뀌고 B 쓰레드는 접근 하려니까 lock이 1이니까 계속 무한 루프를 돈다. 이것은 성능상의 저하를 불러 일으킨다. 왜? 쓸데없는 행동이기 때문에 따라서 A쓰레드가 공유자원을 사용을 끝날 때 까지 B쓰레드를 무한루프를 돌게 하지말고 재우는데 Thread.sleep, yeild.. 뭐 이런 함수를 이용해서 재우는데 그럼 무한 루프가 잠시 멈추는 상황이잖아요? 그럼 a쓰레드가 공유자원을 쓰고 나왔다는 것을 어떻게 알 수 있나요? 검색 해보니까 sleep을 os가 깨운다는데 그럼 정리를 해보면 면접관님 께서 만약 이런 질문을 하시면 일단 OS가 A 쓰레드가 할일을 끝냈으니, 잠자고 있던 B쓰레드를 깨워서 그때부터 반복을 해서 다시 LOCK 검사를 진행합니다. LOCK 변수 값이 0이라면 컨텍스트 스위칭이 일어나는데 A 쓰레드의 정보가 레지스터에서 지워지고 B 쓰레드 정보가 채워짐으로써 B 쓰레드가 CPU를 점유하고 이제 B쓰레드가 공유자원 _num변수를 사용해서 _num++연산이 진행이 됩니다. 이렇게 저는 해당 챕터 강의를 이해 하고 정리를 했거 든요 혹시 틀린 점이 있다면 알려주심 감사하겠습니다. 아 그 sleep 걸어놓고 os가 깨우는 거 맞는지도 알려주시면 감사하겠습니다. ^^
안녕하세요 영한센세!!! 역대급 강의 정말 감사합니다ㅠㅠ,,, 강의가 너무 재밌고 유익해서 자야하는데 ... 멈출수가 없어요... 다름이 아니라 강의 7:17 분 경에 나온 인텔리제이가 제공하는 다이어그램 설정하는 부분에 대해서 다른분들에게 조그마한 도움이 될까 몇글자 남깁니다!! 단순해요 !! 그냥 자기가 보고 싶은 클래스, 인터페이스, 추상클래스를 선택하고 영한센세께서 가르쳐 주신 것 처럼 우클릭후 Show Diagram / Show Diagram Pop UP 누른 뒤 JavaClasses를 누르면 짜잔! 이렇게 나옵니다! 단순하게 상위 패키지에 설정하면 복잡한 구조가 나오고 내가 보고싶은 것만 콕콕 찝어서 보면 저렇게 나옵니다 :) 별것 아니지만 공유드립니다😄
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
void ChooseLotto(int numbers[]) { srand((unsigned)time(0)); int count = 0; bool overlap; while (count < 6) { int randValue = 1 + (rand() % 45); overlap = false; for (int i = 0; i < count; i++) { if (randValue == numbers[i]) overlap = true; break; } if (overlap) continue; numbers[count] = randValue; count++; } Sort(numbers, 6); } 강의와 달리 저는 중복을 체크하는 found 값을 overlap이란 변수명으로 whil문 밖에서 선언하고, while을 돌때마다 false로 갱신해주는 방법으로 함수를 짜봤는데, 중복을 못걸러내는 문제가 발생했습니다. 제가 보기엔 강의에서의 코드와 거의 차이가 없는데 왜 중복을 못거르는 문제가 발생하는지 잘 모르겠습니다.