'Programming'에 해당되는 글 43건

  1. 2010/09/01 귀차니스트 DebuggerOnC
  2. 2010/03/17 귀차니스트 Textcube 에서 XQuared 에디터를 쓰면서 Hooriza님의 Codehilight 사용
  3. 2010/03/09 귀차니스트 Script Interpreter - boost::spirit
  4. 2010/02/22 귀차니스트 VirtualHttpServer - 가상URL 처리 서버 (4)
  5. 2010/01/22 귀차니스트 음.. 여러가지 일이 있지만.. (2)

DebuggerOnC

Programming 2010/09/01 02:34 귀차니스트

사용자 삽입 이미지

 

  안녕하세요^^. 멤버십에 들어와서 생활을 하다보니 블로그에 글이 적어지는 듯한 이유를 알 수 있을 것 같습니다. 사실 뭐 조금 게으른것도 영향이 클 것 같군요. 과제를 3개월 단위로 하나를 수행하는데, 원래 4명으로작하려고 했었다 2명이 결국 도중에 나가게 되어 2명이서 과제를 완료한 DebuggerOnC 라는 프로그램입니다. 

  이 프로그램의 특징은 우선 x64 프로세스를 대상으로 동작하는 Debugger 이자 Decompiler 입니다. 즉 한마디로 컴파일 되어 실행된 프로그램을 어셈블리와 C코드로 분석을 할 수 있게 도와주는 툴입니다. 이 것을 3개월 동안 만들었습니다^^. 물론 약간의 사정이 있어 기간상 문제도 있었구요.

  저번에 올라왔었던 글이 이 프로그램에서의 Decompiler 쪽을 담당하는 모듈입니다. 그에 대한 기능을 대략적으로나마 완성이 되었을 때 올렸었죠^^. 일단 8월 10일날 프로그램에 대해서 1차적인 완료는 끝이 났습니다. 왜냐구요? 이게 8,9,10월에 진행하는 또 다른 과제가 있기 때문입니다. 

  새로 시작하게 되는 과제는 상용 서비스를 진행할 예정이기 때문에 공개는 현재 힘들듯 하고. 아마 이 과제가 끝나게 되면 DebuggerOnC의 개선과 더불어 OS의 기능 추가도 진행할 수 있을 듯 합니다. 오랫만에 들른거 치고는 또 많이 남기지는 못하는군요.

  머릿속에 많은 아이디어는 존재하는데 실제로 개발하기에 시간이 부족하기 그지 없습니다. 만들고 싶은 것은 많은데 아쉽네요^^. 탐색기도 기존의 Windows Explorer는 불편한 점이 종종 발견되어 새로운 부분을 생각하고 있긴 한데 어떻게 될지 모르겠습니다. ㅎㅎ

  8,9,10월이 끝나고 제대로 된 상용 서비스가 시작된다면 아마 또 그 쪽 관련해서 글을 올릴지도 모르겠군.모바일 멀티 플랫폼으로 개발하는 게임이다 보니 ^^ 4명이서 제작하고 있는 만큼 퀄리티도 꽤 나올 듯 합니다. 

  이 글을 올린 이유는 Decompiler 기능을 마치면서 기념을 위해서 올린거랍니다. 더 큰 프로그램을 만든 적도 있긴 하지만 제가 원해서 이 정도로 만들어본 프로그램은 극히 드물기 때문이죠 ㅎㅎ 그럼 다음 포스팅을대해 주시면 감사하겠습니다.

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/09/01 02:34 2010/09/01 02:34

댓글을 달아 주세요

  안녕하세요 오늘은 수업이 끝난 후 간단한 삽질을 통하여 아주 예전에 해결하지 못했던 부분을 해결하여 이렇게 올려봅니다. 예전에 Xquared라는 Springnote에서 사용하는 편집기가 Textcube에서 사용이 가능하게 된 플러그인이 올라왔다고 얘기를 드린 적이 있었습니다. 그리하여 그 플러그인을 적용을 시켰었는데 기존에 사용하던 Hooriza님의 Codehilight 플러그인이 제대로 적용되지 않고 깨지는 문제점이 있었다고 알려드렸던 적도 있었죠.

  그런데 오늘 수업을 마치고 약간 삽질을 해봤습니다. 글은 몇 개 없는 블로그이지만 그래도 2년 정도 된 블로그다 보니 차근차근 글을 쓸 예정이고 해서 수정을 시도를 했었습니다. 그리고 기존에 시도했었던 소스를 웹상에 백업폴더로 저장을 해놓았기에 이를 참고하여 제대로 적용을 완료시켰습니다.

 

Hooriza 님의 Codehilight 플러그인의 호출점 수정

  먼저 Hooriza님의 플러그인에서 Editor에 Html코드를 삽입하는 호출점을 수정하여야 합니다.

ch_main.js (Language : html4strict)
  1. success : function(html) {
  2.     var code = "<br />" + html + "<br />";
  3.     try {
  4.         wnd.xed.insertCodeHilightHtml(code);
  5.         setTimeout(function() { window.close(); }, 10);
  6.     } catch(e) {
  7.         alert("객체를 삽입하는 도중에 에러가 발생하였습니다");
  8.         alert(code + ", " + e.description + ", " + e.source);
  9.     }            
  10. }

  위 코드에서 wnd.xed.insertCodeHilightHtml 이라는 부분이 수정된 부분입니다. 기존의 코드는 이와 같이 되어 있지 않고, Editor.InsertObject인가 그런 것으로 적혀져 있었죠. 그러다보니 없는 메소드를 호출하게 되고 try~catch구문에 걸려 에러메시지만 표시되는데 이와 같이 수정할 경우 뒤에서 만들어줄 insertCodeHilightHtml 함수를 호출하게 됩니다.

 

XQuared - Editor의 개체삽입함수 수정

  원래 XQuared에서 제공하는 Editor.js 파일의 에디터는 insertTemplate 이라는 함수를 제공합니다. 그런데 실제로 이 것을 사용하면 이상한 에러가 뜨면서 제대로 실행이 되지 않는 것을 알 수 있는데요. 그리하여 예전에 수정했었던 소스에서는 아래의 함수를 수동으로 추가를 시켜 주었습니다.

Editor.js (Language : html4strict)
  1. /**
  2.  * Inserts HTML template
  3.  * @TODO: Add selenium test
  4.  *
  5.  * @param {String} html Template string. It should have single root element
  6.  * @returns {Element} inserted element
  7.  */
  8. insertTemplate: function(html) {
  9.     return this.rdom.insertHtml(this._processTemplate(html));
  10. },
  11. /**
  12.  * Inserts HTML
  13.  * @TODO: Add selenium test
  14.  *
  15.  * @param {String} html Template string. It should have single root element
  16.  * @returns {Element} inserted element
  17.  */
  18. insertCodeHilightHtml: function(html) {
  19.     return this.rdom.insertCodeHilightHtml(html);
  20. }

  위 함수에서 insertCodeHilightHtml함수를 만듬과 동시에 내부의 함수에서 this.rdom.insertCodeHilightHtml이라는 멤버함수를 불러주는 까닭은 실제 내용을 처리하는 함수가 rdom에 존재하기 때문입니다. insertHtml이 기존에 문제가 있었기 때문에 새로 인터페이스를 만든 것이죠.

rdom/base.js (Language : html4strict)
  1. /**
  2.  * Inserts given html into current caret position
  3.  *
  4.  * @param {String} html HTML string
  5.  * @returns {Node} Inserted node. It could be different with given node.
  6.  */
  7. insertHtml: function(html) {
  8.     return this.insertNode(this.createElementFromHtml(html));
  9. },
  10. /**
  11.  * Inserts given html into current caret position
  12.  *
  13.  * @param {String} html HTML string
  14.  * @returns {Node} Inserted node. It could be different with given node.
  15.  */
  16. insertCodeHilightHtml: function(html) {
  17.     return this.insertNode(this.createCodeHilightHtml(html));
  18. }
rdom/base.js (Language : html4strict)
  1. /**
  2.  * Creates element from HTML string
  3.  *
  4.  * @param {String} html HTML string
  5.  * @returns {Element} Created element
  6.  */
  7. createElementFromHtml: function(html) {
  8.     var node = this.createElement("div");
  9.     node.innerHTML = html;
  10.     if(node.childNodes.length < 1) {
  11.         throw "Illegal HTML fragment";
  12.     }
  13.     return this.getFirstChild(node);
  14. },
  15. /**
  16.  * Creates element from HTML string
  17.  *
  18.  * @param {String} html HTML string
  19.  * @returns {Element} Created element
  20.  */
  21. createCodeHilightHtml: function(html) {
  22.     var node = this.createElement("div");
  23.     node.innerHTML = html;
  24.     return node;
  25. }

 두 번째 블럭에서 CodeHilightHtml을 수정함과 밑의 체크 구문을 제거한 것으로 createCodeHilightHtml함수를 만들었습니다. 이렇게 하면 제대로 JavaScript 함수 단에서의 호출문제는 제거가된 것인데요. 이렇게 하여 Textcube 에서 Hooriza 님 플러그인을 사용하게 된다면 FIELDSET, LEGEND가 제거되어 글을 작성 후 제대로 표시되지 않는 문제점이 존재합니다. 

 

Whitelist에 Html태그 추가

  Javascript함수를 하나씩 디버깅하여 추적을 해본 결과 해결방법을 찾게 되었습니다. 위 까지는 예전에 진행했었던 단계였던지라 이 번에 적을 것이 점심시간 후 시도했던 방법이라고 보시면 됩니다. 여기서는 xquared.js 파일을 열어서 해당 부분을 찾아봅시다.

xqurared.js (Language : html4strict)
  1. /**
  2.  * Pre-defined whitelist
  3.  */
  4. xq.predefinedWhitelist = {
  5. .
  6. .
  7. .

  이 부분을 찾으셨으면 아래로 내린 뒤, 아래 코드와 같이 해당 tag를 추가하면 됩니다.

xqurared.js (Language : html4strict)
  1. .
  2. .
  3. .
  4.    'var':         xq.commonAttrs.concat(),
  5.    'fieldset':      xq.commonAttrs.concat(),
  6.    'legend':            xq.commonAttrs.concat()
  7. };

  이렇게 추가하신 뒤, 사용하시면 짜잔 제대로 표시가 됩니다. 물론 var는 기존에 존재하던 것이라 fieldset, legend 부분만 추가하시면 되구요^^. 지금 남기는 이 글 또한 문제를 해결한 Editor로 글을 남기는 것이라 감회가 남다르네요.

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/03/17 14:54 2010/03/17 14:54

댓글을 달아 주세요

Script Interpreter - boost::spirit

Programming 2010/03/09 02:57 귀차니스트

  이번에는 boost에 존재하는 spirit을 사용하여 간단한 스크립트 언어의 Interpreter를 만들어보게 되었습니다. 예전에 IPangYa 를 비롯하여 PangCal 프로그램을 만들 때 잠시 사용하였던 라이브러리를 다시 사용하게 되었는데요, 예전엔 문법적인 체크만 했었는데 이번엔 그래도 파서라는 이름에 맞게 인터프리터를 만들어보게 되었네요.

문법

명령문 -> if, while, 변수선언문, 변수대입문

if -> if(판별식) { 명령문 } else { 명령문 }

while -> while(판별식) { 명령문 }

판별식 -> 수식 비교연산자 수식

비교연산자 -> == != < >

변수선언문 -> var 변수이름

변수대입문 -> set 변수이름 = 수식

수식 =  +, -, *, /

 = (), 숫자, var:변수이름

 

예시

변수선언

ex) var abc

    abc 변수를 선언

변수대입

ex) set abc=100

    abc 변수에 100을 대입

if

ex) if(1==1) { 명령문 }

          1 1의 값이 동일할 때 명령문 실행

    if(var:a==var:b) { 명령문 }

변수a 값과 변수b 값이 동일할 때 명령문 실행

    if(a==b) { 명령문 }

변수a 값과 변수b 값이 동일할 때 명령문 실행

    else { 명령문 }

추가적으로 뒤에 붙을 수 있음

while

ex) while(a<1000) { 명령문 }

변수a 값이 1000보다 작을 동안 명령문 실행

  위와 같은 문법을 지원하는 스크립트 언어 입니다. 사실 너무 간단한 스크립트 언어라 어떻게 이름을 지정할 것도 없지만요^^; 사용은 무척 쉽게 되었습니다. 사실 boost::spirit에 존재하는 함수에서 abstract parser tree를 만들어주기 때문에 해당 트리를 기반으로 평가함수를 실행하면 되기 때문이죠^^. 이번에는 C Interpreter를 만들어보려고 하고 있습니다. C++ 은 template가 있어서 그 부분은 불가능 할 것 같고 차라리 C 를 만들어보기로 했습니다. 이 부분은 완성이 천천히 진행이 될 것 같군요. 아래는 제가 만들었던 스크립트 언어의 룰입니다.

Identifier = token_node_d[(alpha_p >> *alnum_p)];
Message = '"' >> token_node_d[*(anychar_p - '"')] >> '"';
Program = *Expression;
Expression = discard_node_d[space_p] | IfExpression
| WhileExpression
| VarExpression
| CallExpression
| NumericExpression
| AssignExpression;

AssignExpression = str_p("set")
>> token_node_d[+space_p]
>> LValue
>> discard_node_d[*space_p]
>> '='
>> discard_node_d[*space_p]
>> RValue;

RValue = NumericExpression
| Message
| Identifier;

LValue = Identifier;

ComparisonOperator = str_p("==") | str_p("!=") | str_p("<") | str_p(">");

BooleanExpression = (RValue
>> discard_node_d[*space_p]
>> ComparisonOperator
>> discard_node_d[*space_p]
>> RValue);

IfExpression = str_p("if")
>> discard_node_d[*space_p]
>> '('
>> discard_node_d[*space_p]
>> BooleanExpression
>> discard_node_d[*space_p]
>> ')'
>> discard_node_d[*space_p]
>> '{'
>> discard_node_d[*space_p]
>> Program
>> discard_node_d[*space_p]
>> '}'
>> !( discard_node_d[*space_p]
>> "else"
>> discard_node_d[*space_p]
>> '{'
>> discard_node_d[*space_p]
>> Program
>> discard_node_d[*space_p]
>> '}');

WhileExpression = str_p("while")
>> discard_node_d[*space_p]
>> '('
>> discard_node_d[*space_p]
>> BooleanExpression
>> discard_node_d[*space_p]
>> ')'
>> discard_node_d[*space_p]
>> '{'
>> discard_node_d[*space_p]
>> Program
>> discard_node_d[*space_p]
>> '}';

VarExpression = str_p("var")
>> token_node_d[+space_p]
>> Identifier
>> *( discard_node_d[*space_p]
>> discard_node_d[ch_p(',')]
>> discard_node_d[*space_p]
>> Identifier);

CallExpression = str_p("call")
>> token_node_d[+space_p]
>> Identifier
>> discard_node_d[*space_p]
>> '('
>> discard_node_d[*space_p]
>> !Arguments
>> discard_node_d[*space_p]
>> ')';

Arguments = RValue
>> *( discard_node_d[*space_p]
>> discard_node_d[ch_p(',')]
>> discard_node_d[*space_p]
>> RValue);

CallVal = str_p("var:") >> Identifier;

NumericExpression = Term
>> *(   (ch_p('+') >> Term)
|   ('-' >> Term));

Term = Factor
>> *(   ('*' >> Factor)
|   ('/' >> Factor));

Factor =   int_p
|CallVal
|   '(' >> NumericExpression >> ')'
|   ('-' >> Factor)
|   ('+' >> Factor);

 위와 같은 룰로 구성이 되어있습니다.  앞으로 C Interpreter를 구성하게 된다면 여러모로 여기저기 붙여서 써먹을 일이 많을 듯합니다^^. 아마 제가 제작하는 OS에도 사용이 가능하게 될지도 모르겠네요^^; 가능했으면 좋겠는데.. 그럼 직접 적은 글은 별로 없는 영양가 없는 포스팅을 줄이도록 하겠습니다. 다음에 뵙겠습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
2010/03/09 02:57 2010/03/09 02:57

댓글을 달아 주세요

VirtualHttpServer - 가상URL 처리 서버

Programming 2010/02/22 01:19 귀차니스트

  요사이 또 한 동안 포스팅을 하지 못했던 것이 있군요. 최근 삼성소프트웨어멤버십이라는 곳에 지원을 하게 되어 그 곳에서 열심히 살다보니 포스팅이 조금 늦었습니다. 사실 이전에 올리던 OS 쪽 부분에서는 조금 많은 변화가 있었습니다.

  실제 Buddyblock 을 통한 메모리 할당 부분쪽이 수정되어 정상적인 동작을 하고 있고, 이로 인해 스케쥴러를 만들 기반은 된 상태구요. 시간이 나게 되면 틈틈이 작업을 할 생각입니다. 현재는 다른 작업 때문에 OS를 통 건드리지 못하고 있네요^^;
  최근 하고 있는 일은 가상의 Http 서버를 만드는 일 입니다. 단순히 이 문장으로는 아마 파악하시기가 힘드실 것 같은데요. 공유기를 한 번 보시면 쉽게 판단이 되실듯 합니다. 공유기의 주소가 대충 몇 가지 있지만 제가 사용하는 공유기의 경우를 예를 들어서 http://192.168.0.1 로 접속을 하면 보통 인증창이 뜨게 되고 HTTP 파일로 공유기의 설정을 서로 바꿀 수 있습니다.
  공유기 쪽에서 클라이언트로부터 전송받은 HTTP 페이지 데이터를 기반으로 공유기의 설정을 계속하여 바꾸게 되는 것인데요. 일반적인 IIS 같은 웹서버를 비롯하여 파일 전송을 주로 하는 역할과는 많이 다르다고 보시면 됩니다. 현재 많이 쓰이는 프로그램 들 중에서 하나를 비교하라고 한다면 BerrysWebShare 프로그램과 가장 비슷할 것 같군요.
  원리는 대충 아래와 같습니다. 어차피 HTTP 프로토콜이라는 것이 TCP 위에서 아스키로 이루어지는 통신의 규약이다보니 HTTP 프로토콜을 서로 전송하고 처리할 수 만 있다면 훌륭한 통신매개체로 사용할 수 도 있습니다. 더욱이 HTTP 라는 것이 범용적으로 사용하는 프로토콜이다 보니 요새 열풍이 불고 있는 스마트폰이나 PSP, PMP등으로도 웹브라우져만 있다면 접근이 가능하게 되어 있는 점이 무척 좋습니다.

POST /aa.html HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg
Referer: http://127.0.0.1/
Accept-Language: ko-KR
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: 127.0.0.1
Content-Length: 40
Connection: Keep-Alive
Cache-Control: no-cache
q=abcdefg&btnG=%C4%F5%B8%AE+%C0%FC%BC%DB


  위 사각형 상자 안에 있는 내용이 어떠한 내용을 요청 받음과 동시에 데이터를 전송하는 형태의 한 부분 입니다. POST 형태로 데이터가 전송되는 부분이 맨 아래에 보입니다. 이러한 데이터를 가지고서 여러가지 가공을 한다면 HTTP 서버에서 즉각적인 처리가 가능하게 됩니다. 좀 재미있는 응용이라고 생각할 수도 있는 부분이라 사실 구현하면서도 정말 재미있었습니다.
  하지만 만들어야 하는 기능이 이 것을 제외하고도 스크립트 언어 쪽 기능도 있다보니 이 부분 또한 처리를 해야 하여 더욱 바쁩니다^^. 그럼 이만 글을 줄이도록 하겠습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
2010/02/22 01:19 2010/02/22 01:19
TAG

댓글을 달아 주세요

  1. 당구리 2010/02/22 08:26  댓글주소  수정/삭제  댓글쓰기

    ㅎㅎ RSS로 첨 온 글이네.ㅋ

  2. 준호씨 2010/03/16 14:36  댓글주소  수정/삭제  댓글쓰기

    이것은 바로 그것이군.

  OS를 만들면서 아직 메모리 관리도 안되고, 스케쥴러도 되지 않는 OS라고 부르기엔 참 민망한 OS이지만 현재 개발은 계속되고 있는 중입니다. 저번주 토욜날 할머니께서 돌아가시는 바람에 부랴부랴 내려가서 3일장을 치르고 오느라 기능을 많이 추가하지는 못했군요. 그 전에도 면접에 대한 준비도 하고 실제 면접도 치르느라 시간이 훌쩍 지나갔습니다^^.

  예전에 올라왔던 스캔코드를 찍었던 스샷과는 다르게 키보드 처리도 어느정도 된 상태의 스크린샷입니다. 모처에 면접을 볼때는 help, mem, size의 단 3개의 명령어만 존재했는데, 현재 메모리관리자를 넣어보려고 하니 제가 생각한 구조에서는 미리 MP Configuration Table을 어느정도 분석하여 코어 개수에 대한 정보가 필요하더군요. 그래서 Process Control Block 도 지정하고 Bootstrap Core 인덱스도 구하고 하는 등의 작업을 추가 했습니다. 대충 생각한 메모리관리자의 구조가 아래와 같습니다.


1. 프로세스 마다 MemoryAllocator 가 존재한다.
2. MemoryAllocator는 BuddyBlock Algorithm으로 할당요청을 처리한다.
3. 프로세스에서 메모리 할당 요청이 들어오면 MemoryAllocator에서 남아있는 여유분의 블럭이 있는지 조사하고 서비스가능한 블럭이 있을경우 BuddyBlock 작업을 수행하여 할당을 한다. 만약 블럭이 없을 경우 PageAllocator에 페이지 할당을 요청한다.
4. PageAllocator에서는 각 Page에 대해서 소유 프로세스를 관리하며, 각각의 페이지 사이즈를 관리한다. 페이지의 할당 요청이 들어왔을 때, 서비스 가능한 페이지가 있다면 해당 페이지를 할당해주고, 아닐 경우 NULL을 리턴한다.
5. 페이지가 할당 요청이 되었을 때에는 MemoryAllocator에 요청된 공간만큼 할당을 시켜준 다음 남은 블럭은 MemoryAllocator에서 자체적으로 다시 관리한다.
6. 해제의 경우 MemoryAllocator에서 남은 블록을 해제 하며 Merging을 수행하여 해당 블럭이 PageAllocator에서 할당하는 기본 페이지 사이즈가 되면 해당 PageAllocator에 페이지 소유를 이양하고 빈 페이지로 설정한다.

  아직 다른 OS에서의 메모리 관리를 자세하게 살펴보지를 않은 상태라 나름대로 고민을 하여 구성을 해보았는데 스스로는 꽤나 괜찮다고 생각을 하지만 알고보면 평범할것 같기도 하여 열심히 구현만 하고 있습니다. 이제 메모리 관리자가 제대로 구현되고 나면 실제로 이제 구현되어야할 스케쥴러를 구현하여 멀티태스킹이 들어가게 되고 이 부분이 되고 나면 그래도 그럭저럭 OS라고 부를 수 있지 않을까 하는 생각이 조금씩 드네요^^;
  다음에도 더 발전된 포스팅 거리를 들고 찾아뵙도록 하겠습니다. 다른 일이 생기지 말아야 빨리 작업이 될텐데 말이죠^^;
크리에이티브 커먼즈 라이센스
Creative Commons License
2010/01/22 05:03 2010/01/22 05:03
TAG , , ,

댓글을 달아 주세요

  1. 비밀방문자 2010/01/30 23:22  댓글주소  수정/삭제  댓글쓰기

    관리자만 볼 수 있는 댓글입니다.

    • 귀차니스트 2010/02/22 01:04  댓글주소  수정/삭제

      음.. 한글화 파일 0.5 버젼은 따로 네이버 동방환상마작 까페에 보시면 있을겁니다.
      리비젼 2는 되지 있지 않구요.. 1만 된 상태에 그것도 완전하지는 않습니다.