묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결작정하고 장고! Django로 Pinterest 따라만들기 : 바닥부터 배포까지
vultr에서 stack으로 서비스 배포후 이미지 수정
vultr에서 포테이너 도커스웜으로 stack배포를 해서 여러가지 프로젝트를 진행중입니다! 좋은 강의 만들어주셔서 감사합니다ㅎㅎ 그런데 한가지 궁금한것이 있습니다. stack배포후에 도커스웜으로 배포되는 docekr image를 수정하려면 db를 날리지 않고 진행하는 방법은 없는걸까요...??? docker swarm, stack, docker image변경 세가지 키워드로 구글링 하고있는데 방법이 잘 검색이 안되네요...ㅠㅠㅠ 알려주시는게 좀 까다롭다면 관려된 링크나 검색해볼 키워드라고 알려주시면 정말 감사하겠습니다....ㅠㅠㅠ
-
미해결[왕초보편] 앱 8개를 만들면서 배우는 안드로이드 코틀린(Android Kotlin)
설명을 자세히 안해주시는건 당장 중요하지 않아서인가요?
새로 배우는 내용이 엄청 많은데 자세한 설명이 없이 그냥 도표 하나만 보여주고 이건 이렇다 정도로만 넘어가시네요. 지금 당장 다 알 필요는 없어서 그런건지 아니면 이걸 이해못하면 다음 영상으로 넘어가지 안되는건지 알고싶어요
-
미해결반응형 웹사이트 포트폴리오(Architecture Agency)
href 링크
선생님 강의를 잘 들었습니다. 다름이 아니라 다 만들었는데 저같은 경우 home section에 네비 메뉴를 넣어뒀습니다. 그래서 각 section에 클래스 옆에다가 아이디로 해당 네비게이션 이름을 지정해놨습니다, 그래서 네비게이션버튼을 눌렀을 때 넘어갈 줄 알았는데 넘어가지를 않아서 아무리 고민을 해봐도 답이 안나와서 글을 남기게 되었습니다. 밑에 코드랑 화면 같이 남기도록 하겠습니다. 감사합니다. <body data-hijacking="on" data-animation="scaleDown"> <section class="cd-section visible" id="home"> <div> <div class="content"> <video src="video/Tomorrowland Presents _ THIS WAS TOMORROW Official Movie Trailer (1080p)_1.mp4" autoplay muted loop></video> </div> </div> </section> <section class="cd-section" id="about"> </section> 각 섹션별로 아이디를 동일하게 지정해놓은 상태입니다. header영역 <header> <div class="head_inner"> <h1 class="logo"><a href="#"><img src="images/android-icon-48x48.png" alt="logo"></a></h1> <div class="gnb"> <ul> <li><a href="#home">Home</a></li> <li><a href="#about">About</a></li> <li><a href="#lineup">LineUp</a></li> <li><a href="#md">MD</a></li> <li><a href="#directions">Directions</a></li> <li><a href="#contact">Contact</a></li> </ul> </div> <div class="slogan">Make Some Noise</div> </header>
-
미해결따라하며 배우는 노드, 리액트 시리즈 - 기본 강의
mssql이 아닌 몽고db를 사용하는 이유가 무엇일까요?
저는 스마트 펙토리 업무를 했었고, c# 윈폼이랑 mssql를 사용했었습니다. 웹 개발을 처음인데요. mssql이 아닌 몽고db를 사용하는 이유가 무엇일까요? - 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결파이썬으로 장고(Django) 공략하기: 입문
NameError: name 'os' is not defined
STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static") ] 추가하셨는데 에러나신다면 ? NameError: name 'os' is not defined 에러 뜨시는분들은 settings.py 에 import os 추가! 강의 영상 중간에 끊고 작성 중인데 뒤에 짚어주실지는 모르겠으나 글 남깁니다. 에러떴는데 그냥 못넘어가서요ㅠ
-
미해결따라하며 배우는 도커와 CI환경 [2023.11 업데이트]
베이스 이미지에 대한 질문입니다.
node와 같은 프로그램(ex> nginx/tomcat)을 꼭 특정 OS (ex> Centos/ubuntu)버전에서 쓰고싶다고하면 도커파일을 어떻게 작성해야하는건가요? Centos 이미지 + node 이미지 각각 만들어서 연동시켜야하는건가요?
-
미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
멀티스레드 환경 변경감지 동시성 관련 질문
안녕하세요 ! JPA 관련 강의를 전부 듣고 개인적으로 공부를 하던 과정에서 궁금한점이 하나생겨 문의드립니다 ! Book이라는 엔티티가 존재하고 수량이라는 컬럼이 존재한다고 가정하고 고객들이 주문을 하게되면 수량이 계속해서 감소하는 로직을 구현했을경우 고객이 동시에 Book을 주문하려고 하는 상황에서 고객1 : 주문전 Book 엔티티 조회(영속성상태)시 수량 20개 고객2 : 주문전 Book 엔티티 조회(영속성상태)시 수량 20개 고객1이 Book 10개를 주문하여 수량이 10개 감소한상태로 변경감지로 업데이트문이 나갈텐데 고객2에 주문전 Book 엔티티는 10개가 감소한 10개인상태에서 차감이 이루어져야할것같은데 WEB환경에서는 서로다른 트랜잭션에서 DB를 처리하게되므로 고객2에 주문전 Book 엔티티는 여전히 20개인상태에서 주문한 수량만큼 차감되어 업데이트가 실행되 두개 주문사이에 수량이 맞지않는 현상이 발생할것같은데 멀티스레드환경에서 각 엔티티가 동시성을 지원하는지 혹은 이러한방법으로 개발하는걸 지양해야하는지 궁금합니다 !!
-
미해결스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
Whilelabel error page 가 뜨네요
이전까지는 회원추가 목록 조회가 잘 됐는데, 디비 연결 이후부터 whitelabel error page가 뜨네요. 처음 화면은 잘 뜨지만, 회원조회에 들어가면 에러 페이지가 뜹니다. 그대로 따라한 것 같은데 정확한 이유를 몰라 드라이브에 코드와 함께 남깁니다! https://drive.google.com/drive/folders/1zgtAWYEhacuXg-N3KcMy5sPy4HSbR18F?usp=sharing
-
미해결스프링 핵심 원리 - 기본편
스프링 빈의 라이프사이클 내에서
안녕하세요, 다른 분들의 질문을 참고해봐도 혼자서 이해하는게 너무 버거워서 질문을 남깁니다. 여기저기 출력문을 찍어보니 ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class); 에서 "스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존 관계 주입 -> 초기화 콜백" 까지 한번에 된다는 사실을 알았습니다. public class BeanLifeCycleTest { @Test public void lifeCycleTest() { System.out.println("rmfjadjswptodtjdeh;a??1"); ConfigurableApplicationContext ac = new AnnotationConfigApplicationContext(LifeCycleConfig.class); System.out.println("rmfjadjswptodtjdeh;a??2"); NetworkClient client = ac.getBean(NetworkClient.class); ac.close(); } @Configuration static class LifeCycleConfig { @Bean public NetworkClient networkClient() { NetworkClient networkClient = new NetworkClient(); //networkClient.setUrl("http://hello-spring.dev"); System.out.println("stestesatestasetasetaset"); return networkClient; } } } 1. setUrl은 생성자 주입처럼 동시에 의존관계가 주입되는게 맞을까요?? 2. 여기서 setUrl은 다른 분들의 질문을 보니 값 주입이라고 하던데 의존관계 주입이나 값 주입이나 비슷하다고 이해하고 넘어가면 될까요?? 3. afterPropertiesSet() 은 따로 호출을 하지 않았는데, 어떻게 호출을 하는건가요?? 4. 초기화 콜백은 '무조건' 호출이 되는 걸까요? 실제로 setUrl을 주석 처리해도 콜백함수가 호출이 됩니다. 질문이 조금 많지만 답변 부탁드립니다 ㅠㅠ 감사합니다.
-
미해결Do It! 장고+부트스트랩: 파이썬 웹개발의 정석
태그 작성 오류
test진행시 마지막 단계에서 이런 오류 문구가 떠서 강사님과 똑같이 오류수정 진행하는데 해결이 되질 않습니다 ㅠ 혹시 몰라 views.py 와 test.py를 첨부해드리겠습니다. from django.core.exceptions import PermissionDenied from django.shortcuts import render, redirect from django.utils.text import slugify from django.views.generic import ListView, DetailView, CreateView, UpdateView from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from blog.models import Post, Category, Tag class PostList(ListView): model = Post ordering = '-pk' def get_context_data(self, **kwargs): context = super(PostList, self).get_context_data() context['categories'] = Category.objects.all() context['no_category_post_count'] = Post.objects.filter(category=None).count() return context class PostDetail(DetailView): model = Post def get_context_data(self, **kwargs): context = super(PostDetail, self).get_context_data() context['categories'] = Category.objects.all() context['no_category_post_count'] = Post.objects.filter(category=None).count() return context class PostCreate(LoginRequiredMixin, UserPassesTestMixin,CreateView): # LoginRequiredMixin 로그인이 되어 있는 경우에만 이 페이지 접속 가능하게 model = Post fields = ['title', 'hook_text', 'content', 'head_image', 'file_upload', 'category'] def test_func(self): return self.request.user.is_superuser or self.request.user.is_staff def form_valid(self, form): # 폼에 들어있는 내용이 맞는지 확인하는 기능 current_user = self.request.user if current_user.is_authenticated and (current_user.is_staff or current_user.is_superuser): form.instance.author = current_user # 만들어진 Form에 instance의 author라는 필드를 current_user 로 채워라 response = super(PostCreate, self).form_valid(form) # from_valid() : 양식이 유효한경우 관련 모델을 저장. tags_str = self.request.POST.get('tags_str') if tags_str: tags_str = tags_str.strip() # strip : 문자열 앞뒤에 빈공간 있으면 없애준다. tags_str = tags_str.replace(',', ';') # 문자열 바꿔주기 , > ; tags_list = tags_str.split(';') # for t in tags_list: t = t.strip() tag, is_tag_created = Tag.objects.get_or_create(name=t) # get_or_create(name=t) : 만약, name 이 t인 것을 가져오고, 없으면 그것을 name이 t로 만들어서 가져오기. if is_tag_created: tag.slug = slugify(t, allow_unicode=True) tag.save() self.object.tags.add(tag) return response else: return redirect('/blog/') # 로그인을 하지 않고 해당 페이지를 열려하면 Blog 경로로 날려짐 class PostUpdate(LoginRequiredMixin, UpdateView): model = Post fields = ['title', 'hook_text', 'content', 'head_image', 'file_upload', 'category'] template_name = 'blog/post_update_form.html' def dispatch(self, request, *args, **kwargs): # 디스패치라는것은 url을 get 방식인지 post방식인지 알아내는 방법이지만, 해당 하는 포스트에 권한이 있는 유저인지 검증할 수 있다. if request.user.is_authenticated and request.user == self.get_object().author: return super(PostUpdate, self).dispatch(request, *args, **kwargs) else: raise PermissionDenied # 장고에서 기본으로 제공되는 기능이고, 에러 페이지 대신에 권한이 없다면 권한이 없다는 메시지를 띄어준다 def get_context_data(self, **kwargs): context = super(PostUpdate, self).get_context_data() if self.object.tags.exists(): tags_str_list = list() for t in self.object.tags.all(): tags_str_list.append(t.name) context['tags_str_default'] = '; '.join(tags_str_list) return context def form_valid(self, form): response = super(PostUpdate, self).form_valid(form) self.object.tags.clear() tags_str = self.request.POST.get('tags_str') if tags_str: tags_str = tags_str.strip() # strip : 문자열 앞뒤에 빈공간 있으면 없애준다. tags_str = tags_str.replace(',', ';') # 문자열 바꿔주기 , > ; tags_list = tags_str.split(';') # for t in tags_list: t = t.strip() tag, is_tag_created = Tag.objects.get_or_create(name=t) # get_or_create(name=t) : 만약, name 이 t인 것을 가져오고, 없으면 그것을 name이 t로 만들어서 가져오기. if is_tag_created: tag.slug = slugify(t, allow_unicode=True) tag.save() self.object.tags.add(tag) return response def category_page(request, slug): if slug == 'no_category': category = '미분류' post_list = Post.objects.filter(category=None) else: category = Category.objects.get(slug=slug) post_list = Post.objects.filter(category=category) return render( request, 'blog/post_list.html', { 'post_list': post_list, 'categories': Category.objects.all(), 'no_category_post_count': Post.objects.filter(category=None).count(), 'category': category } ) def tag_page(request, slug): tag = Tag.objects.get(slug=slug) post_list = tag.post_set.all() return render( request, 'blog/post_list.html', { 'post_list': post_list, 'categories': Category.objects.all(), 'no_category_post_count': Post.objects.filter(category=None).count(), 'tag': tag } ) # def single_post_page(request, pk): # reqeust, 변수명 # post = Post.objects.get(pk=pk) # # return render( # request, # 'blog/single_page.html', # { # 'post': post, # } # ) ## 이건 test.py 코드입니다################## from django.test import TestCase, Client # Client 가 하는 역할 : 장고에서 재공하는 것이며 웹사이트의 방문자를 말함? from bs4 import BeautifulSoup from .models import Post, Category, Tag from django.contrib.auth.models import User # 장고에서 기본적으로 제공하는 User 임. class TestView(TestCase): def setUp(self): # DB에 들어갈 내용을 여기서 테스트 적용 self.client = Client() self.user_trump = User.objects.create_user( username='trump', password='somepassword', ) self.user_obama = User.objects.create_user( username='obama', password='somepassword', ) self.user_obama.is_staff = True self.user_obama.save() self.category_programming = Category.objects.create( name='programming', slug='programming' ) self.category_music = Category.objects.create( name='music', slug='music' ) self.tag_python_kor = Tag.objects.create( name='파이썬 공부', slug='파이썬-공부' ) self.tag_python = Tag.objects.create( name='python', slug='python' ) self.tag_hello = Tag.objects.create( name='hello', slug='hello' ) self.post_001 = Post.objects.create( title='첫번째 포스트 입니다.', content='Hello, World. we are the World', category=self.category_programming, author=self.user_trump ) self.post_001.tags.add(self.tag_hello) self.post_002 = Post.objects.create( title='두번째 포스트 입니다.', content='저는 쌀국수를 좋아합니다.', category=self.category_music, author=self.user_obama ) self.post_003 = Post.objects.create( title='세번째 포스트 입니다.', content='Category가 없나유.', author=self.user_obama ) self.post_003.tags.add(self.tag_python) self.post_003.tags.add(self.tag_python_kor) def navbar_test(self, soup): navbar = soup.nav self.assertIn('Blog', navbar.text) self.assertIn('About Me', navbar.text) logo_btn = navbar.find('a', text='Saohwan') self.assertEqual(logo_btn.attrs['href'], '/') home_btn = navbar.find('a', text='Home') self.assertEqual(home_btn.attrs['href'], '/') blog_btn = navbar.find('a', text='Blog') self.assertEqual(blog_btn.attrs['href'], '/blog') about_me_btn = navbar.find('a', text='About Me') self.assertEqual(about_me_btn.attrs['href'], '/about_me') def category_card_test(self, soup): categories_card = soup.find('div', id='categories-card') self.assertIn('Categories', categories_card.text) # 카테고리스라는 문구가 categories_card 에 있는지 확인하는 테스트 self.assertIn( f'{self.category_programming} ({self.category_programming.post_set.count()})', categories_card.text ) self.assertIn( f'{self.category_music} ({self.category_music.post_set.count()})', categories_card.text ) # 이렇게 하는 이유는 유지 보수성을 위해 self.assertIn( f'미분류 ({Post.objects.filter(category=None).count()})', categories_card.text ) def test_post_list_with_posts(self): self.assertEqual(Post.objects.count(), 3) # 시작하자마자 포스트가 3개있다. # 1.1 포스트 목록 페이지 (post list)를 연다. response = self.client.get('/blog/') # 블로그 페이지가서 읽고 # 1.2 정상적으로 페이지가 로드된다. self.assertEqual(response.status_code, 200) # 에러 코드가 200이면 정상임 # 1.3 페이지의 타이틀에 Blog 라는 문구가 있다. soup = BeautifulSoup(response.content, 'html.parser') self.assertIn('Blog', soup.title.text) # soup.title.text에 'blog' 라는 문구가 있어야한다. soup 으로 접근 self.navbar_test(soup) # 블로그라는게 헤더 타이틀에 있는지 확인\ self.category_card_test(soup) # 3.3 메인 영역에 포스트 2개의 타이틀이 존재한다. main_area = soup.find('div', id='main-area') # 3.4 "아직 게시물이 없습니다" 라는 문구가 없어야 한다. self.assertNotIn('아직 게시물이 없습니다.', main_area.text) post_001_card = main_area.find('div', id='post-1') self.assertIn(self.post_001.title, post_001_card.text) self.assertIn(self.post_001.category.name, post_001_card.text) self.assertIn(self.tag_hello.name, post_001_card.text) self.assertNotIn(self.tag_python.name, post_001_card.text) self.assertNotIn(self.tag_python_kor.name, post_001_card.text) post_002_card = main_area.find('div', id='post-2') self.assertIn(self.post_002.title, post_002_card.text) self.assertIn(self.post_002.category.name, post_002_card.text) self.assertNotIn(self.tag_hello.name, post_002_card.text) self.assertNotIn(self.tag_python.name, post_002_card.text) self.assertNotIn(self.tag_python_kor.name, post_002_card.text) post_003_card = main_area.find('div', id='post-3') self.assertIn(self.post_003.title, post_003_card.text) self.assertIn('미분류', post_003_card.text) self.assertNotIn(self.tag_hello.name, post_003_card.text) self.assertIn(self.tag_python.name, post_003_card.text) self.assertIn(self.tag_python_kor.name, post_003_card.text) self.assertIn(self.post_001.author.username.upper(), main_area.text) self.assertIn(self.post_002.author.username.upper(), main_area.text) # upper 대문자로 나왔으면 좋겠을 때. def test_post_list_without_posts(self): Post.objects.all().delete() response = self.client.get('/blog/') self.assertEqual(response.status_code, 200) # 에러 코드가 200이면 정상임 soup = BeautifulSoup(response.content, 'html.parser') self.navbar_test(soup) self.assertIn('Blog', soup.title.text) self.assertEqual(Post.objects.count(), 0) # Post 모델에 레코드가 몇개 있는지 아무 겄도 없을때 main_area = soup.find('div', id='main-area') self.assertIn('아직 게시물이 없습니다.', main_area.text) def test_post_detail(self): self.assertEquals(Post.objects.count(), 3) # 테스트는 생성할때마다 DB가 초기화되서 0이다. # 1.2 그 포스트의 url은 '/blog/1/' 이다. self.assertEquals(self.post_001.get_absolute_url(), '/blog/1/') # 2 첫 번째 포스트의 상세 페이지 테스트 # 2.1 첫 번쨰 포스트의 url로 접근하면 정상적으로 response가 온다..(status code: 200). response = self.client.get(self.post_001.get_absolute_url()) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') # 2.2 포스트 목록 페이지와 똑같은 내비게이션 바가 있다. self.navbar_test(soup) self.category_card_test(soup) # 2.3 첫 번째 포스트의 제목이 웹 브라우저 탭 타이틀에 들어 있다. self.assertIn(self.post_001.title, soup.title.text) # 2.4 첫 번째 포스트의 제목이 포스트 영역에 있다. main_area = soup.find('div', id='main-area') post_area = main_area.find('div', id='post-area') self.assertIn(self.post_001.title, post_area.text) self.assertIn(self.post_001.category.name, post_area.text) # 2.5 첫 번째 포스트의 작성자(author)가 포스트 영역에 있다.(아직 구현할 수 없음). self.assertIn(self.user_trump.username.upper(), main_area.text) # 2.6 첫 번째 포스트의 내용(content)이 포스트 영역에 있다. self.assertIn(self.post_001.content, post_area.text) def test_category_page(self): response = self.client.get(self.category_programming.get_absolute_url()) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') # html.parser 로 담아준다. self.navbar_test(soup) self.category_card_test(soup) main_area = soup.find('div', id='main-area') self.assertIn(self.category_programming.name, main_area.h1.text) self.assertIn(self.category_programming.name, main_area.text) self.assertIn(self.post_001.title, main_area.text) self.assertNotIn(self.post_002.title, main_area.text) self.assertNotIn(self.post_003.title, main_area.text) def test_tag_page(self): response = self.client.get(self.tag_hello.get_absolute_url()) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') self.navbar_test(soup) self.category_card_test(soup) self.assertIn(self.tag_hello.name, soup.h1.text) main_area = soup.find('div', id='main-area') self.assertIn(self.tag_hello.name, main_area.text) self.assertIn(self.post_001.title, main_area.text) self.assertNotIn(self.post_002.title, main_area.text) self.assertNotIn(self.post_003.title, main_area.text) def test_create_post_without_login(self): response = self.client.get('/blog/create_post/') self.assertNotEqual(response.status_code, 200) def test_create_post_with_login(self): self.client.login(username='trump', password='somepassword') response = self.client.get('/blog/create_post/') self.assertNotEqual(response.status_code, 200) self.client.login(username='obama', password='somepassword') response = self.client.get('/blog/create_post/') self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') self.assertEqual('Create Post - Blog', soup.title.text) main_area = soup.find('div', id='main-area') self.assertIn('Create a New Post', main_area.text) tags_str_input = main_area.find('input', id='id_tags_str') # input 이라는 태그중에서 id가 id_tags_str 이 있는지 확인하는 작업. self.assertTrue(tags_str_input) self.assertEqual(Tag.objects.count(), 3) self.client.post( '/blog/create_post/', { 'title': 'Post Form 만들기', 'content': 'Post Form 페이지를 만듭시다.', 'tags_str': 'new_tag; 한글 태그, python' } ) last_post = Post.objects.last() self.assertEqual(last_post.title, 'Post Form 만들기') self.assertEqual(last_post.author.username, 'obama') self.assertEqual(last_post.content, 'Post Form 페이지를 만듭시다.') self.assertEqual(last_post.tags.count(), 3) self.assertTrue(Tag.objects.get(name='new_tag')) self.assertTrue(Tag.objects.get(name='한글 태그')) self.assertTrue(Tag.objects.get(name='python')) self.assertEqual(Tag.objects.count(), 5) def test_update_post(self): update_post_url = f'/blog/update_post/{self.post_003.pk}/' # 로그인 하지 않은 상태에서 접근 하는 경우 response = self.client.get(update_post_url) self.assertNotEqual(response.status_code, 200) # 로그인은 했지만, 작성자가 아닌 경우 self.assertNotEqual(self.post_003.author, self.user_trump) self.client.login(usernmae='trump', password='somepassword') response = self.client.get(update_post_url) self.assertNotEqual(response.status_code, 200) # 작성자(obama)가 접근하는 경우 self.assertEqual(self.post_003.author, self.user_obama) self.client.login(username='obama', password='somepassword') response = self.client.get(update_post_url) self.assertEqual(response.status_code, 200) soup = BeautifulSoup(response.content, 'html.parser') self.assertEqual('Edit Post - Blog', soup.title.text) main_area = soup.find('div', id='main-area') self.assertIn('Edit Post', main_area.text) tag_str_input = main_area.find('input', id='id_tags_str') self.assertTrue(tag_str_input) self.assertIn('파이썬 공부; python', tag_str_input.attrs['value']) response = self.client.post( update_post_url, { 'title': '세 번째 포스트를 수정했습니다.', 'content': '안녕 세계? 우리는 하나!', 'category': self.category_music.pk, 'tags_str': '파이썬 공부; 한글 태그, some tag' }, follow=True # 위 내용을 리다이렉트 되는 것을 따라가려면 설정 ) soup = BeautifulSoup(response.content, 'html.parser') main_area = soup.find('div', id='main-area') self.assertIn('세 번째 포스트를 수정했습니다.', main_area.text) self.assertIn('안녕 세계? 우리는 하나!', main_area.text) self.assertIn(self.category_music.name, main_area.text) self.assertIn('파이썬 공부', main_area.text) self.assertIn('한글 태그', main_area.text) self.assertIn('some tag', main_area.text) self.assertNotIn('python', main_area.text)
-
미해결스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
editForm.html 파일이 이상합니다.
editForm.html 파일만 코드가 파란색으로 되면서 html 문법이 적용 안되는거같더라구요.. 재밌는건 editForm.html 이라는 이름의 파일만 그렇고 다른 이름이면 괜찮네요.. 또 editFoom.html 이라고 생성해서 코드를 넣고 이름을 editForm.html로 바꾸면 또 코드가 저렇게 바뀝니다. 뭐가 문제일까요..? 실제로 돌려보면 작동하긴 합니다만...ㅠ
-
미해결[리뉴얼] 코딩자율학습 제로초의 자바스크립트 입문
person.getAge() 값이 왜 수정이 안되는지 모르겠습니다;;
클로저 공부를 하다가 인터넷에서 이런 예시가 있어서 RunJS에서 따라쳐봤는데요. person.age를 30으로 바꿨고, person.age를 출력했을 때는 30이 찍히는데, 왜 person.getAge( ); 로 찍었을 때는 15로 계속 나오는지 도저히 이해가 안되네요ㅠ 왜 이런 현상이 발생하는 건가요??? ;;;;;;;
-
미해결코딩인터뷰를 저격하는 JS 스나이퍼 양성학교
클로저 파트 마지막 예시에 관해 질문있습니다.
예시를 RunJS에서 따라쳐봤는데요. person.age를 30으로 바꿨고, person.age를 출력했을 때는 30이 찍히는데, 왜 person.getAge( ); 로 찍었을 때는 15로 계속 나오는지 도저히 이해가 안되네요ㅠ 왜 이런 현상이 발생하는 건가요??? 제가 이해력이 부족해서, 강의만으로 온전히 이해가 안되네요. 이 부분에 대해서 좀 더 자세한 설명 부탁드리겠습니다. 감사합니다.- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
-
미해결애플 웹사이트 인터랙션 클론!
질문있습니다 ㅠㅠ
function calcValues(values, currentYOffset) { let rv; // 현재 씬(스크롤섹션)에서 스크롤된 범위를 비율로 구하기 const scrollHeight = sceneInfo[currentScene].scrollHeight; const scrollRatio = currentYOffset / scrollHeight; if (values.length === 3) { // start ~ end 사이에 애니메이션 실행 const partScrollStart = values[2].start * scrollHeight; const partScrollEnd = values[2].end * scrollHeight; const partScrollHeight = partScrollEnd - partScrollStart; if (currentYOffset >= partScrollStart && currentYOffset <= partScrollEnd) { rv = (currentYOffset - partScrollStart) / partScrollHeight * (values[1] - values[0]) + values[0]; } else if (currentYOffset < partScrollStart) { rv = values[0]; } else if (currentYOffset > partScrollEnd) { rv = values[1]; } } else { rv = scrollRatio * (values[1] - values[0]) + values[0]; } return rv; } 해석 scrollHeight : 지금 현재 씬의 높이 지금 현재씬 높이 /현재 활성화된 씬의 비율 만약 values 값이 3개라면 ex) example : [0, 1, {start : 0.1, end : 0.2}] partScroll start,end(비율..) 는 scrollHeight(지금 현재 씬의 높이)를 곱함 partScrollHeight : start와 end의 중간 값 만약 현재 스크롤 위치가 스타트 위치보다 위에 있고 스크롤 위치가 end보다 작은곳에 있다면? 현재 스크롤 위치 빼기 시작 위치 / (sceneInfo[0~3]의 높이) * (끝값 - 시작값) + 시작값 사이 값이 아닐때 (partScrollStart값보다 작을때)=> 시작값 사이 값이 아닐대(partScrollend 값보다 클때) => 끝값 value값이 3이 아니라면 ..? 이해 못함 정리하면서 공부하고 있는데.. value 값이 3이 아닌건 videoImageCount: 960, imageSequence: [0, 959], 이부분도 3이 아닌데.. 그러면 videoImageCount일때는 values[1]의 값은 무엇인가요?? 그리고 혹시 제가 설명한부분이 틀린부분있으면 고쳐주실수 있으실까요? 아 또 여쭈어볼게 있는데 if (delayedYOffset < prevScrollHeight + sceneInfo[currentScene].scrollHeight) { document.body.classList.remove('scroll-effect-end'); } scroll-effect-end가 바디 클래스 리스트에 붙는다고 하는데 아무리 찾아봐도 안붙는거 가아서요 이부분이 이해가 안가네요 ㅠㅠ 도와주세요
-
미해결[리뉴얼] React로 NodeBird SNS 만들기
connect ECONNREFUSED 127.0.0.1:3333
고생 많으십니다. 아래처럼 npx sequelize db:create 입력시 connect ECONNREFUSED 127.0.0.1:3333으로 표시되고 있습니다. 연결되지 않았다는 뜻 같은데 해당 포트 주소가 DB 주소로 설정한 상태입니다. 워크벤치를 통해서도 해당 주소로 잘 접속되고 있고 터미널을 통해서도 mysql을 켜둔 상태입니다. config.js에도 잘 입력하여 back 서버에 git pull로 잘 적용한 상태입니다. 왜 이런걸까요??
-
미해결[백문이불여일타] 데이터 분석을 위한 중급 SQL
선생님
선생님 안녕하세요 TOP EARNERS 문제에서 SELECT MONTHS * SALARY AS EARNINGS , COUNT(*) 로 값은 구했는데 값 말고 이 문제의 예시 output처럼 earning 도 함께 추가된 모든 컬럼을 추출할려면 어떻게 해야하나요?? SELECT MONTHS * SALARY AS EARNINGS 다음 * 로 하면 추출될줄 알았는데 안되네요 ㅠ
-
미해결
아나콘다 파이썬 바인딩
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이 제대로 잘 적은거 같은데 오류 나는 이유 알수 있을까여?ㅜㅜ용해주세요.
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
size mismatch 현상
안녕하세요 교수님. 양질의 강의를 제공해주셔서 감사합니다. 다름이 아니라 VOC Dataset은 CLASS가 20개이고 COCO Dataset은 80개의 클래스를 가지고 있는 것으로 알고 있습니다. config_file과 checkpoint_file 또한 coco로 맞추어져 있는데 train_detector를 실행하면 위의 사진과 같이 size mismatch라는 출력이 나오게 됩니다. 우려와는 다르게(?) 결과는 잘 나오는데 혹시나 문제가 되지 않을까 하여 질문 드립니다. 감사합니다.
-
미해결스프링 핵심 원리 - 기본편
AppConfig가 스프링 컨테이너인 거죠?
AppConfig가 스프링 컨테이너인 거죠?
-
미해결
Oracle Database 18c Express Edition를 다운받아 설치하는데 롤백이 되고 설치가 완료되지 않습니다.
설치가 안됩니다 ㅠㅠ. 처음에는 21c로 설치하다가 롤백이 일어났는데, D드라이브에서 다운받았다가 안되고 C드라이브에서도 롤백이 일어났어요 안되겠다 해서 18c를 설치 시작했는데 어느 순간 잘되다가 끝나기 10프로 남기고 1시간동안 안움직여서 그냥 설치 창에서 취소를 누르고 컴퓨터를 다시 시작했습니다. 그때부터 잘못했나봐요. cmd에서 sqlplus를 했을때는 아무것도 없다고 나오는데 앱에서는 oracle이 있었어요 깔다가 만듯 합니다. 그래서 다 삭제하고 cmd에서 sc delete oracle 등등 해서 컴퓨터에서 다 지웠는데 다시 18c를 다운 받으려고 하니깐 롤백이 일어나네요 좀 도와주세요 ㅠㅠ