2012-11-28

Python : 이미지 파일 일괄 자르기



ImageMagick 을 이용하여 이미지 파일들을 일괄로 Crop 하는 스크립트이다. ImageMagick 모듈을 이용하지 않고, convert 툴을 이용하여 구현하였다. 이번엔 급한대로 써야 해서 대충했지만, 다음에는 관련 모듈을 이용해서 제대로 해봐야겠다.
  • 관련 모듈
    • Wand is a ctypes-based ImagedMagick binding library for Python.
    • PythonMagickWand is an object-oriented Python interface to MagickWand based on ctypes.
    • PythonMagick is an object-oriented Python interface to ImageMagick.
import os, glob, shutil
 
# 원하는 사이즈와 출력 디렉토리를 정한다.
CROP_SIZE = '1739x2617+364+0'
OUT_DIR   = 'output'
 
if os.access(OUT_DIR, os.F_OK) :
    shutil.rmtree(OUT_DIR)
os.mkdir(OUT_DIR)
file_list = glob.glob('*.tif') # 이미지 확장명을 정한다.
 
cnt = 1
for filename in file_list :
    print('%s/%s : convert %s -crop "%s" %s\\new_%s' % (cnt, len(file_list), filename, CROP_SIZE, OUT_DIR, filename))
    os.system('convert '+filename+' -crop "'+CROP_SIZE+'" '+OUT_DIR+'\\new_'+filename)
    cnt = cnt + 1



2012-11-21

Ramaze 에서 JSON 으로 응답하기



AJAX 로 동작하는 웹프로그램을 개발하려면, JSON 으로 응답하는 컨트롤러를 작성할 필요가 있다. Ramaze 기본 문서에는 대략만 나와 있어서, 써먹기 어려워서 테스트해보고 다시 정리해본다.

  • Controller 의 init.rb 에 다음 내용을 추가해준다.
    require 'json' # --> 추가된 부분
    
    class Controller < Ramaze::Controller
      layout :base
      helper :xhtml
      engine :etanni
      provide( :json, :type => "application/json") { |action, val| val.to_json } # --> 추가된 부분
    end
    
  • Controller 작성 예제
    class TestController < Controller
      map '/test'
      
      def action
        json = {}
        json['a'] = '1234'
        json['b'] = '5678'
        json
      end
    end
    
  • 해당 액션을 호출할 때에는 http://test.com/test/action.json 처럼 끝에 .json 을 붙여준다.

2012-11-19

Ramaze Simple Tutorial (with Sequel)



흔히들 많이 이용되는 Rails 를 안쓰고 Ramaze + Sequel 조합을 시도해 본 이유는 설치되는 모듈이 정말 적기 때문이다. 너무 많은 의존성을 가지게 되면, 시간이 지날 수록 관리하는데 많은 문제를 읽으킨다. 이 때문에, 원래는 python/Django 를 사용했었는데, python 대신 ruby 를 사용하고 싶어서 대체할만한 웹프레임워크를 찾고 있었다. 그러다가, Ramaze + Sequal 이 초간단으로 설치되는 것을 확인하고, 관련 문서를 찾아보고 테스트했지만 Rails 나 Django 처럼 충분한 문서를 제공하지 않더라. 쓸만한 Tutorial 도 없고 해서, 초간단으로 Tutorial 을 만들어보았다.

  • 관련 모듈 설치
    $ apt-get install libsqlite3-dev sqlite3
    $ gem install ramaze sequel thin sqlite3
    
  • 프로젝트 생성
    $ mkdir -p /opt/project/ramaze
    $ cd /opt/project/ramaze
    $ ramaze create web
    
  • 기본 웹서버 변경 -> start.rb 에서 :webrick 을 :thin 으로 수정
  • 웹서버 시작 테스트
    $ ramaze start -s thin
    or 
    $ ruby start.rb
    
  • db 생성
    $ cd /opt/project/ramaze/web
    $ mkdir -p db/migration
    $ vi db/migration/001_AdminMigration.rb
    
    # db/gigration/001_AdminMigration.rb
    # Run:
    # sequel -m db/migration -M 1 sqlite://db/web.db
    
    class CreateAdminsTable < Sequel::Migration
      def up
        create_table(:admins) do
          primary_key :id
          String :login, :unique => true
          String :password
          String :name
          String :email
          String :mobile_phone
          String :level
        end
      end
    
      def down
        drop_table(:admins)
      end
    end
    
    DB Migration
    $ sequel -m db/migration -M 1 sqlite://db/web.db
    
  • app.rb 에 다음 추가
    # coding : utf-8
    require 'sequel'
    
    # Open the accounts database
    DB = Sequel.connect('sqlite://db/web.db')
    
    # Initialize controllers and models
    require __DIR__('model/init')
    require __DIR__('controller/init')
    
    # 아래는 처음 실행할 때 한번만 적용하고 주석으로 막아준다.
    # Admin.create(:login => 'hong', :password => 'hong1234', :name => '홍길동', :email => 'hong@test.com', :mobile_phone => '010-5555-5555', :level => '00')
    # Admin.create(:login => 'jang', :password => 'jang1234', :name => '장영실', :email => 'jang@test.com', :mobile_phone => '010-6666-6666', :level => '01')
    
  • model/init.rb 에 다음 추가
    require __DIR__('admin')
    
  • model/admin.rb 생성
    require 'sequel'
    
    class Admin < Sequel::Model
    
    end
    
  • controller/init.rb 에 다음을 추가
    require __DIR__('admin')
    
  • controller/admin.rb 생성
    class AdminController < Controller
      map '/admin'
      def index
        'Admin Test'
      end
    end
    
  • 프로젝트를 실행하고 브라우저에서 http://localhost:7000/admin 을 접근해본다.
  • 이제, controller/admin.rb 의 index 를 다음과 같이 변경한다.
      def index
        @admins = Admin.all
      end
    
  • view 디렉토리 생성
    $ cd /opt/project/itsm_ramaze/web/view
    $ mkdir admin
    
  • view/admin/index.xhtml 생성
    <h1> Admin Test Page </h1>
    <?r @admins.each do |admin| ?>
      #{admin.login}
      #{admin.name}
      #{admin.email}
      #{admin.mobile_phone}
      #{admin.level}
      <br/>
    <?r end ?>
    
  • 프로젝트를 실행하고 브라우저에서 http://localhost:7000/admin 을 접근해서 데이터 목록이 뜨면 정상이다.

2012-11-05

(Perl) 모듈 관리



Perl 의 모듈관리 기능을 정리해보았다. Ruby 의 gem 처럼 하나의 툴로 이쁘게 관리되면 좋겠는데, 아직까지는 번거롭게 몇가지 툴을 설치해서 따로 따로 사용해야 된다는 것이 아쉽다. Windows 용 Perl 인 ActivePerl 에서는 ppm 이라는 툴을 제공하긴 하지만, cpan 을 이용할수 없다는 것이 흠이다.

  • 설치할 모듈 검색
    https://metacpan.org/
    http://www.cpan.org/
  • 모듈관리도구 설치
    $ cpan App::cpanminus App::cpanoutdated Devel::Loaded App::pmuninstall
    
  • 모듈 설치
    $ cpanm [모듈이름]
    or
    $ cpan [모듈이름]
    
  • 모든 모듈 업데이트
    $ cpan-outdated | cpanm
    
  • 설치된 모듈 검색
    $ pminst [모듈이름]
    or 
    $ pmall | grep [모듈이름] --> 시간 오래 걸림
    
  • 모듈 설명 보기
    $ pmdesc [모듈이름]
    
  • 모듈 삭제
    $ pm-uninstall [모듈이름]