level 2. 가장 긴 팰린드롬

|

문제출처

문제

앞뒤를 뒤집어도 똑같은 문자열을 palindrome이라고 합니다. longest_palindrom함수는 문자열 s를 매개변수로 입력받습니다. s의 부분문자열중 가장 긴 palindrom의 길이를 리턴하는 함수를 완성하세요. 예를들어 s가 “토마토맛토마토”이면 7을 리턴하고 “토마토맛있어”이면 3을 리턴합니다.

풀이코드

def longest_palindrom(s):
    list_s = list(s)
    if list_s == list_s[::-1]:
        return len(list_s)

    result = []
    for idx, item in enumerate(list_s):
        if item in list_s[idx+1:]:
            idx2 = list_s[idx+1:].index(item) + idx+2

            if list_s[idx:idx2] == (list_s[idx:idx2])[::-1]:
                result.append(len(list_s[idx:idx2]))

    if len(result) == 0:
        return 1
    return max(result)

print(longest_palindrom("토마토맛토마토")) # 7
print(longest_palindrom("토마토맛있어")) # 3
print(longest_palindrom("맛있어토마토")) # 3

level 2. 괄호 확인하기

|

문제출처

문제

is_pair함수는 문자열 s를 매개변수로 입력받습니다. s에 괄호가 알맞게 짝지어져 있으면 True를 아니면 False를 리턴하는 함수를 완성하세요. 예를들어 s가 “(hello)()”면 True이고, “)(“이면 False입니다. s가 빈 문자열(““)인 경우는 없습니다.

풀이코드

  • stack을 활용한다.
  • 빈 stack 에는 “(“ 만 들어갈 수 있다.
  • ”)” 이 올때까지 “(“ 를 쌓다가, “)” 이 오면 “(“ 하나와 함께 pop
  • 마지막에 빈 stack 이 남으면 True, 아니면 False
def is_pair(s):
    stack = []
    for ch in s:
        if ch == "(":
            stack.append(ch)
        elif ch == ")":
            try:
                stack.pop()
            except IndexError:
                return False

    return len(stack) == 0

썸네일 만들기 (PILKit, imagekit) ImageSpecField, ProcessedImageField

|

AskDjango 수업을 듣고 중요한 내용을 정리하였습니다.


웹/앱에서 많이 쓰이는 이미지 포맷

  • 이미지 용량을 줄이려면 메타데이터를 제거하고, 적절한 크기로 리사이징, 가급적 JPG 포맷 사용
    1. JPEG : 손실압축 포맷, 파일 크기가 작음, 압축률은 60~80%가 적절, 사진 이미지 유용
    2. PNG : 투명채널 지원, 문자가 있는 이미지 유용
    3. GIF : 256색 지원, 움짤 이미지

파이썬 이미지 처리 라이브러리

  • PIL > Pillow > PILKit(라이브러리) > django-imagekit(앱)
    1. PIL : 09년 이후 업데이트가 없음
    2. Pillow : Pillow는 PIL 프로젝트에서 fork 되어서 나온 라이브러리로, PIL이 python 3를 지원하지 않기 때문에 pillow를 많이 사용하는 추세 (ImageField 사용시 필수)
    3. PILKit : PIL, Pillow를 좀 더 쓰기 쉽도록 도와주는 라이브러리
    4. (참고) django-imagekit : 이미지 썸네일 helper 장고 앱 (실제 이미지 처리시에는 PILKit 이 사용됨)
    • 설치 후, settings.INSTALLED_APPS에 imagekit 추가 필요

PILKit

  • PIL, Pillow를 좀 더 쓰기 쉽도록 도와주는 라이브러리
  • pip install pilkit 으로 설치
  • 다양한 Processors 지원
    • Thumbnail
    • Resize
    • Crop 등

PILKit을 활용한 썸네일 생성, 저장 예시

from PIL import Image #Pillow
from pilkit.processors import Thumbnail

processor = Thumbnail(width=300, height=300)
mountain_image = Image.open("mountain.jpg")

thumb_image = processor.process(mountain_image)
thumb_image.save("sample-300x300.jpg", quality=60)

imagekit

  • 이미지 썸네일 helper 장고 앱 (실제 이미지 처리시에는 PILKit 이 사용됨)

설치

$ pip install pillow # django-imagekit 사용을 위해서 사전 설치 필요
$ pip install pilkit # django-imagekit 사용을 위해서 사전 설치 필요
$ pip install django-imagekit

# pip 설치 후, settings.INSTALLED_APPS에 imagekit 추가 필요

활용 1. 원본 ImageField로 부터 생성 (원본o, 썸네일o) - ImageSpecField

  • ImageSpecField 는 form에서는 렌더링 되지 않음
from django.db import models
from imagekit.models import ImageSpecField
from imagekit.processors import Thumbnail

class Post(models.Model):
	photo = models.ImageField()
	photo_thumbnail = ImageSpecField(
		source = 'photo', 		   # 원본 ImageField 명
		processors = [Thumbnail(100, 100)], # 처리할 작업목록
		format = 'JPEG',		   # 최종 저장 포맷
		options = {'quality': 60}) # 저장 옵션

활용 2. 원본 이미지를 재가공하여 저장 (원본x, 썸네일o) - ProcessedImageField (추천)

  • ProcessedImageField
from django.db import models
from imagekit.models import ProcessedImageField
from imagekit.processors import Thumbnail

class Post(models.Model):
	photo_thumbnail = ProcessedImageField(
		upload_to = 'blog/post',
		processors = [Thumbnail(100, 100)], # 처리할 작업 목룍
		format = 'JPEG',					# 최종 저장 포맷
		options = {'quality': 60})  		# 저장 옵션

활용 3. 템플릿에서 이미지 직접 처리 (추천)

  • widht, height, crop, upscale 설정 가능


<!-- 썸네일 이미지 태그 생성 -->
{% thumbnail "100x100" post.photo %}

<!-- 썸네일 file object 획득 -->
{% thumbnail "100x100" post.photo as thumb %}
<img src="{{ thumb.url }}" alt="" width="{{ thumb.width }}" height="{{ thumb.height }}">

<!-- 추가 속성 정의 -->
{% thumbnail "100x100" post.photo -- style="" onclick="" class="" %}


장고 미디어 파일 (Media Files) - 사진업로드, 파일서빙

|

AskDjango 수업을 듣고 중요한 내용을 정리하였습니다.


미디어 파일 (Media File)

목차

static and media Files

  • static files : 개발 리소스 로서의 정적인 파일 (js, css, image etc)
    • 앱 단위로 저장/서빙
    • 프로젝트 단위로 저장/서빙
  • media files : 유저가 업로드 한 모든 정적인 파일 (image, pdf etc)
    • 프로젝트 단위로 저장/서빙

media files 전달 및 저장 (settings.py)

  1. view : HttpRequest.FILES를 통해 파일이 전달되고,
  2. view : settings.MEDIA_ROOT 디렉토리 하단에 파일 저장
  • 관련 settings 예시
# mysite/settings.py

# 각 media 파일에 대한 URL Prefix
MEDIA_URL = '/media/' # 항상 / 로 끝나도록 설정
# MEDIA_URL = 'http://static.myservice.com/media/' 다른 서버로 media 파일 복사시

# 업로드된 파일을 저장할 디렉토리 경로
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

FileField / ImageField (models.py)

  • models.FileField : 파일 저장을 지원하는 모델 필드
  • models.ImageField : 이미지 저장을 지원하는 모델 필드 (FileField 상속)
  • 제출된 파일, 이미지는 settings.MEDIA_ROOT 경로에 파일을 저장하고,
    DB 필드에는 settings.MEDIA_ROOT 내 저장된 하위 경로를 저장

  • 관련 model필드 예시
# blog/models.py

from django.db import models

class Post(models.Model):
	title = models.CharField(max_length=100)
	photo = models.ImageField(blank=True)

Pillow

  • PIL(Python Image Library)의 일종, 파이썬으로 이미지들을 처리하고 싶을 때 사용
  • Pillow는 PIL 프로젝트에서 fork 되어서 나온 라이브러리로, PIL이 python 3를 지원하지 않기 때문에 pillow를 많이 사용하는 추세
  • 이미지관련 width, height, format, resize 작업을 수행
$ pip install pillow

파일 업로드시의 form enctype, 템플릿내 media url 처리 (template)

form enctype

  • template html의 form에서 유저가 파일을 업로드 하기 위해서는 몇 가지 설정이 필요하다.
    1. form method : 반드시 POST 로 설정이 필요하다.
    2. form enctype : multipart/form-data 로 설정이 필요하다.

<form method='post' action='' enctype="multipart/form-data">
	{% csrf_token %}
	<table>
		{{ form.as_table }}
	</table>
	<input type="submit">
</form>

template 내 media url 처리

  • settings.MEDIA_URL 설정은 언제라도 변경될 수 있다.
  • 따라서 ImageField, FileField 의 .url 속성을 사용하는게 좋다 (settings.MEDIA_URL이 prefix로 붙음)
  • 참고로 .path 속성은 파일시스템 상의 절대경로 (settings.MEDIA_ROOT 가 Prefix로 붙음)

<h2>{{ post.title }}</h2>
{% if post.photo %}
path :{{ post.photo.path }} # /Users/nickname/documents/practice/media/jeju_pic.png
url : {{ post.photo.url }} # /media/jeju_pic.png
<img src="{{ post.photo.url }}" alt="">
{% endif %}


파일 저장경로

  • 저장경로 : settings.MEDIA_ROOT/파일명 경로에 저장
  • DB : 파일명이 string으로 저장

upload_to 필드옵션을 통한 파일 저장경로 수정 (models.py)

  • 한 디렉토리에 파일이 몰릴 경우, OS 파일 찾기 기능이 저하된다.
  • 디렉토리 depth가 깊어지는 것은 성능에 큰 영향이 없다.
  • 대책 예시 : 업로드 시간대 별로 다른 디렉토리에 저장
# blog/models.py

from django.db import models

class Post(models.Model):
	profile_pic = models.ImageField(upload_to="blog/profile_pic")
	# 저장경로 : MEDIA_ROOT/blog/profile_pic/xxxx.jpg 경로에 저장
	# DB필드 : 'MEDIA_URL/blog/profile_pic/xxxx.jpg' 문자열 저장
	photo = models.ImageField(blank=True, upload_to="blog/%Y/%m/%d")
	# 저장경로 : MEDIA_ROOT/blog/2017/05/10/xxxx.jpg 경로에 저장
	# DB필드 : 'MEDIA_URL/blog/2017/05/10/xxxx.jpg' 문자열 저장

개발환경에서의 media 파일서빙 (urls.py)

  • static 파일과는 다르게 개발서버에서 기본 서빙 미지원
  • 개발 편의성 목적으로 서빙 rule 추가 가능
  • settings.DEBUG = False 일때는 static 함수에서 빈 리스트 리턴
from django.conf import settings
from django.conf.urls.static import static

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

170508-0514_TIL

|

5월 14일 (일)

오늘 한 일 (회고)

  • AskDjango 오프라인 강의에 참여했다.
    • 간단한 사진 업로드 페이지 작성
    • 아마존웹서비스 클라우드에 서비스 배포 (AWS ElasticBeanstalk + RDS + S3) 하는 방법에 대해서 배웠다.
  • codility 알고리즘 문제를 풀었다.
  • 텀블벅 페이지를 마크업을 개선했다. 연습 페이지

내일 할 일

  • 팁스타운 코드챌린지 예선문제 풀어보기 링크
  • AskDjango 사용자 인증 부분 강의노트 정리하기

5월 13일 (토)

오늘 한 일 (회고)

  • bootstrap grid 시스템, scss를 활용하여 개인프로젝트용 웹 페이지를 마크업을 진행했다. 연습 페이지

내일 할 일 (회고)

  • AskDjango 오프라인 강의 참여
  • 텀블벅 연습 페이지 개선

5월 12일 (금)

오늘 한 일 (회고)

  • 패스트캠퍼스 웹 프로그래밍 스쿨 수업 참여
  • scss를 활용하여 텀블벅 페이지를 마크업했다. 연습 페이지

내일 할 일

  • bootstrap을 활용하여 게시판 메인화면 만들기
  • 텀블벅 연습 페이지 개선하기
  • linked list 복습하기

5월 11일 (목)

오늘 한 일 (회고)

  • hash 관련 강의를 들었다.
    • 다른사람의 알고리즘 풀이 내용을 보면 hash를 활용해서 O(1), O(N) 으로 해결하는 경우가 있어서, hash 라는게 뭔지 궁금했다.
    • 파이썬의 딕셔너리는 해시 테이블(hashtable) 알고리즘을 활용하기 때문에, 검색시 O(1)의 성능을 가진다고 한다.

      해시 함수(hash function)는 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하는 함수이다. 해시 함수에 의해 얻어지는 값은 해시 값, 해시 코드, 해시 체크섬 또는 간단하게 해시라고 한다. 그 용도 중 하나는 해시 테이블이라는 자료구조에 사용되며, 매우 빠른 데이터 검색을 위한 컴퓨터 소프트웨어에 널리 사용된다. 해시 함수는 큰 파일에서 중복되는 레코드를 찾을 수 있기 때문에 데이터베이스 검색이나 테이블 검색의 속도를 가속할 수 있다 위키백과

  • 코딩 인터뷰 완전 분석 풀이 강의를 듣고 실습했다.
    • 문자열 뒤집기 알고리즘
    • anagram, 문자열 2개 입력 받아 순열인지 판별하는 메서드
    • 공백을 %20으로 바꿔주는 알고리즘
    • 같은 문자 반복 횟수를 이용한 문자열 압축
  • 알고리즘 문제를 풀었다. 괄호 확인하기 문제는 2달 전에 못 풀어서 넘어갔던 문제인데, 컴공입문 수업에서 배웠던 stack을 활용해서 풀 수 있었다.
  • AskDjango 장고 기본강의를 들었다.
    • 이미지 처리 라이브러리 pilkit, 이미지 썸네일 helper앱 django-imagekit을 활용하여 썸네일 이미지를 생성하는 방법에 대해서 배웠다. 블로그 정리내용
  • 패스트캠퍼스 웹 프로그래밍 스쿨 수업 참여
    • scss를 활용한 마크업 실습

5월 10일 (수)

오늘 한 일 (회고)

내일 할 일


5월 9일 (화)

오늘 한 일 (회고)

  • 패스트캠퍼스 웹 프로그래밍 스쿨 수업 참여
  • 컴퓨터공학 입문 수업 복습
    • 바이너리 서치 (이진탐색)에 대해서 복습하고, 이진탐색을 제귀적 방법으로 구현하는 부분을 연습했다.
  • AskDjango 장고 기본강의를 들었다.
    • Message Framework 를 활용하여 새글 추가, 수정, 삭제시에 활용 가능한 기본 메시지를 view에서 작성하고, template에서 표시하는 방법
    • 장고에서 static files (HTML, CSS, image) 을 찾는 방법 (static files finders)
    • 개발환경에서 static 파일 서빙, 실배포를 위한 collectstatic (외부 웹서버에서 finder의 도움 없이도 static 파일을 서빙하기 위해 static_root 경로에 파일들을 복사)
  • 파이썬 웹프로그래밍 2장을 읽었다.
    • 파이썬의 웹 라이브러리 (웹 서버용 / 웹클라이언트용 http패키지 (저수준 API제공), urllib패키지 (고수준 API제공))
    • 프레임워크는 개발자가 웹 서버 프로그램을 개발하기 쉽도록, 저수준의 기능을 이미 만들어 놓은 프로그램
    • 중급 이상의 개발자가 되려면, 프레임워크가 어떻게 동작하는지, 파이썬의 웹 서버 라이브러리가 웹 프레임 워크에서 어떻게 사용되는지 등에 대한 기술을 파악할 필요가 있다.

내일 할 일


5월 8일 (월)

오늘 한 일 (회고)

  • 패스트캠퍼스 웹 프로그래밍 스쿨 첫수업에 참여했다. (오리엔테이션, HTML 기초)
  • REST API 대한 글을 읽었다.
    • REST API 설계시 가장 중요한 항목 2가지, 다른건 다 잊어도 아래 내용은 꼭 기억하자.
    • 1) URI는 정보의 자원을 표현해야 한다.
    • 2) 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.
  • 파이썬 웹프로그래밍 1장 웹프로그래밍의 이해 부분을 읽었다.
    • URL 설계는 웹 서버 로직 설계의 첫걸음이고, 사용자 또는 웹 클라이언트에게 웹 서버가 가지고 있는 기능을 명시에 주는 중요한 단계이다.
    • URL은 웹 클라이언트에서 호출한다는 시점에서 보면, URL은 웹 서버에 존재하는 애플리케이션에 대한 API이라고 할 수 있다.
    • REST (Representational State Transfer)는 API(URL)의 명명 규칙을 정하는 방법 중 하나이다.
    • REST방식은 웹 서버에 존재하는 요소들을 모두 리소스라 정의하고 URL을 통해 웹 서버의 특정 리소스를 표현한다는 개념을 갖는다. 리소스는 상태가 변할 수 있고, 리소스에 대한 조작을 HTTP 메소드로 (GET, POST, PUT, DELETE) 매핑한다.
    • 웹서버 : 웹 클라이언트의 요청을 받아 처리하고 결과를 웹 클라이언트에게 응답한다. 정적인 페이지를 제공할 때 사용한다.
    • 웹 어플리케이션 서버 : 웹 서버로 부터 동적 페이지 요청을 받아서 요청을 처리하고, 결과를 웹 서버로 반환한다. 주로 동적 페이지 생성과 데이터 베이스 연동 기능을 처리한다. (프로그램과 웹서버 사이에 정보를 주고받는 규칙인 CGI 방식의 대안 기술로서 발전)
  • 파이썬 웹 프로그래밍 실전편 실습 - 첫페이지 template, static 작성

내일 할 일