note

재미로 하는 프로그래밍?

아이폰, 파나소닉 GX1, 소니 RX100 M2 이렇게 세 가지 카메라를 사용하는데 고정 초점거리인 아이폰은 두고라도, 다른 카메라의 줌은 어떻게 사용하는 지 궁금.

그래서 간단하게 exiftool을 이용해서 사진의 초점거리 정보를 정리하는 스크립트를 작성했다. exiftool이 없었으면 PIL같은 모듈을 사용해서 일일이 exif 파일에서 정보를 추출했어야 할텐데 exiftool를 이용하면 간단하게 사진 이름, 카메라 명, 초점 거리 정보만 얻어낼 수가 있다. 이걸 이용해서 카메라 명 + 초점 거리를 key로 하는 dictionary를 구성해서 사진 개수만큼 수를 세면 간단하게 필요한 데이터가 나온다.

그 다음이 문제인데 숫자로만 나오면 분포를 보기가 어려우니 초점 거리를 기준으로 분포도를 볼 수 있도록 그래프를 그리려고 하는데 python에서 그래프를 그리는 방법이 다양한데 뭐가 꼬인건지 집 맥에서 잘 안된다. 하도 피곤해서 어제는 그냥 잠들었는데 오늘이나 내일까지는 한번 끝내봐야지.

note

Why Are There So Many Pythons? From Bytecode to JIT | Toptal

Python이 language라기 보다는 interface라고. 그래서 그 interface를 구현한 게 CPython, Jython, IronPython, PyPy등이 있는 거라고.

잘 이해는 안되지만 JIT때문에 PyPy를 쓰는게 좋다고 하네.

Why Are There So Many Pythons? From Bytecode to JIT | Toptal

note

C __LINE__ equivalent in Python by Elf Sternberg

python, tip

Move Jpg, mov, mp4 to somewhere based on the date info

#!/usr/bin/env python
"""
    Move JPG file to dest. directory based on the exif capture date
    and move MOV, mp4 based on the file (modification) date
"""

import os
import sys
import time
import datetime
import shutil
from PIL import Image
from PIL.ExifTags import TAGS

base_dir="."
targetDir = "/Volumes/shared/Photo/2012/"

def getExifInfo(filename, field=""):
    """ Get value for a given tag """
    im = Image.open(filename)
    try:
        info = im._getexif()
    except:
        print "Fail to analyze %s" %filename
        return ""

#   if info == None:
#       print "No EXIF information"
#       return ""

    for key, value in info.items() :
        if field:
            if field == TAGS.get(key, key):
                break;
        else:
            print "  * %-30s %s" %(TAGS.get(key, key) , repr(value))

    try:
        tmp = value.split()[0].split(':')
        return "%s-%s-%s" %(tmp[0], tmp[1], tmp[2])
    except:
        return ""

def main(from_here):
    """ """
    for t in os.walk(from_here):
        for f in t[2]:
            filename = "/".join((t[0], f))

            if filename.endswith("JPG") or filename.endswith("jpg"):
                dateDir = getExifInfo(filename, "DateTimeOriginal")
                if dateDir != "":
                    if not os.path.exists(targetDir+dateDir):
                        os.mkdir(targetDir+dateDir)

                    print "Copy %s => %s" %(filename, targetDir+dateDir)
                    shutil.copy(filename, targetDir+dateDir)

            elif filename.endswith("MOV") or filename.endswith("mp4") or filename.endswith("m4v"):
                tmp = datetime.datetime.fromtimestamp(os.path.getmtime(filename))
                dateDir = str(tmp)[0:10]

                if not os.path.exists(targetDir+dateDir):
                    os.mkdir(targetDir+dateDir)

                print "Copy %s => %s" %(filename, targetDir+dateDir)
                shutil.copy(filename, targetDir+dateDir)

#           elif filename.endswith("PNG") or filename.endswith("png"):
#               print "png", filename
#               print getExifInfo(filename, "DateTimeOriginal")


if __name__ == '__main__':
    if len(sys.argv) > 1:
        if os.path.exists(sys.argv[1]):
            base_dir = sys.argv[1]

    main(base_dir)

python

GAE – html 파일에서 python의 변수 직접 사용하기

1. template.render를 사용하는 경우 1:1로 치환할 정보를 정의한다.

HTML 코드

    The first album of user {{ username }} is "{{ album_name }}" ({{ num_photos }}) 
    <img src="{{ url }}" />

Python 코드

        template_values = { 
            #'url': photos[0], #url,
            'albums'    : albums,
            'album_name': album_title,
            'username': username,
            'num_photos': len(albums), #num_photos,
            #'photo_name': photo_name,
        }   

        path = os.path.join(os.path.dirname(__file__), 'output.html')
        self.response.out.write(template.render(path, template_values))

2. html 파일에 python code를 embed할 수 있다.

HTML 코드

    <ul>
    {% for album in albums %}
       <li> {{ album }}</li>
    {% endfor %}
    </ul>

위에서 albums는 1번에서 render() 함수에서와 같이 치환시켜 사용한다.(albums -> ‘albums’)

아래는 위 2가지를 모두 가지고 있는 HTML 파일(output.html)

<head>
    <link type="text/css" rel="stylesheet" href="/stylesheets/main.css" />
</head>

<html>
  <body>

    Public Album List
    <ul>
    {% for album in albums %}
       <li> {{ album }}</li>
    {% endfor %}
    </ul>

    The first album of user {{ username }} is "{{ album_name }}" ({{ num_photos }}) 
    <img src="{{ url }}" />

  </body>
</html>
note

Picasa client in Google App Engine

기존에 CLI로 만들었던 Picasa 사진 원본 다운받기 프로그램을 Google App Engine용으로 변환해보자.

제일 먼저 해야 할 건 이 페이지에 있는 것과 처럼

  • 계정 가입
  • SDK 다운로드
  • 그리고 Tutorial 둘러보기

Tutorial은 이 페이지에 있음. HTML이나 웹 응용 프로그램을 전혀 모르는 터라 잘 이해는 안되지만 대충 html페이지에 대한 request를 처리하고, 필요하면 request 처리 페이지에서 사용자 입력을 받아 response html를 만들어 보여주는 듯

TBD.

데모 페이지
Picasa ID를 입력하면 첫 번째 앨범의 이름, 사진 수, 첫 번째 사진의 URL 및 사진을 보여준다.