Thursday, November 18, 2010

building and running vivid app example step by step

우선 gmo-game.com에서 개발자 등록하고 필요한 sdk와 examples를 다운받았아요.
다운 받은 화면은 다음과 같아요. 저는 c:\temp_vivid에 설치했어요



그리고 cmd창을 열어서 샘플디렉토리로 가요.
cd C:\temp_vivid\examples\benchmark\benchmark\build\platform\vs2008

컴파일하기 위한 환경설정을 실행해요. 예제는 vs2008프로젝트인데 무시하고 그냥 설치된 vs2010의 환경변수를 설정했어요.
"c:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"

thrip유틸을 이용해서 빌드를 해요. release모드로 했어요.
C:\temp_vivid\vivid_runtime_sdk_1.0\tools\thrip\thrip.exe vs build benchmark.vcproj release

이렇게 컴파일 하더라구요


역시 thrip유틸을 이용해서 실행해 봤어요.
C:\temp_vivid\vivid_runtime_sdk_1.0\tools\thrip\thrip.exe vs run benchmark.vcproj release

이런 프로그램이 실행되어요.
vivid는 딱히 에뮬을 가지고 있지 않고 그냥 같이 링크해버리나봐요.



windows7도 없어 윈모7 에뮬도 못띄우고 있고,
안드로이드는 가지고 있는 단말기가 없고,
imac에 objc는 시간을 못내서 못하고 있는데,

이건 그래도 돌려볼만한 환경이 되는 군요 ㅠㅠ
흥미가 끌렸어요. 담에 좀 더 조사해봐야겠어요.

이상.

Sunday, October 24, 2010

일본어 페이지를 빨리 한국어로 번역해 보는 방법

이미 쓰고 계시는 분들도 많겠지만,

FF, Opera, Chrome계열에서 일본어 페이지를 빨리 한국어로 번역해 보는 방법입니다.

MSDN같은 경우는 일본어로는 설명이 준비되어 있는데 한국어로는 준비되어 있지 않은 경우도 많습니다.

우선 bookmark 레코드를 하나 준비해서 다음의 이미지와 같이 준비합니다.
눈여겨 봐야 할 곳은 Location입니다. Location에 다음과 같이 입력합니다.
description은 적지 않아도 상관없습니다.

http://translate.google.com/translate?js=n&prev=_t&hl=en&ie=UTF-8&u=%s&sl=ja&tl=ko&history_state0=

이중 %s 는 url 입력창에서 parameter로 입력되는 string을 의미합니다.




즉 다음과 같은 일본어 페이지의 일본어 페이지의 url 앞에 'jako '라고 쓰면



다음과 같은 페이지로 이동합니다.



FF에서 작성된 BookMark 프롬프트는 Opera와 Chrome에서 import했을 때도 잘 작동합니다.
IE 8까지는 구현되지 않고 있습니다.

이 방법은 와이프가 만족해 잘 사용했습니다. 구약소(구청)등의 페이지를 얼른 번역해 보기에 편했습니다.

이 힌트는 이 책에서 얻었습니다. 여기에서는 url 주소창에 cpan 이라는 키워드를 이용해서 모듈의 페이지로 바로 이동하는 방법을 소개합니다.


저는 키워드로 jako로 선택해 사용하고 있습니다.
이와 비슷한 방법으로
koja
enko
chko
image (구글의 이미지 검색)
등을 준비해 사용하고 있습니다.
#api의 설명 페이지로 빨리 가는 방법으로도 확장해 쓸 수 있지만, 이쪽은 jd-gui(java의 경우)나 reflector(닷넷의 경우)등의 로컬 프로그램등으로 object browser를 빨리 띄워 보는 방법을 사용하고 있습니다.

그럼 어디까지나 참고로..
잘 부탁드립니다.

Wednesday, October 20, 2010

an emeditor magic - custom query console page on webpreview pane



나는 종종 관리자툴에 쿼리를 실행해볼 수 있는 페이지를 넣는다. 물론 Select권한만. 그래놓고 emeditor에서 요렇게 사용하는 것을 즐긴다.

Friday, October 8, 2010

an emeditor magic - checking emails through EmEditor webpreview


an emeditor magic - checking emails through EmEditor webpreview showing a html embedding outlook viewer ActiveX

Sunday, October 3, 2010

ItemDone

a simple dialog shows progress on top most window
the progress calculation based on keyword of 'item' and 'done' in a text file.




Imports System.IO
Imports System.Text.RegularExpressions
Imports System.Threading

Public Class MainFrm
Private strFilePath As String = "c:\itemdone.txt"
Private iIntervalSec As Integer = 5
Private datLastWriteTime As Date
Private strItemKeyword As String = "#item:"
Private strDoneKeyword As String = "#done"
Private iItemsCount As Integer = 0
Private iDoneCount As Integer = 0
Private Thrd As Thread

Private Sub MainFrm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.TopMost = True

Dim args As String() = Environment.GetCommandLineArgs()
For Each arg As String In args
If arg.StartsWith("/f:") Then
strFilePath = arg.Replace("/f:", "")
ElseIf arg.StartsWith("/t:") Then
If Integer.TryParse(arg.Replace("/t:", ""), iIntervalSec) = False Then
iIntervalSec = 5
End If
ElseIf arg.StartsWith("/ik:") Then
strItemKeyword = arg.Replace("/ik:", "")
ElseIf arg.StartsWith("/dk:") Then
strDoneKeyword = arg.Replace("/dk:", "")
End If
Next

'// set title
Me.Text = strFilePath

'// Thread begin
Dim TStart As New ThreadStart(AddressOf ThreadMain)
Thrd = New Thread(TStart)
Thrd.Priority = ThreadPriority.Highest
Thrd.Start()
End Sub

Private Sub MainFrm_Disposed(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Disposed
If Thrd.IsAlive Then
Thrd.Abort()
Thrd = Nothing
End If
End Sub


Private Sub ThreadMain()
Try
While True
UpdateProgress()
Threading.Thread.Sleep(iIntervalSec * 1000)
End While
Catch ex As Exception
Console.WriteLine(ex.ToString)
Console.WriteLine(ex.Message)
End Try
End Sub

Private Sub UpdateProgress()
Dim myReader As StreamReader
Try

Dim fi As FileInfo = New FileInfo(strFilePath)
Dim bToGo As Boolean = False

'// now - save < interval
If datLastWriteTime = Nothing Then
bToGo = True
End If
If fi.LastWriteTime.AddSeconds(iIntervalSec) < Date.Now Then
bToGo = True
End If


If bToGo Then
'// file open
myReader = File.OpenText(strFilePath)
Dim strContent As String = myReader.ReadToEnd
myReader.Close()

'// count "#item:"
Dim regularExpression As Regex = New Regex(strItemKeyword)
Dim matchResult As MatchCollection = regularExpression.Matches(strContent)
iItemsCount = matchResult.Count
Me.lbItems.Text = iItemsCount.ToString

'// count "#done:"
regularExpression = New Regex(strDoneKeyword)
matchResult = regularExpression.Matches(strContent)
iDoneCount = matchResult.Count
Me.lbDone.Text = iDoneCount.ToString

If iDoneCount = 0 Then
Me.lbProgress.Text = "0 %"
Else
Me.lbProgress.Text = String.Format("{0:f2} %", (iDoneCount / iItemsCount) * 100)
End If
End If

datLastWriteTime = Date.Now

Catch ex As Exception
Console.WriteLine(ex.ToString)
Console.WriteLine(ex.Message)
Exit Sub
End Try
End Sub
End Class

Saturday, October 2, 2010

an emeditor magic. web preview pane showing a pdf file #Emeditor





function WebPreview_Navigate(strURL) {
var wndEmeditor = shell.FindWindow("EmEditorMainFrame3", "" );
var wndEEPaneContainer;
try {
wndEEPaneContainer = wndEmeditor.FindWindow("EEPaneContainer", "");
} catch(e) {
editor.ExecuteCommandByID(5632+9); Sleep(100);
wndEEPaneContainer = wndEmeditor.FindWindow("EEPaneContainer", "");
}

var wndEmEditorWebPreview = wndEEPaneContainer.FindWindow("EmEditorWebPreview", "");
var wndShellEmbedding = wndEmEditorWebPreview.FindWindow("Shell Embedding", "");
var wndShellDocObjectView = wndShellEmbedding.FindWindow("Shell DocObject View", "");
var wndInternetExplorerServer = wndShellDocObjectView.FindWindow("Internet Explorer_Server", "");

var com = new ActiveXObject("CrowdyEmeditorCom.WebPreviewController");
var Browser2 = com.GetIEBrowser(wndInternetExplorerServer.hWnd);
if (Browser2 != null) {
Browser2.Navigate(strURL);
} else {
alert('Browser2 is null.');
}
}

Sunday, September 5, 2010

Captcha인증컨트롤

http://www.codeproject.com/KB/custom-controls/CaptchaControl.aspx
의 컨트롤을 다운받아 변형해 보았습니다.

Tuesday, August 10, 2010

간단한 java 실행방법

TO : Helma님

잘 작동하는 군요.

저도 이런거 있으면 유용하겠다라고 생각했던 것 중, 거의 7할은 만든 저도 사용하지 않고 있습니다. 좋은 기획이란 어떤 것일까요? ^^; (먼산)

언제인가 ANT가 반드시 필요한가에 대해 토론했던 기억이 나서,,,
다음은 Ant대신 emeditor에서 실행해본 예 입니다.

소스를 좀 수정했습니다.
package를 없앴고, utf-8로 저장하고 윗부분에 (자칭) 확장 shebang을 넣었습니다.

/*
#run:javac -cp .;dom4j-1.6.1.jar -encoding UTF-8 XMLOptMapper.java
#run:java -cp .;dom4j-1.6.1.jar XMLOptMapper
#run:dir fsdfds.xml
*/

즉 이 내용대로 실행하라는 말이지요.



그다음에 F5를 눌러 run.jsee의 매크로를 실행했습니다.
이 매크로가 저 shebang을 인식해서 실행합니다.
%Comspec%이 열리고 다음과 같이 Sendkey해서 이하와 같이 출력되었습니다.



잘 작동하네요 ^^;;

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

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

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(일본어) 입니다.