안녕하세요. 좋은 강의 감사합니다. 강의를 듣고 저도 word로 데이터를 가공해, 저만의 챗봇을 huggingface에 있는 모델을 사용해 만들어 streamlit에 띄우고 싶습니다. 그런데 streamlit에 띄우는 과정에서 계속 로딩이 오래걸리거나, 로컬과 달리 이상한 답변이 나오는 등 문제를 겪고 있습니다. 참고하면 좋을 만한 자료가 있을까요?
다름이 아니고 UserListViewController에서 private func bindView() { tableView.rx.prefetchRows .bind { [weak self] indexpath in guard let rows = self?.tableView.numberOfRows(inSection: 0), let itemIndex = indexpath.first?.item else { return } if itemIndex >= rows - 1 { self?.fetchMore.accept(()) } } .disposed(by: disposeBag) } 해당 코드 작성한 것을 확인했는데 이 상황에서 itemIndex >= rows - 1 가 정상적으로 동작하지 않는다고 생각이 들어서요. 정상적으로 동작하는 경우도 있지만 (천천히 스크롤 할 때) 빠르게 스크롤했을때 rows 는 30이라고 할때 itemIndex 는 24가 찍혀 self?.fetchMore.accept(()) 가 실행이 안되더라구요 그렇다면 prefetchRows 를 쓰는게 좋은 방법인가에 대한 생각이 들어서 질문 드립니다!
✅ 연습문제 (1) Array & Struct -- 연습문제 1) 영화 제목 별로 장르를 unnest하여 출력 -- select 절에서 새로운 이름으로 사용해야 unnest한 값이 출력됨 (기존의 array칼럼은 사용하지 않기) select title, genre from`avdanced.array_exercises` as ori ,unnest(genres) as genre --연습문제 2) 영화별로 배우와 배역을 출력. -- safe_offset 사용시, 모든 칼럼에 대하여 일일히 [0], [1].. 해줘야 하는 문제 -> UNNEST 사용. select title, ac.actor, ac.character from`avdanced.array_exercises` as ori ,unnest(actors) as ac -- 연습문제 3) title, actor, character, genre 출력 select title, ac.actor, ac.character, genre from`avdanced.array_exercises` as ori ,unnest(actors) as ac ,unnest (genres) as genre --연습문제 4) 배열을 풀기 select user_id, event_date, event_name, user_pseudo_id, eve.key, eve.value.string_value, eve.value.int_value from`avdanced.app_logs_temp` as ori , unnest (event_params) as eve where event_date = '2022-08-01' (2) Pivot 연습문제 --Pivot : 집계함수(if (조건문, true일 때 값, False일때 값)) as new_column + GROUP BY (False일때의 값은 NULL또는 0으로 해주기) --1) id를 기준으로 amount sum을 pivot, order_date를 행, user_id를 열 -- 연습문제 1-1) 서브쿼리 사용하기 select order_date, sum(if(user_id=1, sum_of_amount, 0)) as user_1, sum(if(user_id=2, sum_of_amount, 0)) as user_2, sum(if(user_id=3, sum_of_amount, 0)) as user_3 from ( select order_date, user_id, sum(amount) as sum_of_amount from `avdanced.orders` group by order_date, user_id ) group by order_date order by order_date -- 연습문제 1-2) 간략하게 작성하기 select order_date, sum(if(user_id=1, amount, 0)) as user_1, sum(if(user_id=2, amount, 0)) as user_2, sum(if(user_id=3, amount, 0)) as user_3 from `.avdanced.orders` group by order_date order by order_date --연습문제 2) orde_date별로 amount의 합을 pivot (user_id row, drder_date column) -- (`)backstick을 사용하여 별칭지정 -- any_value: 그룹화할 대상 중 임의의 값을 선택(NULL 제외). any_value에서는 나머지 값이 NULL이거나 확정적으로 이값이 나올 것이다 기대할 때 사용! -- ANY_VALUE: 임의의 값을 반환하며, 특정한 규칙이나 일관성을 요구하지 않을 때 사용. (대표값, 랜덤 샘플링) -- MAX: 그룹 내에서 가장 큰 값을 반환하며, 항상 일관된 결과를 제공합니다. select user_id, sum(if(order_date='2023-05-01', amount, 0)) as `2023-05-01`, sum(if(order_date='2023-05-02', amount, 0)) as `2023-05-02`, sum(if(order_date='2023-05-03', amount, 0)) as `2023-05-03`, sum(if(order_date='2023-05-04', amount, 0)) as `2023-05-04`, sum(if(order_date='2023-05-05', amount, 0)) as `2023-05-05` from `avdanced.orders` group by user_id order by user_id -- +) 강의 내용 (any_value) -- select -- user_id, -- any_value(if(order_date='2023-05-01', amount, 0)) as `2023-05-01`, -- any_value(if(order_date='2023-05-02', amount, 0)) as `2023-05-02`, -- any_value(if(order_date='2023-05-03', amount, 0)) as `2023-05-03`, -- any_value(if(order_date='2023-05-04', amount, 0)) as `2023-05-04`, -- any_value(if(order_date='2023-05-05', amount, 0)) as `2023-05-05` -- from `avdanced.orders` -- group by user_id -- order by user_id --연습문제 3) user_id, order_date별로 주문이 있으면 1, 없으면 0으로 pivot, user_id row, order_date column. select user_id, max(if(order_date='2023-05-01', 1, 0)) as `2023-05-01`, max(if(order_date='2023-05-02', 1, 0)) as `2023-05-02`, max(if(order_date='2023-05-03', 1, 0)) as `2023-05-03`, max(if(order_date='2023-05-04', 1, 0)) as `2023-05-04`, max(if(order_date='2023-05-05', 1, 0)) as `2023-05-05` from `avdanced.orders` group by user_id order by user_id -- 연습문제 4) app_log를 pivot하기 with date_user_cnt as( select ori.user_id, ori.event_date, ori.event_name, ori.event_timestamp, ori.user_pseudo_id, max(if(eve.key = "firebase_screen", eve.value.string_value, null)) as firebase_screen, max(if(eve.key ="food_id", eve.value.int_value, null)) as food_id, max(if(eve.key ="session_id", eve.value.string_value, null)) as session_id from`avdanced.app_logs_temp` as ori , unnest (event_params) as eve where event_date ='2022-08-01' group by all ) select event_date, count(user_id) as user_cnt from date_user_cnt where event_name ="click_cart" group by event_date (3) 퍼널 연습문제 -- 퍼널 별 유저수 집계 -- 1-1) UNNEST하기 & PIVOT하기 WITH base AS( SELECT event_date, event_timestamp, event_name, user_id, user_pseudo_id, MAX(IF(param.key = 'food_id', param.value.int_value,NULL)) AS food_id, MAX(IF(param.key = 'session_id', param.value.string_value,NULL)) AS session_id, MAX(IF(param.key = 'firebase_screen', param.value.string_value,NULL)) AS firebase_screen, from `bigquery-432401.avdanced.app_logs_temp` , unnest (event_params) as param where event_date between '2022-08-01' and '2022-08-18' GROUP BY ALL ), base2 AS( -- 1-2) CONCAT하기 SELECT * EXCEPT (event_name, firebase_screen, event_timestamp), CONCAT(event_name, "-", firebase_screen) AS event_name_with_screen, DATETIME(TIMESTAMP_MICROS(event_timestamp), 'Asia/Seoul') AS event_datetime FROM base WHERE event_name IN ("screen_view", "click_payment") ), base3 AS ( --1-3) 일자별 이벤트 별 집계 SELECT event_date, event_name_with_screen, CASE WHEN event_name_with_screen = "screen_view-welcome" THEN 1 WHEN event_name_with_screen = "screen_view-home" THEN 2 WHEN event_name_with_screen = "screen_view-food_category" THEN 3 WHEN event_name_with_screen = "screen_view-restaurant" THEN 4 WHEN event_name_with_screen = "screen_view-cart" THEN 5 WHEN event_name_with_screen = "click_payment-cart" THEN 6 ELSE NULL END AS step_number, COUNT(DISTINCT user_pseudo_id) AS cnt FROM base2 GROUP BY ALL HAVING step_number IS NOT NULL ) --1-4) 집계한 데이터를 PIVOT SELECT event_date, MAX(IF(base3.event_name_with_screen ="screen_view-welcome", cnt, NULL)) AS screen_view_welcome, MAX(IF(base3.event_name_with_screen ="screen_view-home", cnt, NULL)) AS screen_vie_home, MAX(IF(base3.event_name_with_screen ="screen_view-food_category", cnt, NULL)) AS screen_view_food_category, MAX(IF(base3.event_name_with_screen ="screen_view-restaurant", cnt, NULL)) AS screen_view_restaurant, MAX(IF(base3.event_name_with_screen ="screen_view-cart", cnt, NULL)) AS screen_view_cart FROM base3 GROUP BY ALL ✅ 배운점 ‘cross join unnest 칼럼 as 별칭’에서 반드시 ‘AS 별칭’ 을 이용해야 ‘ Cannot access field on a value with type ARRAY ’ 에러가 안 뜬다. 빅쿼리에서는 ‘’이 아닌, ``을 사용하여야 한다. pivot이라고 하면 pivot()함수를 반드시 사용해야 편할 것이라고 생각했었는데, max와 if로 pivot을 구현하는 것이 인상 깊었다. SQL 기반이라고 하면 모든 DB가 비슷한 기능을 가지고 있다고 생각했는데, DB마다 생성된 함수 및 기능이 미묘하게 다르다는 것을 느꼈다. 예를 들어 빅쿼리에서 배운 countif()을 MySQL에서 사용했는데 안되는 것도 그 예가 아닐까. 생각보다 빅쿼리와 PostgreSQL에서 사용하는 함수가 동일한 게 많아 인상적이었다. ✅ 익숙해져야 할 부분 퍼널 분석을 배우면서, 이론적으로 이해하는 것은 쉽지만 내가 아는 쿼리적인 지식을 실제 데이터에 적용하는 것은 생각보다 손이 많이 가고 쉽지 않은 작업이라는 것을 느꼈다. 많이 해봐야 노하우가 생길 것 같다. 어떤 데이터를 어떻게 해야 어떤 결과가 나오고, 이를 어떻게 이용하고 해석할 수 있는지에 대한 일련의 과정에 익숙해져야 할 것 같다. TIMESTAMP를 DATE로 바꾸고 확인하는 부분에 대한 연습이 필요 쿼리 작성 시, 예약어를 대문자로 사용하는 것이 좋다고 알고 있는데, 아직 이 부분이 익숙하지 않아 연습이 필요하다. 코드를 작성하면서 문장을 그대로 쿼리로 옮기는 편이라서 그런지 서브 쿼리를 사용하는 경우가 많다. 단순히 문장을 쿼리로 옮기기 보다 어떻게 하면 더 간결하고 가독성 높은 쿼리를 작성할 수 있을 지 고민하는 습관을 들여야 겠다. 함수 이름 정하는 거 중요한 건 아는데, 잘 안되는 것 같다. 사용 기능을 이용하여 함수 이름 짓는 습관을 지어야겠다.
ASP.NET Core MVC +ASP.NET Core +REST API +.NET 8.0
안녕하세요 20강의 마지막 부분에서 배포 부분에서 궁금한 점이 있어서 질문드립니다. 강의 중 20강 26:34 에서 "공유기가 아닌 랜선을 바로 여러분들의 컴퓨터하고 연결을 한다면 공인 ip를 통해 외부에서 여러분들이 생성한 사이트에 접속이 가능" 이라는 설명이 있습니다. 무선 네트워크 환경(공유기 or 핫스팟 등)에서는 배포가 불가능한가요?
안녕하세요 강의를 재밌게 수강하던 도중 궁금증이 생기어 질문 드립니다. 질문 select 의 row 매개변수의 순서와 FilmWithActor의 생성자 매개변수의 순서가 각 테이블 타입에 매칭되지 않을 경우 mapping이 정상적으로 이뤄지지 않는 현상이 있어 별도의 해결 방법이나 대안이 있는지 여쭙고 싶습니다. 정상 케이스(Film - FilmActor - Actor) dslContext.select( DSL.row(FILM.fields()), DSL.row(FILM_ACTOR.fields()), DSL.row(ACTOR.fields()) ).from(FILM) .join(FILM_ACTOR) .on(FILM.FILM_ID.eq(FILM_ACTOR.FILM_ID)) .join(ACTOR) .on(FILM_ACTOR.ACTOR_ID.eq(ACTOR.ACTOR_ID)) .offset((page - 1) * pageSize) .limit(pageSize) .fetchInto(FilmWithActor.class); public class FilmWithActor { private final Film film; private final FilmActor filmActor; private final Actor actor; public FilmWithActor(Film film, FilmActor filmActor, Actor actor) { this.film = film; this.filmActor = filmActor; this.actor = actor; } // ... 문제 케이스(Film - Actor - FilmActor) dslContext.select( DSL.row(FILM.fields()), DSL.row(FILM_ACTOR.fields()), DSL.row(ACTOR.fields()) ).from(FILM) .join(FILM_ACTOR) .on(FILM.FILM_ID.eq(FILM_ACTOR.FILM_ID)) .join(ACTOR) .on(FILM_ACTOR.ACTOR_ID.eq(ACTOR.ACTOR_ID)) .offset((page - 1) * pageSize) .limit(pageSize) .fetchInto(FilmWithActor.class); public class FilmWithActor { private final Film film; private final FilmActor filmActor; private final Actor actor; public FilmWithActor(Film film, Actor actor, FilmActor filmActor) { this.film = film; this.filmActor = filmActor; this.actor = actor; } // ...
안녕하세요 선생님 🙂 테스트케이스가 여러 개인 문제기 때문에 vector를 clear해줬는데요, out of range error가 발생해서 질문 드립니다. 아래 코드의 주석을 살리면 위 에러가 발생합니다. 조언 부탁 드립니다 🙂 http://boj.kr/f9dc05bf7b6e4897a286d9746368c283
강의에 알려주신대로 따라서 하고 있는데 원핫인코딩 결과에 income category랑 card category만 뜨고 나머지 object컬럼(gender 등)은 뜨질 않습니다.. 뭐가 문제인지 알려주실 수 있을까요? #baseline(object컬럼 제거) cols = train.select_dtypes(include='object').columns # print(train.shape, test.shape) # train = train.drop(cols, axis=1) # test = test.drop(cols,axis=1) # print(train.shape, test.shape) # 라벨인코딩 # from sklearn.preprocessing import LabelEncoder # for col in cols: # le = LabelEncoder() # train[col] = le.fit_transform(train[col]) # test[col] = le.transform(test[col]) # train.head() # onehot 인코딩 pd.get_dummies(train, columns=cols) 마지막에 8101 rows × 39 columns 라고 뜨는데 그냥 표시만 안 된건가요?
release(m)에서 마지막에 lock = 0 을 해주어야 acquired(m)에서 해당 lock을 사용할 수 있는거 아닌가요..? 또한 a스레드에 의해 락이 획득된 상태에서, block() 함수를 통해 대기상태로 변하고 > 이후 release(m)를 통해 실행대기 상태로 변한 스레드들은 ( 목적이 critical section의 실행 ) do - while 구문을 통해 critical section을 반복적으로 실행할 수 있도록 되는 건가요?? 실행 대기 상태로 돌아왔을 때 어떻게 다시 락 획득 프로세스를 다시 진행할 수 있는 건지 알고 싶습니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 안녕하세요. 문제와 풀이2 번째 ShoppingCart 클래스를 만들면서 어떻게 해야 이 습관이 고쳐질까? 라는 생각에 질문을 드립니다. 영한님의 ShoppingCart 클래스, displayItems()메서드를 보면, 전체가격합을 구할때 따로 메서드를 만들어서(calculateTotalPrice) 하시는 것을 볼수가 있었습니다. 근데 저가 코드를 하는 것을 보면 displayItems()메서드 안에서 계속 합을 구하더라고요. public void displayItems() { int itemsTotal = 0; for (Item item : items) { System.out.println("상뭄명: " + item.getName() + ", 합계: " + item.getTotalPrice()); itemsTotal += item.getTotalPrice(); } System.out.println("전체 가격 합: " + itemsTotal); } 이런식으로요. 이것을 고치는 방법이 있을까요? 답변 부탁 드립니다.
incrementAndGet() 메서드에서, 스레드 두개가 들어가고 동시에 실행 됐을때 마지막 스레드가 다시 compareAndSet(getValue, getValue + 1) 이 성공적으로 돌았을때 getValue의 값이 이미 2가 되는것으로 예상되는데 결과는 1이 반환이 되고, return getValue + 1;로 인해 결과값이 2가 어떻게 나오는 지 궁금합니다. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 여기에 질문 내용을 남겨주세요.
강의를 들으면서 문제에 대한 답은 이해했습니다! 그런데 4번 문제 푸는 과정에서 위의 그림처럼 UNNEST안에 event_params.key를 넣어봤는데 아래의 에러가 떴습니다. 그럼 event_params는 STRUCT 구조체를 포함하는 ARRAY배열이라는 말일까요? 강의에서 array_excercised 스키마를 확인하며 event_params의 유형이 RECORD이면 보통 STRUCT 구조체를 의미한다고 말씀해주셨는데 event_params 자체는 ARRAY일까요 STRUCT일까요...?