JSLint는 일련의 규칙을 가지고 문제를 일으킬만한 코드를 집어낸다. JSLint에서 사용하는 모든 규칙과 설정에 대한 정보는 http://jslint.com/
JSLint에서 내세우는 요구사항 중 하나는 모든 프로그램에서 변수를 사용하기 전에 반드시 선언해야 한다는 것이다.
// JSLint 에서 요구하는 변수 선언
// 잘못된 변수 선언
foo = 'bar';
// 올바른 변수선언
var foo;
foo = 'bar';
!=,== 보다는 !==, === 를 사용하라고 요구한다. !==, === 는 변수 안의 실제값을 들여다 보기 때문이다.
//!=, == 가 !==, === 와 어떻게 다른지를 보여주는 예들
// 둘 다 true
null == false
0 == undefined
// !== 과 === 를 대신 사용해야 한다.
null !== false
false === false
한 줄짜리 블록을 사용하지말라고 요구한다. 중괄호를 제거하면 코드에서 어떤 부분이 블록에 속하고 어떤 부분이 속하지 않는지 알기 어려울 수 있다.
//들여쓰기를 잘못한 단일 문장을 포함하는 코드 블록
// 적법한 일반적인 자바스크립트 코드다.
if ( dog == cat )
if ( cat == mouse )
mouse = "cheese";
// JSLint 는 이 코드를 다음과 같이 쓰라고 요구한다:
if ( dog == cat ) {
if ( cat == mouse ) {
mouse = "cheese";
}
}
한줄에 한문장만 쓸경우 문장 끝에 있는 세미콜론을 생략할 수 있지만, 압축 했을때 파일크기를 줄이기 위해 끝줄들을 제거한다거나 하면 문제가 생긴다. 항상 세미콜론을 입력해야 한다.
//세미콜론이 필요한 문장들
//자바스크립트 코드를 압축할 계획이라면 모든 문장 끝에 세미콜론을 입력해야 한다.
var foo = 'bar';
var bar = function(){
alert('hello');
};
bar();
The YUI Library is a set of utilities and controls, written with
JavaScript and CSS, for building richly interactive web applications
using techniques such as DOM scripting, DHTML and AJAX. YUI is
available under a BSD license and is free for all uses.
//새 Person 클래스를 만든다.
var Person = Base.extend({
// Person 클래스 생성자
constructor: function( name ) {
this.name = name;
},
//Person 클래스의 간단한 메서드
getName: function() {
return this.name;
}
});
// Person 클래스를 상속하는 새 User 클래스를 만든다.
var User = Person.extend({
// User 클래스의 생성자를 만든다.
constructor: function( name, password ) {
// 부모 클래스의 생성자 메서드를 호출한다.
this.base( name );
this.password = password;
},
// User 클래스에 간단한 메서드를 추가한다.
getPassword: function() {
return this.password;
}
});
Function.prototype.method : 이 함수는 그저 생성자의 프로토타입에 함수를 붙인다. 이런 식으로 method 함수를 정의하면,
모든 생성자는 함수이므로 모두 'method'메서드를 갖게 된다.
Function.prototype.inherits : 이 함수는 간단한 단일 부모 상속을 지원한다.
이 함수에서 대부분의 코드는 어떤 객체 메서드 안에서든 this.uber('methodName')을 호출해 그 객체가 오버라이드한
부모 객체의 메서드를 호출할 수 있게 하려고 작성되었다. 오버라이드한 부모 객체의 메서드를 호출 할 수 있는 기능은
자바스크립트 상속모델에서 기본으로 지원하지 않는 기능이다.
Function.prototype.swiss : 이 함수는 .method() 함수의 고급버전으로 한 부모 객체에서 여러 메서드를
상속받는데 사용한다. 이 함수를 여러부모 객체에 대해 사용하면 다중 상속 시능을 사용하는 것과 마찬가지가 된다.
//프로토타입에 새 함수를 연결하는 간단한 헬퍼
Function.prototype.method = function(name,func){
this.prototype[name] = func;
return this;
}
//다른 객체로부터 우아한 방식으로 함수를 상속받으면서 여전히 부모 객체의 함수를
//호출할 수 있게 해 주는 (약간 복잡한) 함수
Function.method('inherits', function(parent){
//상속 계층 안에서 얼마나 깊이 들어왔는지 추척한다.
var depth = 0;
//부모의 메서드를 상속 받는다.
var proto = this.prototype = new parent();
//'uber'라는 privileged 함수를 만든다.
//이 함수는 상속 과정에서 덮어쓴 함수를 실행할 수 있게 해 준다.
this.method('uber', function(name){
var func; //실행할 함수
var ret; //함수의 반환값
var v = parent.prototype; //부모의 프로토타입
//이미 다른 'uber'함수 안이라면
if(depth){
//근원 프로토타입을 찾아 필요한 만큼 깊이 들어간다.
for( var i = depth; i > o; i -= 1){
v = v.constructor.protptype;
}
//그리고 그 프로토타입에서 함수를 가져온다.
func = v[name];
//아니면 'uber'를 처음 호출하는 상황이다.
}else{
//실행할 함수를 프로토타입에서 가져온다.
func = proto[name];
//함수가 이 프로토타입의 일부였다면
if(func == this[name]){
//대신 부모 프로토타입에 간다.
func = v[name];
}
}
//상속 스택에서 얼마나 깊이 들어왔는지를 추척한다.
depth += 1;
//첫 번째 전달인자를 제외한 모든 전달인자를 넘기면서 함수를 호출한다.
//(첫 번째 전달인자는 우리가 호출하려는 함수 이름을 담고 있다.)
ret = func.apply(this, Array.prototype.slice.apply(arguments, [1]));
//스택의 깊이를 변경한다.
depth -= 1;
//함수 호출의 결과값을 되돌려준다.
return ret;
});
return this;
});
//parent 객체에서 new parent()를 사용해 모든 함수를
// 상속받지 않고, 오직 함수 몇개만을 상속받는 함수
Function.method('swiss', function(parent){
for(var i = 1; i < arguments.length; i+= 1){
//상속받을 메서드들을 모두 방문한다.
var name = arguments[i];
//메서드를 이 객체의 프로토타입으로 가져온다.
this.prototype[name] = parent.prototype[name];
}
return this;
});
객체의 타입을 검사하는 첫번째 방법은 typeof 가 있다. typeof 연산자는 변수가 담고 있는 값의 타입을 나타내는 문자열 이름을 반환하는데, 객체,배열 또는 사용자 정의 객체를 담은 변수에 대해서는 object라는 문자열만 반환하기 때문에 이 객체들을 구별하기가 어렵다는 점을 제외하고는, typeof 연산자를 사용하는 방법이 타입을 검사하는 최적의 방법이라고 할 수 있다.
두번째 방법은 모든 자바스크립트객체에 존재하는 constructor라는 프로퍼티를 참조하는 방법인데, 이 프로퍼티는 맨 처음 객체를 생성할때 사용한 함수를 가리킨다.
아래의 표는 위 두 방법을 사용해 여러 객체의 타입을 검사 할 때 반환되는 결과를 보여주는데, 첫번째열은 타입을 알아보려는 객체이고, 두번째열은 typeof, 세번째는 첫번째열의 객체에 대해 Variable.constructor 를 실행한 결과이다. 셋째열은 모두 객체다.
As part of Microsoft’s commitment to Interoperability, this open source
project is an effort bridge PHP developers to Windows Azure. PHPAzure is
an open source project to provide software development kit for Windows
Azure and Windows Azure Storage – Blobs, Tables & Queues
Overview
Enables PHP developers to take advantage of the Microsoft Cloud Services Platform – Windows Azure.
Provides consistent programming model for Windows Azure Storage (Blobs, Tables & Queues)
Features
PHP classes for Windows Azure Blobs, Tables & Queues (for CRUD operations)
Helper Classes for HTTP transport, AuthN/AuthZ, REST & Error Management
Manageability, Instrumentation & Logging support
Support for storing PHP sessions in Azure Table Storage
2. Project contributors
Windows Azure SDK for PHP is an open source collaboration project driven by RealDolmen and Microsoft, based on a blog post of Maarten Balliauw.
The RealDolmen
Microsoft Competence Centre is occupied with the supply of
made-to-measure professional Microsoft solutions to customers and is the
largest Microsoft integrator in Belgium. RealDolmen has over 10 years
of experience of complete implementation of Microsoft projects in terms
of strategy, architecture, implementation, integration of systems,
maintenance, training as well as support.
Microsoft is the project sponsor and provides Architectural & Technical Guidance on its Windows Azure platform.
3. What is Windows Azure?
Windows Azure
is the name for Microsoft’s Software + Services platform, an operating
system in the cloud providing services for hosting, management, scalable
storage with support for simple blobs, tables, and queues, as well as a
management infrastructure for provisioning and geo-distribution of
cloud-based services, and a development platform for the Azure Services
layer.
Windows Azure SDK for PHP provides access to Windows Azure's storage,
computation and management interfaces by abstracting the REST/XML
interface Windows Azure provides into a simple PHP API.
Deployment scenarios
An application built using Windows Azure SDK for PHP can access Windows
Azure's features, no matter if it is hosted on the Windows Azure
platform or on an in-premise web server.
Firefox는 언제나 HTML5를 훌륭히 지원해왔으며 기록상 마지막 버전 빌드는 보다 진보된 기능을 가지고 있습니다.
Firefox는 HTML5 형식을 충족하며
새로운 입력 형식, 데이터 목록 지원, autofucus나 placeholder와 같은 새 입력 속성, 분리된 형식, 형식
옵션, 유효성 기법, 강제 유효성, 그리고 이를 한데 묶을 새 CSS 선택기를 지원합니다. 보다 자세한 정보를 원하시면, 저희의 Hacks site를 방문하십시오.
Firefox는 사용료를 지불할 필요가 없는 새로운 웹용 비디오 포맷인 WebM을 지원합니다. 유튜브의 HTML5 베타에 참여하시면 작동하며 새로운 iframe 엠베딩 API를 사용할 경우 엠베딩된 유튜브 비디오에서도 작동합니다. 베타에 참여하시고 이 글의 아래에 있는 예제가 작동하는 것을 보십시오.
Firefox는 초기 버전의 calc를 -moz-calc와 같은 특별한 형태로 지원합니다. 이는 개발자들이 CSS
페이지 배치를 훨씬 간단하게 만들 수 있는 length를 어디에서나 사용해(더이상 빈칸을 위해 divs를 사용하지 않아도
됩니다!) 간단한 표현을 사용할 수 있게 해줍니다.
Firefox의 CSS 가상-선택자인 -moz-focusring은 한 요소가 focus되었을 경우 그리고 focus
ring이 주위에 그려질 시 어떻게 보일지를 지정하게 해 줍니다. focus ring이 그려지거나 그렇지 않을 경우에 대한 규칙은
운영체제마다 다르나 이것은 기반 규칙을 유지 보수하는 동안 form control의 모양새를 제어하게 해 줍니다.
Firefox는 숨겨진 파일 제어의 .click()을 호출해서 파일 업로드 위젯 기반을 가져올 수 있으며 이는 (볼품 없는) 파일 업로드 제어를 여러분만의 것으로 확장할 수 있다는 뜻입니다. 만약 여기에 새 File API와 progress event를 조합시키면 매우 훌륭한 파일 업로드 경험 기법이 될 것입니다.
Firefox 는 Blob API와 딸려오는 .slice API를 지원합니다. 이는 전체 파일을 메모리로 올리지 않고
JavaScript를 사용해 큰 파일 객체의 부분만 처리하고 싶은 경우 도움이 됩니다. 신뢰할 수 있는 대용량 파일 업로드를
원하는 경우에는 서버와 JavaScript 코드를 사용해 큰 파일을 여러 부분으로 나누어 전체 덩어리를 업로드하며 이 과정에서
재-재시도 실패 부분이나 심지어는 동시에 여러 부분을 전송하는 것이 포함됩니다.
컨텐츠 보안 정책(CSP: Content Security Policy)은 개발자가 여러 다른 종류의 공격을 방지에는 데
도움을 주는 도구의 모음입니다. 구체적으로, 이는 cross-site scripting 공격과 click-jacking, 그리고
패킷 스니핑 공격을 누그러뜨리는 도구를 제공합니다. 만일 규칙을 위반하게 되면 Firefox는 웹 사이트에 위반사항에 대한
정보를 보내 다른 브라우저의 보안도 향상되도록 돕습니다.
Firefox는 HTTP Strict Transport Security (HSTS) 헤더를 지원합니다. 이 헤더는
반드시, 절대로 사이트를 암호화되지 않은 HTTP로 연결하지 않도록 브라우저에게 알리는데 사용됩니다. Firefox 사용자는 또한
HSTS 목록의 사이트를 추가하거나 지우는 STS UI 부가기능을 심지어는 사이트가 HSTS에 대한 직접적인 지원을 하지 않아도 사용할 수 있습니다.