이 블로그 검색

2012년 9월 28일 금요일

forever loop 를 활용한 error handling


함수내 에러처리에 대한 방법은 여러가지가 있겠으나, 최근 흥미로운 글 하나를 읽었다.
http://www.codeofhonor.com/blog/error-handling-using-forever-loop
for loop 를 활용한 기법인데 정리해보면 다음과 같다.

먼저 일반적인 함수내 에러처리 방식을 보면, 아마 다음과 같을것이다.

bool someFuncPlain () 
{         
    if (작업1 수행이 실패한경우)
    {
        에러 발생시의 추가 작업수행...;
        return false;
    }

    if (작업2 수행이 실패한경우)
    {
        return false;
    }
    ....
 
    // 함수내 모든 처리 완료      
    return true;
}


2012년 9월 20일 목요일

regex basic

[] => [] 안에 존재하는 문자들중 한 문자만을 나타낸다.
    예) [abc] 는 a , b, c 중에 한문자. '-' 는 범위. 즉 [a-f] 는 [abcdf]

 \w => [a-zA-Z0-9_]
 \d => [0-9]
 .  => 모든 문자에 대응되는 한 문자
 +  => 한 문자 이상(하나는 반드시 존재, repeats the preceding regular expression at least once)
 *  => 문자나 집합이 없는 경우 또는 하나 이상 연속하는 경우에 일치한다. 없어도 ok
 ?  => 문자가 없거나 하나와 대응하는 문자   예) https?// - s가 없거나 한번 있는 경우와 대응
    ca?r matches both `car' and `cr', but nothing else.
 \ => 문자그대로 . 를 나타냄 (이스케이프)

 ab{3}" => b가 3개까지 (abbb)
 ab{3,5}" =>  b가 3개에서 5개 까지 (abbb, abbbb, abbbbb )
 ab{2,}" => b의 개수가 2개 이상 (abb, abbbbb ...)
 {3,} => 최소 3번 일치함을 의미한다.

 () => ()안에 있는 글자들을 그룹화, 하위 표현식.
    a(bc)* : a라는 문자를 포함하고 bc라는 문자열이 없거나 계속반복( a, abc abcbc 등)
    a(bc)  : a라는 문자를 포함하고 bc라는 문자열이 있거나 없거나. (a,abc)

    (\d{1,3}\.){3}\d{1,3} => ip addr

 공백 문자 => \n, \r, \t, \f-form feed, \v-vertical tab
 \s => 공백 ,[\f\n\r\t\v],
 \S => 공백아님 , [^\f\n\r\t\v]

 |  => or 연산자, 묶음 안에서 하나를 일치시키고자 할 때
    IP주소를 구성하는 각 숫자 묶음을 유효한 조합으로 정의하는 규칙
    - 모든 한 자리 혹은 두 자리 숫자
    - 1로 시작하는 모든 세자리 숫자
    - 2로 시작하면서 두 번째 자리 숫자가 0부터 4사이의 모든 세 자리 숫자
    - 25로 시작하면서 세 번째 자리 숫자가 0부터 5사이의 모든 세 자리 숫자

    (((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))

    주민번호 : \d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])-[1-4]\d{6}


탐욕적 수량자,  게으른 수량자
    *                            *?
    +                            +?
    {n,}                       {n,}?

    예) "<B>111</B> and <B>222</B>" 에서

    <[Bb]>.*</[Bb]>  => 111 and 222
    <[Bb]>.*?</[Bb]> => 111, 222

egrep 에서 111이후 대문자3자리로 끝나는  프로세스 검색
==> -w 옵션 사용

> ps -ef | egrep -w  '111[A-Z]{3}'


2012년 9월 10일 월요일

python decorator


#!/usr/bin/env python
# -*- encoding:utf-8-*-
import time

def elapsed_time(functor):
    def decorated(*args, **kwargs):
        start = time.time()
        functor()
        end = time.time()
        print "Elapsed time: %f" % (end-start)
    return decorated
    
@elapsed_time
def hello():
    print 'hello'

# 위의 코드는 다음과 동일.
# def hello(*args, **kwargs):
#     print 'hello'
# 를 정의후 다음을 호출하는것과 같음,
# hello = elapsed_time(hello)
# hello()

if __name__ == "__main__":
    hello()
    # hello = elapsed_time(hello)
    # hello()

Python Flask 설치 (windows)


0. 당연히 python은 먼저 설치되어 있어야 함.

1. easy_install, pip 설치 : 이것들은 Python 패키지들을 설치하고 관리하기 위한 도구이다. 다음 순서대로 수행.

  - easy_install 설치
  http://python-distribute.org/distribute_setup.py 을 다운받아서 실행.

  - PC path에 C:\Python27\Scripts 를 추가.  

  - pip 설치 : easy_install pip

2. 이제 Flask를 설치 할수 있다. 다음을 실행. 
  
  pip install Flask


* 여기서 부터는 옵션.

  virtualenv : 서로 다른 버전의 파이선, 라이브러리들과 작업해야 하는 경우에 자신의 프로젝트만을 위한 파이선 개발 환경을 만들수 있다. 사용하고 싶다면 다음을 실행.
  
  pip install virtualenv
  (혹은 easy_install virtualenv 으로도 가능)

  그리고 프로젝트 폴더상에서 다음을 실행
  virtualenv venv

  이제 관련 폴더들이 생성되고, 해당 프로젝트를 위한 환경이 구성되었다.
  해당 환경을 활성화 시키기 위해 다음을 실행한다.

  venv\scripts\activate

  프롬프트가 (venv) 로 변경됨을 알아두자. 이상태에서, pip install Flask 을 수행해서 개발환경을 만들수 있다. 이경우,
  \venv\Lib\site-packages 에 관련 패키지가 설치된다(즉, 프로젝트별 환경이 구성됨).

2012년 9월 3일 월요일

Ruby on Rails 간단 게시판 다시 만들어보기


예제 소스: https://github.com/jeremyko/RailsBoardSample/tree/moreRailsWay
참고한 문서 : http://ruby.railstutorial.org/ruby-on-rails-tutorial-book

앞서 예제를 좀더 수정해서 약간 더 개선시킨 소스이다. 추가된 부분은 다음과 같다.

1. RESTful routing
2. form_for , 모델을 폼과 연결
3. Partial 사용, 중복 제거
4. Validation check
5. bootstrap-sass

1. RESTful 제공

rails가 제공하는 resources 메서드 를 호출해서 RESTful한 route를 사용할수 있다.
route.rb 파일을 다음처럼 변경한다.

* route.rb
RailsBoard::Application.routes.draw do       
    root :to => 'my_rails_board_rows#index'
   
    #REST-style URI    
    resources :my_rails_board_rows
    
    #matchs...
    match '/listSpecificPageWork',  to: 'my_rails_board_rows#listSpecificPageWork'    
    match '/searchWithSubject',  to: 'my_rails_board_rows#searchWithSubject'    
    match '/EditViaPostReq',  to: 'my_rails_board_rows#EditViaPostReq'   
end

이렇게 한줄 추가함으로서 rails에서 처리가능한 route는 다음처럼 구성되게 된다.

< Table 1 RESTful URI >
# ------------------------------------------------------------------------------------
# request     URI                                       Action      Purpose
# ------------------------------------------------------------------------------------
# GET          /my_rails_board_rows             index    모든 게시물들 조회
# GET          /my_rails_board_rows/1          show     id 1의 게시물 조회
# GET          /my_rails_board_rows/new      new       새로운 게시물 작성을 위한 화면 보임
# POST        /my_rails_board_rows            create    새로운 게시물을 생성 처리
# GET          /my_rails_board_rows/1/edit   edit        id 1 게시물 수정을 위한 화면 보임
# PUT          /my_rails_board_rows/1          update   id 1 게시물 수정 작업 처리
# DELETE    /my_rails_board_rows/1          destroy  id 1 게시물 삭제 처리

게시물 CRUD 처리를 RESTful하게 처리하기 때문에, 이전 예제와 비교시 action이 간단해졌다. 또한 Rails는 url을 간단하게 표시할수 있게끔 helper를 같이 생성해주는데, resources :my_rails_board_rows 의 경우 다음과 같은 helper들이 생성된다.

    ------------------------------------------------------------------------------------
    helper                                            호출시 return 되는 값
    ------------------------------------------------------------------------------------
    my_rails_board_rows_path               /my_rails_board_rows
    new_my_rails_board_row_path          /my_rails_board_rows/new
    edit_my_rails_board_row_path(:id)    /my_rails_board_rows/:id/edit
    my_rails_board_row_path(:id)           /my_rails_board_rows/:id

RESTful 구현을 위해 컨트롤러를 작성해보자
resources 호출로  RSESTful한 접근을 설정한 경우, Rails 는 위에서 표시된 것처럼(예를 들어, my_rails_board_rows/new), 모델명을 기준으로 컨트롤러를 찾게 된다. 즉, my_rails_board_rows_controller.rb를 찾는데, 현재 이 파일이 없으므로 생성해줘야 한다.