2016년 10월 5일 수요일

Fast screen capture in python.

I need to screen capture to make simple macro program.

First, I use ImageGrab in pillow or pyscreenshot.
But, These are too slow for my program.

Then, I found good library-wx.
wx is GUI development library based on C++.
Capture method in wx is more faster than ImageGrab.

But, on pixel processing using pillow methods, PNG is on error.
I don't know why it is, BMP is ok.

Sample code in python.

import time
import pyscreenshot as ImageGrab
import wx
from PIL import Image


def main():
    count = 10
 
    start = time.time()
    for i in xrange(count):
        im = ImageGrab.grab(bbox=(0, 0, 100, 100))
        im.save('ImageGrab.png')
     
    print time.time() - start

    start = time.time()
    app = wx.App()
    screen = wx.ScreenDC()
    for i in xrange(count):
        bmp = wx.EmptyBitmap(100, 100)
        mem = wx.MemoryDC(bmp)
        mem.Blit(0, 0, 100, 100, screen, 0, 0)
        del mem
        bmp.SaveFile('wx.bmp', wx.BITMAP_TYPE_BMP)
     
    print time.time() - start


if __name__ == '__main__':
    main()


Get 0,0 to 100,100 screen image and save it 10 times.

Execute results.

17.631000042
0.203000068665

In my computer, wx is faster than pyscreenshot about 80 times.
If you need to fast screen capture, use wx.

wx install url:
https://wxpython.org/download.php

파이썬으로 바탕화면 빠르게 캡처 하기.

간단한 매크로 프로그램을 만드는 중,
바탕화면을 캡처해서 처리해야 하는 일이 필요했다.

 맨 처음에는 pillow 라이브러리에 있는 ImageGrab이나 pyscreenshot을 사용했다.
하지만, 내가 하고 싶은 일을 처리하는 시간보다, 바탕화면을 가져오는 데
더 많은 시간이 들어서 프로그램이 비효율적이였다.

 더 좋은 방법이 없나 찾아 보다가, wx를 알게 되었다.
원래 wx는 C++에서 시작된 GUI 프로그램 개발 라이브러리이다.
기능중에 바탕화면 정보를 가져오는 함수가 있어서 써 보니,
월등히 빠른 속도로 캡처를 해서 프로그램이 훨씬 빨라졌다.

 단, pillow 함수를 이용해서 wx가 캡처한 이미지를 픽셀 단위로 처리하려 할 때,
이미지 확장자명이 png면 오류가 발생했다. 이 문제의 원인은 잘 모르겠지만,
wx에서 이미지를 저장할 때 bmp으로 저장하면 에러가 발생하지 않는다.

아래는 참고 코드이다.

import time
import pyscreenshot as ImageGrab
import wx
from PIL import Image


def main():
    count = 10
 
    start = time.time()
    for i in xrange(count):
        im = ImageGrab.grab(bbox=(0, 0, 100, 100))
        im.save('ImageGrab.png')
     
    print time.time() - start

    start = time.time()
    app = wx.App()
    screen = wx.ScreenDC()
    for i in xrange(count):
        bmp = wx.EmptyBitmap(100, 100)
        mem = wx.MemoryDC(bmp)
        mem.Blit(0, 0, 100, 100, screen, 0, 0)
        del mem
        bmp.SaveFile('wx.bmp', wx.BITMAP_TYPE_BMP)
     
    print time.time() - start


if __name__ == '__main__':
    main()


각각 모니터에서 0, 0에서 100, 100 부분을 캡처한 뒤 파일로 저장하는 과정을
10번 반복한다.

아래는 실행 결과이다.

17.631000042
0.203000068665

내 컴퓨터 환경에서 wx 는 pyscreenshot 보다 대략 80배 정도 빠르다.
빠른 캡처가 필요하다면, wx를 사용하는게 좋을 것이다.

wx 설지 url:

https://wxpython.org/download.php

2016년 9월 21일 수요일

Use of vim

I think good programmer is learning various knowledge and
having various programming skills.

But, I think used to programming toos is important recently.

Vim is good editor for programmer.




Simple use of vim


vim filename : open filename
view filename : open filename read only (I think it is useless)

:q! : quit no save
:wq : save and quit

i : insert character before cursor
I : insert character before line
o : insert character under line
O : insert character upper line
a : insert character after cursor
A : insert character after line

w : right direction next word last character
e : right direction next word first character
b : previous word last character

dd : line delete
1,10d : 1 ~ 10 lines delete
yy : paste

h : left
j : down
k : up
l : right

^ : first of line
$ : last of line


For beginner, this is sufficient

vim 사용 후기 및 사용법

나는 좋은 프로그래머가 되기 위해서는 이론적인 지식이나
프로그래밍 기술이 중요하다고 생각했다.

하지만 요즘들어 생각해보니, 툴의 사용을 익히는 것도
좋은 프로그래머가 되기 위한 중요한 요소 같다.

툴의 사용은 금방 익힐수 있다고 생각해서
툴 사용법이나 단축키 같은 건 전혀 외우지 않았다.

하지만 툴을 잘 선택해서 능숙히 사용할 수 있게 된다면,
프로그래머로서의 생산성이 올라가서
더 프로그래밍 자체에 집중할수 있을 것이다.

따라서 나는 편집기 중 vim과 emacs를 고려하다가,
일단 쉬워 보이는 vim을 사용중이다.

확실히 마우스를 사용하지 않고 키보드로만 프로그래밍을 진행하니,
더 집중이 잘 되고, 생각의 흐름이 끊기지 않는 것 같다.

아직 사용하기 시작한지는 얼마 안되었지만,
능숙하게 다룰 때 까진 vim 중심으로 코드를 작성하려고 한다.




아래는 간단한 사용법이다.


vim filename : filename 파일 열기
view filename : 읽기 모드로 filename 열기(별로 쓸일 없을 것 같다.)

:q! : 저장하지 않고 종료
:wq : 저장 후 종료

i : 커서 앞쪽에 문자 삽입
I : 행 앞쪽에 문자 삽입
o : 행 아래쪽에 문자 삽입
O : 행 위쪽에 문자 삽입
a : 커서 뒤쪽에 문자 삽입
A : 행 뒤쪽에 문자 삽입

w : 오른쪽 방향의 다음 단어 끝 문자
e : 오른쪽 방향의 다음 단어 처음 문자
b : 이전 단어 끝 문자

dd : 현재 행 삭제
1,10d : 1 ~ 10 행 삭제
yy : 붙여 넣기

h : 좌
j : 하
k : 상
l : 우

^ : 행의 처음
$ : 행의 끝


일단 이 정도만 알고 시작하면, 어느정도 쓸만 할 것이다.

Using GPIO in Raspberry pi

GPIO(General Purpose Input Output)



Some sensor is necessary a breadboard

The basic use of sensor is connecting 5V and GND to a sensor(or a breadboard),
then select data line for data sending.
(#4, #17, #18... etc)


You can use GPIO in raspberry using RPi.GPIO Module in python.

python code


# -*- coding: utf8 -*-

from RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUB_UP)

print GPIO.input(4)


The example displays data reading from #4.
You can process various data from sensor.
(Fire sensor, Temperature sensor...)

라즈베리 파이 GPIO 사용하기

GPIO(General Purpose Input Output - 범용입출력)


센서에 따라서 브레드 보드(일명 빵판)이 필요할 수도 있다.




가장 기본적인 센서 사용법은 센서에 5V 전압과 GND를 연결한 뒤,
데이터를 전송하기 위해 적당한 번호에 선을 연결하면 된다.
(위에서는 #4, #17, #18... 등)

라즈베리파이에서 python의 RPi.GPIO 모듈을 이용하여 GPIO를 사용할 수 있다.

python 코드


# -*- coding: utf8 -*-

from RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(4, GPIO.IN, pull_up_down=GPIO.PUB_UP)

print GPIO.input(4)


위의 예제는 #4로 부터 정보를 읽어들여서 출력하는 예제이다.
어떤 센서를 연결했느냐에 따라 온도 값이나 화재 상황등
다양한 정보를 입력 받아서 처리할 수 있다.