2012년 5월 18일 금요일

Dart server 설치기

작성 : Songhun Kim 

안녕하세요.

요즘 호스팅 해주는 곳이 많지요..
Dart같은 경우는 직접 모든 것을 설치해야 하기 때문에 Server 호스팅을 받아야 하는데요.
어디서 받아야 뒤적거리다가 보니 Cafe24에서 가상서버호스팅이라는 것이 가장 저렴한 것 같아서 신청을 해보았습니다. Ubuntu 11.10 (GNU/Linux 3.0.0-12-server x86_64)

다들 자신의 PC등에서는 서버를 간단히 돌려보셨을꺼예요.(제발 그냥 돌려봤다고 해주세요~)
Windows에서 돌아가는 것은 다른 분을 통해서 봤고, 저 같은 경우는 OSX에서 잘 도는 것을 확인 했기 때문에, 호스팅에서도 간단히 돌 줄 알았는데..
이상하게 동작이 안되는 것이였습니다.

그래서, 메일링 리스트를 뒤적뒤적 거리다 보니..
많은 분들이 저와 같은 얘기를 하고 있더군요.

결론은 "not yet"

하지만, 많은 Linux 서버들이 64bit로 전환 되었기 때문에..
어떻게든 돌려봐야하지 않겠나 해서 더 찾아보니..
32bit Library들을 가져다가 돌리면 되는 것을 발견 하였습니다.

그럼. 64bit linux에서 Dart를 돌리는 방법을 간단히 정리해보도록 하겠습니다.
우선 문서들 부터 정리 하면.

  1. 공식 문서
    1. http://code.google.com/p/chromium/wiki/LinuxBuildInstructionsPrerequisites
    2. http://code.google.com/p/dart/wiki/PreparingYourMachine
    3. http://code.google.com/p/dart/wiki/GettingTheSource
    4. http://code.google.com/p/dart/wiki/Building
  2. DartWatch
    1. http://blog.dartwatch.com/2011/10/step-by-step-setting-up-dart-build.html
Building 까지 하셔도 되지만, 제가 생각할 땐 Build 까지는 안하셔도 될 것 같고..
32bit library까지만 하셔도 Dart를 사용하실 수 있습니다.

무슨 얘기인고 하니..
wget http://src.chromium.org/svn/trunk/src/build/install-build-deps.sh
source install-build-deps.sh
이 것을 가지고 Library들을 설치해주시고..
에서 SDK를 받아서 진행해주셔도 설치가 가능 합니다.

하지만, 잘 안되시는 경우에는 위의 DartWatch에서 제공하는 Step by Step을 진행해보셔야 할 듯 합니다. 저 같은 경우는 Build 과정이 어떻게 되는지 궁금해서 전체 Build를 해보았습니다.

그 과정은 위의 DartWatch에서 상세히 되어있어서 생략하구요.
그 중 특이했던 점과 주의 점만 공유 드립니다.
우선 32bit Library설치 과정인데요.
source install-build-deps.sh --lib32
로 명령어를 줬습니다.
처음에 Install이 안되서 Shell을 열어보니.
다음과 같이 되어있더군요.
222 # Install 32bit backwards compatibility support for 64bit systems
즉, 저와 같은 상황에 계신 분들은 꼭 --lib32 옵션을 주시기 바랍니다.
그 다음, root로는 gclient가 동작되지 않습니다.
유저를 분리 해주셔야 합니다.
#update_depot_tools
if [ "$USER" == "root" ];
then
  echo Running depot tools as root is sad.
  exit
fi
또, 주의 하시면 좋을 점은..
gclient config http://dart.googlecode.com/svn/trunk/deps/all.deps
gclient sync
의 경우 정말로 svn에서 다운받는 과정을 거치기 때문에.
명령어를 실행 시킬 Directory를 잘 확인 하고 실행 하시기 바랍니다.

그럼!! 꼭 성공 하시길 바랍니다~

2012년 5월 17일 목요일

[News] Dart Editor Build 7696


안녕하세요!!
빌드가 엄청 빨리 되네요. :)
이번엔 어떠한 것이 바뀌었는지 살펴보도록 하겠습니다!!

  • 로컬 변수 리펙토링이 확장 되었습니다.
  • 검색과 검색 박스가 변경 되었습니다.
  • 검색에서 숨겨진 디렉토리들(.)을 검색하지 않습니다.
  • File View에서 리소스명을 변경하면,
    Dart소스안에 있는 #import, #source와 #resource의 참조가 업데이트 됩니다.
  • 분석서버의 일반적인 수정이 있습니다.
  • 에디터 외 뉴스 : dart:dom이 deprecated되었습니다.

테스트 해보고 싶은 기능이 있네요.
그리고, 예전에 알려드렸던 dart:dom의 제거 소식 놓치지 마세요~^_^

2012년 5월 15일 화요일

[안내] 5월 Dart Time!!

Go!! Dart Time!!


안녕하세요!!
개발자들의 수다 시간!! Dart Time 5월 모임을 가지려고 합니다!!
다양한 이야기로 수다를 떠는 것이 목적이기 때문에
부담없이 오셔서 즐겁게 얘기 하시면 좋을 듯 합니다.


시간 : 2012.5.31(목) 저녁 8시
장소 : 카페베네 역삼스타점 : http://goo.gl/EoD9M ( 장소 후원: 구글 코리아 http://goo.gl/P57iM )
제공 : 간단한 간식 및 음료 일체
참가 신청 : http://goo.gl/CWC1d


평소에 뭔가 고민이 있었는데..
다른 개발자들은 어떻게 생각하고 있는지 궁금하신 분들!!

간단한 아이디어가 있는데..
구체적으로 잡히지 않는 분들!!

평소에 소심한 성격으로 말을 잘 못해서..
인맥 넓혀보고 싶으신 분들!!


개발자가 아니여도 좋습니다!
개발자들이 어떤 수다를 떠는지 궁금하신 분들!!


그런 분들을 위해 준비 해봤습니다!!
이 번엔 특별히 Golang Korea분들과 함께 즐거운 시간을 가질 것입니다!!



여러분들이 주인공입니다!!
차 한 잔 하고 가세요~
그럼 기다리고 있겠습니다!!


2012년 5월 14일 월요일

[News] Dart Lang Spec 0.09!!

Dart 가 0.09가 되었네요.
조만간 0.1이 될 수 있을까요?^_^


주요 변경사항은 다음과 같습니다.

  • Abstract Methods는 기본 값을 가집니다. [링크]
  • Interface Methods도 기본 값을 가집니다. [링크]
  • "~/" 연산자는 doubles에도 적용 될 수 있습니다. [링크]
  • Factory들이 사용 되는 것이 허용 되도록,
    Abstract Class 의 인스턴스화에 관한 룰을 재정의 하였습니다. [링크
  • Switch 구문의 사양을 교정 하였습니다. [링크]
  • throw는 null을 던질 수 없습니다. [링크]
  • Imports는 Library scope로 부터 scope 구분을 알려줍니다.
    중복적인 Library들이 prefix를 공유할 수 있습니다.[링크]
  • 재귀typedefs를 허용합니다. [링크]



감사합니다~

[News] Dart Editor Build 7552

거의 1주일에 1번씩 빌드 되는 느낌이네요. :)
뉴스 전해드리는 것 자체가 벅찰 정도로 빠릅니다!!

이번 Build는 7552입니다.
다들 업그레이드 해주시기 바랍니다. :)
주요 변화는 다음과 같습니다.

  • Rename 리펙토링을 개선 하였습니다. 
    • prefix, 로컬 함수, Getter & Setter을 포함합니다.
    • 타입이 변경 되거나 멤버가 private등이 될 때 경고를 알려줍니다.
  • frog와 dart2js를 같이 사용할 수 있습니다.
    • 몇 주내로 dart2js만 사용하도록 할 예정입니다.
  • 외부 파일을 읽기 전용으로 열도록 변경하였습니다.
  • SDK 텍스트 검색 기능을 만들었습니다.
  • 텍스트 파일의 타입의 필터링 기능을 향상 시켰습니다.
    • .dart.js 혹은 config 파일들은 하지 않습니다.

이번 에디터에 포함된 dartium에서 제 fxPresenti가 동작을 하지 않더군요.
이 부분은 문의 진행 중입니다.^_^예제 돌려보실 때 참고 하시기 바랍니다.^_^

감사합니다~

2012년 5월 13일 일요일

[안내] Mini Happy Hour!! (2012.06)



안녕하세요.

제 1회 Mini Happy Hour* 를 개최 합니다.

시간 : 6월 16일 토요일 오전 11시~오후 2시 까지(3시간)
장소 : 강남역 토즈 ( 장소 후원: 구글 코리아 http://goo.gl/P57iM )
정원 : 30명
스케쥴

  • fxPresenti.dart v0.04 를 통한 Dart Project 실습 (15분)
  • Dart Hackathon (2시간)
    • 시간은 짧지만, 주기적으로 할 예정이니 간단히 나눠서 진행하면 됩니다.
  • 진행 상황 공유 및 칭찬 시간(30분)
  • 버퍼시간 : 15분

모집 마감은 장소 예약 사정상 1주 전에 마감하도록 하겠습니다.(6월 9일, 토요일)

참고로 저는 Dart 한국어 문서화를 진행 할 예정이오니
관심있으신 분은 참여 해주시기 바랍니다!!

감사합니다!!

* Global Dart Hackathon 인 Happy Hour에서 빗대어 만들었습니다.
공식적인 Dart Team의 모임은 아님을 알려드립니다.

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을 다루는 것을 더 알기 원한다면, 이 문서를 참조 해주세요.