fullscreen - Boolean - 전체 화면 설정 여부 tabletStartupScreen - String - iPad의 시작 이미지의 경로 크기는 768 × 1004 세로로하지 않으면 안됨. phoneStartupScreen - String - iPhone 및 iPod touch 용 부팅 이미지 경로 320 × 460에 세로로하지 않으면 안됨. icon - String - 태블릿과 스마트폰 모두에 사용되는 아이콘 이미지 경로 72 × 72이 좋은 tabletIcon - String - 태블릿용 아이콘 이미지 경로 이곳을 icon으로 설정되는 이미지보다 우선 72 × 72가된다. phoneIcon - String - 스마트폰 아이콘 이미지 경로 이곳을 icon으로 설정되는 이미지보다 우선 57 × 57이다. glossOnIcon - Boolean - iPhone, iPad and iPod Touch 아이콘에 광택 효과 여부. statusBarStyle - String - iOS web 애플 리케이션의 상태 표시줄에 대한 스타일 설정 default, black, black - translucent 중 하나를 선택. preloadImages - Array - 미리 이미지 경로 배열 (자세한 내용은 추후 조사) onReady - Function - DOM 생성 후에 실행되는 함수. 애플 리케이션의 시작 지점이되는 경우가 많다. scope - Scope - 범위 설정
JSON (JavaScript Object Notation)은 경량의 DATA-교환 형식이다.
이 형식은 사람이 읽고 쓰기에 용이하며, 기계가 분석하고 생성함에도 용이하다.
JavaScript
Programming Language, Standard
ECMA-262 3rd Edition - December 1999의 일부에 토대를 두고 있다.
JSON은 완벽하게 언어로 부터 독립적이지만 C-family 언어 - C, C++, C#, Java, JavaScript, Perl, Python 그외 다수 - 의 프로그래머들에게 친숙한 관습을 사용하는 텍스트 형식이다.
이러한 속성들이 JSON을 이상적인 DATA-교환 언어로 만들고 있다.
JSON은 두개의 구조를 기본으로 두고 있다:
name/value 형태의 쌍으로 collection 타입.
다양한 언어들에서, 이는 object, record, struct(구조체), dictionary, hash table, 키가 있는 list, 또는 연상배열로서 실현 되었다.
값들의 순서화된 리스트. 대부분의 언어들에서, 이는 array, vector, list, 또는 sequence로서 실현 되었다.
이러한 것들은 보편적인 DATA 구조이다. 사실상 모든 현대의 프로그래밍 언어들은 어떠한 형태로든 이것들을 지원한다.
프로그래밍 언어들을 이용하여 호환성 있는 DATA 형식이 이러한 구조들을 근간에 두고 있는 것은 당연하다.
JSON 에서, 이러한 형식들을 가져간다:
object는 name/value 쌍들의 비순서화된 SET이다.
object는 { (좌 중괄호)로 시작하고 } (우 중괄호)로 끝내어 표현한다.
각 name 뒤에 : (colon)을 붙이고 , (comma)로 name/value 쌍들 간을 구분한다.
array은 값들의 순서화된 collection 이다.
array는 [ (left bracket)로 시작해서 ] (right bracket)로 끝내어 표현한다.
, (comma)로 array의 값들을 구분한다.
value는 큰따옴표안에 string, number ,true ,false , null, object ,array이
올수 있다. 이러한 구조들을 포함한다.
string은 큰따옴표안에 둘러 싸인 zero 이상 Unicode 문자들의 조합이며, 쌍다옴표안에 감싸지며,backslash escape가 적용된다.
하나의 문자(character)도 하나의 문자열(character string)로서 표현된다. string은 C 또는 Java 문자열 처럼 매우 많이 비슷하다.
number는 8진수와 16진수 형식을 사용하지 않는것을 제외하면 C와 Java number 처럼 매우 많이 비슷하다.
토근들의 어떤 쌍 사이에 공백을 삽입할수 있다. 드물게 encode된 세부 항목을 제외하면, 이렇게 설명된 JSON의 형식은 완벽하게 그 언어를 설명한다.
제작하려는 앱유형에 따라서 앱이 유리한 경우도, 모바일웹이 유리한 경우도 있습니다.화면 변경이 잦거나, HTML 인터페이스로도 UI를 구성하고, 이용자 Action을 처리할 수 있는 경우에는 모바일웹을 구성하는 것이 유리할테고,인터페이스가 복잡하고, 이용자 만족도가 높은 품격있는 서비스를 고려한다면, 앱을 선택하는 편이 유리할 것입니다.
A = 65 B = 66 C = 67 D = 68 E = 69 F = 70 G = 71 H = 72 I = 73 J = 74 K = 75 L = 76 M = 77 N = 78 O = 79 P = 80 Q = 81 R = 82 S = 83 T = 84 U = 85 V = 86 W = 87 X = 88 Y = 89 Z = 90
둘은 똑같이 Mobile JavaScript Library라는 공통점을 지니고 있지만, 개발에 사용되는 언어의 차이가 크다.
jQuery Mobile은 기존 HTML 개발하듯이 마크업 중심의 구성을 갖고 있으며, Sencha Touch는
JavaScript로 개발을 하는데 특히 ExtJS 라이브러리 중심으로 구성되어 있다. 이는 개발 난이도를 결정하는 요소가 된다.
ExtJS 라이브러리를 다룰 수 있는 개발자가 거의 없기에(외국에도 많이 쓰이지는 않는다.) ExtJS를 먼저 학습해야 하는
비용이 추가된다. 그에 반해 jQuery Mobile은 우리에게 익숙한 HTML 중심의 마크업 언어라서 잠깐의 교육만으로도 바로
개발이 가능하다.
실무에 어떤 라이브러리를 선택할 것인가?
"개발방시의 차이"는 때때로 인력 구성의 심각한 문제를 가져 올 수 있다. 미래웹기술연구소에서 수행했던 프로젝트의 경우
디자이너/Web UI Developer(HTML/CSS 코딩)/자바스크립트 엔지니어 이렇게 분업이 잘 되어 있다. Web UI
Developer 가 없는 프로젝트에서는 디자이너가 HTML/CSS 코딩 역할을 대신 하기도 한다. 그러나 Sencha Touch
중심의 웹앱 프로젝트에서는 Web UI Developer가 Sencha Touch나 ExtJS를 모르면 아무런 작업을 할 수
없다. 그렇게 Web UI Developer가 하지 못한 작업들은 고스란히 자바스크립트 엔지니어에게 전가 된다.(하지만 전달받은
개발자 또한 ExtJS 라이브러리가 익숙한 것은 아닐 것이다.) 그래서 웹앱개발을 위한 자바스크립트 라이브러리 선택시에는 현재
조직의 인원구성에 대한 고민이 선행되어야 한다.
하이브리드 앱
두가지 라이브러리 모두 PhoneGap 등을 이용하여 앱(App.)으로 만들 수 있다. 하지만 이부분에서 Sencha
Touch의 앱 스러움이 실력을 발휘 한다. 일단 언어가 비슷하고 (Sencha Touch와 PhoneGap 모두 자바스크립트
기반) 마크업언어와 다르게 콤포넌트 기반이어서 화면 구성이 앱과 비슷한 점이 많다. 그리고 앱스러운 기능을 jQuery
Mobile 보다 월등하게 많이 가지고 있다.
이미 사용 중인 Eclipse에 Appspresso를 통합할 수 있는 Appspresso Eclipse plug-in의 설치 URL은 다음과 같습니다. (plug-in 설치 방법은 사용 중인 Eclipse의 도움말을 참조하시기 바랍니다.) http://www.appspresso.com/update/site.xml
※ Appspresso 1.0 beta에서 생성한 project를 beta2로 이전하기 Appspresso 1.0 beta2에서 변경사항이 있어 Appspresso 1.0 beta에서 생성한 Appspresso project를 인식하지 못합니다. 해당 project를 Appspresso 1.0 beta2에서 인식되게 하려면 파일 탐색기를 통해 Appspresso project 폴더로 이동하신 후 .project 파일을 찾아 텍스트 편집기로 열고 다음과 같이 수정해 주시기 바랍니다. Appspresso 1.0 beta : <nature>com.kthcorp.wp.rudder.core.Nature</nature> Appspresso 1.0 beta2: <nature>com.appsresso.core.Nature</nature>
HTML5 offers two new objects for storing data on the client: * localStorage - stores data with no time limit * sessionStorage - stores data for one session
Client-Side 데이터 기억장치 : 초기에 웹 애플리켕이션에서는 데이터저장을 서버측 데이터베이스나 브라우저 쿠키가 담당했지만, HTML5의 등장으로 웹 개발자들은 더 많은 선택의 여지가 생겼는데 그것은 localStorage, sessionStorage, client-side databases.
localstorage와 sessionStorage는 다수의 페이지들을 검색할 때 name/value 쌍을 설정하기 위해 javascript를 사용한다는 점에서 쿠키와 매우 유사하다. 하지만, 쿠키와 달리 부라우저이 요청이 있을 때 데이터를 와이어를 통해 전송하지 않는데, 데이터는 오직 클라이언트에만 존재한다. 그러므로 쿠키보다 더 많은 데이터를 저장하는 것이 가능하다.
이 둘은 기능적으로는 같지만, 지속성과 범위 측면에서만 다르다.
localStorage - 윈도우가 닫힌 후에도 데이터가 저장된다. 데이터는 같은 소스(도메인네임,프로토콜, 포트가 같아야 한다.)로부터 로드된 모든 윈도우에서 사용 가능하다. 이는 애플리케이션 환경설정 같은 것에 유용하다. sessionStorage - 데이터는 윈도우객체와 함께 저장된다. 다른 윈도우(or Tab)들은 데이터 값을 알지 못하고 윈도우가 닫힐때 사라진다. 활성화된 탭을 강조하는 것과 같은 윈도우의 특정 상태만을 저장할 때나 테이블 정렬 순서를 저장할 때 유용하다.
value 설정 : localStorage.setItem('age', 35); 저장된 value 호출 : var age = localStorage.getItem('age'); 특정한 key/value 삭제하기 : localStorage.removeItem(age); 모든 key/value 삭제하기 : localStorage.clear();
ex) kilo.js var db; var jQT = $.jQTouch({ icon: 'kilo.png', statusBar: 'black' });
//shortName : 디스크에 있는 database를 호출하기 위해 몇 개의 var을 정의하고 있다. var shortName = 'Kilo'; // version : Database 스키마를 바꿀 필요가 있을 경우, // 업그레이드와 이전 버전과의 호환을 처리하기 위해 사용한다. var version = '1.0'; // displayName : 사용자 인터페이스에 보이는 문자열 // 예를 들어 아이폰에 있는 Setting 애플레케이션에서 // Setting > Safari > Database panel 에 displayName이 보인다. var displayName = 'Kilo'; //Database 가 가지는 최대 크기를 킬로바이트 단위로 지정한다. var maxSize = 65536; //위 설정된 파라미터를 가지고 openDatabase 함수를 호출하고 연결을 db변수에 저장한다. // 만약 Open 하고자 하는 database가 존재하지 않으면 새로 생성한다. db = openDatabase(shortName, version, displayName, maxSize); // transaction 메서드를 호출. db.transaction( //익명 함수를 사용하여 파라미터로 트랜잭션을 전달한다. function(transaction) { // 함수 내부에서 표준 CREATE TABLE 쿼리를 실행하기 위해 // 트랜잭션 객체의 excuteSql메서드를 호출한다. transaction.executeSql( 'CREATE TABLE IF NOT EXISTS entries ' + ' (id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, ' + ' date DATE NOT NULL, food TEXT NOT NULL, ' + ' calories INTEGER NOT NULL );' ); } ); });
function loadSettings() { $('#age').val(localStorage.age); $('#budget').val(localStorage.budget); $('#weight').val(localStorage.weight); }
function refreshEntries() { var currentDate = sessionStorage.currentDate; $('#date h1').text(currentDate); $('#date ul li:gt(0)').remove(); db.transaction( function(transaction) { transaction.executeSql( 'SELECT * FROM entries WHERE date = ? ORDER BY food;', [currentDate], function (transaction, result) { for (var i=0; i < result.rows.length; i++) { var row = result.rows.item(i); var newEntryRow = $('#entryTemplate').clone(); newEntryRow.removeAttr('id'); newEntryRow.removeAttr('style'); newEntryRow.data('entryId', row.id); newEntryRow.appendTo('#date ul'); newEntryRow.find('.label').text(row.food); newEntryRow.find('.calories').text(row.calories); newEntryRow.find('.delete').click(function(){ var clickedEntry = $(this).parent(); var clickedEntryId = clickedEntry.data('entryId'); deleteEntryById(clickedEntryId); clickedEntry.slideUp(); }); } }, errorHandler ); } ); } function createEntry() { // SQL에 사용할 변수를 설정한다. var date = sessionStorage.currentDate; var calories = $('#calories').val(); var food = $('#food').val(); db.transaction( function(transaction) { transaction.executeSql( // ?는 플래이스 홀더(자리표시)이다. 'INSERT INTO entries (date, calories, food) VALUES (?, ?, ?);', // Database에 전송될 값들의 배열. // place holder에 대응되는 값이다. [date, calories, food], // 이 익명함수는 SQL쿼리가 성공하면 실행된다. function(){ refreshEntries(); jQT.goBack(); }, // SQL 쿼리가 실패하면 실행될 함수 이름이다. errorHandler ); } ); return false; }
// Entry 삽입이 실패하면 실행. // 에러 핸들러는 두개의 파라미터가 전송된다. 트랜잭션 객체와 에러 객체이다. // error 핸들러는 true 나 false 를 반환한다. // 에러핸들러가 true를 반환할 때는 실행이 멈추고 전체 트랜잭션이 RollBack 한다. // " false를 반환할 때는 계속 실행. // ERROR Code // Constant Code Situation // UNKNOWN_ERR 0 트랜잭션실패.Database자체와는 무관하고, 다른 오류코드에 포함되지 않는다. // DATABASE_ERR 1 Statement 실패 // VERSION_ERR 2 Operation 실패. 버전이 다르다. // TOO_LARGE_ERR 3 Statement 실패. DB에서 리턴된 데이터가 너무 크다.SQL LIMIT modifier권유 // QUOTA_ERR 4 Statement 실패. 남아있는 공간이 충분하지 않거나 저장공간 할당량 초과. // SYNTAX_ERR 5 Statement 실패. Syntax 에러,파라미터의 수가 맞지 않거나, 허용되지 않는 문자열 시도 // CONSTRAINT_ERR 6 Constraint 실패로 인해 insert, update, replace statement 실패 // TIMEOUT_ERR 7 Transaction을 위한 lock이 주어진 시간을 초과하였다. function errorHandler(transaction, error) { alert('Oops. Error was '+error.message+' (Code '+error.code+')'); return true; }
function deleteEntryById(id) { db.transaction( function (transaction) { transaction.executeSql('DELETE FROM entries WHERE id=?;', [id], null, errorHandler); } ); }
The HTML5 Web Sockets specification defines an API
that enables web pages to use the Web Sockets protocol for two-way
communication with a remote host. It introduces the WebSocket
interface and defines a full-duplex communication channel that operates
through a single socket over the Web. HTML5 Web Sockets provide an
enormous reduction in unnecessary network traffic and latency compared
to the unscalable polling and long-polling solutions that were used to
simulate a full-duplex connection by maintaining two connections.
HTML5 Web Sockets account for network
hazards such as proxies and firewalls, making streaming possible over
any connection, and with the ability to support upstream and downstream
communications over a single connection, HTML5 Web Sockets-based
applications place less burden on servers, allowing existing machines
to support more concurrent connections. The following figure shows a
basic WebSocket-based architecture in which browsers use a WebSocket
connection for full-duplex, direct communication with remote hosts.