[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!
안녕하세요. 코팩님! [고급 캐시관리] 파트의 PaginationListView와 PaginationWidgetBuilder에서 제네릭을 처리하는 부분에 있어 타입 추론이 명확하게 되지 않는 부분이 있습니다. class PaginationListView<T extends IModelWithId> extends ConsumerStatefulWidget { final StateNotifierProvider<PaginationProvider, CursorPaginationBase> provider; final PaginationWidgetBuilder<T> itemBuilder; ... @override ConsumerState<PaginationListView> createState() => _PaginationListViewState<T>(); } class _PaginationListViewState<T extends IModelWithId> extends ConsumerState<PaginationListView> { ... 여기서 _PaginationListViewState 클래스는 ConsumerState<PaginationListView>를 상속 받으면서 정확하게는 ConsumerState<PaginationListView<dynamic>>을 상속하게 됩니다. 이로 인해 State클래스 내부에서 호출하는 itemBuilder는 PaginationWidgetBuilder<dynamic>으로 동작하여 실제 사용하는 코드 부분에서 itemBuilder 파라미터에 빌더 작성시 일반적으로는 아래와 같은 에러가 발생합니다. type '(BuildContext, int, RestaurantModel) => Widget' is not a subtype of type '(BuildContext, int, IModelWithId) => Widget' 이에 builder Function 앞에 강의 내용처럼<RestaurantModel>을 선언하여 에러를 회피할 수 있지만, 이럴 경우 빌더에 전달되는 파라미터는 전부 dynamic으로 추론되는 것을 확인했습니다. 그리고, 새로운 익명함수를 정의하는 형태라 그런지 앞에 <RestaurantModel>가 아닌 아무 의미 없이 <ABC>를 적어도 빌드나 실제 앱 동작에 아무런 문제가 없습니다. 그래서 빌더 함수 내부에서 model. 을 입력하더라도 dynamic 이기 때문에 실제로 목표로 하는 모델의 속성들이 자동완성 제안이 되지 않고 런타임에서 대입됩니다. class _PaginationListViewState<T extends IModelWithId> extends ConsumerState<PaginationListView<T>> { ... 위와 같이 State 클래스에서 선언한 제네릭 T를 이용해서 PaginationListView<T>의 ConsumerState 임을 명시했을 때, State클래스 내부의 itemBuilder가 PaginationWidgetBuilder<T>로 잘 동작했습니다. 타입이 명확하므로 builder Function에 <RestaurantModel>을 쓰지 않아도 정확한 타입을 전달해줬습니다. 마찬가지로 final StateNotifierProvider<PaginationProvider, CursorPaginationBase> provider; 이 부분도 제네릭을 명시해야 실제 해당 뷰의 모델에 맞는 프로바이더만 주입 가능하기 때문에 더 나을 것 같습니다. dynamic이 넘어오는게 의아해서, 혼자 이리저리 해보면서 궁금증을 해결했는데 강의에 괜찮은 피드백이 될까 싶어서 글 남깁니다 :) 좋은 강의 감사드립니다. 내용이 좋아서 시간 가는 줄 모르고 꾸준히 듣고 있네요!
안녕하세요. 해당 강의 들은 이후 제가 이해한 바로는 git main브랜치가 변경 된다면 action이 발동되어서 푸시한 내용이 자동으로 홈페이지에 적용되는것으로 이해했는데요. 코드를 수정 후 푸시를 해보았을때 자동으로 ec2코드에서 변경이 되지 않습니다. 이건 private repo라서 그러는 것일까요 ?
설계독학맛비's 실전 FPGA를 이용한 HW 가속기 설계 (LED 제어부터 Fully Connected Layer 가속기 설계까지)
안녕하십니까? BRAM 영역에 DPRAM을 구현하고, DPRAM의 왼쪽은 FPGA 외부와 인터페이스를 하고, 오른쪽은 FPGA 내부 PS영역에 연결하고 싶습니다. 이를 위한 PIN MAPPING 방법에 대해서 알고 싶습니다. 지금 영상을 보면서, DPRAM 구성을 해 보고 있는 상태입니다.
db.sequelize.sync() .then(() => { console.log('db 연결성공') }) .catch(console.error) 선생님 여기서 비동기처리하는 async가 아닌 동기 sync를 사용하 그후에 then을 사용하는 이유가 있을까요 보통 async하고 나서 then 처리하는 방식은 많이 봤는데요 문득 강의 진행중 궁금해서 질문드립니다. 선생님 추가로 회원가입 완료되면 초기화면 으로 돌아가는 로직 구현하는곳에서 문제가 있는데 useEffect(() => { if (signUpDone) { Router.push('/') } }, [signUpDone]) 회원가입 완료되면 signUpDone 이 ture로 변해서 이제 다시 회원가입 화면으로 접근이 안되는데 따로 또 액션 만들어 주어야하는건가요 선생님이 만드신 사이트는 정상 작동하던데 어떤 방식으로 구현하셨는지 궁금합니다. 아니면 강의 후반에 이 로직문제 해결하는게 나오나요?
전투 공식에 대한 설명 중 방어력을 구하는 과정에서 [2번 스텝] 피해 받는 비율 = {(방어력 + 방어상수)/(방어력 + 방어상수)}-{방어력/ (방어력+방어상수)} 에서 [3번 스텝] 피해 받는 비율 = 방어상수/방어력+방어상수 으로 된다고 설명해주셨는데 괄호 순서대로 계산하면 수식을 풀기전인 1 - (피해흡수량) 과 같지 않나요? '피해 받는 비율 = 1 - (방어력 / (방어력+방어상수))' 에서 어떻게 '피해 받는 비율 = 방어상수/방어력+방어상수' 으로 계산되는지 구체적인 계산 과정이 궁금합니다.
안녕하세요 detach 관련 코드를 이리저리 수정해보던 중 @Test void batch() { Member test1 = new Member(10L, "test1"); Member test2 = new Member(20L, "test2"); em.persist(test1); em.persist(test2); em.detach(test1); em.detach(test2); test1.setName("test11"); test2.setName("test22"); em.flush(); } 와 같이 엔티티 두개를 모두 detach로 준영속 상태로 만들 경우 테스트가 정상적으로 살행이 됐으나 @Test void batch() { Member test1 = new Member(10L, "test1"); Member test2 = new Member(20L, "test2"); em.persist(test1); em.persist(test2); em.detach(test1); // em.detach(test2); test1.setName("test11"); test2.setName("test22"); em.flush(); } 처럼 하나만 detach를 했을 경우 처럼 non-threadsafe access 라는 에러가 뜨는데 구글링 해본 결과 영속성 컨텍스트의 thread-safe 관련 내용이 나오는데 혹시 이와 관련이 있어서 발생하는 현상인지 궁금합니다.
안녕하세요? .env 파일, .env.development 파일을 생성하여 환경변수를 분리하여 관리하는 방법을 강의에서 가르쳐주셨는데요. import.meta.env.VITE_API_URL 이런 식으로 소스코드에서 가져와서 사용하는 방법도 알려주셔서 잘 이해가 되었습니다. 다만 저렇게 환경변수를 관리하는 방식이 개발중에는 잘 사용하겠는데, vite build시에는 생각한대로 잘 안되네요 ㅠㅠ 예를 들어, 강의에서 알려주셨듯 (1) .env 파일에 production 환경에서 사용할 환경 변수를 기입하고 (2) vite.config.js 파일에서 mode : 'production' line을 추가한 후 build했는데 (3) dist 폴더의 build 결과물에서는 .env파일이 아닌 .env.development의 환경변수가 적용되어 있습니다 ㅠㅠ 도움주시면 정말 감사하겠습니다!!
설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
안녕하세요 맛비님. 다음과 같은 코드를 보면 always문 안에는 *(asterisk) 로 combination circuit 즉, clock에 의존하지 않습니다. 제가 알기로 무어(MOORE) 머신은 output이 현재 state 에만 의존한다. 클럭 엣지에 의해서만 output이 바뀐다.로 이해하였고, 밀리(MEALY) 머신은 output이 현재 state와 input에 의존한다. 클럭의 한 사이클을 기다리지 않고 같은 사이클에서 입력을 바로 출력에 반영한다. 라고 알고 있습니다. 그럼 위 코드는 clock에 의존하지않고, 1. 현재 상태 = S_IDLE 일 때 현재 입력이 i_run=1이면 clock에 관계없이 바로 output, 즉 다음 상태가 S_RUN으로 되고, 2.현재 상태 = S_RUN 일 때 현재 입력이 is_done=1이면 clock에 관계없이 바로 output, 즉 다음 상태가 S_DONE으로 되고, 3.현재 상태 = S_DONE일 때 현재 입력에 상관없지만 clock에 관계없이 바로 output, 즉 다음 상태가 S_IDLE로 됩니다. c_state는 clock에 의존하여 변하지만, "밀리(MEALY) 머신은 output이 현재 state와 input에 의존한다. 클럭의 한 사이클을 기다리지 않고 같은 사이클에서 입력을 바로 출력에 반영한다. 라고 알고 있습니다." 에서 n_state는 같은 사이클에서 입력을 바로 출력에 반영한다. 라고 보이므로, MEALY 머신이 아닌가요? 인터넷에서는 FSM이 MOORE 머신이라고 나와서 질문드립니다!
안녕하세요. 제가 동영상 으로 진행하다가 404 에러가 발생하여 댓글에 있는 포스트를 이용해서 진행하려고 했으나, sudo certbot --nginx 과정에서 에러가 발생하여 질문하고자 합니다. // etc/nginx/nginx.conf 저는 localhost:3000으로 진행했어서 127.0.0.1:3000으로 기입했습니다.
뷰 템플릿 문법을 넣어서 했는데 에러가 나옵니다. 그래도 따라 했는데요 <template> <div> <header> {{ $ route . name }} </header> <nuxt-link to ="/">홈으로</nuxt-link> <nuxt-link to ="/">메인</nuxt-link> <Nuxt /> </div> </template> 3:13 error Replace ·{{·$route.name·}}· with {{·$route.name·}} prettier/prettier ✖ 1 problem (1 error, 0 warnings) 1 error and 0 warnings potentially fixable with the --fix option.