<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>bae-code.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Tue, 26 Apr 2022 08:40:36 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>bae-code.log</title>
            <url>https://images.velog.io/images/bae-code/profile/8cd03637-b54f-4f9b-94ea-022b584e085b/KakaoTalk_20211210_205353936.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. bae-code.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/bae-code" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[블로그 이전]]></title>
            <link>https://velog.io/@bae-code/%EB%B8%94%EB%A1%9C%EA%B7%B8-%EC%9D%B4%EC%A0%84</link>
            <guid>https://velog.io/@bae-code/%EB%B8%94%EB%A1%9C%EA%B7%B8-%EC%9D%B4%EC%A0%84</guid>
            <pubDate>Tue, 26 Apr 2022 08:40:36 GMT</pubDate>
            <description><![CDATA[<p>새로운 마음 으로 시작
<a href="https://baecode.tistory.com/">https://baecode.tistory.com/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTTP status code]]></title>
            <link>https://velog.io/@bae-code/HTTP-status-code</link>
            <guid>https://velog.io/@bae-code/HTTP-status-code</guid>
            <pubDate>Fri, 22 Apr 2022 13:14:47 GMT</pubDate>
            <description><![CDATA[<p>HTTP status code</p>
<ul>
<li>클라우드 환경에서 HTTP API를 통해 통신하는것이 대부분</li>
</ul>
<p>이때, 응답 상태 코드를 통해 성공/실패 여부를 확인할수 있으므로 API 문서 작성할때
필수로 알아야 하는것</p>
<p>100번대 : 정보 확인
200번대 : 통신 성공
300번대 : 리다이렉트
400번대 : 클라이언트오류
500번대 : 서버오류</p>
<hr>
<p>200번대 : 통신 성공
상태코드    이름    의미
200    OK    요청 성공(GET)
201    Create    생성 성공(POST)
202    Accepted    요청 접수O, 리소스 처리X
204    No Contents    요청 성공O, 내용 없음</p>
<hr>
<p>300번대 : 리다이렉트
상태코드    이름    의미
300    Multiple Choice    요청 URI에 여러 리소스가 존재
301    Move Permanently    요청 URI가 새 위치로 옮겨감
304    Not Modified    요청 URI의 내용이 변경X</p>
<hr>
<p>400번대 : 클라이언트 오류
상태코드    이름    의미
400    Bad Request    API에서 정의되지 않은 요청 들어옴
401    Unauthorized    인증 오류
403    Forbidden    권한 밖의 접근 시도
404    Not Found    요청 URI에 대한 리소스 존재X
405    Method Not Allowed    API에서 정의되지 않은 메소드 호출
406    Not Acceptable    처리 불가
408    Request Timeout    요청 대기 시간 초과
409    Conflict    모순
429    Too Many Request    요청 횟수 상한 초과</p>
<hr>
<p>500번대 : 서버 오류
상태코드    이름    의미
500    Internal Server Error    서버 내부 오류
502    Bad Gateway    게이트웨이 오류
503    Service Unavailable    서비스 이용 불가
504    Gateway Timeout    게이트웨이 시간 초과</p>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[두 정수 사이의 합]]></title>
            <link>https://velog.io/@bae-code/%EB%91%90-%EC%A0%95%EC%88%98-%EC%82%AC%EC%9D%B4%EC%9D%98-%ED%95%A9</link>
            <guid>https://velog.io/@bae-code/%EB%91%90-%EC%A0%95%EC%88%98-%EC%82%AC%EC%9D%B4%EC%9D%98-%ED%95%A9</guid>
            <pubDate>Sat, 09 Apr 2022 15:04:13 GMT</pubDate>
            <description><![CDATA[<p>나의 풀이 </p>
<p>수가 커졌을때 효율이 너무 좋지않아 다른방법을 고민해봄</p>
<pre><code>def solution(a, b):

    if a &gt; b :
        answer = sum(range(b, a+1))
    else:
        answer = sum(range(a, b+1))


    return answer</code></pre><hr>
<p>사용된 공식</p>
<p>n~m까지의 합 : (n부터 m까지의 갯수) * (n+m) / 2 </p>
<p>ex) 5부터7까지의합 : 3*(5+7)/2=18</p>
<pre><code>def solution(a,b):

    return (abs(a-b)+1) * (a+b) // 2</code></pre><p>a부터 b까지의 수 개수를 abs(a-b)+1 로서 구하고 //2 를 하여 나눈수의 정수부분만 구해옴</p>
<p>abs() &lt;- 수의 절대값을 구해준다</p>
<ul>
<li>수학적인 부분을 이용하여 알고리즘 해결을 하는 걸 많이 생각하자</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[WIL - 잘걷는듯 잘못걷는 사람]]></title>
            <link>https://velog.io/@bae-code/WIL-%EC%9E%98%EA%B1%B7%EB%8A%94%EB%93%AF-%EC%9E%98%EB%AA%BB%EA%B1%B7%EB%8A%94-%EC%82%AC%EB%9E%8C</link>
            <guid>https://velog.io/@bae-code/WIL-%EC%9E%98%EA%B1%B7%EB%8A%94%EB%93%AF-%EC%9E%98%EB%AA%BB%EA%B1%B7%EB%8A%94-%EC%82%AC%EB%9E%8C</guid>
            <pubDate>Mon, 21 Feb 2022 04:59:27 GMT</pubDate>
            <description><![CDATA[<p>백앤드 과정에 들어온지도 어언 2달이 넘고 3달을 향해 달려가고 있다</p>
<p>요즘 좀 혼란스러운 시기인듯하다 백앤드를 배우고 개발을 경험하고 배워나가면서</p>
<p>개발안에서도 백앤드말고도 다양한 지식과 분야들이 있고 거기에도 흥미를 느끼게 되니까</p>
<p>공부할게 엄청많아지고 이것 저것 막 공부하다보니 혼란스러워 진듯하다</p>
<p>그래도 그나마 뚜렷하게 백앤드 or 데이터 엔지니어 를 목표로 하고있으니 그나마 다행인듯하고</p>
<p>그중에서 데이터엔지니어를 더많이알아보고 공부를 더많이하는거보면 아마 그쪽에 맘이가는게아닌가 라는 생각도 들고 그냥 글 자체도 혼란이다</p>
<p>아무튼 더 배워나가고 WIL도 잘적어지기를 바란다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[python - 제곱과 제곱근 sqrt(), pow()]]></title>
            <link>https://velog.io/@bae-code/python-%EC%A0%9C%EA%B3%B1%EA%B3%BC-%EC%A0%9C%EA%B3%B1%EA%B7%BC-sqrt-pow</link>
            <guid>https://velog.io/@bae-code/python-%EC%A0%9C%EA%B3%B1%EA%B3%BC-%EC%A0%9C%EA%B3%B1%EA%B7%BC-sqrt-pow</guid>
            <pubDate>Thu, 17 Feb 2022 17:17:50 GMT</pubDate>
            <description><![CDATA[<p>파이썬에서 제곱을 사용하려면 </p>
<pre><code>2 ** 2
4 </code></pre><p>이렇게 작성을하여서 2의 ** ( 몇제곱) 이렇게 사용하고</p>
<p>제곱근을 표기할때는</p>
<pre><code>4 ** 0.5 </code></pre><p>를 이용하여 제곱근을 구한다</p>
<p>파이썬에서 제공하는 math 에 있는 pow()와 sqrt를 사용하여 작성할수도 있다</p>
<pre><code>제곱 = pow(x,y)
x = 계산할 수
y = 제곱 횟수

제곱근(루트) = sqrt(x)

x = 계산할 수
</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 -삼각달팽이]]></title>
            <link>https://velog.io/@bae-code/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%82%BC%EA%B0%81%EB%8B%AC%ED%8C%BD%EC%9D%B4</link>
            <guid>https://velog.io/@bae-code/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%82%BC%EA%B0%81%EB%8B%AC%ED%8C%BD%EC%9D%B4</guid>
            <pubDate>Tue, 15 Feb 2022 12:55:20 GMT</pubDate>
            <description><![CDATA[<pre><code>def solution(n):
    answer = []
    floor = []
    start = 1

    # 삼각형 리스트
    for i in range(n):
        floor.append([0] * (i+1))

    # x는 가로축
    x = 0
    # y는 세로축 0부터시작해야함 아래에서 더해줄것이기 때문에 -1로 설정
    y = -1

    # 한면에서 방향이 바뀔때 마다 길이가 1씩 줄어듬 4 &gt; 3 &gt; 2 &gt; 1
    # 이중 for문으로 j부터 n까지 출력 (길이만큼 돌기 위해서)
    # ex)n = 4  0,1,2,3 || 1,2,3 || 2,3 || 3 
    for j in range(n):
      for k in range(j , n):
        #0이면 아래, 1이면 오른쪽, 2면 위

        # 아래로 가기 때문에 세로축 + 1
        if j % 3 == 0:
            y += 1
        # 오른쪽으로 진행하기때문에 가로축 + 1
        elif j % 3 == 1:
            x += 1

        # 위로 진행하기 때문에 가로축 -1 , 세로축 -1
        elif j % 3 == 2:
            x -= 1
            y -= 1

        # 1부터 시작하는 start를 넣고 start에 +1 을 해준다
        floor[y][x] = start
        start += 1

    # floor 리스트 안의 리스트들을 answer에 더해줌
    for b in floor:
        answer += b
    return answer</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[pandas-index,attributes,methods]]></title>
            <link>https://velog.io/@bae-code/pandas-indexattributesmethods</link>
            <guid>https://velog.io/@bae-code/pandas-indexattributesmethods</guid>
            <pubDate>Tue, 15 Feb 2022 07:35:21 GMT</pubDate>
            <description><![CDATA[<p>판다스에서 인덱스를 지정해준다</p>
<pre><code>series_3 = pd.Series(data = my_list, index = my_labels)</code></pre><p>pandas 공식 문서
<a href="https://pandas.pydata.org/docs/reference/api/pandas.Series.memory_usage.html">https://pandas.pydata.org/docs/reference/api/pandas.Series.memory_usage.html</a></p>
<pre><code>my_series.values , my_series.index , my_series.dtype</code></pre><p>과 같은건 pandas의 attribute</p>
<pre><code>my_series.sum(), my_series.mean(), my_series.product()....., head(), tail()</code></pre><p>는 pandas 의 method 들이다 파이썬과 동일하게 볼수있을것같다</p>
<pre><code>my_series.memory_usage()</code></pre><p>시리즈가 얼마만큼의 메모리를 소비하고있는지를 알려주는 method이다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Pandas series,dtype]]></title>
            <link>https://velog.io/@bae-code/Pandas-seriesdtype</link>
            <guid>https://velog.io/@bae-code/Pandas-seriesdtype</guid>
            <pubDate>Mon, 14 Feb 2022 14:36:01 GMT</pubDate>
            <description><![CDATA[<p>Series의 경우 pandas에서 제공하는 데이터타입인데, index가 있는 1차원 배열이라고 생각하면 좋다. 문자, 논리형, 숫자 모든 데이터타입이 들어갈 수 있다. dataframe의 한 컬럼, 한 컬럼이 series이다.</p>
<p>Object dtype은 string 같은 개념</p>
<p>int64 dtype은 메모리 64비트를 사용하고있는 수라고 함.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[크롤링 특징]]></title>
            <link>https://velog.io/@bae-code/%ED%81%AC%EB%A1%A4%EB%A7%81-%ED%8A%B9%EC%A7%95</link>
            <guid>https://velog.io/@bae-code/%ED%81%AC%EB%A1%A4%EB%A7%81-%ED%8A%B9%EC%A7%95</guid>
            <pubDate>Sun, 13 Feb 2022 12:50:49 GMT</pubDate>
            <description><![CDATA[<p>requests , beautifulsoup = 
html 내부 데이터만 크롤링
장점 ] 굉장히 빠른 속도 
단점 ] 외부 데이터 수집이 불가 </p>
<p>selenium, beautifulsoup = </p>
<p>html 내부 외부 모두 크롤링</p>
<p>장점] 모든데이터를 가져옴</p>
<p>단점 ] 상대적으로 느림 , 불안정</p>
<p>selenium = </p>
<p>장점 ] 조작가능함
단점 ] bs를 사용하는것보다 느림</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[poetry vscode에서 사용]]></title>
            <link>https://velog.io/@bae-code/poetry-vscode%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9</link>
            <guid>https://velog.io/@bae-code/poetry-vscode%EC%97%90%EC%84%9C-%EC%82%AC%EC%9A%A9</guid>
            <pubDate>Fri, 11 Feb 2022 14:15:34 GMT</pubDate>
            <description><![CDATA[<pre><code>poetry config virtualenvs.in-project true
poetry config virtualenvs.path &quot;./.venv&quot;
프로젝트 내부에 venv 새로 설치
poetry install &amp;&amp; poetry update</code></pre><p>poetry new how-long[폴더이름]</p>
<p>poetry install</p>
<p>poetry add mypy[추가할 패키지 이름]</p>
<p>이렇게 세가지를 사용해서 사용을했다 vscode에서는인터프리터 인식이 없어서 방법을찾아보고</p>
<p>위의 방법들을 사용해서 poetry를 사용했다 강의에서 사용중인 것이라 사용해보는거에 의미를 둘까생각중이기는한데 편한건 확실해보인다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[레트로플릭스] 스트리밍..?]]></title>
            <link>https://velog.io/@bae-code/%EB%A0%88%ED%8A%B8%EB%A1%9C%ED%94%8C%EB%A6%AD%EC%8A%A4-%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D</link>
            <guid>https://velog.io/@bae-code/%EB%A0%88%ED%8A%B8%EB%A1%9C%ED%94%8C%EB%A6%AD%EC%8A%A4-%EC%8A%A4%ED%8A%B8%EB%A6%AC%EB%B0%8D</guid>
            <pubDate>Tue, 08 Feb 2022 15:01:01 GMT</pubDate>
            <description><![CDATA[<p>프로젝트가 끝나기 하루전 결국 어째저째 스트리밍을 구현했다.
원리만 간단히 보자면 전달 받은 데이터를 쪼개서 장고에 StreamingHttpResponse로 전달 해주는 것이다.
구글링을통해 각종 소스 코드들을 모아봤고 결국 다 똑같아서 채용해서 사용해보기로했다.</p>
<pre><code>Class RangeFileWrapper(object):

    #blksize = 데이터를 쪼갤 block사이즈
    #offset = 파일을 읽는 시작점
    def __init__(self, filelike, blksize=10240, offset=0, length=None):
        self.filelike = filelike
        #python seek를 이용하여서 파일을 쪼개 읽는다(라고한다 seek에대한 공부 필요)
        self.filelike.seek(offset, os.SEEK_SET)
        self.remaining = length
        self.blksize = blksize

    def close(self):
        if hasattr(self.filelike, &#39;close&#39;):
            self.filelike.close()

    def __iter__(self):
        return self

    def __next__(self):
        if self.remaining is None:
            # If remaining is None, we&#39;re reading the entire file.
            data = self.filelike.read(self.blksize)
            if data:
                return data
            raise StopIteration()
        else:
            if self.remaining &lt;= 0:
                raise StopIteration()
            data = self.filelike.read(min(self.remaining, self.blksize))
            if not data:
                raise StopIteration()
            self.remaining -= len(data)
            return data


def stream(request):
    range_header = request.META.get(&#39;HTTP_RANGE&#39;, &#39;&#39;).strip()
    range_match = range_re.match(range_header)
    size = os.path.getsize(&#39;movie/video1.mp4&#39;)
    content_type, encoding = mimetypes.guess_type(&#39;movie/video1.mp4&#39;)
    content_type = content_type or &#39;application/octet-stream&#39;
    if range_match:
        first_byte, last_byte = range_match.groups()
        first_byte = int(first_byte) if first_byte else 0
        last_byte = int(last_byte) if last_byte else size - 1
        if last_byte &gt;= size:
            last_byte = size - 1
        length = last_byte - first_byte + 1
        resp = StreamingHttpResponse(RangeFileWrapper(open(&#39;movie/video1.mp4&#39;, &#39;rb&#39;), offset=first_byte, length=length), status=206, content_type=content_type)
        resp[&#39;Content-Length&#39;] = str(length)
        resp[&#39;Content-Range&#39;] = &#39;bytes %s-%s/%s&#39; % (first_byte, last_byte, size)
    else:
        resp = StreamingHttpResponse(FileWrapper(open(&#39;movie/video1.mp4&#39;, &#39;rb&#39;)), content_type=content_type)
        resp[&#39;Content-Length&#39;] = str(size)
    resp[&#39;Accept-Ranges&#39;] = &#39;bytes&#39;
    return resp</code></pre><p>seek와 iteration을 얼른 공부해서 추가적으로 이해가 필요할거같다</p>
<p>결과적으로 급한대로 쓰긴했지만 추가적으로 공부를하여 완벽하게 이해를 하지못하면
의미가 없을거같아서 따로 또 공부해볼 필요가있는 기능인거 같아 보인다
영상뿐아니라 큰 사이즈의 csv 파일이나 음악 스트리밍역시 이기능을 사용한다면 꼭
알고 넘어가야할 중요한 기능이라 생각함</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[WIL - 또 한번 배운게 많았던 한 주]]></title>
            <link>https://velog.io/@bae-code/WIL-%EB%98%90-%ED%95%9C%EB%B2%88-%EB%B0%B0%EC%9A%B4%EA%B2%8C-%EB%A7%8E%EC%95%98%EB%8D%98-%ED%95%9C-%EC%A3%BC</link>
            <guid>https://velog.io/@bae-code/WIL-%EB%98%90-%ED%95%9C%EB%B2%88-%EB%B0%B0%EC%9A%B4%EA%B2%8C-%EB%A7%8E%EC%95%98%EB%8D%98-%ED%95%9C-%EC%A3%BC</guid>
            <pubDate>Sat, 05 Feb 2022 15:17:45 GMT</pubDate>
            <description><![CDATA[<p>이번에 또 WIL를 적게되는이유는 또 많은걸 배웠기 때문이다.</p>
<p>첫째로 하기싫은것을 못하는것으로 생각하지말자.
참 나도 간사하다고 느낀것이 최대한 많은것을 해보자고 하면서도
하기싫은건 은근히 밀어내는 경향이 보였다
근데 일단 그런일을 잡게되고 하게 되니까 내 생각보다 하기싫은것도 아니였고
못할것은 더더욱 아니였다 .</p>
<p>둘째로 지금과 같이 스스로 알아보고 늦더라도 꼭 스스로 답을 찾아내고 고민하자
일례로 자기주도적학습이 현재 듣고있는 캠프의 주된 것이라고 한다..
주관적인 생각이지만 &#39;자기주도적&#39; 이 단어를 얼마나 잘 수행하느냐가 첫번째 허들이라고
생각한다. 자기주도적 학습 앞으로 나아가 자기주도적으로 업무를 해야하는 사람이 되는데 
가장 중요한 것이라고 생각한다.</p>
<p>마지막으로,끊임없이 새로운것을 탐구하고 도전하자 특히 누군가는했고 나에게는 미지의 영역인것</p>
<p>누군가 했다면 나 역시 할 수있고 그 부분을 더 개선하여 더 좋은 것으로 만들 가능성도 열려있다.</p>
<p>물론 어려운것도 쉬운것도있겠지만 하나씩 도전하고 이뤄내면서 얻어가는 나의 성장을 기대하면서</p>
<p>최대로 어렵다 어려워죽겟네 정도로 끝내고 계속 해보자</p>
<p>아무튼 이번주는 코드적으로도 배운게많은데 이건 그냥 따로적는 ㅋㅋ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[레트로플릭스] 상세페이지 ajax]]></title>
            <link>https://velog.io/@bae-code/%EB%A0%88%ED%8A%B8%EB%A1%9C%ED%94%8C%EB%A6%AD%EC%8A%A4-%EC%83%81%EC%84%B8%ED%8E%98%EC%9D%B4%EC%A7%80-ajax</link>
            <guid>https://velog.io/@bae-code/%EB%A0%88%ED%8A%B8%EB%A1%9C%ED%94%8C%EB%A6%AD%EC%8A%A4-%EC%83%81%EC%84%B8%ED%8E%98%EC%9D%B4%EC%A7%80-ajax</guid>
            <pubDate>Fri, 04 Feb 2022 16:29:15 GMT</pubDate>
            <description><![CDATA[<pre><code>def select_movie_detail(request):
    if request.method == &#39;GET&#39;:

        abc = request.user.id

        print(abc)
        #넘겨받는 영화 제목
        title_give = &#39;올드보이&#39;

        #############Movie.objects.get(title = { 여기에 넘겨받은 영화 제목이 들어감 })
        movie_find = Movie.objects.get(title = title_give)


        ###### 찾은 영화의 .opneDt ex ) .title = 끌로드부인 , .openDt = 1990, 이런 값들에  접근이 가능합니다
        print(movie_find.openDt)
        print(movie_find.title)
        print(genre_idx[movie_find.genre])
        print(movie_find.star)

        #### 영화와 비슷한 영화 추천 정보 #####

        user_title = movie_ratings.pivot_table(&#39;rating&#39;, index=&#39;title&#39;, columns=&#39;userId&#39;)

        user_title = user_title.fillna(0)

        item_based_collab = cosine_similarity(user_title, user_title)

        item_based_collab = pd.DataFrame(item_based_collab, index=user_title.index, columns=user_title.index)

        # 현재영화와 비슷하게 유저들로부터 평점을 부여받은 영화들은?


        # recommend_movies = item_based_collba[넘겨받은 영화의 제목 넣는 부분].sort_values(ascending=False)[1:11].index 
        recommend_movies = item_based_collab[title_give].sort_values(ascending=False)[1:11].index

        # 추천 영화를 리스트로 변경 해주는 부분
        recommend_list = [i for i in recommend_movies]

        print(recommend_list)
        detail= {&#39;title&#39;:movie_find.title,
        &#39;openDt&#39;:movie_find.openDt,
        &#39;star&#39;:movie_find.star,
        &#39;genre&#39;:genre_idx[movie_find.genre],
        &#39;recommend_list&#39;: recommend_list
        }

        #########ajax와 연결후 ajax로 전달해줄 jsonresponse
        #########return JsonResponse(detail)
        return render(request, &#39;main/detail.html&#39;,detail)</code></pre><p>상세 페이지 모달의 html내용을 바꿔주기위해서 ajax로 연결해서 영화이름을 전달하고 필요 내용을 전달받아 교체해주는 방법을 쓰기로했다</p>
<p>&lt;클래스이름&gt;.objects.values() :</p>
<ul>
<li>.values()로 dictionary의 key와 value에 접근이 가능하다.</li>
<li>QuerySet()은 리스트이고, 객체는 dictionary 이므로 <variable name>[index][&#39;key&#39;] 의 형식으로 value값에 접근이 가능하다</li>
</ul>
<p> &lt;클래스이름&gt;.objects.get(id=1) :</p>
<ul>
<li>get()은 dictionary의 요소 하나를 반환한다.</li>
<li>해당 조건의 요소가 존재하지 않을때는 DoesNotExist, 여러개 존재할때는 MultipleObjectsReturned 에러가 발생한다.</li>
<li>하나의 객체이기에 반환되기 때문에, dot notation으로 접근이 가능하다. <variable name>.name<pre><code>title_give = &#39;올드보이&#39;
movie_find = Movie.objects.get(title = title_give)
print(movie_find.openDt) 
&gt; 2003</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[레트로플릭스]영화 DB저장]]></title>
            <link>https://velog.io/@bae-code/%EB%A0%88%ED%8A%B8%EB%A1%9C%ED%94%8C%EB%A6%AD%EC%8A%A4%EC%98%81%ED%99%94-DB%EC%A0%80%EC%9E%A5</link>
            <guid>https://velog.io/@bae-code/%EB%A0%88%ED%8A%B8%EB%A1%9C%ED%94%8C%EB%A6%AD%EC%8A%A4%EC%98%81%ED%99%94-DB%EC%A0%80%EC%9E%A5</guid>
            <pubDate>Tue, 01 Feb 2022 19:51:37 GMT</pubDate>
            <description><![CDATA[<p>기존 영화 크롤링 코드에 pymysql을 추가하여 db에영화 전체를 추가 하였다.</p>
<pre><code>movie_list = []

#셀레니움에서 이미지 크롤링에 사용하기위한 제목리스트
title_list = []

#movie_id로 사용할 값
movie_id= 1

# db와 연결 하는 부분
conn = pymysql.connect(host= host, user = username, passwd= password, db= database, port= port, use_unicode= True, charset= &#39;utf8&#39;)
cursor = conn.cursor()

# 저장할 형식
sql = &quot;INSERT INTO movies (movieid, title, openDt, clip, star, genre) VALUES (%s, %s, %s, %s, %s, %s )&quot;


# 90년도부터 07년도 까지 연도별 100개씩 출력
for i in range(1990,2007):

    # 영화 진흥회 api
    url =f&#39;https://kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json?key=f5eef3421c602c6cb7ea224104795888&amp;openStartDt={i}&amp;openEndDt={i}&amp;itemPerPage=100&#39;

    res = requests.get(url)
    text = res.text

    d = json.loads(text)

    # 100개의 영화에서 제목, 장르, 개봉일, movie_id를 저장
    for i in d[&#39;movieListResult&#39;][&#39;movieList&#39;]:
        # 제목의 공백을 지워줌
        b = i[&#39;movieNm&#39;].replace(&#39; &#39;,&#39;&#39;)
        #제목의 특수문자를 지워줌
        title = &#39;&#39;.join(filter(str.isalnum, b))

        #장르
        genre =i[&#39;repGenreNm&#39;]

        # 장르를 숫자로 저장하기위한 리스트
        genre_idx=[&#39;가족&#39;,&#39;공포(호러)&#39;,&#39;다큐멘터리&#39;,&#39;드라마&#39;,&#39;멜로/로맨스&#39;,&#39;뮤지컬&#39;,&#39;미스터리&#39;,&#39;범죄&#39;,&#39;사극&#39;,&#39;서부극(웨스턴)&#39;,&#39;성인물(에로)&#39;,&#39;스릴러&#39;,&#39;애니메이션&#39;,&#39;액션&#39;,&#39;어드벤처&#39;,&#39;전쟁&#39;,&#39;코미디&#39;,&#39;판타지&#39;,&#39;SF&#39;,&#39;&#39;]

        #장르 index값 ex)0,12,4
        genre_int = genre_idx.index(genre)

        #연도만 저장함 ex ) 1994
        openDt = int(i[&#39;openDt&#39;][:4])

        # 무비id(없어도될듯한데;), 타이틀, 개봉일자, 클립, 평점 평균, 장르 
        movie_list.append((movie_id,title,openDt,&#39;&#39;,0.0,genre_int))

        #제목만 제목리스트에 따로저장
        title_list.append(title)
        #movie_id 에 +1하여 반복할수있게 함 



        movie_id+=1

### 저장하는 부분

retro_rds = conn.cursor()

#리스트안에 있는 모든튜플을 sql &lt; 에 형식과 동일하게 저장함
retro_rds.executemany(sql, movie_list)

conn.commit()</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[레트로플릭스] 기본적인 작업들]]></title>
            <link>https://velog.io/@bae-code/%EB%A0%88%ED%8A%B8%EB%A1%9C%ED%94%8C%EB%A6%AD%EC%8A%A4-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-%EC%9E%91%EC%97%85%EB%93%A4</link>
            <guid>https://velog.io/@bae-code/%EB%A0%88%ED%8A%B8%EB%A1%9C%ED%94%8C%EB%A6%AD%EC%8A%A4-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-%EC%9E%91%EC%97%85%EB%93%A4</guid>
            <pubDate>Sun, 30 Jan 2022 13:22:53 GMT</pubDate>
            <description><![CDATA[<p>오늘은 프로젝트에 S3를 연결하고 RDS 연결하면서 생긴 key pw 정보들을 json파일로 엮어
분리시켜서 gitignore에 추가하여 관리하게 설정하였다</p>
<pre><code>def get_secret(setting, secrets=secrets):
    try:
        return secrets[setting]
    except KeyError:
        error_msg = &quot;Set the {0} environment variable&quot;.format(setting)
        raise ImproperlyConfigured(error_msg)

SECRET_KEY = get_secret(&quot;SECRET_KEY&quot;)

DATABASES = {
    &#39;default&#39;: {
        &#39;ENGINE&#39;: get_secret(&#39;DATABASES&#39;)[&#39;default&#39;][&#39;ENGINE&#39;],
        &#39;NAME&#39;: get_secret(&#39;DATABASES&#39;)[&#39;default&#39;][&#39;NAME&#39;],
        &#39;USER&#39;: get_secret(&#39;DATABASES&#39;)[&#39;default&#39;][&#39;USER&#39;],
        &#39;PASSWORD&#39;: get_secret(&#39;DATABASES&#39;)[&#39;default&#39;][&#39;PASSWORD&#39;],
        &#39;HOST&#39;: get_secret(&#39;DATABASES&#39;)[&#39;default&#39;][&#39;HOST&#39;],
        &#39;PORT&#39;: get_secret(&#39;DATABASES&#39;)[&#39;default&#39;][&#39;PORT&#39;],
    }
}</code></pre><p>이전에 그냥 무심결에 올렷다가 깃가디언한테 혼난적이있어서 분리하는 방법을 알아보다가
s3 분리법을 이용해서 똑같이사용했다.</p>
<p>그리고 기본적인 base html을 만들었다.</p>
<p><img src="https://images.velog.io/images/bae-code/post/b2def312-b238-4926-b618-d4667159cc4d/image.png" alt=""></p>
<p>준비물은 다 준비해뒀으니 이제 만들기만 하면 될것같다!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[레트로플릭스] 영화진흥회 api , 이미지 크롤링,csv 만들기]]></title>
            <link>https://velog.io/@bae-code/%EB%A0%88%ED%8A%B8%EB%A1%9C%ED%94%8C%EB%A6%AD%EC%8A%A4-%EC%98%81%ED%99%94%EC%A7%84%ED%9D%A5%ED%9A%8C-api-%EC%9D%B4%EB%AF%B8%EC%A7%80-%ED%81%AC%EB%A1%A4%EB%A7%81csv-%EB%A7%8C%EB%93%A4%EA%B8%B0</link>
            <guid>https://velog.io/@bae-code/%EB%A0%88%ED%8A%B8%EB%A1%9C%ED%94%8C%EB%A6%AD%EC%8A%A4-%EC%98%81%ED%99%94%EC%A7%84%ED%9D%A5%ED%9A%8C-api-%EC%9D%B4%EB%AF%B8%EC%A7%80-%ED%81%AC%EB%A1%A4%EB%A7%81csv-%EB%A7%8C%EB%93%A4%EA%B8%B0</guid>
            <pubDate>Thu, 27 Jan 2022 22:25:47 GMT</pubDate>
            <description><![CDATA[<p>할게 너무많아서 너무 바쁜 하루~?이틀 정도
물론 밤새고 아침에적어서 잘모르겠다 ㅋㅋ
아무튼 이번에 장고로 넷플릭스 클론코딩을 하게되는데 이번 아이디어는
레트로 플릭스 예전에 나온 영화들을 모아서 보여주는 사이트로 했다.</p>
<p>첫째로 어려운것이 90-2000년대 초반 영화들 데이터 모으는것이였는데 다행히
<a href="https://www.kobis.or.kr/kobisopenapi/homepg/main/main.do">https://www.kobis.or.kr/kobisopenapi/homepg/main/main.do</a>
영화 진흥회 api 가 있었다!
들어가면 상세한 사용법도 잘나와있으니 나중에 필요하면 꼭 사용해보길 바람</p>
<p>아무튼 90~ 07년도까지 각 연도별 100가지 영화를 뽑아서 1700개의 영화를 가져왔다
(100까지밖에 api출력이 안되서 더 많이는 못뽑았다)</p>
<p>그리고 여기서 또 두번째 어려운 부분이 발생했다
포스터가 없었다는거다 .. (이미지도 넣어주시면 고맙겟습니다 영화진흥회)
그렇다고 뭐 없이 뭐 할맛이 나겠는가?
바로 셀레니움으로 포스터 이미지를 크롤링 해왔다.
1700개? 1683~7개 정도  뽑아왔고 굉장히 오래걸렸다 처음쓰는거라서 
그리고 나머지는 작업하면서 빈곳있으면 찾아넣어야겟다</p>
<pre><code>import json
import requests
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
import urllib.request
from bs4 import BeautifulSoup
import os



movie_list = []
title_list = []
a= 1


for i in range(1990,2007):
    # 영화 진흥회 api에 연도별로 데이터를 뽑기위해 for문을썻다 (100개만출력 제한ㅠ)
    url =f&#39;https://kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json?key=f5eef3421c602c6cb7ea224104795888&amp;openStartDt={i}&amp;openEndDt={i}&amp;itemPerPage=100&#39;
    res = requests.get(url)
    text = res.text

    d = json.loads(text)

    for i in d[&#39;movieListResult&#39;][&#39;movieList&#39;]:
        # 공백란을 제거해줬다
        b = i[&#39;movieNm&#39;].replace(&#39; &#39;,&#39;&#39;)
        # 아래에서 크롤링할떄 용이하게 하기위해서 특수문자는 빼줫다
        title = &#39;&#39;.join(filter(str.isalnum, b))
        genre =i[&#39;repGenreNm&#39;]
        #연도만 뽑기위해서 슬라이스해줫다
        openDt = i[&#39;openDt&#39;][:4]
          #무비리스트에 더해줬다
        movie_list.append([a,openDt,title,genre])
        #크롤링을위해 제목만 저장한 리스트
        title_list.append(title)

        #movie_id 로 사용할 a
        a+=1

# 여기 까지가 영화 데이터를 받아온 부분이고
#타이틀 리스트로 제목만 받아온뒤 셀레니움으로 크롤링해줬다

driver = webdriver.Chrome(&quot;chromedriver.exe&quot;)
options = webdriver.ChromeOptions()
options.add_argument(&quot;user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36&quot;)
driver.get(&quot;https://www.google.co.kr/imghp?hl=ko&amp;tab=wi&amp;ogbl&quot; )
for x , i in enumerate(title_list[80:100]):
    vali = os.path.isfile(&quot;{i}.jpg&quot;)
    #이 부분은 작업도중 혼선이 와서 최대한 시간을 적게 쓰기위한 코드였다
    if vali != True:
        # 위와 중복인데 처음은 여기만적었는데 아래 저장에서 에러가나서 위에서 아예 다적용한것
        a = &#39;&#39;.join(filter(str.isalnum, i))
        elem = driver.find_element_by_name(&quot;q&quot;)

        #영화 제목 포스터를 입력하고 검색하는 부분
        elem.send_keys(f&#39;영화 {a} 포스터&#39;)
        elem.send_keys(Keys.RETURN)

    #검색창(&#39;q&#39;)를 초기화시키는 부분
        driver.find_element_by_name(&quot;q&quot;).clear()

        #여기서부터 내 폴더에 저장하는부분
        driver.find_elements_by_css_selector(&quot;.rg_i.Q4LuWd&quot;)[0].click()
        imgURL=driver.find_element_by_css_selector(&quot;.n3VNCb&quot;).get_attribute(&quot;src&quot;)


        urllib.request.urlretrieve(imgURL, f&quot;{i}.jpg&quot;)
        #자꾸 봇이라고 뭐라하길래 텀도 추가해줬다
        time.sleep(2)

    #자꾸에러나서 열받아서 index 출력해줌 
    print(x)
</code></pre><p>자꾸 404도 뜨고 뭐 이런저런일이 많이발생해서 힘들긴했지만 결국 다 받아와서 매우 흡족한 부분이 아닐수없다</p>
<p>아 추가로 movie_list로 pandas를 이용해 csv 파일을 만들었다.</p>
<pre><code>import pandas as pd
import numpy as np
import csv
import json
import requests
movie_list = []
a= 1
for i in range(1990,2007):

  url =f&#39;https://kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json?key=f5eef3421c602c6cb7ea224104795888&amp;openStartDt={i}&amp;openEndDt={i}&amp;itemPerPage=100&#39;
  res = requests.get(url)
  text = res.text

  d = json.loads(text)


  for i in d[&#39;movieListResult&#39;][&#39;movieList&#39;]:
    title_a = i[&#39;movieNm&#39;].replace(&#39; &#39;,&#39;&#39;)
    title = &#39;&#39;.join(filter(str.isalnum, title_a))
    genre =i[&#39;repGenreNm&#39;]
    openDt = i[&#39;openDt&#39;][:4]
    movie_list.append([a,openDt,title,genre])
    a+=1

movie_data = pd.DataFrame(movie_list, columns= [&#39;movieid&#39;,&#39;openDt&#39;,&#39;title&#39;,&#39;genre&#39;])

movie_data

from google.colab import drive

movie_data

drive.mount(&#39;drive&#39;)

movie_data.to_csv(&#39;movie_data.csv&#39;)
!cp movie_data.csv &#39;drive/My Drive/&#39;

movies = pd.read_csv(&#39;movie_data.csv&#39;)
movies
</code></pre><p>기본적이고 귀찮은 일들을 싹 처리한기분이다 남은게 있겠지만 이후에 처리할것들이고</p>
<p>오늘처럼 뜨끈하게 처리할수있기를 바란다</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[딴짓프로젝트] 욕설 필터.]]></title>
            <link>https://velog.io/@bae-code/%EB%94%B4%EC%A7%93%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9A%95%EC%84%A4-%ED%95%84%ED%84%B0</link>
            <guid>https://velog.io/@bae-code/%EB%94%B4%EC%A7%93%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%9A%95%EC%84%A4-%ED%95%84%ED%84%B0</guid>
            <pubDate>Mon, 24 Jan 2022 19:06:21 GMT</pubDate>
            <description><![CDATA[<pre><code>f = open(&#39;badwords.txt&#39;, &#39;r&#39;,encoding = &quot;utf-8&quot;)
ff = f.readlines()

user = &#39;abcd&#39;.lower() 
for i in ff: 
    if user.find(i.strip()) &gt;= 0:
        user = &#39;금지어&#39; 
        break


print(user)
</code></pre><p>방명록으로 못된짓을 막기위해 일단은 생각나는 욕설필터를 달았다.</p>
<p>txt 파일을 불러와서 readlines() 로 모든 단어를 리스트로 저장했다</p>
<p>user 로 받아오는 값중에 영어는 lower()로 처리하여 필터링에 문제없게 했다.</p>
<p>금지어가 들어가있지않은경우에는 find로 -1을 반환하고 그경우 그냥 user값이 그대로넘어감</p>
<p>금지어가있을경우 금지어가있는곳의 index를 반환한다</p>
<p>그경우 0보다 크기때문에 user를 금지어로 저장한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[git-파일or폴더 rename]]></title>
            <link>https://velog.io/@bae-code/git-%ED%8C%8C%EC%9D%BCor%ED%8F%B4%EB%8D%94-rename</link>
            <guid>https://velog.io/@bae-code/git-%ED%8C%8C%EC%9D%BCor%ED%8F%B4%EB%8D%94-rename</guid>
            <pubDate>Mon, 24 Jan 2022 00:57:30 GMT</pubDate>
            <description><![CDATA[<p>$ git mv cheet cheats</p>
<p>$ git add .</p>
<p>$ git commit -m &quot;Rename kk&quot;</p>
<p>프로젝트 이름 오타난거 이제발견하고 수정</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[python - fstring]]></title>
            <link>https://velog.io/@bae-code/python-fstring</link>
            <guid>https://velog.io/@bae-code/python-fstring</guid>
            <pubDate>Sun, 23 Jan 2022 00:19:18 GMT</pubDate>
            <description><![CDATA[<pre><code>

&gt;&gt;&gt; x = 1
&gt;&gt;&gt; y = 2
&gt;&gt;&gt; f&quot;{x} + {y}는 {x + y}입니다.&quot;
&#39;1 + 2는 3입니다.&#39;
f-string은 문자열 안에 변수 값을 삽입하는 용도로 사용될 때 그 진가를 발휘됩니다.

&gt;&gt;&gt; first_name = &quot;John&quot;
&gt;&gt;&gt; last_name = &quot;Doe&quot;
&gt;&gt;&gt; f&quot;Welcome, {first_name} {last_name}!&quot;
&#39;Welcome, John Doe!&#39;
함수 호출
f-string을 사용하면 문자열 안에서 함수를 호출한 결과를 삽입할 수 도 있습니다.

&gt;&gt;&gt; word = &quot;Python&quot;
&gt;&gt;&gt; f&quot;{word}는 {len(word)}글자입니다.&quot;
&#39;Python는 6글자입니다.&#39;
&gt;&gt;&gt; f&quot;대문자로는 {word.upper()}이고, 소문자로는 {word.lower()}입니다.&quot;
&#39;대문자로는 PYTHON이고, 소문자로는 python입니다.&#39;
다른 표현식
사실 상 파이썬에서 가능한 모든 표현식을 문자열 안에 삽입할 수 있기 때문에 f-string의 활용법은 무궁무진하다고 볼 수 있습니다.

&gt;&gt;&gt; word = &quot;Python&quot;
&gt;&gt;&gt; f&quot;{word}의 첫 두 글자는 {word[:2]} 입니다.&quot;
&#39;Python의 첫 두 글자는  Py 입니다.&#39;
&gt;&gt;&gt; word = &quot;Python&quot;
&gt;&gt;&gt; f&quot;{word}를 거꾸로 하면 {word[::-1]} 입니다.&quot;
&#39;Python를 거꾸로 하면 nohtyP 입니다.&#39;
&gt;&gt;&gt; f&quot;3회 반복: {&#39;,&#39;.join([word] * 3)}&quot;
&#39;3회 반복: Python,Python,Python&#39;
객체 치환
f-string 안 에서 객체를 사용하면 해당 객체의 __str__() 메서드가 호출된 결과가 삽입됩니다.

&gt;&gt;&gt; from datetime import date
&gt;&gt;&gt; f&quot;오늘은 {date.today()} 입니다.&quot;
&#39;오늘은 2021-02-27 입니다.&#39;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[컨닝군단장] 이벤트 페이지 크롤링]]></title>
            <link>https://velog.io/@bae-code/%EC%BB%A8%EB%8B%9D%EA%B5%B0%EB%8B%A8%EC%9E%A5-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%ED%8E%98%EC%9D%B4%EC%A7%80-%ED%81%AC%EB%A1%A4%EB%A7%81</link>
            <guid>https://velog.io/@bae-code/%EC%BB%A8%EB%8B%9D%EA%B5%B0%EB%8B%A8%EC%9E%A5-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%ED%8E%98%EC%9D%B4%EC%A7%80-%ED%81%AC%EB%A1%A4%EB%A7%81</guid>
            <pubDate>Sat, 22 Jan 2022 21:03:02 GMT</pubDate>
            <description><![CDATA[<p>이벤트 페이지가 2페이지로 되어있어서 일단은 2페이지의 이벤트 정보를 긁어오기위해
for문으로 두페이지의 정보를 모두 가져왔다</p>
<pre><code>for a in range(2):
    page = a + 1
    data = requests.get(f&#39;https://lostark.game.onstove.com/News/Event/Now?page={page}&amp;searchtype=0&amp;searchtext=&#39;,headers=headers)

    soup = BeautifulSoup(data.text, &#39;html.parser&#39;)

    event = soup.select(&#39;#lostark-wrapper &gt; div &gt; main &gt; div &gt; div &gt; div.list.list--event &gt; ul &gt; li&#39;)


    for e in event:
        title= e.select_one(&#39;a &gt; div.list__thumb &gt; img&#39;)[&#39;alt&#39;]
        image = e.select_one(&#39;a &gt; div.list__thumb &gt; img&#39;)[&#39;src&#39;]
        date = e.select_one(&#39;a &gt; div.list__term&#39;).text.split(&#39;:&#39;)[1]
        print(title,image,date)</code></pre><p>현재 결과값</p>
<pre><code>2022 로열 로더스 예선 접수 https://cdn-lostark.game.onstove.com/uploadfiles/banner/c728999cc6b241dea8d789e7cb4c274f.jpg  2022.01.12 06
로웬 테스트 서버 오픈 https://cdn-lostark.game.onstove.com/uploadfiles/banner/71a9deaa7d32484aa5d04f0ff86611da.jpg  2022.01.19 06
도화가 사전등록 쿠폰 확인 https://cdn-lostark.game.onstove.com/uploadfiles/banner/7c52a8f9dfc54f25ad6ce9721df5d87d.jpg  2022.01.05 06
도화가 오픈 아바타 https://cdn-lostark.game.onstove.com/uploadfiles/banner/691f7ab305a54f3897f61c5e6508f48a.jpg  2022.01.12 06
아크패스 : 영광과 안식의 선율 https://cdn-lostark.game.onstove.com/uploadfiles/banner/ff9711949de6481ab142ccfcd854012a.jpg  2021.12.22 06
후끈후끈 노천 온천 만들기 대작전 https://cdn-lostark.game.onstove.com/uploadfiles/banner/fd81744fd9874047af6322dabeecb12f.jpg  2022.01.19 06
프레이야 희망의 트리 https://cdn-lostark.game.onstove.com/uploadfiles/banner/64b1dd42e0534700af6ec96eed1db081.jpg  2021.12.22 06
프레이야 아일랜드 https://cdn-lostark.game.onstove.com/uploadfiles/banner/a253a785ee3d4923b45afbf15a64ad65.jpg  2021.12.22 06
하이퍼 익스프레스 &amp; 점핑권 https://cdn-lostark.game.onstove.com/uploadfiles/banner/ab18171cc90d4e0d89246677bfffadbc.jpg  2021.12.22 06
아크라시아의 겨울을 부탁해! https://cdn-lostark.game.onstove.com/uploadfiles/banner/c6c044c335544d5a9ee666cff7d0579c.jpg  2021.12.22 06
겨울 프레이야 포인트 SHOP https://cdn-lostark.game.onstove.com/uploadfiles/banner/2c9c788332034fdfa53b30012ac7552a.jpg  2021.12.22 06</code></pre><p>아주 정상적으로 잘 출력</p>
]]></description>
        </item>
    </channel>
</rss>