1. Mozilla의 Boot to Gecko – 웹은 플랫폼이다.

    Mozilla Boot to Gecko (B2G)는 오픈 웹을 위해서 완전하고 독립적인 운영 체제를 구축하는 것입니다. B2G는 데스크톱이나 모바일의 애플리케이션을 위한 첫번째 선택이 될 수 있는 웹 기술이 만드는 것이 목표입니다. 그리고, 이 기술이 애프리케이션 개발을 위해 하나의 업체에 전유되는 독점을 대체할 수 있다고 믿고 있습니다. 이와 관련하여 우리는 여러분과 공유하고 싶은 흥분되는 얼마의 진전을 이뤄냈습니다.

    Boot to Gecko 프로젝트

    프로젝트가 어떻게 구성돼 있는지 살펴보는 것으로 시작하겠습니다.

    목표
    Boot to Gecko는 모바일 기기를 위한 모질라의 오픈 소스 웹 기반 운영 체제입니다. B2G는 2012년 2월 MWC(Mobie World Congress)에서 소개된 오픈 웹 디바이스 플랫폼을 위한 프레임워크입니다.
    기술
    Boot to Gecko 아키텍처는 앱을 개발할 때 특정 플랫폼에 종속된 API의 필요성을 제거합니다. HTML5를 사용하여 개발자들은 모든 곳에서 직접 웹을 대상으로 개발합니다. 개발자들은 특정 플랫폼에 종속된 제약이나 규칙에 구애받지 않고 놀라운 사용자 경험과 앱을 만들 수 있습니다.
    접근 가능한 개방된 표준들
    모든 모질라의 프로젝트들 처럼, 소스 코드는 오픈 소스이며, 프로젝트는 전적으로 개방된 표준을 기반합니다. 개방된 표준이 놓치고 있는 분야(전화, SMS, 카메라, 블루투스, USB, NFC 포함)에서 모질라는 이들에 대한 표준 제정을 위해 표준 기구나 여타 다른 업체들과 협업하고 있습니다. 더 많은 정보를 위해 모질라와 모바일 웹 API의 발전을 읽어 보시기 바랍니다.

    다음은 B2G 프로젝트 개발자들의 (여러 언어들이 섞인) 수 많은 인터뷰입니다.

    HTML5로 동영상을 보기위해서는 유투브의 동영상 플레이어를 설치하세요.

    오픈 웹 디바이스 소개

    오늘 MWC(Mobile World Congress)에서 발표된 것처럼, 오픈 웹 디바이스에 대해서 매우 놀라운 소식이 있습니다. 우리는 통신업체인 텔레포니카(Telefónica)와 협업을 하게 될 것입니다. 자세한 내용은 언론에 보도된 내용에 상세히 나오는 것처럼 협업의 목적은 다음과 같습니다.

    • 피처폰 가격으로 스마트 폰 기능을 제공하는 오픈 웹 기반의 HTML5 기기
    • W3C에 표준으로 제출되도록 하고, 기술을 개방하는 것
    • 애플리케이션 개발자들에게 새로운 기회를 열어주고, HTML5를 교차 플랫폼을 표준으로 만들어 가는 것

    퀄컴 칩셋에 기반하여, 모질라, 텔레포니카, 퀄컴은 기능이 풍부한 프로토타입 플랫폼을 제공하기 위해 공동 작업할 것입니다. 이미 웹 브라우저는 HTML5 테스트에서 317점을 얻었습니다. 그리고, 이 플랫폼이 쓸만해졌을 때, (텔레포니카의 카를로스 도밍고에 의하면) Boot to Gecko 폰은 아이폰보다 열배 저렴할 것입니다.

    도이치텔레콤(Deutsche Telekom)과의 협업

    우리는 또한 도이치텔레콤의 혁신 연구소가 Boot to Gecko를 개발하는 데 모질라와 함께 하게 됐다는 것을 알리게 되어 기쁩니다.

    Boot to Gecko 데모

    여기에서 동작하는! 부트 투 겍코 데모를 볼 수 있습니다. 이 데모는 전화온 내역을 연락처에 저장하는 것과, 웹 서핑 그리고, (Firefox 모바일이 모든 모바일 브라우저 중에서 가장 높은 점수를 얻는) HTML5 테스트를 실행하는 것을 보여줍니다. 그런 후에, 트위터 클라이언트와 게임하는 모습, 구글 지도를 사용하고, 유투브에서 동영상을 보고 책을 읽은 후에 기기에 저장돼 있는 동영상을 보는 것으로 끝맺습니다.

    웹은 플랫폼입니다

    모질라가 항상 믿는 것처럼 웹은 플랫폼입니다. 그리고, 열린 기술이야말로 이를 만들 수 있는 길입니다.

    웹과 미래를 위해 개발합시다.

    원저자: Robert Nyman – 원문으로 가기

  2. 배터리 API 사용 – WebAPI

    기기나 컴퓨터의 배터리 남은 양을 측정할 수 있는 기능은 현재 상태를 사용자에게 알려주고자 할 때 도움이 됩니다. 이 기능을 모질라의 WebAPI내에 배터리 API란 이름으로 추가했습니다.

    배터리 객체 얻기

    먼저 배터리 객체를 얻는 것이 중요합니다.

    var battery = navigator.mozBattery;

    배터리 객체 속성

    기기에 있는 배터리의 충전 정도를 알수 있는 다음과 같은 몇 개의 속성이 있습니다.

    level
    배터리의 현재 충전 정도를 확인. 0에서 1사이의 값을 반환.
    charging
    진리값. 기기나 컴퓨터가 현재 충전 중인지를 반환.
    chargingTime
    완전히 충전될 때까지 남은 시간(초). 충전 중일 때 사용 가능.
    dischargingTime
    방전될 때까지 남은 시간(초). 충전하지 않고 있을 때 사용 가능.

    // 배터리 충전 정도를 백분율로 얻기
    var batteryLevel = battery.level * 100 + "%";

    // 기기가 충전중인지 아닌지 상태값 얻기
    var chargingStatus = battery.charging;

    // 기기가 완전히 충전될 때 까지의 시간
    var batteryCharged = battery.chargingTime;

    // 기기가 방전될 때 까지의 시간
    var batteryDischarged = battery.dischargingTime;

    이벤트

    배터리의 상태 변경 감지를 위한 4개의 이벤트가 있습니다.

    levelchange
    배터리의 충전 정도가 변하는 경우
    chargingchange
    기기가 충전중이다가 충전이 끊기거나 그 반대인 경우를 감지
    chargingtimechange
    (충전을 위해 연결시) 기기의 충전 시간이 변경됐을 때
    dischargingtimechange
    (충전이 끊겼을 때) 기기의 방전 시간이 변경됐을 때

    battery.addEventLister("levelchange", function () {
        // 기기의 배터리 충전 정도 변경
    }, false);
    
    battery.addEventListener("chargingchange", function () {
        // 기기가 전원에 연결됐거나 아니면 연결이 끊겼을 때
    }, false);
    
    battery.addEventListener("chargingtimechange", function () {
        // 기기의 충전 시간이 변경됨
    }, false);
    
    battery.addEventListener("dischargingtimechange", function () {
        // 기기의 방전 시간이 변경됨
    }, false);

    기기 지원

    배터리 API는 다음의 환경하에 Firefox 베타에서 지원됩니다.

    • 안드로이드 (현재는 Firefox Aurora 만 지원)
    • 윈도우즈
    • 리눅스 (UPower가 설치된 경우. 대부분의 최근 배포판에는 포함돼 있음)

    현재는 Mac OS X를 위해 작업하고 있는 사람이 없습니다. 그러므로, 만약에 능력이 있는 분이 있다면, 이 부분에 기여를 위해 한 번 뵙고 싶습니다!

    데모와 코드

    기본적인 배터리 API 데모를 마련해 두었습니다. 코드는 또한 GitHub의 배터리 API 저장소에서 내려 받을 수도 있습니다.

    여러분이 가진 기기에서 배터리 API가 기대한 대로 동작하지 않는 경우, 버그로 등록 해 주시기 바랍니다. 그러면, 저희가 살펴볼 수 있을 것입니다. 이 API는 현재 실험적인 상태입니다. 그러므로, 아직 실 사용에는 문제가 있을 수 있습니다.

    원저자: Robert Nyman – 원문으로 가기

  3. 진동 API 사용 – WebAPI

    모질라의 WebAPI 결과의 일부분으로, 모든 기기를 지원하는 진동(Vibration) API 추가 작업이 진행중입니다.

    진동 API의 기본 생각은 게임이나 기타 필요한 경우에 기기를 진동시킴으로써 사용자에게 특정한 내용을 알릴 수 있도록 하는 것입니다. 이 API는 기기에 장착된 진동 장치를 접근하며, 얼마나 오랫동안 진동해야 하는 지를 지정합니다.

    예제

    기기를 진동시키는 방법은 매우 간단한데, 예제에서 볼 수 있는 것처럼 얼마동안 진동해야하는지를 인수로 지정하면 됩니다. 수치는 100분의 1초 단위입니다.

    navigator.mozVibrate(1000);

    진동을 제어하는 또 다른 방법은 진동과 멈춤을 번갈아 지정하여 진동 패턴을 지정하는 것입니다. 아래 예제에서 홀수번째 인수가 진동시간이고, 짝수번째 인수는 진동을 멈추는 시간입니다.

    navigator.mozVibrate([200, 100, 200, 100]);

    그리고, 진동을 멈추고 싶은 경우 다음과 같이 mozVibrate 메소드에 0이나 빈 패턴을 넘기면서 호출하면 됩니다.

    navigator.mozVibrate(0);
    navigator.mozVibrate([]);

    직접 해보기!

    진동 API를 지금 테스트 해 보고 싶다면, Firefox 11이 될 예정인 Firefox Aurora에서 해 볼 수 있습니다. 현재, 진동 API는 (당연히) 진동 기능을 지원하는 기기에서만 동작하는데, (대부분의) 안드로이드 폰의 Firefox에서 동작합니다.

    주의사항: 안드로이드 기기에서 햅틱 반응 기능을 켜 놓은 상태일 경우 진동 요청이 취소될 수 있습니다.

    데모

    다음에 나오는 간단한 데모에 테스트를 위해 필요한 코드들을 한데 모아놨습니다. 테스트 해 보시기를 부탁드리며, 아울러 여러분이 생각하는 바를 알려 주시면 고맙겠습니다.

    부가설명: 잠시 진동기(Vibrator) API라는 이름을 붙인적이 있습니다. 하지만, 어감이 좋지 않았기 때문에 현재는 진동(Viration) API라고 부르고 있으며, 이는 W3C 진동(Vibration) API 초안과 부합됩니다.

    원저자: Robert Nyman – 원문으로 가기

  4. Firebug 1.9의 새로운 기능들

    Firebug 1.9가 출시되었습니다. 여느때와 마찬가지로, 이번 버전에 추가된 몇몇 새로운 기능들을 소개하고자 합니다.

    Firebug

    먼저, 아래에 있는 호환성 표를 확인하시기 바랍니다

    • Firefox 4.0: Firebug 1.7.3
    • Firefox 5.0 – 11.0 : Firebug 1.9
    • Firefox 12.0 (nightly) : Firebug 1.10

    Firebug 1.10 알파 1이 다음주에 나옵니다. 그 전까지는 Firefox nightly를 위해 Firebug 1.9b6을 사용하면 됩니다.

    이번에 추가된 새로운 기능들을 정리해 보면 다음과 같습니다

    Firebug UI 위치 설정

    Firebug UI를 브라우저 창의 상하좌우 네 곳 모두 중 어느 한 곳에 위치할 수 있게 됐습니다. 단지, 시작 버튼의 팝업 메뉴를 열고 Firebug UI Location(Firebug UI 위치)을 선택한 후 원하는 위치를 선택하면 됩니다.

    JSON 응답을 클립보드에 복사하기

    AJAX와 JSON을 다루고 계신가요? Firebug는 JSON 응답을 살펴볼 수 있게 해 주고, JSON 트리의 일부를 클립보드로 복사할 수 있게 해 줍니다. 단지 (콘솔이나 네트워크(Net) 판넬이 있는)HTTP 요청을 확장하고, JSON 탭을 선택한 후에 트리의 한 항목을 우클릭하여 문맥 메뉴에서 선택하면 됩니다.

    구문 오류가 난 위치 표시

    오류가 발생했울 때, 콘솔 판넬에서 구문 오류가 발생한 줄의 정확한 위치를 화살표로 표시합니다.

    네트워크(Net) 판넬에 새로운 항목 추가: 프로토콜(Protocol)

    네트워크(Net) 판넬에 모든 요청에 대한 HTTP 프로토콜을 보여주는 Protocol 칼럼이 추가됐습니다. 이 칼럼을 사용하면 모든 요청을 프로토콜로 정렬해서 볼수 있습니다. 예를 들어, https 요청만 볼 수 있습니다. 이 칼럼은 기본적으로 보이지는 않습니다. 상단 부분을 우클릭하여 나오도록 설정해야 합니다.

    페이지 내에 엘리먼트를 빠르게 제거하는 기능

    잘 알려진 요소 검사(Inspector) 기능은 페이지 내에서 선택된 항목을 빠르게 제거할 수 있게 해 줍니다. 특정 요소를 선택한 후 Delete키를 누르면 페이지에서 현재 선택된 항목을 제거할 수 있습니다.

    함수 객체의 displayName 속성

    Firebug also supports a displayName function object property. You can use this property to specify custom function name for anonymous functions. Firebug is consequently using that property to display stack traces.

    Firebug는 또한 displayName이라는 함수 객체의 속성을 지원합니다. 이 속성은 익명 함수의 이름을 지정할 때 사용할 수 있습니다. 그로 인해 Firebug는 스택 추적을 보여줄때 이 속성의 이름을 사용합니다.

    모든 콘솔 로그에 출처 정보 표시

    이 부분은 간단한 새로운 기능입니다. 콘솔에 보여지는 모든 로그는 자신의 출처를 갖습니다(파일 url과 줄 번호). 당연히 Firebug는 출처 링크를 클릭하면 바로 소스틀 보여줍니다.

    HTTP 요청 재전송

    네트워크(Net) 판넬에 있는 HTTP 요청을 재전송할 수 있습니다. 원하는 항목을 우클릭한 후 메뉴에서 Resend을 선택하면 됩니다. 쉽고 멋집니다!

    조건적 중단점을 위한 툴팁

    스크립트(Script) 판넬은 조건적 중단점을 위한 툴팁을 표시합니다. 중단점에 대한 조건을 보기 위해서 조건 편집기를 열 필요가 없습니다.

    DOM 판넬의 "Add Watch"

    DOM 판넬의 문맥 메뉴에 Add Watch 명령이 새롭게 추가됐습니다. 이 명령은 개발자가 특정한 객체나 필드(구조상 서너 단계 깊이도 가능)를 찾아 바로 스크립트(Script) 판넬의 Watch 창에 추가하여 해당 객체나 필드를 자세히 보거나 계속 관찰할 수 있게 해 줍니다.

    브라우저 캐시로부터의 응답 헤더

    네트워크(Net) 판넬은 이제 브라우저 캐시로부터 온 응답에 대해서도 HTTP 헤더를 보여줍니다. HTTP 요청을 클릭하여 확장한 후 헤더 탭을 클릭하면 (캐시로부터 온 응답인 경우)아래 쪽에 새로운 섹션이 있습니다

    폰트 뷰어

    Firebug는 이번에 네트워크(Net) 판넬과 결합된 (*.woff 파일들을 위한)폰트 뷰어를 추가했습니다. 웹 페이지가 폰트 파일을 로딩하는 경우 해당 페이지 요청을 확장하면 다운로드된 폰트에 대한 모든 메타 데이터를 볼 수 있습니다. 멋지죠!

    폰트 툴팁

    디자이너를 위한 또하나의 좋은 지원이 있습니다. CSS 판넬(또는 스타일 사이드 판넬)에서 폰트에 마우스 커서를 올리면 폰트를 미리볼 수 있는 툴팁을 볼 수 있습니다.

    배열 항목에 대한 툴팁

    또 하나의 실용적인 기능 향상은 툴팁을 이용하여 배열을 살펴보고 디버깅하는 것도 관련돼 있습니다. 배열의 대괄호에 마우스 커서를 가져가면 캡쳐 화면처럼 배열에 들어 있는 실제 값을 볼 수 있습니다.

    지금 만나보세요!

    Honza

    원저자: Jan Odvarko – 원문으로 가기

  5. Firefox7에서 웹 개발자에게 새로운 점들

    오늘, 우리는 Firefox 7을 공개했습니다. 이번 업데이트에는 지난 석 달에 걸쳐 진행된 안정화 작업이 포함돼 있고, 몇 가지 얘기할 만한 흥미로운 것들이 포함돼 있습니다.

    분명히 얘기하지만, 이 글은 변경에 관한 정식 목록이 아니고 단지 주요 변화를 언급하는 글입니다. 언제나 그렇듯이 우리는 웹 개발자들이 내용을 알 수 있도록 변경된 사항을 확인할 수 있는 페이지를 만들었습니다. 전체 목록은 Firefox 7 for developers page를 보기 바랍니다.

    Firefox에서 text-overflow: ellipsis를 지원합니다.

    Firefox는 이제 text-overflow 속성에 ellipsis모드를 지원합니다. 이 속성은 다른 브라우저들에서도 지원하고 있기 때문에 개발자들은 이제 실무에서 이 속성을 사용할 수 있습니다. 다음은 text-overflow: ellipsis가 어떻게 동작하는지 보여주는 예입니다.

    HTML:

    <html>
    <body>
          <div class="inner">I am some very long text!</div>
    </body>
    </html>

    CSS:

    div.inner {
        width: 120px;
        text-overflow: ellipsis;
    
        white-space:nowrap;
        overflow:hidden;
     
        color: red;
    
        border: 1px dashed #333;
        margin: 20px;
    
        padding: 10px;
    }

    결과:

    결과에서 볼 수 있는 것처럼, 이 새로운 속성을 사용하여 텍스트를 적절히 잘라 표시하는 것은 매우 쉽습니다. 속성들을 설명하는개발자 페이지에는 다른 브라우저들을 위한 예제 구문이 포함돼 있습니다.

    웹소켓: 프로토콜이 갱신되었고 모바일에서 사용 가능합니다.

    먼저, Firfox 모바일 버전에서 웹소켓을 기본으로 사용할 수 있게 됐습니다. 지연 시간이 길고 초기 연결 설정 비용이 큰 모바일 네트워크를 위해, 웹소켓은 HTTP 폴링보다 훨씬 나은 경험을 갖게할 수 있는 기회를 제공합니다.

    두 번째로 IETF의 웹소켓 프로토콜 초안 가장 최신 버전을 적용했습니다. 다소 혼란스럽게도, 프로토콜의 버전은 8인데 반해 초안의 버전은 10입니다. 이 내용은 웹 소켓과 툴 상에서 애플리케이션을 개발하는 사람들에게는 촉각을 세우게 하는 소식일 것입니다. 하지만, 하위 호환성(backwards compatibility)을 유지하기 때문에 크게 염려하지 않아도 됩니다.

    웹소켓 개발은 계속 진행중이기 때문에, 웹소켓을 위한 이름공간(namespace)에는 아직 최종본이 아니라는 의미로 moz- 가 앞에 붙습니다.

    훨씬 더 빨리진 캔버스(Canvas) 엘리먼트

    Firefox 7에서 canvas 엘리먼트는 보다 더 빨라졌습니다. 우리는 이전 버전의 Firefox와 사람들이 실제로 캔버를 어떻게 사용하는지 알게된 것을 토대로 캔버스를 위한 코드를 변경했습니다. 캔버스 엘리먼트를 사용하여 그릴때, 다양한 데모를 통해서 보다 멋진 성능을 내도록 할 수 있습니다. 예를 들어, Runfield 데모를 보시기 바랍니다.

    웹 사이트가 더 이상 주 브라우저 창의 크기를 조정할 수 없습니다.

    다음에 나오는 규칙 따라 브라우저에서 웹사이트를 위해 더 이상 기본 창 크기를 변경할 수 없습니다.

    1. 창(window)이나 window.open으로 생성되지 않은 탭은 크기를 변경할 수 없습니다.
    2. 하나 이상의 탭을 가진 창 안에 있는 경우 창이나 탭의 크기를 변경할 수 없습니다.

    새로운 네비게이션 웹 타이밍(Navigation Web Timing) 명세 지원

    Firefox 7은 이제 네비게이션 타이밍 명세를 지원합니다. 이 명세는 웹 페이지를 만든 사람이 페이지 자체 내에서 웹 페이지 성능을 관찰할 수 있게 해 줍니다. 페이지의 적재 및 이동 성능에 대해 관심 있는 사람들을 위해, 실제 성능을 향상 시킬 수 있는 정보를 서버로 전송할 수도 있습니다.

    이 영역에 대해서는 두 가지 정도의 다른 명세 – 사용자 타이밍자원 타이밍 – 가 더 있습니다만, 아직 워킹그룹에서 논의 중에 있고, 그에 따라 우리도 아직 구현하지 않았습니다.

    원저자: Christopher Blizzard – 원문으로 가기

  6. WebAPI 소개

    모질라는 3 ~ 6개월 내에 기본적인 HTML5에 전화 경험을 제공하는 WebAPI를 소개하고자 합니다.

    현재 상황

    현재 우리가 있는 지점은, 웹과 네이티브 API간에 명확한 차이가 있다는 것과 장착될 기능들을 어떻게 구현되야 하는가 알고 있는 것입니다. 많은 개발자들이 인지하고 있는 것처럼, 우리는 단지 특정 기기나 제조사에 국한된 것이 아니라, 여러 브라우저와 운영체제 그리고, 단말기에서 일관되게 동작하는 API가 필요합니다. 웹을 다음 단계로 이끌 방법이 필요합니다.

    WebAPI?

    WebAPI는 웹과 네이티브 API를 연결하기 위한 모질라의 노력이며, 운영체제에 상관없이 모든 브라우저에서 동작하는 일관된 API를 갖고 있습니다. 명세 초안과 구현 프로토타입이 곧 사용가능하며, 표준화를 위해 W3C에 제출될 것입니다. WebAPI에서 보안은 매우 중요한 요소입니다. 이를 위해 현재의 보안 수준에 준하는 기능들을 채용하거나(예, 지오로케이션처럼 사용자에게 권한 요청), 새로운 대안이 적용될 것입니다.

    근 시일내에 개발될 기능들은 다음과 같습니다.

    • Dialer: Telephony & Messaging API, Contacts API
    • Address Book: Contacts API
    • SMS: Telephony & Messaging API, Contacts API
    • Clock
    • Camera: Camera API, Filesystem API
    • Gallery: Filesystem API (could possibly be FileReader & FileWriter in conjunction)
    • Calculator
    • Settings: Device Status API, Settings API
    • Games: Accelerometer API, Mouse Lock API
    • Maps: Geolocation API, Contacts API

    참여

    우리는 외부에 참여를 원하는 재능 있는 분들이 매운 많다는 것을 알고 있습니다. 그러므로, 다음과 같은 방법들로 즐겁게 참여해 주시기 바랍니다.

    개발자 채용

    우리는 또한 WebAPI를 작업할 몇 명의 전시간 개발자를 채용하고 있습니다.채용 정보를 읽어보시고 지원해 주세요.

    원저자: Robert Nyman – 원문으로 가기

  7. JSMad – 자바스크립트 MP3 디코더

    최근의 브라우저들과 거기에 탑재된 자바스크립트 엔진의 속도는 항상 저를 놀라게 합니다. 그리고, 사용자가 설치해야만하고 (더 중요한 것은) 계속 최신 버전으로 유지해야하는 플러그인에 의존하지 않고, 브라우저 내에서 많은 것들을 해내려고 하는 창조적인 분들 역시 저를 놀라게 합니다.

    JS MAd

    가장 최근에 “오~!!”하면서 놀란 것은 아모스 웽거와 젠스 노커트, 매티아스 조지가 만든 jsmad(GitHub에 있는 소스)입니다. JSMad는 자바스크립트로 만든 MP3 디코더입니다!

    “그게 뭐?”라고 말하실지 모르겠는데요, JSMad가 만들어졌다는 의미는 Firefox가 플래시 없이 MP3를 플레이할 수 있다는 뜻입니다. 또한, 리눅스 상에서 64bit 문제 없이 브라우저로 MP3를 들을 수 있다는 얘기입니다. JSMad와 함께하면 MP3 형식을 좀 더 깊게 살펴볼 수 있고, 음악을 플레이할 뿐만 아니라 MP3에 대한 정보도 얻을 수 있습니다. 아마, 머지않은 장래에 순수하게 브라우저에서 동작하는 DJ 믹서나, 샘플러, 시퀀스 프로그램들을 만들 수 있을 것입니다.

    현재, JSMad는 Firefox 4 이상의 버전과 about:flags를 통해 웹 오디오 API를 활성화한 크롬 13버전 이상에서 동작합니다.

    MP3가 처음 나왔을 때가 기억나네요. 그 당시에 제 컴퓨터는 너무 느려서 윈앰프만 하나만 실행시켜야 겨우 MP3 인코딩을 할 수 있었습니다. 당시에, 씬 플레이어(a scene player)가 저를 구출해줬던 기억이납니다. 이제, 우리는 같은 작업을 데스크톱 애플리케이션이 아닌 브라우저 내에서 할 수 있습니다.

    원저자: Chris Heilmann – 원문으로 가기

  8. 파일 업로드를 재개하는 방법

    이 글은 객원 기고가인 사이몬 스파이크가 작성한 글입니다. 사이몬은 웹 개발자이며, 웹 표준 신봉자이자 모질라 0.8(!)부터 모질라 애호가입니다.

    이번 글은 사이먼이 파일 API와 Firefox 4에서 새롭게 소개된 slice() 메소드를 가지고 실험한 내용입니다. 여기에 사이먼이 구현한 파일 업로드를 재개방법이 설명돼 있습니다.

    XHR 레벨 2 객체를 사용하면 파일을 업로드 할 수 있습니다. 이 객체는 요청(예: 파일 전송, 전송 과정 확인)과 응답(예: 업로드가 성공했는지 아니면 오류가 발생했는지)을 다루는 서로 다른 이벤트와 메소드를 제공합니다. 더 자세한 정보는 HTML5 이미지 업로더 개발 방법을 읽어보시기 바랍니다.

    아쉽게도, XHR 객체는 업로드를 중단하거나 재개하는 메소드를 제공하지 않습니다. 하지만, 새로운 File API의 slice() 메소드와 XHR의 abort() 메소를 조합하면 이를 구현할 수 있습니다. 그 방법을 함께 알아 봅시다.

    라이브 데모

    파일 업로드 라이브 데모를 여기에서 확인하거나, github.com에서 자바스크립트와 PHP 코드를 다운로드 할 수 있습니다.

    업로드 중단과 재개

    기본적인 생각은 사용자에게 진행중인 업로드를 중단하고 후에 다시 재개할 수 있는 버튼을 제공하는 것입니다. 요청을 중단하는 것은 간단합니다. 간단히, abort()를 메소를 통해 요청을 중단합니다. 다만, 주의할 점은 요청을 중단할 때, 사용자 인터페이스에서 이를 오류로 표시하지 않아야 한다는 것입니다.

    더 어려운 부분은 요청이 중단 되고 연결이 닫힌 후에 업로드를 재개하는 부분입니다. 파일 전체를 다시 전송하는 대신에 blob의 slice() 메소를 사용하여 파일의 나머지 부분을 포함하는 덩어리(chunk)를 만들 것입니다. 그런 후에 새로운 요청을 만들고, 그 덩어리를 전송하며 이를 이전 요청이 중지 됐을 때 서버에 저장된 부분에 추가할 것입니다.

    나머지 부분(chunk) 만들기

    파일 나머지 부분(chunk)은 다음과 같이 만들 수 있습니다.

    var chunk = file.slice(start, length);

    파일을 자르기 위해 필요한 정보는 자를 시작점입니다. 즉, 이미 업로드된 바이트 수를 알아야 합니다. 가장 쉬운 방법은 요청을 중단하기 전에 ProgressEvent의 loaded 속성의 값을 저장하는 것입니다. 하지만, 이 값은 실제 서버에서 저장된 바이트 수와 일치하지 않을 수 있습니다. 가장 신뢰있는 접근 방법은 추가적인 요청을 통해 서버에 실제 저장된 바이트 수를 받는 것입니다. 그런 후에 이 정보를 가지고 파일을 자르고 전송할 덩어리(chunk)를 만듭니다.

    흐름 정리

    (업로드가 이미 진행 중이라고 가정합니다)

    1. 사용자가 업로드를 멈춘다
    2. UI 상태는 멈춤 상태로 설정된다
    3. 업로드를 중단한다
    4. 서버에서 디스크에 파일 쓰는 작업이 중단된다
    5. 사용자가 업로드를 재개한다
    6. UI 상태는 재개로 설정된다
    7. 서버로부터 이미 저장된 파일 크기를 얻는다
    8. 파일의 남은 부분을 자른다(덩어리)
    9. 남은 부분(chunk)을 업로드한다
    10. UI 상태를 업로드 중으로 설정한다
    11. 서버는 데이터를 추가로 붙인다

    자바스크립트 코드

    // 방금 막 이미 써진 바이트 수를 알기위해 요청했고,
    // xhr.result에 서버의 응답이 xhr.result에 담겨 있다고 가정.
    var start = xhr.result.numWrittenBytes;
    var length = file.size - start;
    
    var chunk = file.slice(start, length);
     
    var req = new XMLHttpRequest();
    
    req.open('post', 'fnc.php?fnc=resume', true);
     
    req.setRequestHeader("Cache-Control", "no-cache");
    
    req.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    req.setRequestHeader("X-File-Name", file.name);
    
    req.setRequestHeader("X-File-Size", file.size);
     
    req.send(chunk);

    PHP 코드

    서버에서 일반적인 업로드와 재개된 업로드를 다루는데 있어 유일하게 다른 점은, 후자의 경우 파일을 새로 생성하는 대신에 기존의 파일에 데이터를 추가한다는 것입니다.

    $headers = getallheaders();
    $protocol = $_SERVER[‘SERVER_PROTOCOL’];
    
    $fnc = isset($_GET['fnc']) ? $_GET['fnc'] : null;
    
    $file = new stdClass();
    $file->name = basename($headers['X-File-Name']));
    
    $file->size = $headers['X-File-Size']);
     
    // php://input 은 php.ini 설정을 무시하기 때문에, 파일 크기를 직접 제한해야함 
    $maxUpload = getBytes(ini_get('upload_max_filesize'));
    
    $maxPost = getBytes(ini_get('post_max_size'));
    $memoryLimit = getBytes(ini_get('memory_limit'));
    
    $limit = min($maxUpload, $maxPost, $memoryLimit);
    if ($headers['Content-Length'] > $limit) {
    
      header($protocol.' 403 Forbidden');
      exit('File size to big. Limit is '.$limit. ' bytes.');
    
    }
     
    $file->content = file_get_contents(’php://input’);
    $flag = ($fnc == ‘resume’ ? FILE_APPEND : 0);
    
    file_put_contents($file->name, $file->content, $flag);
     
    function getBytes($val) {
    
     
    $val = trim($val);
          $last = strtolower($val[strlen($val) - 1]);
    
          switch ($last) {
              case 'g': $val *= 1024;
    
     
    case 'm': $val *= 1024;
     
    case 'k': $val *= 1024;
    
          }
     
    return $val;
    }

    Caution!

    주의!

    위에 있는 PHP 코드 예제는 보안 관련 부분이 전혀 업습니다. 사용자는 어떠한 유형의 파일이라도 여러분의 서버에 쓰거나, 붙여 쓰거나, 덮어 쓸 수 있습니다. 그러므로, 여러분의 웹 사이트에 업로드 기능을 사용할 때는 적절한 보안 정도를 분명히 적용해야 합니다.

    오류가 발생한 후에 업로드 재개

    업로드 중단 및 재개 흐름은 네트워크 오류가 발생한 후에 업로드를 계속하고자 할 때도 사용할 수 있습니다. 전체 파일을 다시 업로드 하는 대신에 서버로부터 이미 쓰여진 파일 크기를 받고 남은 크기 만큼을 덩어리로 자릅니다.

    중지 했거나 전송이 끊긴 파일 업로드를 재개할 때 기억할 점

    요청이 중단됐을 때 서버에서 뭘 쓰는지 안 쓰는지까지 모두 제어할 수 없기 때문에, 이미 올라간 파일에 데이터를 추가하는 작업은 파일을 깨지게 할 수 있습니다.

    브라우저 충돌 후에 업로드 재개

    업로드 중단 및 재개 기능을 보다 나아가서 사용할 수 도 있습니다. (적어도 이론적으로) 브라우저가 뜻하지 않게 종료되거나 충돌이 일어나 업로드가 중단된 경우에도 이를 복구하는 것이 가능합니다. 문제점은 브라우저가 닫힌 후에는 메모리로 읽어들인 파일 객체가 사라진다는 것입니다. 그러므로, 업로드 재개를 위해 파일을 자르기 전에 사용자가 먼저 파일을 다시 선택하거나 드래그 해야 합니다.

    다른 방법으로, 새로운 IndexedDB API를 사용하여 업로드가 끝나기 전에 파일을 저장할 수 있습니다. 그러면, 브라우저 충돌이 일어난 후에 데이터베이스로부터 파일을 읽어와 업로드 안 된 부분을 자르고 업로드를 재개할 수 있습니다.

    원저자: Paul Rouget – 원문으로 가기

  9. Firebug 1.7의 새로운 기능들

    Firefox 4를 온전히 지원하는 Firebug 1.7이 출시됐습니다. 그리고, 이번 버전에서 새로 소개된 몇몇 기능들을 설명하는 기회를 놓칠 수 없어 이렇게 이글을 씁니다.

    Firebug 블로그를 구독하지 않거나 Firebug에 익숙치 않은 분들은 Firebug 세계를 좀 더 상세히 설명해 주는 다음과 같은 링크들을 확인해 보시기 바랍니다.

    DOM 저장소(Storage)

    DOM 저장소는 이제 많은 웹 애플리케이션에서 중요한 부분이 되고 있습니다. 그래서, 우리는 DOM 패널(panel)을 통해 모든 (전역, 세션, 지역) DOM 저장소 객체의 내용을 쉽게 사용할 수 있게 만들었습니다.

    또한 이런한 객체들의 로그를 남기기 위해 콘솔 패널을 사용할 수 있습니다. 예를 들어, 명령행에서 window.sessionStorage를 실행하면, 다음과 같은 출력이 나타납니다.

    물론, 페이지 내에서 표준 console.log API를 사용하여 DOM 저장소 객체를 로그로 남길 수 있습니다. 두 방법 모두 결과는 같습니다.

    큰 명령행 이력(Large Command Line History)

    알고 계신 것처럼 Firgbug에는 두 가지 명령행 방식이 있습니다. 한줄 방식은 작은 명령행(Small Command Line)으로 불리고, 여러줄 방식은 큰 명령행(Large Command Line)이라고 불립니다. 한가지 새로운 점은 큰 명령행 방식으로 전환하는 경우 이전에 수행한 명령어들의 이력(history)이 남아 이를 실행할 수 있다는 것입니다.

    이력(history)이 없는 경우에는 비활성화되고, 그렇지 않은 경우에는 클릭하여 목록을 확인할 수 있습니다. 또 하나의 새로운 기능이 다음 그림에 묘사돼 있습니다. 작은 명령행(Small Command Line) 방식에서도 왼쪽에 있는 버튼을 클릭함으로써 같은 목록을 확인할 수 있습니다.

    날짜 객체 로그 남기기

    날짜 객체를 로그로 남길 수 있는 기능은 Firebug 콘솔 로그에서 작지만 멋진 향상된 기능입니다. Date() 객체의 인스턴스를 로그로 남기면…

    …인스턴스의 실제 값을 볼 수 있습니다. 저는 이 모든 작은 기능들이 Firebug 브라우저에 내장되는 개발 도구 중에 대표주자로 유지 시켜줄 것이라고 믿어 의심치 않습니다.

    산출된 스타일 정렬(Sort Computed Styles)

    이제 산출된 스타일들(computed styled)의 목록을 알파벳 순으로 정렬할 수 있습니다.(HTML 패널에서 가장자리에 있는 Computed 패널에서 사용 가능)

    기본 정렬은 범주(category)입니다

    중단 알림 메시지(Break Notification messages)

    중단 알림 메시지 UI가 재설계 됐습니다. 그래서, 알림 메시지 자체가 최대한 간단한 UI를 갖습니다.

    이런 변경 사항은 디버거를 통해 중단점을 사용할 때 의심할 여지없이 가장 중요한 일인, 사용자가 실제적으로 소스 코드를 보는 데 도움이 됩니다. 그림에서 볼 수 있는 것처럼(약간 번지기는 했지만 글씨를 읽을 수는 있죠), 알림 기능을 비활성화 할 수 있습니다. UX는 직관적이어야 하며, 빠르게 다시 활성화 할 수 있어야 합니다.

    향상된 속성 표시

    DOM 패널에 엘리먼트의 속성 목록을 표시하는 방법이 개선됐습니다(이번 개선은 제 개인적으로 오랜 동안의 바램이었습니다). 다음 그림을 보시기 바랍니다.

    일반적으로 엘리먼트 속성 목록에서 원하는 것은 이름과 값입니다. 이 내용이 바로 이번 변화의 핵심입니다(이전에 이러한 정보를 얻기 위해서는 얼마나 힘들었는지는 아마 모르시는게 좋을 겁니다). 물론, 개개의 속성(DOM 노드에 해당)에 대한 모든 DOM 요소들을 알고 싶다면, 단지 원하는 항목에 클릭을 하고 더 자세히 살펴보면 됩니다.

    파이어버그 시작 버튼 변경

    파이어폭스4에 변화된 내용 중 하나는 상태 막대(status bar)가 없다는 것입니다. 상태 막대는 실질적으로 부가기능모음으로 대체됐지만… 요즘 추세가 브라우자 하단에 아무 것도 가지고 가지 않는 것입니다. 파이어버그의 진입점이 상태 막대였던 관계로, 우리는 대안을 마련할 수 밖에 없엇습니다.

    이 버튼은 설치 후 자동으로 파이어폭스 툴바에 추가됩니다. 이 버튼은 상태 막대에 있던 이전 버전의 아이콘과 정확히 같은 역할을 합니다. 만약 이러한 UI에 익숙치 않게 느껴진다면 부가기능모음을 활성화 하여 거기에 있는 시작 버튼을 사용하면 됩니다.

    시작 버튼과 관련된 더 자세한 내용은 여기를 보세요.

    특정 스크립트 행으로 빠른 스크롤

    사용자들이 스크립트 패널 등에서 특정 줄로 점프하는 기능에 대해서 잘 모른다는 생각이 들어 이를 보다 직관적으로 만들었습니다.

    특정 줄로 이동하기 위해서 필요한 것은 # + 줄번호가 전부입니다(엔터를 누를 필요도 없습니다).

    줄번호를 치면 스크립트 패널의 내용은 자동으로 스크롤 되고 해당 줄은 강조됩니다.

    새로운 확장 API

    Firebug architecture has been well improved and there are two new extension points that are worth mentioning.

    Firebug 구조는 좋게 개선됐으며, 다음과 같은 새로운 두가지 확장 접점이 생겼습니다.

    Honza

    원저자: Honza – 원문으로 가기

  10. HTML5 이미지 업로더 개발 방법

    HTML5에는 정말 놀라운 API들이 포함 돼 있습니다. 이러한 API를 <canvas> 엘리먼트와 조합하면, 강력하고 현대적이며 놀라운 이미지 업로더를 만들 수 있습니다. 이 글은 그런 이미지 업로더를 만드는 방법을 설명합니다.

    여기에서 소개하는 모든 팁들은 Firefox 4에서 잘 동작합니다. 또한 웹킷 기반의 브라우저들에서도 문제없이 동작하는 대체 방법들도 기술하였습니다. API의 대부분은 IE에서는 동작하지 않지만, 그에 대한 대비책으로 일반적인 폼을 사용하는 것은 매우 쉽습니다.

    여러분이 만약 이러한 기술들 중 하나를 자신의 프로젝트에 사용하게 된다면 우리에게 알려주시기 바랍니다.

    이미지 읽기

    드래그 앤 드롭

    파일을 업로드 하기 위해서는 <input type=”file”> 엘리먼트가 필요합니다. 하지만, 사용자가 데스크톱에서 웹 페이지로 이미지를 드래그 앤 드롭하게 하는 것도 지원하는 것이 좋습니다.

    드래그 앤 드롭에 대한 자세한 내용은 제가 이전에 작성한 드래그 앤 드롭을 지원하는 웹 페이지 구현에 설명돼 있습니다.

    또한, 모질라 튜토리얼의 드래그 앤 드롭을 살펴보는 것도 도움이 됩니다.

    다중 input

    사용자가 파일 선택 창에서 업로드할 파일을 동시에 여러개 선택할 수 있습니다.

    <input type="file" multiple>

    Again, here is an article I’ve written about multiple file selection.

    다중 파일 선택과 관련해서도 다중 파일 선택이라는 제가 작성한 글이 있습니다.

    파일 전처리

    File API 사용

    (자세한 내용은 File API 문서를 참조하세요)

    드래그 앤 드롭이나 <input> 엘리먼트로 부터 선택된 파일 목록을 다음과 같은 방법으로 얻을 수 있습니다.

    // input 엘리먼트에서
    
    var filesToUpload = input.files;
    // 드래그 앤 드롭
    function onDrop(e) {
    
      filesToUpload = e.dataTransfer.files;
    }

    선택된 파일들이 실제 이미지들인지 확인합니다.

    if (!file.type.match(/image.*/)) {
    
      // 이미지가 아닌 파일
    };

    썸네일(미리보기) 보여주기

    두가지 옵션이 있습니다. 파일 API의 FileReader 를 사용하거나, 새로운 createObjectURL() 메소드를 사용할 수 있습니다.

    createObjectURL()

    var img = document.createElement("img");
    img.src = window.URL.createObjectURL(file);

    FileReader

    var img = document.createElement("img");
    var reader = new FileReader();  
    
    reader.onload = function(e) {img.src = e.target.result}
    
    reader.readAsDataURL(file);

    캔버스 사용

    일단 <img> 엘리먼트에 이미지 미리보기를 하면, 이 이미지를 파일 전처리를 위해 <canvas> 엘리먼트에 그릴 수 있습니다.

    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0);

    이미지 크기 조절

    사용자들은 카메라에서 찍은 이미지를 그대로 업로드 하는 데 익숙합니다. 이런 이미지들은 매우 고 해상도 이고 아주 크기가 큰 파일들입니다(수 메가 바이트). 용도에 따라 이런 이미지들의 크기를 조절하기를 원할 수 있습니다. 아주 간단한 트릭은 작은 캔버스(예를 들어 800×600)를 준비하고, 이미지 태그를 이 캔버스에 그리는 것입니다. 물론 이미지의 비율을 유지하기 위해서 캔버스의 크기(dimensions)를 변경해야 합니다.

    var MAX_WIDTH = 800;
    var MAX_HEIGHT = 600;
    
    var width = img.width;
    var height = img.height;
    
     
    if (width > height) {
      if (width > MAX_WIDTH) {
        height *= MAX_WIDTH / width;
    
        width = MAX_WIDTH;
      }
    } else {
      if (height > MAX_HEIGHT) {
    
        width *= MAX_HEIGHT / height;
        height = MAX_HEIGHT;
    
      }
    }
    canvas.width = width;
    canvas.height = height;
    
    var ctx = canvas.getContext("2d");
    ctx.drawImage(img, 0, 0, width, height);

    이미지 편집

    이제 이미지를 캔버스에 올렸습니다. 기본적으로, 할 수 있는 일은 무궁무진합니다. 예를 들어 세피아 필터를 적용하고 싶다면 다음과 같이 하면 됩니다.

    var imgData = ctx.createImageData(width, height);
    
    var data = imgData.data;
    var pixels = ctx.getImageData(0, 0, width, height);
    
    for (var i = 0, ii = pixels.data.length; i < ii; i += 4) {
    
        var r = pixels.data[i + 0];
        var g =pixels.data[i + 1];
    
        var b = this.pixels.data[i + 2];
    
        data[i + 0] = (r * .393) + (g *.769) + (b * .189);
    
        data[i + 1] = (r * .349) + (g *.686) + (b * .168)
    
        data[i + 2] = (r * .272) + (g *.534) + (b * .131)
    
        data[i + 3] = 255;
    }
    ctx.putImageData(imgData, 0, 0);

    XMLHttpRequest를 사용하여 업로드

    클라이언트에 이미지를 적재했으니, 다음은 이를 서버로 전송하는 것입니다.

    캔버스를 전송하는 방법

    또 다시 두 가지 옵션이 있습니다. 캔버스를 데이터 URL로 변환 할 수도 있고, (Firefox 상에서) 캔버스를 이용해 파일을 생성할 수도 있습니다.

    canvas.toDataURL()

    var dataurl = canvas.toDataURL("image/png");

    캔버스를 이용하여 파일 생성

    var file = canvas.mozGetAsFile("foo.png");

    유연한 업로드

    사용자에게 하나의 파일이나 또는 선택한 파일 전체를 한 번에 업로드할 수 있게 합니다.

    업로드 진행상황 보여주기

    프로그레스바를 생성하기 위해서 업로드 이벤트를 사용합니다.

    xhr.upload.addEventListener("progress", function(e) {
    
      if (e.lengthComputable) {
        var percentage = Math.round((e.loaded * 100) / e.total);
    
        // 필요한 작업 수행
    }, false);

    FormData 사용

    여러분은 단지 (xhr.send(file)를 사용하여 쉽게 할 수 있는) 파일만 업로드 하는 것을 원하지 않을 것이며, 아마 (키와 이름 같은)부가적인 정보를 추가하여 업로드 하는 것을 원할 것입니다.

    이런 경우, FormData 객체를 사용하여 multipart/form-data 요청을 생성하는 것이 필요합니다(Firefox 4: FormData를 사용하여 JS로 보다 쉽게 폼 다루기 참조).

    var fd = new FormData();
    fd.append("name", "paul");
    
    fd.append("image", canvas.mozGetAsFile("foo.png"));
    fd.append("key", "××××××××××××");
    
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "http://your.api.com/upload.json");
    
    xhr.send(fd);

    자신의 API를 공개하는 방법

    자신의 서비스를 다른 웹사이트에서 사용하도록 허용하기를 원할 수 있습니다.

    교차 도메인 요청 허용

    기본적으로 여러분의 API는 자신의 도메인으로부터 오는 요청만 허용할 것입니다. 만약에, 사람들이 여러분의 API를 사용하도록 허락하려면, 다음과 같은 HTTP 헤더를 추가하여 교차 XHR를 허용하면 됩니다.

    Access-Control-Allow-Origin: *
    

    또한 미리 지정한 도메인들만 허용할 수도 있습니다.

    교차 사이트 자원 공유를 읽어보기 바랍니다.

    postMessage

    (이 팁과 관련하여 다니엘 굳윈에게 감사를 전합니다.)

    또한, postMessage를 통해 보낸 메시지를 수신할 수 있습니다. 사용자가 다음과 같이 postMessage를 통해서 여러분의 API를 사용하도록 할 수 있습니다.

    document.addEventListener("message", function(e){
        // e.data에서 인수 읽기
        var key = e.data.key;
    
        var name = e.data.name;
        var dataurl = e.data.dataurl;
    
        // 업로드
    }
    // 일단 업로드가 완료되면 원래의 창에 postMessage를 보낼 수 있음

    여기까지입니다. 이와 관련하여 공유할만한 다른 팁이 있는 분은 자유롭게 댓글을 남겨 주세요.

    Enjoy ;)

    원저자: Paul Rouget – 원문으로 가기