묻고 답해요
158만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
56강에 대한 질문입니다(BoundedMain).
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]package thread.bounded; import static util.MyLogger.log; public class ProducerTask implements Runnable { private BoundedQueue queue; private String request; public ProducerTask(BoundedQueue queue, String request) { this.queue = queue; this.request = request; } @Override public void run() { log("[생산 시도] " + request + " -> " + queue); log("[생산 완료] " + request + " -> " + queue); } }package thread.bounded; import static util.MyLogger.log; public class ConsumerTask implements Runnable { private BoundedQueue queue; public ConsumerTask(BoundedQueue queue) { this.queue = queue; } @Override public void run() { log("[소비 시도] ? <- " + queue); String data = queue.take(); log("[소비 완료] " + data + " <- " + queue); } }package thread.bounded; public interface BoundedQueue { void put(String data); String take(); }package thread.bounded; import java.util.ArrayList; import java.util.List; import static util.MyLogger.log; import static util.ThreadUtils.sleep; public class BoundedMain { public static void main(String[] args) { // 1. BoundedQueue 선택 BoundedQueue queue = new BoundedQueueV1(2); // 2. 생산자, 소비자 실행 순서 선택, 반드시 하나만 선택! producerFirst(queue); // 생산자 먼저 실행 //consumerFirst(queue); // 소비자 먼저 실행 } private static void producerFirst(BoundedQueue queue) { log("== [생산자 먼저 실행] 시작, " + queue.getClass().getSimpleName() + " =="); List<Thread> threads = new ArrayList<>(); startProducer(queue, threads); printAllState(queue, threads); startConsumer(queue, threads); printAllState(queue, threads); log("== [생산자 먼저 실행] 종료, " + queue.getClass().getSimpleName() + " =="); } private static void consumerFirst(BoundedQueue queue) { log("== [소비자 먼저 실행] 시작, " + queue.getClass().getSimpleName() + " =="); List<Thread> threads = new ArrayList<>(); startConsumer(queue, threads); printAllState(queue, threads); startProducer(queue, threads); printAllState(queue, threads); log("== [소비자 먼저 실행] 종료, " + queue.getClass().getSimpleName() + " =="); } private static void startProducer(BoundedQueue queue, List<Thread> threads) { System.out.println(); log("생산자 시작"); for (int i = 1; i <= 3; i++) { Thread producer = new Thread(new ProducerTask(queue, "data" + i), "producer" + i); threads.add(producer); producer.start(); sleep(100); } } private static void startConsumer(BoundedQueue queue, List<Thread> threads) { System.out.println(); log("소비자 시작"); for (int i = 1; i <= 3; i++) { Thread consumer = new Thread(new ConsumerTask(queue), "consumer" + i); threads.add(consumer); consumer.start(); sleep(100); } } private static void printAllState(BoundedQueue queue, List<Thread> threads) { System.out.println(); log("현재 상태 출력, 큐 데이터: " + queue); for (Thread thread : threads) { log(thread.getName() + ": " + thread.getState()); } } }package thread.bounded; import java.util.ArrayDeque; import java.util.Queue; import static util.MyLogger.log; public class BoundedQueueV1 implements BoundedQueue { private final Queue<String> queue = new ArrayDeque<>(); private final int max; public BoundedQueueV1(int max) { this.max = max; } @Override public synchronized void put(String data) { if (queue.size() == max) { log("[put] 큐가 가득 참, 버림: " + data); return; } queue.offer(data); } @Override public synchronized String take() { if (queue.isEmpty()) { return null; } return queue.poll(); } @Override public String toString() { return queue.toString(); } }C:\Users\lgh80\.jdks\temurin-21.0.4\bin\java.exe --enable-preview "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.4\lib\idea_rt.jar=52674:C:\Program Files\JetBrains\IntelliJ IDEA 2024.1.4\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath C:\java-adv1\out\production\java-adv1 thread.bounded.BoundedMain09:38:16.411 [ main] == [생산자 먼저 실행] 시작, BoundedQueueV1 ==09:38:16.413 [ main] 생산자 시작09:38:16.424 [producer1] [생산 시도] data1 -> []09:38:16.425 [producer1] [생산 완료] data1 -> []09:38:16.531 [producer2] [생산 시도] data2 -> []09:38:16.532 [producer2] [생산 완료] data2 -> []09:38:16.642 [producer3] [생산 시도] data3 -> []09:38:16.642 [producer3] [생산 완료] data3 -> []09:38:16.752 [ main] 현재 상태 출력, 큐 데이터: []09:38:16.754 [ main] producer1: TERMINATED09:38:16.754 [ main] producer2: TERMINATED09:38:16.754 [ main] producer3: TERMINATED09:38:16.755 [ main] 소비자 시작09:38:16.757 [consumer1] [소비 시도] ? <- []09:38:16.757 [consumer1] [소비 완료] null <- []09:38:16.864 [consumer2] [소비 시도] ? <- []09:38:16.865 [consumer2] [소비 완료] null <- []09:38:16.974 [consumer3] [소비 시도] ? <- []09:38:16.975 [consumer3] [소비 완료] null <- []09:38:17.085 [ main] 현재 상태 출력, 큐 데이터: []09:38:17.085 [ main] producer1: TERMINATED09:38:17.086 [ main] producer2: TERMINATED09:38:17.086 [ main] producer3: TERMINATED09:38:17.086 [ main] consumer1: TERMINATED09:38:17.087 [ main] consumer2: TERMINATED09:38:17.087 [ main] consumer3: TERMINATED09:38:17.087 [ main] == [생산자 먼저 실행] 종료, BoundedQueueV1 ==Process finished with exit code 0이런 식으로 출력이 뜨는데 강의 내용에 나와있는 로그 창이랑 많이 달라서 강의 코드랑도 비교해봤는데 어디에서 문제가 있는 건지 잘 모르겠습니다.
-
미해결김영한의 실전 자바 - 중급 2편
의존관계 주입에 대해서 질문드립니다!
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? 예[질문 내용]안녕하세요! 영한님 강의를 잘 듣고 있습니다.의존관계 주입 설명해주실때 문득 궁금점이 생겨서 질문드립니다. 의존관계 주입은 추상적인 것을 의존하게 하고,나중에 실제 구체적인것을 넣어주는 부분인데이는 같은 기능을 수행하는 List(Array, Linked)의 경우라고 한다면 처음에는 한가지 기능만 수행하다가, 필요에 의해서 다른 기능을 만들었고 이걸 공통화가 가능하다면 인터페이스로 만들어주는 작업을 진행하면 되는 걸까요? 실무에서 인터페이스는 처음부터 설계를 잡고 들어가는 경우가 많은지, 혹은 필요에 의해 중간에 만드는 경우도 있는지 궁금합니다! 중간에 필요하긴한데 기능이 다 같진 않은 경우에는 어떻게 하는지도 궁금하네요ㅠ
-
해결됨스프링 DB 1편 - 데이터 접근 핵심 원리
체크예외를 리포지토리에서는 처리하지 않는 이유가 궁금합니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]안녕하세요, 예외처리 부분을 듣고 궁금한 점이 있어 질문 남깁니다.강의에서 하위 레벨의 체크 예외가 서비스, 컨트롤러로 올라오는 것이 문제라고 하셨는데, 리포지토리와 같이 해당 예외가 직접 발생하는 곳에서 try~catch로 잡아서 처리하면 상위 레벨로 올라오지 않을텐데 그렇게 처리하지 않는 이유는 뭔가요? 어차피 대부분 복구 불가능한 예외라 시스템 상에서는 로그를 남기는 것 밖에 하지 못하고, 왜 하위 레벨에서는 처리하지 않는지 궁금합니다. 밖으로 던져서 공통으로 처리할거면 리포지토리에서 처리해도 공통으로 처리되는 효과가 있는게 아닌지..동일한 리포지토리를 여러 서비스에서 사용할 때 비즈니스 로직에 따라 같은 리포지토리 메서드여도 다른 오류 메세지를 보여줘야 해서 그런걸까요..?
-
해결됨나도코딩의 자바 기본편 - 풀코스 (20시간)
Catch 안에서 쓰인 throw
안녕하세요. try { writer.close(); } catch (Exception e) { throw new RuntimeException(e); }여기에서 catch 안에 throw로 RuntimeException 을 발생 시켰는데, 이부분은 어디서 catch가 되나요?
-
미해결실리콘밸리 엔지니어와 함께하는 데이터 사이언스 기초편
선형회기 모델 r2 계산방법
안녕하세요선형회기모델 강의 내용 중 12:42분 ppt에서 Sum of squared residual이 SS_res로 되어있는데, 이 용어에 대한설명이 관측값과 회기 예측값의 차이로 으로 되어있습니다. 그렇다면 이는 SSE(error sum of squares)와 동일한 것으로 수식이 (SS-res / SS_tot), 즉 SSE/SST 로 변경되어야 하지 않을까요?(SS_res와 SSE를 동일한 뜻으로 간주한다면) 하지만 현재 자료는 1- (SS_res/SST)로 되어있고, 이 케이스는 SS_res가 회기값과 관측값 평균의 차, 즉 regression sum of squares 와 동일한 의미로 설명되어 있습니다.아마 SSR(SS_res)의 용어와 SSR(regression sum of squares)의 용어 혼돈인것 같은데 작성하신 뜻에 의하면 "1-"부분이 삭제되어야 할것 같아서 문의 남깁니다. 확인부탁드립니다.
-
해결됨스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
에러 페이지 출력이후 고객의 다음과정을 위한 처리가 궁금합니다.
[질문 내용]강의에서는 이와 같은 페이지를 만들고 끝나는데실제 고객이 이런 페이지를 마주치게 된다면메인 페이지로 이동 버튼을 두어 되돌아가게 하는 형태로사용하게 되는지 또는 다시 구글에 검색해서 다시 사이트를 들어간다던지 등 어떤식으로 고객이 사용할 수 있도록 구성해야되는지 질문드립니다.
-
미해결스프링 DB 1편 - 데이터 접근 핵심 원리
RowMapper 질문드립니다.
@Overridepublic Member findById(String memberId) {String sql = "select * from member where member_id = ?";return template.queryForObject(sql, memberRowMapper(), memberId);}private RowMapper<Member> memberRowMapper() {return (rs, rowNum) -> {Member member = new Member();member.setMemberId(rs.getString("member_id"));member.setMoney(rs.getInt("money"));return member;};}이 코드에서,1. 해당 람다식은 파라미터로 rs와 rowNum을 받아서, 중괄호 부분을 실행한후 결과를 리턴하는것인가요? 그렇다면 rowNum의 역할은 무엇인지 궁금합니다. 또, 람다 내부의 rs와 rowNum 파라미터의 매개값은 어떻게 대입되는것인가요 ..? 람다식부분이 이해가 되지않아서 질문드립니다.2. 이 코드에서 return member;를 하면 Member객체가 반환되는데 실제 리턴타입은 RowMapper<Member>로 되어있는데 어떻게 RowMapper<Member>타입으로 반환될수 있는것인지 질문드립니다.3. queryForObject()의 리턴타입은 Member인데, 어떻게 Member가 되는것인가요 ?
-
해결됨[리뉴얼] 맛집 지도앱 만들기 (React Native & NestJS)
QueryClient 에서 retry 를 false 로 설정하신 이유
3-8 강의 1:04 에서, QueryClient 의 retry 옵션을 false 로 설정하신 특별한 이유가 있으신가요? 왜 이렇게 설정한지 궁금합니다.
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
질문 있어서 남기게 됩니다.
사이드 프로젝트를 하다가 SpringSecurity를 좀더 잘 구햔해보고 싶어 강의를 들으면서 sideproject에 springSecurity를 도입하고 있습니다. 수업 내용과는 상이한 질문이라 드려도 될지 조심스럽습니다만, 혼자 공부하고 있어 여주어 볼 곳이 선생님 밖에 없어 질문을 남기게 됩니다. 권한을 설정해 주고, 회원에게 권한을 직접 지정해 주는 방식으로 진행했는데, api test해본 결과 계속 Set SecurityContextHolder to anonymous SecurityContext라는 오류가 발생합니다. 시간이 괜찮으시다면, 진행중인 sideProject에서 security 부분이 어디가 잘못되었는지 팁을 주시면 감사하겠습니다. https://github.com/Fangsangik/fintech_rebuilding
-
해결됨Real MySQL 시즌 1 - Part 2
시퀸셜하게 증가하지 않는 PK의 insert성능도 문제가 있을까요?
좋은 강의 제공해주셔서 감사합니다!강의를 듣다보니 의문점이 하나 생겼는데요. 에피소드 14의 시퀸셜하지 않은 UUID사용시 범위 검색의 조회 효율성 문제를 언급해주셨는데요 데이터 삽입시 인덱스가 리밸런싱되거나 리프노드의 실제 데이터 위치가 이동하는 문제가 발생할수도 있을까요?
-
미해결스프링 시큐리티 완전 정복 [6.x 개정판]
인텔리제이 내장 db
안녕하세요,저는 현재 스프링 시큐리티 강의를 수강 중인 학생입니다. 강의를 차근차근 학습하고 있었으나, 프로젝트 마감 기한을 맞추기 위해 실전 프로젝트 부분을 우선적으로 학습하고 있습니다.문제는 제가 아직 스프링과 스프링부트에 익숙하지 않다는 점입니다. 그래서 DB 연결 및 구축 방법에 대해 잘 이해하지 못하고 있습니다. 혹시 이 부분에 대해 어떻게 해야 하는지 설명해 주실 수 있으신가요? 또는 참고할 만한 자료가 있다면 추천 부탁드립니다.구글에서 자료를 찾아보기도 했지만, 여전히 혼란스러운 부분이 많습니다. 현재 프로젝트에서는 백엔드와 시큐리티 부분을 담당하고 있으며, 강사님의 강의를 통해 제대로 배워보고자 하고 있습니다. 질문드린 부분을 도와주실 수 있으면 정말 감사하겠습니다.
-
해결됨Next.js 시작하기
router를 사용할 때 왜 페이지가 갱신되는지에 대한 질문
안녕하세요.면접준비에 도움이 될 거 같고 개념적으로도 궁금해서 질문드립니다.장바구니에서 삭제를 하면 갱신되는데에 동작원리에서 처음엔 router.replace(router.asPath) 때문에 url이 변경되진 않아도 단순하게 /cart로 이동이란 동작을 해서 페이지를 다시 그린다고 생각했습니다.CartList는 CartPage의 자식 컴포넌트이다.CartPage는 getServerSideProps로 서버에서 받아온 데이터를 프롭스(carts)로 받으며, 그 프롭스를 CartList에게 전달해주고 있다.CartList는 부모컴포넌트에게 받은 carts 프롭스를 통해 장바구니 목록을 보여주고 있다.장바구니에서 상품을 삭제하면, 선택한 상품을 서버에서 삭제하고 router.replace를 통해(router.push도 동일) 현재 페이지(asPath)인 /cart로 이동한다./cart 페이지(즉, CartPage.jsx)가 리렌더링된다.리액트는 리렌더링되면 컴포넌트의 모든 코드를 다시 실행하게 된다.(고 알고 있습니다.)그로 인해 getServerSideProps가 다시 실행되고 갱신된(장바구니에서 상품을 삭제한) 데이터를 다시 CartPage에게 프롭스로 내려주게 된다.프롭스가 변경됐으니 자식 컴포넌트인 CartList도 리렌더링되어 모든 코드가 다시 실행된다.바뀐 장바구니 데이터로 보여지게 된다.라고 생각했는데요. https://nextjs.org/docs/pages/building-your-application/data-fetching/get-server-side-props#behavior공식문서를 살펴보니 사용자가 Link 컴포넌트 또는 router를 통해 페이지를 방문할 때, Next.js는 서버에 API 요청을 보내 getServerSideProps를 실행합니다. 라고 되어있습니다. 이러면,현재 CartList는 CartPage의 자식 컴포넌트이다.CartPage는 getServerSideProps로 서버에서 받아온 데이터를 프롭스(carts)로 받으며, 그 프롭스를 CartList에게 전달해주고 있다.CartList는 부모컴포넌트에게 받은 carts 프롭스를 통해 장바구니 목록을 보여주고 있다.장바구니에서 상품을 삭제하면, 선택한 상품을 서버에서 삭제한다.router.replace를 통해(router.push도 동일) 현재 페이지(asPath)인 /cart로 이동한다. router를 통해 페이지를 방문했으므로 CartPage의 getServerSideProps가 다시 실행되고 갱신된 데이터를 CartPage에게 프롭스로 내려주게 된다.프롭스가 변경됐으니 자식 컴포넌트인 CartList도 리렌더링되어 모든 코드가 다시 실행된다.바뀐 장바구니 데이터로 보여지게 된다.이렇게 이해하면 될까요?그리고, getServerSideProps가 있는 페이지 컴포넌트는 getServerSideProps가 재실행되면 자동으로 리렌더링되게 되는 구조인가요?설명해주셨는데 제가 놓친거면 죄송합니다.
-
해결됨[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
강의 자료 질문 드립니다!
강의 중간중간에 나오는 리스트뷰 흐름 도표???는 받을 수 없는건가요????
-
미해결김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성
인터럽트에 대해 질문 있습니다.
public class ThreadStopMainV2 { public static void main(String[] args) throws InterruptedException { Job job = new Job(); Thread thread = new Thread(job); thread.start(); Thread.sleep(4000); log("작업 중단 지시 interrupt"); thread.interrupt(); log("main 스레드 끝"); } static class Job implements Runnable { @Override public void run() { while (true) { try { log("스레드 실행"); Thread.sleep(2000); } catch (InterruptedException e) { log("예외 발생"); break; } } log("작업 끝"); } } }위 코드의 실행 결과는 아래와 같습니다.궁금한 부분은 로그에서 작업 중단 지시 interrupt 이후에 대해 궁금한점이 있습니다. 작업 중단 지시 interrupt 를 로그로 찍고 thread.interrupt();를 호출 했습니다. 그러면 생선한 스레드에 interrupt 신호를 보내고 Thread.sleep(2000); 부분에서 예외가 발생해 catch 문으로 빠지는것도 이해했습니다. 하지만 catch 문으로 빠지기전 log("스레드 실행"); 가 실행되지 않나 라는 생각이 듭니다. 그래서 최종 결과는 아래와 같이 catch 로 빠지기전에 스레드 실행이 한번 더 찍혀야 하지 않나 라는 생각이 듭니다.23:08:15.622 [ Thread-0] 스레드 실행23:08:17.629 [ Thread-0] 스레드 실행23:08:19.613 [ main] 작업 중단 지시 interrupt23:08:19.613 [ Thread-0] 스레드 실행23:08:19.614 [ main] main 스레드 끝23:08:19.614 [ Thread-0] 예외 발생23:08:19.616 [ Thread-0] 작업 끝
-
미해결김영한의 실전 자바 - 기본편
자바 16부터는 instanceof 사용법에 질문이 있습니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 자바 16부터는 instanceof 를 사용하면서 동시에 변수를 선언할 수 있다고 하셨는데 그럼 if(parent instanceof Child child){child.childMethod()} 여기서 child.childMethod() 는 어떻게 작동이되는건가요? Child child 를 선언하긴했지만 instance 주소값을 대입하지않아서 작동이 되지 않는거 아닌가요?
-
해결됨[리뉴얼] 맛집 지도앱 만들기 (React Native & NestJS)
백엔드에 요청을 보내면 Network Error가 발생합니다
안녕하세요. 지금 강의 3-8을 들으면서 회원가입, 로그인 요청을 보내는 코드를 작성 중입니다.다름아니라 회원가입 등 백엔드에 요청을 보내면 백엔드 서버까지 요청이 전달되지 못하고 network error를 반환합니다.소스코드는 다음과 같습니다// auth.ts const postSignup = async ({email, password}: RequestUser): Promise<void> => { try{ const {data} = await axiosInstance.post('/auth/signup', { email, password, }); return data; } catch (error) { console.error(error); } };// axios.ts import axios from 'axios'; const axiosInstance = axios.create({ baseURL: 'http://localhost:3030', withCredentials: true, }); export default axiosInstance;백엔드와 DB연결이 잘못되어있나 싶어서 postman으로 요청을 보내니 그 요청은 잘 전달되어 DB에 user가 생성됩니다.그리고, 강의 3-8의 소스코드를 그대로 가져와 서버를 켜고 요청을 보내니 여전히 network error가 발생합니다. 어디서 실수를 해서 에러가 나는 것일까요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘
Big-o 표기법에서 시간 복잡도
혹시 강의에서 상수는 생략된다고 했는데 그러면 O(1) 이러면 O()가 되나요?
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 실전편 (인공지능 수익화)
GUI를 변형하여 네이버 쇼핑에서 가져오는것 성공했지만... 도와주세요
안녕하세요.네이버 지식인 GUI 강의하신 내용 참고하여,네이버 쇼핑을 GUI 로 만들어 보았습니다.여러번 버버벅 거리면서 수정하여, GUI 에 제품명을 담고, 엑셀로도 제품명과 링크 저장하는데 까지 성공했습니다.그런데, 네이버로 부터 ip 일시적 차단 경고 받았습니다.사전에 ip 차단 염려하여 1 페이지만 크롤링했고, 코드에서는 2군데 time.sleep(2)도 두었는데도 , 네이버로 부터 경고 받았습니다. 그래서, 더 진행하다가 아예차단될까 두려워서 방법 문의 드립니다.네이버 쇼핑 경고 ;쇼핑 서비스 접속이 일시적으로 제한되었습니다.네이버는 안정적인 쇼핑 서비스 제공하고자 시스템을 통해 아래와 같은 비정상적인 접근이 감지될 경우 해당 네트워크의 접속을 일시적으로 제한하고 있습니다.상품 구매, 탐색과 무관한 외부 이벤트를 통한 접속짧은 시간 내에 너무 많은 요청이 이루어진 IPVPN을 사용하여 접속한 IP특정 확장 프로그램 이용 시위와 같은 접근이 아님에도 접속이 제한된 경우,네이버앱을 업데이트 또는 원클릭 진단을 부탁드립니다.해당 방법을 통해서도 접속이 불가한 경우 네이버쇼핑 고객센터로 문의 부탁드립니다.적용된 코드 입니다;차단 원인과 해결방법 도와주세요~~감사합니다from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from PySide6.QtWidgets import QApplication,QWidget from nShopping_c_ui import Ui_Form import requests import sys import time from bs4 import BeautifulSoup import pandas as pd from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class MainWindow_c2(QWidget,Ui_Form): def __init__(self): super().__init__() self.setupUi(self) self.start_btn.clicked.connect(self.start) self.reset_btn.clicked.connect(self.reset) self.save_btn.clicked.connect(self.save) self.quit_btn.clicked.connect(self.quit) def start(self): input_keyword=self.keyword.text() input_page=int(self.page.text()) self.result=[] # 적재창고 건설 # 크롬 드라이버 생성 self.driver=webdriver.Chrome() for i in range(1, input_page+1): self.textBrowser.append(f'{i}페이지 크롤링...') self.driver.get(f"https://search.shopping.naver.com/search/all?adQuery={input_keyword}&origQuery={input_keyword}&pagingIndex={i}&pagingSize=40&productSet=total&query={input_keyword}&sort=rel×tamp=&viewType=list") #스크롤 전 높이 확인 last_height=self.driver.execute_script("return document.body.scrollHeight") while True: #스크롤 끝까지 내리기 self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") #잠시대기 time.sleep(2) # 스크롤 후 높이 new_height=self.driver.execute_script("return document.body.scrollHeight") # 비교(if, break) if new_height==last_height: break # 스크롤 전 높이 업데이트 last_height=new_height html=self.driver.page_source soup=BeautifulSoup(html,'html.parser') #나무태그 찾기 items=soup.select(".product_item__MDtDF") for item in items: # 각 아이템에서 제목과 링크 추출 name=item.select_one(".product_title__Mmw2K>a").text link=item.select_one(".product_title__Mmw2K>a").attrs['href'] self.textBrowser.append(name) self.result.append([name, link]) QApplication.processEvents() time.sleep(2) self.textBrowser.append('크롤링 완료...') def reset(self): self.textBrowser.setText("") self.keyword.setText("") self.page.setText("") def save(self): input_keyword=self.keyword.text() df=pd.DataFrame(self.result,columns=['제목','링크']) df.to_excel(f'{input_keyword}_d.xlsx') def quit(self): self.driver.quit() # 크롬 드라이버 종료 sys.exit() app=QApplication() window=MainWindow_c2() window.show() sys.exit(app.exec())
-
해결됨설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)
[Verilog HDL/FPGA 외전1 - 시계만들기] Chapter 3
안녕하세요 🙂[1. 질문 챕터] : [Verilog HDL/FPGA 외전1 - 시계만들기] Chapter 3[2. 질문 내용] : 23분 즈음에 3개의 아키텍쳐의 결과를 정리해서 올려주신다고 했는데 결과가 없어서 질문드립니다!
-
미해결[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!
Intel HAXM installation failed! 를 만났습니다
안녕하세요.HAXM 설치 도움 부탁드립니다.증상 : emulator 설치편에서 device manager 메뉴에서 Flutter Inflearn 은 잘설치되고, start 를 하니까 HAXM 설치하라고 하여 진행하니 다음 에러 발생했습니다.BIOS에서VT-x는 support로 되어 있는것 확인했습니다. 어떻게 해결해야되는지 도와 주세요.Intel HAXM is required to run this AVD. HAXM is not installed. Install Intel HAXM for better emulation performance. 경고가 뜨서 SDK tool에서 Intel x86 Emulator Accelerator... 체크해서 apply 하니까 다음 에러 메세지 만났습니다.Running Intel® HAXM installerIntel HAXM installation failed!For more details, please check the installation log: C:\Users\beamw\AppData\Local\Temp\haxm_install-20240909_2145.logIntel® HAXM installation failed. To install Intel® HAXM follow the instructions found at: https://github.com/intel/haxm/wiki/Installation-Instructions-on-WindowsDone