2012년 5월 12일 토요일

[DevFestX Korea 2012] 발표를 마치고 나서.

작성 : Songhun Kim 

안녕하세요.
어제 DevFextX Korea 2012를 마치고 돌아왔습니다.

Staff로 열심히 일하다가, 발표도 간단히 준비해서 다녀왔는데요.
어제는 Dart관련 발표가 무려 2개!
콤보로 소개 + 실습의 멋진 콤비로 진행 되었습니다.

멋진 발표!!

아직 널리 퍼지지 않은 언어이기 때문에 실습보단
초기 개념잡기를 위한 소개 시간이 중요했기 때문에
그런고로, 신재용님의 시간이 매우 중요했었습니다.^_^
관련된 지식도 많이 전달 해주셨고, 가감 없는 Dart의 장단점을 말씀 해주셔서 좋았습니다!!
많은 분들이 Dart에 대해서 많은 지식을 얻으셨길 바랍니다.

저의 경우는 Dart를 이용한 실습을 보여드리는 시간을 가지고자 하였습니다.
버전이 무려! V0.02였기 때문에 그냥 보여드리는 수준에 머물렀지만,
중요한 문법을 소개 시켜드리는 시간을 가졌습니다!!
제가 그렇게 말이 빠른 사람인 줄은 이 날 발표로 알았네요.ㅋ
이 모든 것을 한 번에 보여드리긴 어렵기 때문에, 그 부분을 추후로 미루기로 하였습니다!!


그러기 위해선?!!



그 날의 풍경을 잠깐 전달 해드릴께요. 제가 찍은건 아니지만 :-)

그날의 모습들

그 외에 저는 Staff로 참여했기 때문에 행사를 운영해보는 경험도 얻은 시간이라 의미가 많이있었습니다. 많은 개발 그룹들이 많습니다. 여러분들도 이런 같은 경험을 얻었으면 좋겠습니다..

앞으로의 활동도 기대해주시고!!
참여하고 싶으신 분들은 어려워 마시고 연락 주세요!!



2012년 5월 6일 일요일

[공유] Tech It! 기고

안녕하세요!!

전문 IT블로그인 Tech It!에 기고를 할 수 있는 기회를 얻었습니다.
링크는 다음과 같습니다. http://techit.co.kr/3253

시간이 많진 않다보니 잠을 약간 줄여가며,
틀릴까봐 나흘간 기초자료 다시 읽어가면서 쓰긴 했는데..
다시 읽어보면 뭔가 어색하고 참 부끄럽고 하네요..

그렇다고 찢어버릴 수도 없고 이미 엎질러진 물...
다들 재밌게 보실 수 있으면 좋겠습니다.

그리고, 소정의 기부금을 받았어요.
그래서 이 금액은 전액 Dartlang.or.kr의 포워드 비용.(년:9,900)에 사용 될 예정입니다.

이 자리를 빌어 Tech It! 관련자 분들에게 감사의 인사 드립니다.



완전쌩큐!

2012년 5월 5일 토요일

Browser에서의 Dart, Server에서의 Dart. 간단한 Http예제

이 문서는 DartWatch 의 번역 문서 입니다.^_^

Dart를 Client(Browser상에서)와 Server에서 사용할 수 있는지에 대해 물어보는 글 들을 메일링 리스트와 Stack Overflow에서 심심치 않게 볼 수 있습니다. 그래서 이 번 포스트에서는 예제를 통해 어떻게 하는 것인지 보여드리고자 합니다.

Server Side

첫번째로 Server Side에 대해서 다루고자 합니다. Dart는 Server에서 Python, Ruby그리고 Node.js와 같은 Server Side Script들 처럼 사용할 수 있습니다. Windows에서는 dart.exe <실행.dart> 방식으로 사용 됩니다. 다음 예제를 보시겠습니다.

//MyScript.dart
main() => print("Hello Dart");

그리고, 이것을 Console 에서 "dart.exe MyScript.dart"을 실행 시키면 다음과 같은 결과물을 볼 수 있습니다.

Hello Dart

그럼에도 불구하고 우리는 좀 더 유용한 것을 원합니다. 그래서 저는 다음 Diagram을 통해 어떻게 어플리케이션을 만들 수 있는지 계획을 세웠습니다.


Server Side Component는 2가지 행동을 실행 할 것입니다.
1. Http Protocol을 통해서 브라우저에게 다음 static 파일들을 전송할 것입니다.

- MyApp.html
- MyApp.dart
- MyApp.dart.js

2. 나머지 GET Http Request에 대해서는 요청된 이름을 가진 JSON 데이터를 전송합니다. 예를 들면 http://localhost:8080/helloWorld(/helloWorld가 GET됩니다.)를 호출 하게 되면, 다음과 같은 JSON 데이터가 전송 됩니다.

{"get":"helloWorld"}

이를 위해서 우리는 dart:io Library를 통해 HTTPServer를 이용해야 합니다. 모든 Dart 앱들은 main() 함수를 통해 시작이 되므로, MyServer.dart라는 화일을 다음과 같이 구성해 보겠습니다.

#import("dart:io"); // dart:io Library를 가져옵니다.


main() {
    HttpServer server = new HttpServer(); // Server를 생성합니다.

    serve.listen("127.0.0.1", 8080); // Listening을 시작합니다.

}

Server는 "dart.exe MyServer.dart"를 통해 실행 시킬 수 있습니다. 아직 이것은 아무 동작도 되지 않습니다. 그래서 우리는 Request에 반응 할 수 있는 Callback함수를 추가해야 합니다. 처음엔 기본적인 Response를 추가하겠습니다. 이 함수는 HttpRequest를 통해 URL을 분석하여 JSON 데이터를 생성하여 HttpResponse를 통해 데이터를 내려주는 것입니다. Callback은 defaultRequestHandler 속성을 통해서 할당 합니다.

#import("dart:io"); // dart:io Library를 가져옵니다.

#import("dart:json"); //json Library를 가져옵니다.


main() {
    HttpServer server = new HttpServer(); // Server를 생성합니다.

    server.defaultRequestHandler = defaultHandler; // Handle 함수를 할당 합니다.(하단에 있습니다)

    serve.listen("127.0.0.1", 8080); // Listening을 시작합니다.

    print("http://127.0.0.1:8080 서버가 활성화 되었습니다");

}

defaultHandler(HttpRequest req, HttpResponse res) {

    Map data = new Map(); // Response를 위한 Map을 생성합니다.

    print("${req.path}가 요청 되었습니다");

    data["get"] == req.path; // 요청된 Path를 data에 담습니다.

    String responseData = JSON.stringify(data); // map을 JSON으로 변경 합니다.

    res.outputStream.writeString(responseData); // Client 에게 응답을 합니다.

    res.outputStream.close(); // 응답을 닫습니다.

}


이제 Script를 실행 하고, 브라우저에 http://localhost:8080/hello를 입력하게 된다면 JSON데이터를 받을 수 있습니다.

두 번째로 실행 할 것은 Static파일 제공하기 입니다. 1회 요청에 3개 파일을 Load하고, 그 데이터를 응답하게 하는 방법을 알아보도록 하겠습니다.  MyApp.html을 요청 받고, Browser에 정상적으로 데이터를 보내는 예제를 만들어 보도록 하겠습니다.

#import("dart:io"); // dart:io Library를 가져옵니다.
#import("dart:json"); //json Library를 가져옵니다.

main() {

    HttpServer server = new HttpServer(); // Server를 생성합니다.
    server.addRequestHandler(matchMyApp, myAppHandler); // 만약에 "myApp"로 시작하는 요청이 있으면 Handle합니다.
    server.defaultRequestHandler = defaultHandler; // Handle 함수를 할당 합니다.(하단에 있습니다)
    serve.listen("127.0.0.1", 8080); // Listening을 시작합니다.
    print("http://127.0.0.1:8080 서버가 활성화 되었습니다");

}



defaultHandler(HttpRequest req, HttpResponse res) {

    Map data = new Map(); // Response를 위한 Map을 생성합니다.
    print("${req.path}가 요청 되었습니다");
    data["get"] == req.path; // 요청된 Path를 data에 담습니다.
    String responseData = JSON.stringify(data); // map을 JSON으로 변경 합니다.
    res.outputStream.writeString(responseData); // Client 에게 응답을 합니다.
    res.outputStream.close(); // 응답을 닫습니다.

}

bool matchMyApp(HttpRequest req){

    bool result = req.path.startsWith("/MyApp"); // MyApp으로 시작 되면
    print("MyApp과 일치여부 : $result");
    return result;

}

// 파일을 열고 Client에게 전송한다.
void myAppHandler(HttpRequest req, HttpResponse res) {
    File file = new File(".${req.path}"); // 요청한 파일을 가져옵니다. 예): ./MyApp.html
    file.openInputStream().pipe(res.outputStream); // 요청에 응답합니다.
}

이제 Server를 돌리게 되면, Client가 MyApp.html을 호출 시 정상적으로 응답해줄 수 있습니다.(지금은 Editor 마법사에 의해 Dart 앱이 만들어질 것입니다.)
GitHub에서 이 파일을 다운로드 받고 실행 하신 후, http://localhost:8080/MyApp.html 혹은 http://localhost:8080/helloWorld를 실행해보시기 바랍니다.
(이것은 에디터 빌드넘버 7232 에서 안정적으로 동작합니다.)

Client Side Dart...


Client Side의 Dart를 시작해봅시다. 우선 Editor에서 New > Web Application으로 예제 앱을 만들어 봅니다.( Server Side Dart에서 호출이 될 수 있도록 MyApp이라고 이름을 설정합니다.)

Editor는 MyApp.dart와 MyApp.html 파일을 생성할 것입니다.MyApp.dart는 최초에 다음과 같을 것입니다.
#import('dart:html');

class MyApp{
    MyApp(){
    }
    void run() {
        write("Hello World!");
    }
    void write(String message) {
        // HTML library는 "document" 전역 변수를 정의 합니다.
        document.query('#status').innerHTML = message;
    }
}

void main(){
    new MuApp().run(); // Class의 instance를 생성하고, run함수를 호출 합니다.

    // TODO : ui element를 이곳에 더 추가합니다.
}

Editor에서 "Tools > Generate Javascript"를 선택 하면 MyApp.dart.js 파일을 생성할 수 있습니다. HTML 파일을 살펴보면, Dartium에서는 자동으로 MyApp.dart 파일을 Load할 수 있도록 링크가 걸려 있을 것입니다. 그리고, 이 HTML파일은 Dartium이 아닌 브라우저를 위해서 MyApp.dart.js를 Load할 수 있도록 되어있습니다.
이 파일들은 MyServer.dart와 같은 폴더에 위치 되어야 합니다. 다시 한번 dart.exe를 이용해 MyServer.dart를 실행 시키고, http://127.0.0.1:8080/MyApp.html 을 요청 해보면 정상적으로 동작 됨을 볼 수 있습니다.

MyApp.dart를 좀 더 개선해보기로 하겠습니다. UI Element들을 더 추가하고, XMLHttpRequest(XHR)을 이용하여 Server Side에서 응답하는 JSON데이터를 받아보는 함수를 만들어보도록 하겠습니다.
이 함수는 Textbox, Button 그리고 서버에서 응답하는 데이터를 표시 할 수 있도록 Span Tag를 추가 할 것입니다. 그리고, Button을 클릭하면 Textbox에 입력된 URL에 XMLHttpRequest 객체를 이용하여 "GET"요청을 실행 할 것입니다. 예를 들어, "HelloWorld"를 TextBox에 입력 하고 Button을 클릭하게 되면 "http://127.0.0.1:8080/HelloWorld"에 요청하고 해당 JSON데이터로 응답할 것입니다. 아마도 {"get":"HelloWorld"}가 될 것입니다.

코드로 표현 해보도록 하겠습니다.
#import('dart:html');

class MyApp{
    MyApp(){
    }
    void run() {
        write("Hello World!");
    }
    void write(String message) {
        // HTML library는 "document" 전역 변수를 정의 합니다.
        document.query('#status').innerHTML = message;
    }
}

void main(){
    new MuApp().run(); // Class의 instance를 생성하고, run함수를 호출 합니다.

    addUiElements() 
}

addUiElements() {
  // UI를 추가합니다.
  var elements = new Element.html("""
Enter some text:
Request=
Response=
"""); document.body.nodes.add(elements); ButtonElement button = document.body.query("#myButton"); // Button을 선택합니다. // Button에 Click이벤트를 추가합니다. button.on.click.add(EventListener (data) { // TextBox에서 URL을 가져와 XHR호출을 하게 됩니다. // URL을 가져옵니다. InputElement textbox = document.body.query("#myTextbox"); // TextBox를 선택합니다. String url = "http://127.0.0.1:8080/${textbox.value}"; // 중요: url은 호출 된 서버와 같아야 합니다. // 만약에 http://localhost 로 호출을 하였다면, // url도 http://localhost로 변경해야 합니다. // 그렇지 않다면 Access-Control-Origin 에러가 발생 됩니다. // UI에 url을 적습니다. SpanElement requestSpan = document.body.query("#requestSpan"); // 요청을 기록할 Span requestSpan.innerHTML += "GET: $url"; // UI에 요청을 적습니다. // 서버로 부터 응답이 오면 실행 되는 부분 XMLHttpRequest request = new XMLHttpRequest.get(url, (XMLHttpRequest request) { SpanElement responseSpan = document.body.query("#responseSpan"); // 응답 Span responseSpan.innerHTML += "${request.responseText}"; // 응답을 출력합니다. }); }); }

MyApp.dart를 수정 한 후, 다시 한번 Javascript 생성을 해주시기 바랍니다.
여기까지의 코드는 GitHub에서 받아 볼 수 있습니다. 총 4개의 파일로 구성 되어있습니다.(MyServer.dart, MyApp.html, MyApp.dart, MyApp.dart.js)
간단히 이 파일들을 한 폴더 안에 위치 시키고, 다음 명령어를 내려보세요.
path/to/dart.exe MyServer.dart
그 이후, Daritum 혹은 브라우저로 다음 URL을 실행 해보세요.
http://127.0.0.1:8080/MyApp.html
Cross Origin에러가 발생 되었다면, XMLHttpRequest가 다른 서버에서 호출하고 있다는 거을 뜻합니다. 서버가 http://127.0.0.1:8080 인지 재확인 해주시기 바랍니다.

만약에 문제가 없다면 다음과 같은 화면을 보실 수 있게 됩니다.




여러분이 Dart를 Client Side와 Server Side에서 어떻게 사용하는지 이해되었기를 희망합니다.
이 Server Side Implementation은 믿을 수 없을 정도로 기초적입니다. 어떠한 Http Header를 제공하지 않습니다. 예를 들어, MyApp이라는 것만 골라내는 코드를 만들기는 상당히 어렵습니다. 여러분들이 한 번 도전 해보시기 바랍니다.

비록 이 블로그에서는 Dart를 Client Side와 Server Side에서 동시에 사용하고 있습니다만, 여러분들은 다른 언어로 만들어 볼 수 있습니다. 예로, Server Side Dart + Client Side Flash 혹은 Server Side Ruby + Client Side Dart 등등이 되겠습니다.

JSON을 다루는 것을 더 알기 원한다면, 이 문서를 참조 해주세요.

2012년 4월 30일 월요일

[의견수집] Dart를 발전 시켜주세요!!

안녕하세요!!

Global Dart Hackathon 진행에서 가장 많이 나왔던 이야기가 여러가지가 있었고.
일부는 현재 의견을 전달 해둔 상태입니다. ^_^

하지만, 현재 가장 많이 들리는 Document 개선에 대해서 Dart Team에서도 고민을 하고 있지만,
어떠한 형태가 가장 좋은 것인가?! 에 대해서는 다들 모르고 있는 상태입니다.
http://api.dartlang.org/ 아휴~ 어렵다~ 그죠잉~


저희도 한 번 의견을 모아서, 저희 취향(?)에 맞는 Document가 될 수 있도록 해보고 싶다는 생각을 했습니다.


그래서!! Dart Document 개선 아이디어 공모전!! 을 해보겠습니다.


참가 방법은!!
https://groups.google.com/forum/?fromgroups#!forum/dartlang-korea
우선 가입해주시고, 의견 개진 해주시면 됩니다.(구체적일 수록 좋겠죠?^_^)



채택 된 분들에게는 제가 특별히 준비한 소정의 선물을 드리도록 하겠습니다!!





기간은 5월 30일 전까지 지속적으로 주시구요.
여러 의견 모이기 바라겠습니다!!

감사합니다!!

[News] Dart Editor Build 6943

안녕하세요!!
새로운 뉴스~ 전해드립니다.

아직은 안정화 단계가 아닌지..
계속 빌드 버전이 나오네요.^_^

이번에 6943이 나왔습니다.(사실 저번 주에 나왔는데..제가 해커톤 준비로 게을러서 지금 봤네요)
  • Console view가 좀 더 좋아졌습니다.
  • 여러 개 실행 되는 어플리케이션을 위한 멀티플 콘솔 지원
  • 파일명 수정 개선 및 버그 수정
  • 삭제한 어플리케이션의 설정도 잘 삭제가 되도록 수정
  • 같은 것이 여러번 import되는지 분석 지원
  • Javascript 컴파일러와 Dartium 개선
  • UI와 분석의 개선과 버그 수정
Update 궈궈씽!

2012년 4월 29일 일요일

[Happy Hour] Postscript in Korea (28/4/12)


Hello everyone!!

We finished "Happy Hour Korea" very successful.
At the first, I worried about the events, because there was a couple of hackathon events at same time and  very clear weather for picnic. So we thought there were not enough developers for enjoy hackathon.
Therefore we decided to unite the place of 2 hackathons. This plan worked very well and we could play the events.

And I introduce 7 great Programmers of Dartlang Korea.


just 7, but we made 4 projects!!


If there are more hackers, a hackathon is more enjoyable, I think.
So we felt more funny and agreed it's good chance for talking about Dart language.



And then we made four great project in this Happy Hour.
  • Web & Chatting Server and Prototype of Shell
    • Simple Web Server and Chatting Server with IO APIs.
    • Command Shell Prototype.
    • We found and hoped that the Dart will stand in for Node.js.
  • Simple Piano
    • Emulate a piano with keyboard events.
    • In the near future, I hope we can control a real piano. :) 
  • Dart Complete
    • When we input codes in textarea, this program suggests apis(auto complete).
    • We'll suggest this idea for adding to Dartboard in Dartlang.org.
  • fxPresenti.dart
    • Web presentation tool written by Dart and HTML/CSS.
    • It's just v0.01. But I try to improve functions and replace all presentations in Dartlang.org.
    • So I hope "Fork me!!"
Although we were few programmers, but we made 4 projects!!(Fantastic 4!)
And we talked about the cause that the Dart is a very simple and clear language.

Just.. documents are not enough(not good for searching/so we made a "Dart complete")
And the Editor is not worked on windows XP(check plz..^_^) and little slow(build codes every saving time).
But it's on Technical Preview. So we thought it's very amazing!!!


We didn't have a enough time for talking, so we took a rain check.
And then we made a promise having parties much more.
So, look forward activity of Dartlang Korea. please!!

Forever Dart!!!




[Happy Hour] 4월 28일 후기

안녕하세요!!


어제 다행히 Happy Hour Korea를 마무리 하였습니다!
수원 안드로이드 해커톤과 일정도 겹치고, 날씨도 너무 좋고 그래서 아쉽게도 많은 분들이 참석을 못했었는데요.











마...망하는 줄 알았따요..









하지만, 솓아날 구멍이 있었습니다!!
GDG 수원 분들과 합류를 하기로 결정!



Dartlang Korea의 7인의 권위자가 탄생 되었습니다!!!


머찌다아~(부끄러워서 작게)







해커톤은 여러 명이 참여해서 서로 격려 하면서 진행 하는 재미가 있기 때문에..
(.......사실 말은 격려지만...실제로는 서로 눈치 봐가면서 서로 막 열심히 하게 되죠!!!  )



Dartlang 에서는 4가지 프로젝트가 진행 되었는데요.
  • Dart를 이용한 각종 서버 및 console
    • Http Web server / Chatting Server를 이용해서 서버를 구현하셨습니다.
    • 그리고, shell 상에서 Dart명령어를 받아볼 수 있는 입력기도 간단히 구현하셨습니다.
    • 이로서 Node.js가 할 수 있는 사항을 Dart 에서도 할 수 있다는 것을 알 수 있었습니다.
  • Simple Piano
    • 키보드 입력을 이용한 Piano 제작!!
    • 나중에 소리도 날 수 있으면 좋을거 같아요!!
  • Dart Complete
    • 웹상에서 Dart 코드를 입력하면, 자동완성 시켜주는 툴입니다.
    • Dartlang.org의 Dartboard에 채택되면 상당히 좋을 듯 합니다.
  • fxPresenti.dart
    • Dart로 제작한 웹 프리젠테이션 툴
    • 이제 Dart 관련 프리젠테이션은.....음..완성도가 아직은...
    • Fork 해주세요!!
적은 인원으로 많은 프로젝트가 진행 되었죠?!
참여하신 분들께서도 생각보다 쉽게 익힐 수 있었다고 말씀하셨어요.

다만 Document가 좀 안 좋고, Editor가 느리고...XP에서 돌지 않는 등....
약간의 문제가 있긴 하지만..
아직 Technical Preview 상황을 고려해 볼 때 상당히 긍정적으로 볼 수 있을 듯 합니다.


저희 끼리 트로피도 받으면서 자축하고, 많은 의견을 나누진 못했지만..
앞으로 더 재밌게 활동 할 수 있을 듯 합니다.

앞으로도 Dartlang Korea는 모임을 가질 예정이예요!!
많은 관심 가져주시고. 부끄러워 하지 말고 함께해요!!



















췟!! 진짜 망하는 줄 알았땅께!!
다음엔 더 재밌는거 준비할끼다!!