inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

랜덤 숫자 생성기 프로젝트 관련

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

안녕하세요 랜덤 숫자 생성기 프로젝트에서 123, 456, 789 하단에 패딩을 줄 때, 마지막 Row 인 789 는 패딩을 주지 않기를 구현하는 과정에서 막혀서 질문 남깁니다!! 일단 아래 2개의 스샷은 57번 라인이 다른것 말고는 완전 동일한 코드인데요 첫번쨰 스샷은 정상적으로 에뮬에 반영이 되는데, 두번째 스샷은 에러가 발생 해서 질문 남깁니다!! ==============================================================

  • flutter
  • Flutter
  • 클론코딩
  • 클론코딩
dhong115 y 댓글 2 좋아요 0 조회수 566

안도르이드 애뮬레이터 질문

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

초기에 플러터 다운로드방법이 다르게 해서 그런지 제가 노트북을 삼성, 아수스 2개쓰고있으며 해당 캡처처럼 자유롭게 움직이는 에뮬레이터를 사용하고싶은데 아수스 노트북에는 움직일수가 없이 애뮬레이터가 고정되어있습니다..

  • flutter
  • 클론코딩
  • 클론코딩
  • Flutter
soulno 댓글 1 좋아요 0 조회수 398

봉우리 - 가장자리 0으로 채우기

해결됨

파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)

이렇게 (N+2)*(N+2) list를 만들고 안에다가 복사해서 붙여넣어버리는 방법은 별로인가요? N = int(input()) input_list = [list(map(int, input().split())) for _ in range(N)] n_list = [[0] * (N + 2) for _ in range(N + 2)] for i in range(N): for j in range(N): n_list[i + 1][j + 1] = input_list[i][j]

  • 코테 준비 같이 해요!
  • 코딩-테스트
  • python
Jiyoung Kang 댓글 2 좋아요 0 조회수 475

super를 사용하는 건, 부모와 자식 클래스의 파라미터 이름이 꼭 같아야하나요?

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

OOP 상속 부분 강의에서 보면 부모클래스의 파라미터 이름과 자식 클래스 파라미터 이름을 다 같게 쓰시더라구요. 혹시 변수 이름 구분을 하면 오류가 나는지 한번 구분을 해보았는데, super뒤의 부모 클래스 파라미터를 적는 부분에서 오류가 나더라구요. 두 개를 다르게 지정하면 안되는건가요? 예를 들어 강의에 나온 대로 받은 입력을 2배하는 클래스, 4배하는 클래스를 만들었을 때 class Timestwo { int number1; Timestwo(this.number1); int calculate(){ return this.number1 * 2; } } class Timesfour extends Timestwo{ Timesfour(int number2) : super(number1); int calculate(){ return super.number1 * 4; } } 밑에서 5번째줄, Timesfour(int number2) : super(number1) 부분에서 number1아래에 빨간줄이 생겨요. 저는 Timesfour(int number2)는 Timesfour라는 클래스의 파라미터를 받는 거라 아무 이름이어도 된다고 생각했고, super( )안은 부모클래스(Timestwo)의 파라미터를 받는거라 number1을 써야한다고 생각했거든요. 그런데 안되더라구요...? 제가 어디를 잘못 이해하고 있는걸까요?

  • flutter
  • 클론코딩
  • Flutter
  • 클론코딩
  • 메소드오버라이딩
  • 상속
  • super
Cha Koo 댓글 1 좋아요 0 조회수 493

안녕하세요 선생님 아키텍쳐 관련해서 질문드릴것이있습니다.

미해결

Flutter 중급 1편 - 클린 아키텍처

일단 선생님의 강의를 듣고 제 생각을 정의해보자면 데이터레이어(데이터소스, 레퍼지토리(구현)) 도메인레이어(레퍼지토리(추상), 모델, 유스케이스) 프레젠트레이어(뷰 모델, 뷰) 레퍼지토리는 기본적으로 외부데이터와의 소통을 위한 통로라고 이해했습니다 그렇기 때문에 도메인레이어에서 레퍼지토리를 추상화하고 데이터레이어에서 이를 구현하는 방식으로 사용되고 이 레퍼지토리를 유스케이스에서 도메인레이어의 모델과, 레퍼지토리를 이용해 우리 도메인의 입맛에 맞는 데이터형식과 로직을 작성하지요 이런 상황속에서 몇가지 의문이 들었습니다 -첫번째질문!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!- 만약 외부데이터와 관련이 없는 온리 client 내부적으로만 필요한 상태를 관리해야하는 로직이 필요하다. 그렇다면 도메인 레이어에 필요한 모델을 작성하고 레포지토리없는 유스케이스를 만들면 외부데이터와 관련이 없는 상태를 관리할수있지 않을까? => 외부데이터와 관련없는 데이터 관리가 필요할경우 레포지토리가 없는 유스케이스에대한 생각이 궁금합니다!! (레포지토리가 필요없는 유스케이스의 경우 쉽게 생각하면 viewModel에서 작성하면 되는 로직 아니야? 라고 생각할수있는데, 만약 해당 데이터 타입과 로직이 꽤많은 화면에서 공통적으로 사용되고있다면 모든 뷰에 대응하는 모든 뷰모델에서 같은 로직을 계속해서 반복하게될텐데 비효율적일것같아서 레포지토리 없는 유스케이스라는 것을 생각하게되었습니다.) -두번째질문!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!- 비지니스로직은 유스케이스에 UI로직은 뷰모델에 작성한다고해주셨는데 비지니스 로직과 UI로직을 나누는 기준이 무엇인지 궁금합니다. 어떤걸 유스케이스에 넣고 어떤걸 뷰모델에 넣어야하는지에 대한 혼란이 있을때가 있어서요!! -세번째질문!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!- 노트관련강의 30번째 강의의 두번째화면 UI작성 28분쯤 해당 색깔을 선택할때 배경색이 바뀌는 로직이 뷰에서 로직이 선언되어있는데, 뷰모델에서 해당 로직을 선언하지 않은 이유가 궁금합니다! 선생님의 강의 정말 잘 듣고있고 매번 너무 감사드립니다ㅜㅜ 질문 세가지 드렸는데, 글이 길지만 세가지 질문에 대한 답변 주시면 정말 감사하겠습니다ㅜㅜ

  • flutter
  • Flutter
  • ios
  • android
akanfldkdlel 댓글 2 좋아요 0 조회수 465

리미트 타임에러

미해결

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

소수 개수 구하기 문제 언어 : 파이썬 내용: 제가 작성한 하위 코드 for문 두 개 돌렸을뿐인데 리미트 타임에러가 뜹니다.. 구글링 해서 emurate함수 써서 푼 문제는 정답이라고 뜹니다. 난이도 초급에 emurate함수 방식으로 써서 풀라는 의도는 아니라고 판단되어 문의 드립니다. 아래 코드가 에러인지, 제가 잘 못하고 있는지 궁금합니다. (입사 전에는 자바로 면접 보고 들어갔는데 입사 한 회사에서 사용하는 언어는 파이썬이라서 파이썬으로 코테 풀고 있는점도 참고해서 피드백 부탁드립니다) received_data = int(input()) list = [] for i in range(2,received_data+1): list.append(0) for i in range(2,received_data+1): if list[i-2]==0: for j in range(2,received_data+1): if j>i and j%i==0: list[j-2]=1 print(list.count(0))

  • java
  • 코딩-테스트
  • 코테 준비 같이 해요!
  • python
xorwn12345 댓글 1 좋아요 0 조회수 279

선생님 flutter device를 크롬으로 했을때 http 통신이 안됩니다..

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

Access to XMLHttpRequest at " http://마이 ipv4주소/home" from origin ' http://localhost:62502 ' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. http를사용합니다. server를 node.js 로 만들고 json 파일 가져올려고 합니다. ios, android는 http통신이 아주 잘되는데 chrome으로 build하면 계속 위의 에러가 나옵니다.. 혹시 해결법을 아시나요...

  • flutter
  • Flutter
  • 클론코딩
김용해 댓글 1 좋아요 0 조회수 805

no element

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

마지막 no element 수업중에 코드를 수정해도 no element 에러화면이 계속 나오네요 ㅠㅠ 데이터를 받아오는것같은데 어디가 문제인지 하루종일 봐도 안되네요 아직 부족한것같습니다 지금 빌드 구문부터 실행이 되지않는데 한번 확인 부탁드려도될까요? https://github.com/JacksonBanco/dust_app

  • flutter
  • 클론코딩
  • Flutter
  • 클론코딩
이태진 댓글 1 좋아요 0 조회수 454

Exception has occurred: SSLError 이런 에러가 발생합니다.

미해결

[신규 개정판] 이것이 진짜 크롤링이다 - 기본편

이 강의에서 에러가 발생했습니다. 소스코드는 다음과 같습니다. import requests from bs4 import BeautifulSoup url = "https://www.naver.com/" response = requests.get(url) # 에러 발생한 부분 html = response.text soup = BeautifulSoup(html, 'html.parser') word = soup.select_one("#NM_set_home_btn") print(word.text) 위 코드중 response = requests.get(url) 위 부분에서 에러가 발생했습니다. [ 에러 내용 ] Max retries exceeded with url:강의에서 접속한 url 이런 에러가 나오고 Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available. 뒤에 이런 문장이 나옵니다. 에러 해결 방법은 무었인가요? [ 에러 전체 내용 ] 에러의 전체 내용은 다음과 같습니다. Exception has occurred: SSLError HTTPSConnectionPool(host='search.naver.com', port=443): Max retries exceeded with url: /search.naver?where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90 (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) urllib3.exceptions.SSLError: Can't connect to HTTPS URL because the SSL module is not available. During handling of the above exception, another exception occurred: urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='search.naver.com', port=443): Max retries exceeded with url: /search.naver?where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90 (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) During handling of the above exception, another exception occurred: File "D:\crawling\05. 뉴스 제목과 링크 가져오기.py", line 4, in <module> response = requests.get("https://search.naver.com/search.naver?where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90") requests.exceptions.SSLError: HTTPSConnectionPool(host='search.naver.com', port=443): Max retries exceeded with url: /search.naver?where=news&sm=tab_jum&query=%EC%82%BC%EC%84%B1%EC%A0%84%EC%9E%90 (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available."))

  • 웹-크롤링
  • 웹-크롤링
  • python
새벽별 댓글 1 좋아요 0 조회수 2025

암호화

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

https://www.inflearn.com/questions/787348/%EC%98%A4%EB%8A%98%EB%8F%84-%EC%B6%9C%EA%B7%BC-%EC%84%B8%ED%8C%85%ED%95%98%EA%B8%B0 답변부탁드립니다

  • flutter
  • 클론코딩
  • Flutter
  • 클론코딩
댓글 1 좋아요 0 조회수 249

함수 컴포넌트와 필수 Hook에서 setValue({value1:10}) 관련 질문이요!

해결됨

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

function App2() { const [value1, setValue1] = useState(0); const [value2, setValue2] = useState(0); const [value, setValue] = useState({ value1: 0, value2: 0 }); const onClick = () => { setValue({ value1: 10 }); }; return ( <div> Hello App2 <hr /> {JSON.stringify(value1)} {JSON.stringify(value2)} {JSON.stringify(value.value1)} <button onClick={onClick}>클릭</button> </div> ); } export default App2; 여기서 onClick을 수행할때 왜 value.value1의 값이 변경되는 건가요?? 첫번째에 useState(0)으로 만든 value1은 어떻게 해야 값의 변경이 되는거죠??

  • react
  • python
  • django
  • docker
꺼넝 댓글 1 좋아요 0 조회수 400

네스팅 방식으로 goRouter Go를 사용할때, 앱바타이틀이 정상적으로 표시되지 않는 문제

미해결

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

GoRouter 초반부를 듣고 있는데, 제목과 같이 앱바타이틀이 정상적으로 표시되지 않는 문제를 겪고 있습니다. Screen Three 로 이동했을때 앱바의 타이틀은 /one/two/three 로 표기가 되나, 뒤로가기를 눌렀을때 홈으로 이동할때까지 그 상태 그대로 /one/two/three 가 유지되다가 홈에서 / 로 표시가 됩니다. OneScreen, TwoScreen, ThreeScreen 별로 각각 텍스트로 one, two, three 라고 입력해서 확인해본결과, 뒤로가기 할때마다 three 에서 출발해서 two, one 으로 화면에 잘 뜨는 것으로 보아 페이지 이동은 정상적으로 이루어지는 것 같습니다. 아래는 default_layout.dart 입니다. class DefaultLayout extends StatelessWidget { final Widget body; const DefaultLayout({ Key? key, required this.body, }) : super(key: key); @override Widget build(BuildContext context) { final router = GoRouter.of(context); return Scaffold( appBar: AppBar( title: Text( router.location, ), ), body: Padding( padding: const EdgeInsets.symmetric( horizontal: 16.0, ), child: body, ), ); } } main.dart void main() { runApp(_App()); } class _App extends StatelessWidget { _App({Key? key}) : super(key: key); final GoRouter _router = GoRouter( initialLocation: '/', routes: [ GoRoute( path: '/', builder: (context, state) => const HomeScreen(), routes: [ GoRoute( path: 'one', builder: (context, state) => const OneScreen(), routes: [ // http://.../one/two GoRoute( path: 'two', builder: (context, state) => const TwoScreen(), routes: [ // http://.../one/two/three GoRoute( path: 'three', builder: (context, state) => const ThreeScreen(), ), ], ) ], ), ], ), // http://..../one // http://..../two // GoRoute( // path: '/one', // builder: (context, state) => const OneScreen(), // ), ], ); @override Widget build(BuildContext context) { return MaterialApp.router( theme: ThemeData(useMaterial3: true), // uri string 을 상태 및 go router 에서 사용할 수 있는 형태로 변환해주는 함수(자동) routeInformationParser: _router.routeInformationParser, // 위에서 변경된 값으로 실제 어떤 route 를 보여줄지 정하는 함수(자동) routerDelegate: _router.routerDelegate, // route 정보를 전달하는 함수(자동) routeInformationProvider: _router.routeInformationProvider, ); } } home_screen.dart class HomeScreen extends StatelessWidget { const HomeScreen({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return DefaultLayout( body: Column( crossAxisAlignment: CrossAxisAlignment.stretch, mainAxisAlignment: MainAxisAlignment.center, children: [ ElevatedButton( onPressed: () { context.go('/one'); }, child: const Text('go to OneScreen'), ), ElevatedButton( onPressed: () { context.go('/one/two/three'); }, child: const Text('go to ThreeScreen'), ), ], ), ); } } 3_screen.dart class ThreeScreen extends StatelessWidget { const ThreeScreen({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return DefaultLayout( body: Column( children: const [Text('three')], ), ); } } 정도로 참고 코드를 올렸습니다. goRouter 버전은 4.2.2 로 강의의 버전과 맞춰서 진행중입니다.

  • flutter
  • 하이브리드-앱
  • Flutter
  • 하이브리드 앱
bubble gun 댓글 2 좋아요 0 조회수 579

[질문] cascading operator 설명하실 때

해결됨

[코드팩토리] [입문] Dart 언어 4시간만에 완전정복

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. ...는 Spread Operator 이고 ..이 Cascading Operator 아닌가해서 질문드립니다. dart 강의 3강, 32분 쯤에 나오는 내용입니다.

  • flutter
  • 함수형-프로그래밍
  • 함수형-프로그래밍
  • Flutter
  • 객체지향
  • oop
인공지능 댓글 1 좋아요 2 조회수 631

책과 강의

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

책과 병행하고 있습니다. 현재 'U&I'를 클론코딩 중입니다. 강의에서는 코드를 짠 이후 정리하는 과정이 있어서 좋았고, 책에서는 미리 정리할 것을 산정하여 진행하는 방법도 좋았습니다. 한데, 제 수준이 문외한이나 다름이 없어 두 교보재의 코딩 방식이 미묘하게 달라서 헛갈리네요. 직장인이라 시간이 부족해서 둘 중 한 방식으로 복습하고자 합니다. 어느 방식을 체득하면 더 좋을지 궁금합니다.

  • flutter
  • 클론코딩
  • Flutter
  • 클론코딩
lee963963 댓글 1 좋아요 0 조회수 403

voidcallback함수와 클래스내에 변수선언에 관한질문

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

toppart위젯의 빌드함수안에 final now = DateTime.now (); 를 선언하는것은 어떤이유인가요? final DateTime selectedDate; final VoidCallback onHeartPressed; 밑에 선언해도(클래스의 변수로 선언해도) 동일한 동작을 하지않나요? 어차피 toppart는 statelesswidget이라 setstate를 하게되면 homescreen의 state가 다시 빌드되면서 toppart위젯도 (빌드함수만실행되는게아니라) 새로 생겨날텐데 어떤거는 빌드함수내에 선언하고 어떤거는 클래스내부의 프로퍼티로 선언하는지 차이가 궁금합니다. toppart인스턴스에 onHeartPressed함수를 아규먼트로 넘겨줄때 함수기호인()괄호를 넣지않았는데 이는 voidcallback 과 관련있는것인가요? void함수도 파라미터를 만들수있는걸로 이해했는데 return이 있는(void가 아닌)함수만 함수를 사용할때 ()기호를넣는것인가요?

  • flutter
  • 클론코딩
  • 클론코딩
  • Flutter
뭐하지이름 댓글 1 좋아요 0 조회수 492

android studio 세팅

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

android studio 세팅중에 flutter doctor를 하면 Unable to locate Android SDK. Install Android Studio from: https://developer.android.com/studio/index.html On first launch it will assist you in installing the Android SDK components. (or visit https://flutter.dev/docs/get-started/install/windows#android-setup for detailed instructions). If the Android SDK has been installed to a custom location, please use flutter config --android-sdk to update to that location. 이런 메세지가 뜹니다. 다른분 질문 답변 중 환경변수 문제 같다고 하셨는데 혹시 환경변수 경로에도 한글이 들어가면 문제가 되는걸까요??

  • flutter
  • 클론코딩
  • Flutter
  • 클론코딩
qoos88 댓글 1 좋아요 0 조회수 502

오늘도 출근 세팅하기

미해결

[코드팩토리] [초급] Flutter 3.0 앱 개발 - 10개의 프로젝트로 오늘 초보 탈출!

AppDelegate.swift에서 GMSServices.provideAPIKey(자신의 apikey)를 어떻게 숨기죠? github에 push하니까 다 보여서요.

  • flutter
  • 클론코딩
  • Flutter
  • 클론코딩
댓글 1 좋아요 2 조회수 578

제발 도와주세요ㅠ

미해결

[신규 개정판] 이것이 진짜 크롤링이다 - 기본편

C:\coding\py>C:/Users/taehw/AppData/Local/Programs/Python/Python311/python.exe c:/coding/py/증권.py Traceback (most recent call last): File "c:\coding\py\증권.py", line 2, in <module> from bs4 import BeautifulSoup ImportError: cannot import name 'BeautifulSoup' from 'bs4' (C:\Users\taehw\AppData\Local\Programs\Python\Python311\Lib\site-packages\bs4\__init__.py) 이렇게 오류 문자가 떠요!코드는 이렇게 썻어요! import requests from bs4 import BeautifulSoup # 종목 코드 리스트 codes = [ '035420', '088980', '005930', '035720' ] for code in codes: url = f"https://finance.naver.com/item/sise.naver?code={code}" response = requests.get(url) html = response.text soup = BeautifulSoup(html, 'html.parser') price = soup.select_one("#_nowVal").text price = price.replace(',', '') print(price)

  • 웹-크롤링
  • 웹-크롤링
  • import
  • python
  • 애러
holy210 댓글 2 좋아요 0 조회수 495

UI Event의 리턴값을 이용하고 싶습니다

미해결

Flutter 중급 1편 - 클린 아키텍처

안녕하세요, 좋은 강의 잘 듣고 있습니다. 이벤트 컨트롤러를 이용하여 스낵바 이벤트를 발생시키는 부분에서 질문이 있습니다. 스낵바 대신 alertDialog를 사용하려 하는데, alert사용자가 선택한 값을 받아오려면 어떻게 하면 될까요? result 값에 따라 분기를 태우고 싶은데, showDialog 이벤트를 사용하는 곳이 많아 showDialog 함수 내에서 분기를 태우긴 찝찝합니다. event.when( showDialog: () async { dynamic result = await showDialog( context: context, barrierDismissible: false, // user must tap button! builder: _buildPopup, ); // 여기에서 if (result==~) 하기엔 범용성이 적다 return result; },

  • flutter
  • android
  • ios
  • Flutter
김선정 댓글 1 좋아요 0 조회수 274

Augmentation 질문

해결됨

[파이토치] 실전 인공지능으로 이어지는 딥러닝 - 기초부터 논문 구현까지

안녕하세요. 데이터 증강 부분에 대해서 궁금점이 있어서 질문드립니다. 가지고 있는 데이터가 1000개 라고 가정했을 때, tr.Compose를 적용시키면 '기존 이미지 1000개 + 증강된 추가 이미지 개수' 가 되는건가요?? 제가 간단하게 해봤을 때는 transform 했을 때 이미지 개수 증가가 아니라 단순 이미지 변환까지만 이루어지는 것 같은데, 제가 잘못된 부분이 있는건가 좀 헷갈려서 질문 드립니다. 만약 단순 이미지 변환만 이루어지는 것이라면 이미지 개수 증가를 위해서 추가적인 작업을 진행해주어야 하는지도 궁금하네요.

  • 머신러닝
  • 딥러닝
  • python
  • 딥러닝
  • 머신러닝 배워볼래요?
  • 인공신경망
  • 인공신경망
  • pytorch
김남욱 댓글 1 좋아요 1 조회수 416

인기 태그

인프런 TOP Writers

주간 인기글