Recent Posts
Recent Comments
03-19 12:42
관리 메뉴

동글동글 라이프

[KPW2012] Notepad Letter 본문

개발자 이야기/Perl

[KPW2012] Notepad Letter

동글동글라이프 2012. 10. 24. 03:37

2008년말 쯤에 한글 문자열을 자판에 입력되는 영문으로 바꾸는 방법  이라는 글을 쓴적이 있습니다.

당시에는 별 생각없이 기술연구 목적으로 테스트 용으로 만들었는데...

가끔 이 모듈을 이용해서 응용작품을 만들어 봐야 겠다는 생각을 하곤 했었죠.


최근에는 인문학이나, 감성, Design for humans 등등 

사람 중심의 문화가 많이 생기고 정착되고 있는 시기입니다.


이렇듯 소프트웨어를 통해 사람의 마음을 움직이는 프로그램이 필요하다고 느꼈고, 

향후에는 사람에게 메세지를 전달하는 정성을 넣어 감동으로 연결시키는

인간적인 프로그램이 앞으로는 크게 이슈가 될 것 같더라구요 ㅋㅋ


그런면에서 Notepad Letter은 그런 부분을 충족시켜주는 부분이 많았습니다.


4년만에 다시 열린 Korean Perl Workshop 2012 에서 발표할 기회가 생겨,

이 모듈을 다시 한번 연구해서 살을 붙여보자 하고 결심했습니다.


아래는 KPW2012 발표 자료입니다.

https://docs.google.com/file/d/0B3NurlLan8deZUJ4Yk1jVy1aM3c/edit?pli=1


Hangle.pm

package Hangle; use strict; use warnings; use Lingua::KO::Hangul::Util qw(:all); use base qw/Exporter/; use Encode qw/decode encode/; our @EXPORT_OK = qw/transformation/; sub transformation{ my $arg = shift; my $str = decode('cp-949', $arg); binmode STDOUT, ':encoding(cp-949)'; my %hangle = ( #초성 "\x{1100}" => 'r', "\x{1102}" => 's', "\x{1103}" => 'e', "\x{1105}" => 'f', # ㄱㄴㄷㄹ "\x{1106}" => 'a', "\x{1107}" => 'q', "\x{1109}" => 't', "\x{110B}" => 'd', # ㅁㅂㅅㅇ "\x{110C}" => 'w', "\x{110E}" => 'c', "\x{110F}" => 'z', "\x{1110}" => 'x', # ㅈㅊㅋㅌ "\x{1111}" => 'v', "\x{1112}" => 'g', "\x{1101}" => 'R', "\x{1104}" => 'E', # ㅍㅎㄲ ㄸ "\x{1108}" => 'Q', "\x{110A}" => 'T', "\x{110D}" => 'W', # ㅃ ㅆ ㅉ #중성 "\x{1161}" => 'k', "\x{1163}" => 'i', "\x{1165}" => 'j', "\x{1167}" => 'u', # ㅏㅑㅓㅕ "\x{1169}" => 'h', "\x{116D}" => 'y', "\x{116E}" => 'n', "\x{1172}" => 'b', # ㅗㅛㅜㅠ "\x{1173}" => 'm', "\x{1175}" => 'l', # ㅡㅣ "\x{1162}" => 'o', "\x{1164}" => 'O', "\x{1166}" => 'p', "\x{1168}" => 'P', # ㅐㅒㅔㅖ #종성 "\x{11A8}" => 'r', "\x{11AB}" => 's', "\x{11AE}" => 'e', "\x{11AF}" => 'f', # ㄱㄴㄷㄹ "\x{11B7}" => 'a', "\x{11B8}" => 'q', "\x{11BA}" => 't', "\x{11BC}" => 'd', # ㅁㅂㅅㅇ "\x{11BD}" => 'w', "\x{11BE}" => 'c', "\x{11BF}" => 'z', "\x{11C0}" => 'x', # ㅈㅊㅋㅌ "\x{11C1}" => 'v', "\x{11C2}" => 'g', # ㅍㅎ "\x{11A9}" => 'R', "\x{11BB}" => 'T', # ㄲ ㅆ #특수문자 "\x{20}" => ' ' , "\x{A}" => "\n" , "\x{2E}" => '.' , "\x{2C}" => ',' , #Space Enter . , "\x{2D}" => '-' , #Number "\x{30}" => '0' , "\x{31}" => '1' , "\x{32}" => '2' , "\x{33}" => '3' , "\x{34}" => '4' , "\x{35}" => '5' , "\x{36}" => '6' , "\x{37}" => '7' , "\x{38}" => '8' , "\x{39}" => '9' , ); my @jamos = map { split //, decomposeJamo($_) }split //, decomposeSyllable($str); my $keys = '{HAN}'; foreach (@jamos) { $keys .= $hangle{$_} } # print "$strokes"; return $keys; }



- 아래는 스크립트 입니다. 공개하니 부끄럽네요 ㅡ_ㅠ

use strict;
use warnings;    
use Win32::GuiTest qw(:ALL);
use Win32::MediaPlayer;
use Hangle qw/transformation/;

my $file = 'background.mp3';
my $winmm = new Win32::MediaPlayer;  
$winmm->load($file);        
$winmm->play;                   
$winmm->volume(100);            

# notepad 시작
system("start notepad.exe");
sleep 3;

#전체 창 띄우기 
max_window();

#한글 키 입력
Win32::GuiTest::SendKeys("{HAN}");

#글씨체 및 폰트 바꾸기
font_change("휴먼편지체",36);
sleep 3;

writing("너를 만나기 전까진.");
waiting();
waiting();
newLine();

writing("내 마음은 차가운 겨울처럼 멈춰있는 신호등과 같았어.");
waiting();
waiting();
newLine();

writing("하지만 너를 만나면서 무뚝뚝하던 내가");
newLine(); # Enter 한줄 내리기 
writing("조금씩 웃고 있다는 걸 깨달았지.");
sleep 4;

# 전체 지우기
clear();

writing("때론 설레임으로 잠을 못 이루기도 하고,");
sleep 2;
newLine(); # Enter 한줄 내리기 

writing("너의 웃음소리가 귓가에 맴돌아 나도 모르게 미소 짓고,");
sleep 2;
newLine(); # Enter 한줄 내리기 

writing("데이트하는 날이면, 시계만 종일 쳐다보는 나를 발견했어.");
waiting();
waiting();
newLine(); # Enter 한줄 내리기
newLine(); # Enter 한줄 내리기

writing("그래.");
waiting();
waiting();
waiting();
writing(" 나 지금 설래이고 떨려.");
waiting();
waiting();
sleep 4;

# 전체 지우기
clear();

writing("지금 네 앞의 남자는");
sleep 3;
newLine();
writing("아직 부족하고 모자라지만,");
sleep 3;
newLine();
newLine();

writing("너만을 사랑하고");
sleep 1;
writing(" 너만을 아껴주는");
sleep 1;
writing(" 멋진 남자가 될께.");
sleep 3;

newLine();
newLine();

writing("우리 앞으로 ");
sleep 1;
writing("행복 하게 지내자 ");
Win32::GuiTest::SendKeys("+6+6");
sleep 3;
newLine();
newLine();

writing("그리고.");
waiting();
waiting();
waiting();

writing(" 사");
waiting();
waiting();
waiting();
writing("랑");
sleep 1;

# 빨리 지우기 
backspace(12);


#천천히 지우기 
backspace(1);
sleep 1;
backspace(1);
sleep 1;
backspace(1);
sleep 1;

writing(" 사랑한다");
writing(" 누구누구야");
Win32::GuiTest::SendKeys("!!");
sleep 5;

#notepad 종료하기
end();

#음악 종료
$winmm->pause;

# 동영상 FullScreen으로 재생
system('"C:\Program Files (x86)\Windows Media Player\wmplayer.exe" C:\동영상.wmv /fullscreen');

# 폰트 변경하기
sub font_change {
  my ( $font,$size ) = (@_);
  my $cmd = "%of".transformation($font)."{TAB}{TAB}".$size;
  Win32::GuiTest::SendKeys($cmd);
  sleep 2;
  Win32::GuiTest::SendKeys("~");
  sleep 3;
}

# 최대창으로 변경 
sub max_window{
   Win32::GuiTest::SendKeys("%{SPACE}x");
   sleep 3;
}

# 한글 변환해서 출력 
sub writing{
  my $text = shift;
  Win32::GuiTest::SendKeys(transformation($text));
}

# . 찍으며 1초씩 기다리기
sub waiting{
  Win32::GuiTest::SendKeys(".");
  sleep 1;	
}

# Enter 한줄 내리기
sub newLine{
  Win32::GuiTest::SendKeys("~");  
}

# Ctrl+A 후 Backspace 키로 전체 지우기
sub clear{
  Win32::GuiTest::SendKeys("^a{BACKSPACE}");
}

# Backspace 사용
sub backspace{
   my ($count) = shift;
   Win32::GuiTest::SendKeys("{BACKSPACE}") for(1..$count) ;
}

#NotePad 종료
sub end{
  Win32::GuiTest::SendKeys("%{F4}{TAB}{ENTER}");
}

Link : http://codepad.org/uPhPvpSx



글을 쓸때 참고했던 URL 입니다 (http://whitelove002.tistory.com/290) 

작가님께 감사합니다 ^^;;



4년만에 함께한 Korean Perl workshop 아주 흥미로웠고 재밌었던 주제가 많았습니다.

특히 Web 분야가 상당히 많이 발전하고 있더군요.

배울점도 많고, 좋은 사람도 많이 만났습니다.


@Gypark 님을 드디어 뵙는 역사적인 날이기도 했구요 ㅋㅋ


좋은 행사를 준비해주신 관리자 분들께 감사드리구요!

11월 모임 때 뵙겠습니다^^/


http://event.perl.kr/kpw2012/


아래는 동영상입니다 ㅠ 흑엽님이 올려주셨는데.. 공개해도 될지..




Comments