Monday, July 26, 2010

demo of custom COM which controls emeditor's webpreview window.

this demo shows how to control emeditor's webpreview window.

이 데모는 Emeditor의 webpreview를 제어하는 기능을 테스트합니다.

IE가 있는 곳이면, 아니 win32를 이용하여 "Internet Explorer_Server" 클래스의 윈도우의 핸들을 구할 수 있다면, OLE 자동화 인터페이스를 제공하고 있기 때문에 얼마든지 그 control을 가로챌 수 있군요.

webpreview가 있는지, 그리고 그 hwnd를 검출하는 함수는 나중에 추가하겠습니다.
이것으로 현재 커서 위치의 단어를 쿼리하는 기능의 매크로등의 작성가능 합니다.
그외에 (사실은 이것이 주 목적입니디만) 웹의 테스트도 좀 편리하게 할 수 있을 것 같기도 하구요.

여기에 소스를 올리려고 했더니, blogger.com에는 파일첨부가 안되는 것을 깜빡했습니다.
아직 제작중인 매크로의 일부의 기능만 테스트한 것이기 때문에,
더 쓸만큼 되면 올리던지, 요청이 있으면 올리도록 하겠습니다.

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

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