 |  |
|
난이도 : 중급 Uche Ogbuji, 파트너, Zepheira, LLC
옮긴이: 박재호 이해영 dwkorea@kr.ibm.com
2008 년 7 월 01 일 모질라 파이어폭스 3은 여러 가지 개선 사항이 추가된 주요 릴리스 버전으로, 몇몇 기능은 최종 사용자를 대상으로 하며, 몇몇 기능은 개발자를 대상으로 합니다. 가장 흥미로운 기능 개선은 사용자가 인터넷에서 접속이 끊어진 상태에서도 동작하는 웹 응용 프로그램 개발 지원입니다. 이 기사에서는 특히 오프라인 응용 프로그램 지원 관점에서 새롭게 선보인 파이어폭스 3 기능을 살펴보겠습니다.
파이어폭스는 모질라 프로젝트 제품 중 가장 큰 성공을 거뒀다. 2004년에 처음 출시된 시점부터 업계 선두 웹 브라우저인 마이크로소프트(Microsoft®) 인터넷 익스플로러(MSIE) 판올림 지연과 많은 보안 문제 때문에 웹 브라우저 암흑기에 상당한 인기를 끌었다. 파이어폭스 신드롬에 대응하기 위해 마이크로소프트는 MSIE 개발에 자원을 투입했지만, 새로운 경쟁자의 발걸음을 느리게 만들지는 못했다. 모질라 재단에 따르면, 45개 언어 지원에 힘입어 파이어폭스 사용자가 전세계를 통틀어 거의 2억 명에 이른다고 한다. 모질라는 소프트웨어 분야에서 24시간 동안에 가장 많은 다운로드 횟수라는 기네스 세계 기록을 달성하기 위한 행사를 계획 중이다(역주: 행사는 끝났고 800만 회 이상 다운로드된 것으로 알려져 있다). 이 기록을 달성하기 위해 준비 중인 소프트웨어는 신형 웹 브라우저인 파이어폭스 3.0으로 2008년 여름에 배포 계획이 잡혀 있다(역주: 지난 6월 17일 발표됐다). 이미 RC(Release Candidate) 형태로 배포되었는데, RC는 개발자들이 다음 배포 버전을 완벽한 최종 3.0 버전이라 확신하고 있다는 의미다. 파이어폭스 3은 웹 개발을 좀 더 즐겁게 진행하도록 만들며, 오프라인 지원을 비롯하여 실용적인 범용 응용 프로그램 플랫폼으로 브라우저를 활짝 열어 놓았다. 이 기사에서는 새로운 파이어폭스 3.0 개선판을 통해 얻는 가장 중요한 장점을 설명하겠다.
모든 사람을 위한 새로운 기능
사람들이 파이어폭스 3.0에 열광하는 이유는 웹 사용자와 개발자를 동시에 고려해 인상 깊은 개선 사항을 약속했기 때문이다. 이런 약속이 중요한 이유는 웹 개발자들이 선호하는 개발 플랫폼으로 파이어폭스를 사용해왔기 때문이다. 심지어 교차 브라우저 호환성을 보장해야 한다는 사실을 알면서도 파이어폭스를 선호한다. 개발자들 사이에서 파이어폭스가 인기를 얻은 까닭은 역동적인 공동체, 엄격한 표준 지원, 플랫폼에서 꾸준한 혁신이 있었기 때문이다. 플랫폼에서 꾸준한 혁신은 개발자가 웹 경향을 놓치지 않고 앞서 나갈 기회를 주며, 최신 표준 지원은 첨단을 달리고 있음을 의미한다. 파이어폭스는 새로운 표준 채택 과정을 가속화하고 호환성 높은 기능을 투명하게 제공한다. 한 걸음 더 나아가 파이어폭스는 새 버전에서 더 많은 기능을 추가했다. 배포 노트를 보면 다음과 같이 언급한 내용이 나온다.
파이어폭스 3은 게코 1.9 웹 렌더링 플랫폼에 기반을 두며, 이 플랫폼은 지난 33개월 동안 개발이 꾸준히 진행되어 왔다. 직전 배포판을 기반으로 게코 1.9에는 성능, 안정성, 렌더링 정확성, 코드 단순성과 지속 가능성을 개선하기 위한 주요 아키텍처 수정을 비롯해 개선 사항이 1만 4000가지 이상 존재한다. 파이어폭스 3.0은 좀 더 안전하고 사용하기 쉽고 웹 사이트와 파이어폭스 부가 기능 개발자에게 필요한 많은 기능을 내부 엔진에서 제공함으로써 개인용 제품을 지향하는 새로운 플랫폼 위에 만들어졌다.
"14,000"은 "사람을 깜짝 놀라게 하는 요소"로도 볼 수 있겠지만, 유용한 개선 사항이 많으며 이 중에서 상당수는 살펴볼 가치가 있다.
스크립트 취약점 개선부터 피싱 방어에 이르기까지 여러 가지 보안 강화 기능이 추가되었는데, 이런 보안 강화는 악성 코드를 작성하지 않는 이상 여러분 작업에 영향을 미치지는 못한다. 또 다른 개선 사항은 좀 더 나은 다운로드와 암호 관리 기능, 깔끔한 페이지 확대 기능, 맥, 윈도우(Windows®), 리눅스(Linux®)에서 좀 더 운영체제와 밀접한 행동 방식 등 사용성을 높인 것이다. 새로운 책갈피 기능은 아주 강력하며, 정적인 계층 구조 대신 다중 태그를 지원한다. 또한 웹을 통한 개인적인 탐색 관리와 추적을 지원하는 플레이스라는 새로운 기능이 추가되었는데, 이렇게 훨씬 더 풍부해진 열어본 페이지 목록 기능과 결합한 형태로 책갈피 기능이 개선되었다.
오프라인 지원
파이어폭스 3은 HTML 5 표준에 기반을 두고 사용자가 오프라인인 경우에도 작업을 계속하도록 도와주는 기능을 제공한다. 사용자는 여러 가지 방식으로 정적인 웹 페이지를 온라인으로 유지할 수 있다. 브라우저 캐시, 지역 캐싱 프록시, 웹 내용을 디스크로 내려받는 방식이 대표적이다. 웹에서 우리가 하는 작업이 점점 더 동적인 성향이 커지고 있다. 웹 메일이나 피드 읽기, 좋아하는 상점 뒤지기, 좋아하는 소셜 네트워크 활용과 같은 예를 생각해보자. 심지어 좀 더 표준적인 생산성을 높이는 응용 분야도 온라인 문서 편집기, 온라인 계산표, 온라인 발표자료 작성 도구는 물론이고 위키와 같은 새로운 범주를 통해 웹을 활용한다. 이런 응용 프로그램은 네트워크가 끊어져 있을 경우에도 문제없이 사용이 가능할 때 훨씬 더 큰 가치를 제공한다. 파이어폭스 3은 웹 응용 프로그램에서 이런 기능을 제공하도록 만들어준다. 웹 개발자에게 가장 흥미로운 선물이 될 새로운 기능을 좀 더 자세히 살펴보자.
첫 번째 온라인/오프라인 퍼즐 조각은 오프라인에서 사용 가능한 응용 프로그램 캐시라는 지역 캐시에 웹 응용 프로그램이 필요한 자원을 저장하도록 웹 브라우저에 명령을 내리는 기능이다. 일반적으로 웹 페이지, 스타일 시트, 스크립트 파일, 자주 변하지 않는 기타 필요한 파일을 저장하기 위해 이 캐시를 활용한다. 이렇게 하려면 응용 프로그램을 위한 URI를 등록해야 하는데, 이 URI는 온라인에 대응해 동기화하도록 파이어폭스가 관리하는 자원 집합을 정의한다. document 엘리먼트(예: html)에서 manifest 속성을 활용해 응용 프로그램을 위한 캐시를 설정한다.
두 번째 퍼즐 조각은 자동 응용 프로그램 캐시 관리자가 다루지 못하는 작업을 수행하기 위해 사용자가 온라인이나 오프라인 상태로 떨어지는 시점을 아는 방법이다. 파이어폭스 2는 navigator.onLine이라는 이진 스크립트 속성을 제공했는데, 일반적으로 파이어폭스 메뉴에서 사용자가 수동으로 오프라인 모드를 선택했을 때 이 속성이 바뀐다. 파이어폭스 3부터는 네트워크 사용이 불가능한 시점을 브라우저가 감지할 때 이 속성이 자동으로 갱신된다. 또한 온라인 상태가 변경되면 스크립트 이벤트를 호출한다. 이런 이벤트를 감시하는 방법으로, 오프라인 환경에서 응용 프로그램 행동 양식을 완벽하게 통제할 수 있다.
오프라인 응용 예제
파이어폭스 3 프리-알파 버전에서 오프라인 지원을 발표한 직후, 모질라 개발자인 Mark Finkle은 자그마한 개발자용 예제를 만들었다. 이 예제는 웹 페이지의 응용 프로그램 캐시 버전으로 사용자 항목을 집어넣는 스크립트를 활용한 작업 목록 도구다. 응용 프로그램 캐시를 사용했기에 온라인이거나 오프라인이거나 무관하게 웹 페이지가 돌아가며, 사용자 자료도 그대로 유지된다. Mark의 허락을 얻어 이번 기사를 위해 예제를 개선했다. Listing 1(todo.html)은 응용 프로그램을 위한 주 HTML 파일이다.
Listing 1. 작업 목록 응용 프로그램을 구성하는 주 HTML(todo.js)
<html manifest="todo.manifest">
<head>
<title>Todo tool</title>
<script type="text/javascript" src="json2.js"></script>
<script type="text/javascript" src="todo.js"></script>
<style type="text/css">
body { font-family: verdana,tahoma, arial; }
div#container { width: 300px; }
div#title { font-size: 120%; }
div#subtitle { font-size: 80%; }
div#tasklist { margin-bottom: .5em; }
div#log { font-size: 90%; background-color: lightgray; margin-top: 1em;
white-space: pre; }
</style>
</head>
<body onload="loaded();">
<div id="container">
<div id="title">Todo tool <span id="status">online*</span></div>
<div id="subtitle">Simple online/offline demo for Firefox 3</div>
<hr />
<div id="tasklist">
</div>
<input type="text" id="data" size="35" />
<input type="button" value="Add" onclick="addItem();"/>
<hr />
<input type="button" value="Remove" onclick="removeItems();"/>
<input type="button" value="Complete" onclick="completeItems();"/>
<div id="log"><strong>Event Log</strong>
</div>
</div>
</body>
</html>
|
첫 행에 나온 속성인 manifest="todo.manifest"에 주목하자. 이 값은 manifest URL을 지정하기 위해 HTML 페이지의 기본 URL과 결합한 상대 URL이다. 실제 내용은 Listing 2에 나온다.
Listing 2. 작업 목록 응용 프로그램을 구성하는 자원 캐시 manifest(todo.manifest)
CACHE MANIFEST
# v1
todo.html
json2.js
|
형식은 상당히 간단하다. 주의를 기울여야 하는 부분은 v1 주석이다. manifest에 파일을 갱신하면, (예를 들어 v2와 같이) 이 텍스트도 갱신해야 한다. 브라우저가 manifest 파일 변경을 감지하면, (심지어 변경되지 않았을지라도) 자동으로 열거된 모든 파일의 새 버전을 가져온다. Listing 1로 돌아가서, 작업 목록 항목은 <div id="tasklist"></div> 내부에 표현되며, 스크립트를 통해 동적으로 갱신된다. 메모리에 올라온 스크립트 중 하나인 json2.js는 JSON 처리를 위한 유용한 코드를 제공하는 인기 높은 라이브러리다. 하지만 여기에 대해서는 나중에 좀 더 다루겠다. Listing 3에 제시한 두 번째 스크립트는 오프라인 처리를 포함한 작업 목록을 위한 구체적인 처리 과정을 담고 있다.
Listing 3. 작업 목록 응용 스크립트(todo.js)
// 웹 응용 프로그램 초안 명세에 정의된 오프라인 기능을 활용한다.
// (현재 파이어폭스 3에만 해당한다)
// JSON은 직접 전송 목적을 위해 작업 목록 항목을 정의한다.
var taskStorage = "[]";
// 웹 응용 프로그램 도메인은 응용 프로그램 캐시 자료(globalStorage)를 위한 키로 사용된다.
var storageDomain = location.hostname;
// 브라우저 페이지가 읽힐 경우에 호출된다(다시 말해 body의 onLoad 속성).
function loaded() {
// 응용 프로그램 캐시나 웹 응용 프로그램에서 작업 목록 자료를 가져온다.
// 여기서 오프라인 상태에 따라 가져올 대상이 달라진다.
updateOnlineStatus("initial load", false);
// 온라인/오프라인 변경을 감지할 사건 처리기를 설정한다.
document.body.addEventListener("offline",
function () { updateOnlineStatus("offline", true) }, false);
document.body.addEventListener("online",
function () { updateOnlineStatus("online", true) }, false);
// (존재한다면) 응용 프로그램 캐시에 저장된 초기 작업 목록을 올린다.
// 이렇게 하면 접근 허락을 받기 위해 브라우저는 사용자에게 확인 메시지를 출력한다.
if (typeof globalStorage != "undefined") {
var storage = globalStorage[storageDomain];
if (storage && storage.taskStorage) {
taskStorage = storage.taskStorage;
}
}
// 갱신된 작업 목록을 가져올 수 있는지 확인하자.
fetchList();
}
// 온라인/오프라인 상태 변경이 있을 때 호출되는 함수
function updateOnlineStatus(msg, allowUpdate) {
// 부 제목에 온라인 상태 지시자를 갱신한다.
var status = document.getElementById("status");
status.innerHTML = (navigator.onLine ? "[online]" : "[offline]");
// 웹 페이지의 로그 영역에 변경 내용을 기록한다.
var log = document.getElementById("log");
log.appendChild(document.createTextNode("Event: " + msg + "\n"));
// 온라인이라면 서버에 작업 목록 변경을 밀어넣으려고 시도한다.
if (navigator.onLine && allowUpdate) {
update();
log.appendChild(document.createTextNode("Updated server\n"));
}
}
// 서버에 HTTP 요청을 수행한다. 작업 목록을 얻거나 갱신 사항을 밀어넣는다.
function httpRequest(type, data, callback) {
var httpreq = new XMLHttpRequest();
httpreq.onreadystatechange = function() {
if (httpreq.readyState == 4)
callback(httpreq.readyState, httpreq.status, httpreq.responseText);
}; //close function()
httpreq.open(type, "/todo-app", true);
if (type == "POST") {
httpreq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
}
httpreq.send(data);
}
// 서버에서 웹 페이지와 응용 프로그램 캐시로 갱신된 작업 목록을 밀어넣는다.
function loadList(readyState, status, responseText) {
if (readyState == 4) {
if (status == 200) {
taskStorage = responseText;
var tasks = JSON.parse(taskStorage);
var html = "";
// 웹 페이지에서 항목을 갱신한다.
for (var i=0; i<tasks.length; i++) {
html += "<input type='checkbox' id='" + tasks[i].name + "'/><label for='"
html += tasks[i].name + "'>" + tasks[i].data + "</label><br/>";
}
document.getElementById("tasklist").innerHTML = html;
// 응용 프로그램 캐시를 갱신한다.
if (typeof globalStorage != "undefined") {
globalStorage[storageDomain].taskStorage = taskStorage;
}
}
}
}
// 응용 프로그램 캐시나 서버에서 갱신된 작업 목록을 불러들인다.
function fetchList() {
if (navigator.onLine) {
httpRequest("GET", null, loadList);
}
else {
loadList(4, 200, taskStorage);
}
}
// 사용자가 새로운 작업 목록 항목을 추가했을 때 호출되는 함수
function addItem() {
var data = document.getElementById("data").value;
document.getElementById("data").value = "";
// 저장된 작업 목록을 자바스크립트 목록으로 바꾼다.
// 현재 타임스탬프를 단순 ID("name")으로 활용한다.
var tasks = JSON.parse(taskStorage);
tasks.push({"name": Date.now(), "data": data });
// JSON으로 변환해 작업 목록 변수를 갱신한다.
taskStorage = JSON.stringify(tasks);
// 서버에 작업 목록 변경 내역을 밀어넣으려고 시도한다.
update();
}
// 사용자가 작업 목록 항목을 제거할 때 호출되는 함수
function removeItems() {
var tasks = JSON.parse(taskStorage);
var newTasks = [];
// 어떤 체크박스가 켜졌는지 살펴 그렇지 않은 항목만 다시 복사한다.
var items = document.getElementById("tasklist").getElementsByTagName("input");
for (var i=0; i<items.length; i++) {
if (items[i].checked == false) {
newTasks.push(tasks[i]);
}
}
taskStorage = JSON.stringify(newTasks);
update();
}
// 사용자가 작업 목록 항목을 완료되었다고 표시할 때 호출되는 함수
function completeItems() {
var tasks = JSON.parse(taskStorage);
// 어떤 체크박스가 켜졌는지 살펴 해당 항목에 strike 태그를 붙인다.
var items = document.getElementById("tasklist").getElementsByTagName("input");
for (var i=0; i<items.length; i++) {
if (items[i].checked) {
var task = tasks[i].data;
if (task.indexOf("<strike>") != -1) {
task = task.replace("<strike>", "");
task = task.replace("</strike>", "");
}
else {
task = "<strike>" + task + "</strike>";
}
tasks[i].data = task;
}
}
taskStorage = JSON.stringify(tasks);
update();
}
// 서버로 작업 목록 변경 내역을 밀어넣으려고 시도하는 함수
function update() {
if (navigator.onLine) {
var post = "action=update&tododata=" + encodeURIComponent(taskStorage);
httpRequest("POST", post, function(readyState, status, json) { fetchList(); });
}
else {
loadList(4, 200, taskStorage);
}
}
|
코드에 주석을 많이 달아놓았지만, 몇 가지 일반적인 사항을 짚고 넘어가겠다. 작업 목록 자료는 페이지에 내장되어 있지만 taskStorage 변수로 유지되는 JSON form 형식으로 전달된다. 웹 응용 프로그램 페이지를 처음 방문하면, 파이어폭스는 이 자료를 응용 프로그램 캐시에서 메모리에 올리려고 시도한다. 응용 프로그램에 대한 항목이 없다면, 파이어폭스는 사용자에게 설정 허가를 요청한다. 이 과정은 그림 1에 잘 나타나 있다.
그림 1. 작업 목록 도구 첫 페이지
사용자가 허용(allow)을 클릭하면, 파이어폭스는 응용 프로그램 캐시를 설정한다. 개발자로서 재설정을 통해 파이어폭스가 다시 한번 질문을 하도록 만들고 싶을지도 모르겠다. 이렇게 하려면 설정(Preferences)이나 옵션(Option) 윈도우에서 고급(Advanced) 탭을 눌러 네트워크(Network) 하위 탭을 선택하면 된다. 그림 2는 맥 OS X에서 대응하는 윈도우 영역을 보여준다. 지역 호스트를 위한 오프라인 허가 항목을 살펴보기 바란다. 재설정이 필요하면, 해당 항목을 선택한 다음에 제거(Remove)를 클릭하자.
그림 2. 오프라인 저장소 관리하기
작업 목록 서버 구현하기
사용자가 웹 페이지를 연 다음에, 항목을 추가하거나 삭제하거나 완료되었다고 표시할 수 있다. 완료되었다고 표시하면 목록에 출력되지만 중간 줄이 그어진다. 그림 3은 온라인 상태에서 몇 가지 테스트 항목을 추가한 다음에 표시된 화면을 보여준다.
그림 3. 몇 가지 항목을 추가한, 온라인 상태에 있는 작업 목록
온라인 상태에서 작업 목록을 갱신할 때마다, 스크립트는 서버에 갱신 사항을 보낸다. 이런 작업을 처리할 간단한 서버를 파이썬으로 작성했다. Mark Finkle 또한 이런 상황을 다루기 위해 PHP로 예제 코드를 작성했으므로, PHP를 선호한다면 참고자료 절을 참조해 원래 코드를 가져오기 바란다. 물론 파이어폭스 3 RC나 최종 버전에서 동작하도록 Listing 3에 제시된 갱신된 스크립트를 사용해야 한다. Listing 4(todohandler.py)는 파이썬 서버 코드다.
Listing 4. 작업 목록 응용 프로그램 서버 코드(todohandler.py)
import os, sys
import cherrypy #http://www.cherrypy.org/
from webob import Request, Response #http://pythonpaste.org/webob/
#이 예제에서는 모든 세션을 위해 단일 파일을 사용한다.
DATAFILE = 'test.json'
#handler 함수
def todo_handler_application(environ, start_response):
req = Request(environ)
if req.POST.get("action") == "update":
#작업 항목 목록을 갱신하기 위해 POST를 다룬다. 파일에 기록한다.
f = open(DATAFILE, 'w')
f.write(req.POST["tododata"])
f.close()
resp = Response(body='', content_type='application/json')
else:
#작업 항목 목록을 보내기 위해 GET을 다룬다. 파일에서 읽는다.
f = open(DATAFILE, 'r')
data = f.read()
f.close()
resp = Response(body=data, content_type='application/json')
#결과를 발송한다.
return resp(environ, start_response)
#todo.html에서 웹 form을 다루기 위해 서버를 설정한다.
cherrypy.tree.graft(todo_handler_application, '/todo-app')
#현재 디렉터리에서 일반 정적 파일을 서비스하기 위해 서버를 설정한다.
server_config = {
'/': {'tools.staticdir.on': True, 'tools.staticdir.dir': os.getcwd() }
}
#CHerryPy handler를 생성한다. 다른 작업을 하지 않는 이유는 핵심이 WSGI app이기 때문이다.
class DummyHandler: pass
cherrypy.quickstart(DummyHandler(), '/', config=server_config)
|
역시 이 코드에는 주석이 상세하게 달려있으며, 언급하고 넘어갈 유일한 사항은 예제를 단순하게 만들기 위해 코드는 모든 응용 프로그램 사용자를 위해 (DATAFILE로 명기된) 파일 하나만을 사용한다. 물론 실제 업무에 적용할 응용 프로그램에서는 바꿔야 할 내용이다. 독립적인 파일이나 사용자 당 데이터베이스 행을 따로 두기를 원할 것이다. Listing 5(test.json)에서는 파일을 사용해 이런 초기 자료를 가져온다.
Listing 5. 작업 목록 응용 프로그램 스크립트(test.json)
[{"name":1171640861226,"data":"<strike>Example entry</strike>"},
{"name":1212604738536,"data":"Say \"Hello\""},{"name":1212604795352,"data":"
<strike>Say \"Good night\"</strike>"}]
|
이제 온라인 동작 원리를 살펴봤으므로 오프라인 상태에서 어떻게 동작하는지 살펴볼 차례다. (맥 OS X의 경우) 파이어폭스의 파이어폭스 메뉴에서 Firefox 메뉴를 선택하면 된다(윈도우에서는 '파일' 메뉴를 선택한 다음에 '오프라인으로 작업' 항목을 선택하면 된다). 제목은 즉시 "Todo tool [offline]"으로 변한다. 온라인/오프라인 변화 과정을 점검하는 스크립트 핸들러를 사용해 이런 작업이 가능해진다. 사용자는 여전히 응용 프로그램을 문제 없이 사용할 수 있다. 오프라인 상태에서 작업을 한 다음에(이 경우에는 완료된 작업을 지정했다), 온라인으로 돌아오면, 화면은 그림 4와 같이 바뀐다.
그림 4. 오프라인 작업 이후에 온라인으로 돌아온 작업 목록 도구
이미 설명했지만, Listing 3에서 JSON 처리를 언급했다. 여기서는 Douglas Crockford가 만든 json2.js 라이브러리를 사용하는데, 자바스크립트 강화를 위한 API에 기반을 둔다. Listing 3은 json2 API에서 제공하는 JSON.stringify와 JSON.parse를 사용한다. 파이어폭스 3은 새로운 고성능 JSON 처리 라이브러리인 nsIJSON을 추가했는데, 아직 기본 브라우저 설치 파일에 들어있지 않다. 아마도 조만간 파이어폭스에 통합될 가능성이 높으며, json2.js와 호환이 가능하다. 이런 통합 작업이 완료되면 성능 향상과 더불어 별도 자바스크립트 파일을 제거함으로써 외부 의존성을 하나 줄이게 된다.
정리
파이어폭스에서 몇 가지 다른 기능도 살펴보기를 권한다. 웹 기반 프로토콜 처리기는 http:나 mailto:와 같은 내장 URI 유형을 넘어 새로운 URI 유형을 정의하도록 허용한다. 파이어폭스 3은 다양한 EXSLT 확장을 지원하며, 이는 XSLT 변환 과정에서 위력을 높인다. 파이어폭스 3은 또한 XML 기반 벡터 그래픽 표준인 SVG 지원을 강화했다. 이를 비롯한 다른 XML 처리 개선 사항은 별도 기사에서 다룰 계획이다. 파이어폭스 3은 웹 개발을 좀 더 즐겁게 만들어주며, 오프라인 기능 추가를 통해 범용 응용 프로그램 플랫폼으로서 브라우저의 가능성을 좀 더 활짝 열어 놓았다. 명백히 브라우저의 신형 기능 대다수가 아직 다른 브라우저에서는 사용하지 못하는 불행한 상황이다. 하지만 새롭게 추가된 기능 상당수가 표준에 기반을 두므로 다른 웹 소프트웨어도 조만간 정신차리고 따라 잡으리라 기대해도 좋겠다.
참고자료 교육
제품 및 기술 얻기
토론
필자소개  | 
|  | Uche Ogbuji는 차세대 웹 기술 솔루션을 제공하는 Zepheira, LLC의 파트너다. XML, RDF, 지식 관리 응용 프로그램의 오픈 소스 플랫폼인 4Suite 개발을 이끌고 있으며, PDF 조회 언어인 Versa 개발도 이끈다. 그는 Nigeria에서 태어나 현재 Colorado 주 Boulder 시에 살고 있는 컴퓨터 엔지니어다. 자세한 내용은 Ogbuji의 블로그 Copia를 참조한다. |
기사에 대한 평가
 |
| 이 문서 북마킹 하기
|
|  |