Monday, July 19, 2010

Sunday, July 18, 2010

Perl 의 SOAP::Lite를 이용하여 간단히 RPC통신을 구현

아직 작성중이고 일부기능만 아주아주 간단히 만들어(짜집기해서) 테스트중입니다만,
좀 더 기능을 붙인다면 쓸만한 것이 나오지 않을까 해서 올려봅니다.

아-주 한참 가다듬어야할 소스이기때문에 코드는 화면에 나오는 코드로 대신합니다.

우선

파일 불러오기와
저장하기 그리고
간단히 실행해 결과 가져오기

이 세개만 구현되어 있습니다.



비디오 캡춰를 하고보니 소스를 소개한다고 보여주는 부분은 눈에 들어오지도 않고 재미도 없군요. 바로 실행데모로 넘어가는 쪽이 좋았다고 생각합니다.
m(_ _)m

Friday, July 16, 2010

Perl의 SOAP::Lite를 이용하여 간단히 RPC통신을 구현

저는 맥과 PC가 있습니다만, 맥에 아직 익숙하지 않아서 에디터는 PC의 Emeditor를 사용하고 있습니다.
Synergy를 이용해서 Emeditor에서 작성한 텍스트를 카피해 xcode에 붙일수는 있지만, 번거러와서, 아예 Emeditor에서 파일을 보내 컴파일 명령을 실행한 결과를 볼 수 있도록 하면 어떨까 하고 생각이 든 적이 있는데, Perl의 SOAP::Lite를 이용하면 간단히 할 수 있을 것 같아 다음과 같은 약간의 테스트를 해보았습니다.

소스는 너무 짧아서 캡춰한 이미지에 있는 것으로 대신합니다.

Soap 서버의 소스. 이쪽은 mac쪽에서 실행시킬 예정입니다.


Soap 서버를 실행시킨 화면



다음은 Soap서버를 이용하는 클라이언트 소스, Emeditor에서 PerlScript로 실행시킬 예정입니다.


Soap 클라이언트를 콘솔에서 실행시킨 화면


다음번에는 Emeditor에 적용시킨 화면을 올려보겠습니다.
조언은 언제나 환영합니다.
잘부탁드립니다.

Thursday, July 15, 2010

Emeditor with ActivePerl

다음은 EmEditor의 PerlScript를 이용해서 hiveminder에 글을 올리는 post입니다.


#language = "PerlScript"
use utf8;
use Net::Hiveminder;

my $hm = Net::Hiveminder->new(email => 'your@email.com', password => 'yourpassword');
my $text = $Window->prompt('Add Hive Minder Summary', '');
$hm->create_task(Encode::encode("euckr", $text));

$Window->Alert('done');


저는 단축키 alt-v로 이 매크로가 실행되도록 해두었습니다.





이렇게 올린 todo는 바로바로 iphone의 iMinder(무료)로 확인할 수 있고 편집할 수 있습니다.



그런데 hiveminder에 올리는 summary에 한글과 영어이외에 일본어나 중국어등의 utf-8코드를 사용하고 싶다면 이하의 방법을 사용해야 합니다.


#language = "PerlScript"
use encoding "utf8";
use utf8;
use Win32::OLE;
use Net::Hiveminder;

my $vbscript = Win32::OLE->new('ScriptControl');

$vbscript->{Language} = 'JScript';
$vbscript->AddObject("window", $Window); # Emeditor의 DOM의 하나인 윈도우 객체를 넘긴다.
$vbscript->AddCode(<<JScript);
function writeFileAsUTF8WithoutBOM(filepath, content) {
/* ADODB.Stream - SaveOptionsEnum */
var adSaveCreateOverWrite = 2;

/* ADODB.Stream - StreamTypeEnum */
var adTypeBinary = 1, adTypeText = 2;

/* ADODB.Stream - StreamWriteEnum */
var adWriteChar = 0, adWriteLine = 1;

var st = new ActiveXObject("ADODB.Stream");
st.type = adTypeText;
st.charset = "utf-8";
st.open();

st.WriteText( content, adWriteLine );

st.Position = 0;
st.Type = adTypeBinary;
st.Position = 3; // to skip BOM
var bin = st.Read();
st.Close();

var stw = new ActiveXObject("ADODB.Stream");
stw.Type = adTypeBinary;
stw.Open();
stw.Write( bin );
if (filepath == '') {
alert('filepath is empty!');
}
stw.SaveToFile(filepath , adSaveCreateOverWrite );
stw.Close();
}
function saveprompt() {
var str = window.prompt('Add Hive Minder Summary', new Date);
writeFileAsUTF8WithoutBOM('c:\\\\_hiveminder.txt', str);
}
JScript

#$vbscript->Run('saveprompt', null);
$vbscript->Eval('saveprompt()');

my $hm = Net::Hiveminder->new(email => 'your@email.com', password => 'yourpassword', );
open (my $fh, "<:utf8", "c:\\_hiveminder.txt") or $window->alert("Cannot open $file: $!");
my $text = <$fh>;
$hm->create_task($text);

#$window->Alert(Encode::encode("UCS-2LE", $text)); <--- doesn't work
#$window->Alert(Encode::encode("UCS-2BE", $text)); <--- doesn't work
#$window->Alert(Encode::encode("utf8", $text)); <--- doesn't work
#$window->Alert(Encode::encode("utf16", $text)); <--- doesn't work

$Window->Alert('done');







이렇게 해야하는 이유는 Emeditor는 ScriptingControl 이라는 ActiveX를 통해서 ActivePerl의 인스턴스를 만들어 내고
소스 문자열을 그대로 이 ScriptingControl에 건내, Eval이나 Run 인터페이스를 통해 실행하는 방식을 취하고 있는데
ActivePerl에서는 유니코드가 내부적으로 utf16이 아닌 utf-8을 사용하고 있고, 윈도우즈는 유니코드를 내부적으로 utf-16(정확히는 UCS-2)을 사용하고 있는데
이 부분에서 WideChar의 전달이 망가지기 때문입니다.

# 전달받지 않고 Perl안에서 할당하고 처리하는 코드는 잘 문제없습니다.

결국 이런 회피법으로 피해가고 있습니다만, 좀 더 똑똑한 방법이 있는 지는 모르겠습니다.
Python도 내부적으로 UCS-2입니다만, Hiveminder의 Python라이브러리가 없습니다.
# 만들면 되는데, Hiveminder의 Api의 설명문서가 제대로 갱신되어 있지 않습니다. 많은 시간 들여 해봤는데 403 forbidden이 나옵니다.
# 전달해야하는 파라메터는 훨씬 더 많은 것 같습니다.

그런데 위쪽의 방법으로 하면 되는 이유는 OS에서는 어째서인지 명확히 설명할 수는 없지만, 시스템 디폴트코드페이지는 먹히기 때문입니다.
# 실제로는 저는 일본 OS이기 때문에 sjis로 decode하고, 일본어만 사용할 수 있습니다.

좀 더 현명한 방법이 있으면 공유 부탁드립니다. m(_ _)m

Thursday, July 1, 2010

Emeditor with Daum Dictionary API

2010년 8월 1일부로 daum의 사전 api가 사라진다고 하는군요
저는 Daum 영어사전 api를 Emeditor의 매크로를 사용하여 다음과 같이 사용하고 있었습니다. http://www.youtube.com/watch?v=iQjl6_29ySU

단축키를 눌러서 매크로를 발동시키는 방식이에요.
사라지면 쓰지 못하므로 아쉬워서 한 컷!

Saturday, June 5, 2010

snippet의 실행을 간단하게. (부제:shebang의 확장으로 xml까지)

이 블로그는 도저히 길어져서 언어로 쓰기 어렵군요.
1시간짜리 경험의 이야기 일 듯 싶어서,
간단히 코드로 보여주고 줄거리는 상상에 맞기는 것이 좋겠습니다.

결론은 shebang의 방식을 xml로 까지 확장해서 사용하고 있으며,
이는 어느 언어든 적용할 수 있는 유연한 방식이었다. 라는 것입니다.

구현은 jscript로(emeditor에서 WSH를 사용할 수 있는 이유로) 되어 있으며
현재 매우 지저분해서 공개할 수 없지만,
이 아이디어는 약 4년전부터 구현하기 시작해 지금도 계속 확장중입니다.

snippet에 해당되는 파일은 물론 지금도 계속 늘려가는 중입니다만, 현재는 8만9천여개의 파일이 모아져 있는데, 꽤 유용하게 사용되고 있습니다.
비슷한 고민을 하신적이 있으시면, 자료와 아이디어를 공유하고 싶습니다. 트위터 @crowdy까지 연락 주시면 언제든 환영합니다.

우선 shebang의 사용


#!/usr/bin/env perl
print "hello";


그리고 제가 중간정도에 사용하던 shebang의 확장

/*
#run:cscript c:\crowdy\emmacro\data\bin\runcrowdy.js {fullname}
//SourceGUID:2877F00B-0CC4-4063-B5A6-D22D127DA319
//ExecuteStart
IF not exist c:\temp\2877F00B-0CC4-4063-B5A6-D22D127DA319 mkdir c:\temp\2877F00B-0CC4-4063-B5A6-D22D127DA319
cd c:\temp\2877F00B-0CC4-4063-B5A6-D22D127DA319
copy {fullname} .
g++ -W -Wall -Werror {fullname} -o {filename.name}_gcc.exe
strip {filename.name}_gcc.exe
{filename.name}_gcc.exe
//ExecuteEnd
*/

#include

int main()
{
std::cout << "This is a native C++ program." << std::endl;
return 0;
}



그리고 이것은 제가 지금 사용하고 있는 snippet 파일



Schema="1.8" FileName="AddBeanFactoryPostProcessorToXmlBeanFactory.psf"
CommandLine=""
Generated="2010-05-31T01:46:35+10:00" xmlns="C:\Program Files\crowdy Script\psf.xsd">

script



context.xml

"http://www.springframework.org/dtd/spring-beans.dtd">




]]>



references
.
e:\ineedcodesample\Language\Jar\STUVWXYZ\spring.jar
e:\ineedcodesample\Language\Jar\JKL\jakarta-commons\commons-logging.jar





그리고 다음은 에디터(emeditor)에서 단축키를 눌러 매크로로 실행한 화면


Friday, February 26, 2010

윈도우에서 유니코드를 표시할 수 있는 콘솔중, 내가 즐겨쓰는 콘솔.

해보시면 아시겠지만, cmd.exe로 실행하는 콘솔화면에는 한가지 언어의 폰트밖에 사용하지 못합니다.(chcp 65000을 하셔도 폰트는 어쩔 수 없습니다.)

그냥 이미지로 답을 할 수 있을 것 같기 때문에 긴 내용은 생략합니다.
이미지의 내용은 utf8로 저장된 perl파일을 실행한 가장 간단한 것입니다.


콘솔에서 유니코드로된 트윗을 읽는다던지,
일본어로 넣으면 중국어로 뜻이 나온다던지
조금 응용하면 재미있는 것들을 해 볼 수 있습니다. :-)

물론 color 명령이라던지, vim같은 명령어는 실행해 볼 수 없습니다. ^^;
utf8로 해놓으면 dir과 같은 내장명령어의 실행은 일본어가 망가져서 출력되기 때문에
ls와 같은 GnuWin32 툴로 실행하는 것이 좋습니다.(멀티플랫폼 사용자라면 더욱!)

■GnuWin32 Package download
http://gnuwin32.sourceforge.net/packages.html

//그러나 단지, 출력의 인코딩만을 제대로 해 보여줄 뿐, 입력의 Codepage는 932(일본어) 입니다.