매개변수가 숫자가 아닌지 판별하여 true/false로 반환하는 함수로 숫자가 아니면 true를 반환합니다다. 예상하지 않은 결과를 방지하기 위해서 Number.isNaN()을 사용하는 걸 추천합니다. Number.isNaN이 없을 경우에, 식(x != x)은 변수x가NaN인지 아닌지 테스트하는 더 믿을 수 있는 방법입니다. (출처)
NaN값은 산술 연산이 정의되지 않은 결과 또는 표현할 수 없는 결과를 도출하면 생성됩니다. 숫자가 아닌 값의 변환을 시도했으나 알맞은 원시 숫자 값이 없는 경우의 결과도 NaN입니다. 0을 0으로 나누면 NaN이지만, 다른 수를 0으로 나누면 그렇지 않습니다. NaN은 같음 연산 ==, ===을 사용해 판별할 수가 없어서 생겨났습니다.
2. jQuery.isNumeric()
$.isNumuric(value)의 value가 숫자인지 여부를 체크해서 boolean 값 true or false으로 반환합니다. 십진수의 유효성을 검사하는 함수이며 이 API는 jQuery 3.3에서 더 이상 사용되지 않습니다. 3.0부터 숫자로 강제 변환될 수 있는 경우에만 true가 반환됩니다. (출처)
4장 객체의 기초 내용을 바탕으로 객체의 정의와 이용 방법을 자세하게 다룹니다. 프로토타입 상속, 접근자 프로퍼티, 객체의 속성, 프로퍼티의 속성 등에 대해서 입니다. JS 언어의 스펙은 객체로 규정되어 있으므로 객체의 매커니즘에 관한 이해는 JS 전체를 이해하는 기초입니다.
1. 객체 생성하기
객체를 정의하는 방법과, 생성자의 프로토타입 객체에 추가한 메서드를 생성자로 생성한 인스턴스에서 사용하는 방법을 정리합니다.
1.1 객체의 생성
JS 객체는 이름-값을 한 쌍으로 묶은 집합입니다. 이름(key)과 값이 한 쌍을 이룬 것을 프로퍼티라고 합니다. 값에는 모든 데이터 타입의 데이터(원시 값, 객체)를 저장할 수 있습니다. 함수의 참조를 값으로 가진 프로퍼티는 메서드라고 합니다.
생성 방법
1) 객체 리터럴로 생성
var card = {suit: "하트", rank: "A"};
2) 생성자로 생성
function Card(suit, rank){
this.suit = suit;
this.rank = rank;
}
var card = new Card("하트", "A");
생성자 안에서 this 뒤에 메서드를 정의하면 그 생성자로 생성한 모든 인스턴스에 똑같은 메서드가 추가됩니다. 즉 메서드를 포함한 생성자로 인스턴스를 여러 개 생성하면 같은 작업을 하는 메서드를 인스턴스 개수만큼 생성하게 되며 결과적으로 그만큼의 메모리를 소비합니다.
function Circle(center, radius) {
this.center = center;
this.radius = radius;
this.area = function(){
return Math.PI*this.radius*this.radius;
};
}
var c1 = new Circle({x:0, y:0}, 2.0);
var c2 = new Circle({x:0, y:1}, 3.0);
var c3 = new Circle({x:1, y:0}, 1.0);
프로토타입 객체
위의 문제는 프로토타입 객체에 메서드를 정의하는 방식으로 해결할 수 있습니다. JS에서 함수도 객체이므로 함수 객체가 기본적으로 prototype 프로퍼티를 갖고 있습니다. 함수의 prototype 프로퍼티가 가리키는 객체를 그 함수의 프로토타입 객체라고 합니다. prototype 프로퍼티는 기본적으로 빈 객체를 가리킵니다.
function F(){};
console.log(F.prototype); //Object{}
프로토타입 객체의 프로퍼티는 생성자로 생성한 모든 인스턴스에서 그 인스턴스의 프로퍼티처럼 사용할 수 있습니다.
F.prototype.prop = "prototype value";
var obj = new F();
console.log(obj.prop); //"prototype value"
프로토타입은 '원형'이라는 뜻이지만, 여기서는 인스턴스에 아무것도 정의하지 않아도 처음부터 사용할 수 있는 것의 의미로 사용합니다. 또한 프로토타입 객체의 프로퍼티는 읽기만 가능하고 수정이 불가능합니다. 인스턴스의 프로퍼티에 값을 대입했을 때 이름이 같은 프로퍼티가 있으면 그 프로퍼티에 값을 대입하고, 없을 시 인스턴스에 그 이름으로 프로퍼티를 추가한 후 값을 대입합니다.
// Circle 생성자
fucntion Circle(center, radius) {
this.center = center;
this.radius = radius;
}
// Circle 생성자의 프로토타입 프로퍼티에 area 메서드 추가
Circle.prototype.area = funciton(){
return Math.PI*this.radius*this.radius;
};
// Circle 생성자로 인스턴스를 생성
var c1 = new Circle({x:0, y:0}, 2.0);
var c2 = new Circle();
var c3 = new Circle();
console.log();
flex의 속성은 크게 큰 테두리에 있는 컨테이너에 적용하는 속성과 컨테이너 안의 아이템들에 적용하는 속성으로 나뉩니다. 사용하기 전에 컨테이너에는 display : flex; 속성을 넣어줍니다.
.container {
display: flex;
}
그러면 아이템들이 가로 방향으로 배치되고 자신이 가진 내용물의 width 만큼 차지합니다. height는 컨테이너의 높이만큼 자동으로 늘어납니다. 비슷한 것으로 inline-flex는 아이템의 배치보다는 컨테이너와 주변 요소와의 관계를 결정합니다.
아이템 배치 축 결정
아이템들의 배치되는 축 (가로, 세로) 결정은 flex-direction을 사용합니다. row, row-reverse, column, column-reverse가 있습니다. 줄 넘김 설정은 flex-wrap을 사용합니다.
.container {
flex-direction: row;
}
아이템 정렬 방식
아래와 같이 설정합니다. (좌->우, 우->좌) flex-start, flex-end, center, space-between, space-around 등이 있습니다. flex-start는 아이템들을 시작점으로, flex-end는 끝점으로, center는 가운데로 정렬합니다. space-between은 사이에 균일한 간격을 넣어주며 space-around는 아이템 둘레에 균일한 간격을 만듭니다. space-evenlh는 아이템 사이와 양 끝에 균일한 간격을 만듭니다.
.container {
justify-content: flex-start;
}
쌓는 방식의 수직축 규칙은 align-items로 설정합니다. stretch는 수직축 방향으로 끝까지 늘어나는 것, flex-start는 아이템들을 시작점으로 정렬하는 것, baseline은 텍스트 베이스 라인 기준으로 정렬하는 것입니다. flex-wrap: wrap;이 설정된 상태에서 아이템들의 행이 2줄 이상일 때 align-content는 여러 행 정렬을 조절할 수 있습니다.
.container {
align-items: flex-start;
}
기타 다양한 옵션들은 아래 포스팅이 정리가 잘 되어있습니다. 아래의 링크를 보고 내용을 요약한 것이 이 포스팅이기도 합니다.
구글의 웹페이지들 중 원하는 정보를 효율적으로 검색하기 위해선 구글 검색 명령어 가이드를 잘 활용하면 좋은데요. 이번 글에서는 구글에서 효율적인 검색을 할 수 있도록 도와주는 구글 검색 명령어를 다뤄보도록 하겠습니다.
구글 검색 명령어 혹은 구글 검색 연산자(Google Search Operator)란 구글에서 검색을 할 때 더 효과적으로 목적에 맞는 검색을 할 수 있도록 도와주는 명령어 입니다. 목적과 용도를 가지고 몇가지만 익숙하게 다루실 줄 안다면, 훨씬 원하시는 정보에 대한 답을 빠르고 효율적으로 얻을 수 있습니다.
1. 구글 기본 검색 명령어(Basic Search Operator)
기본 검색 명령어는 구글 서치 결과 값을 간단하게 필터할 때 사용할 수 있는 명령어 입니다. 기본 검색 명령어 자체만을 이용해서 검색도 가능하고, 원하시는 결과 값에 따라 여러 기본 검색 명령어 및 고급 검색 명령어와 함께 사용하여 검색도 가능합니다.
” “
큰따옴표 사이에 원하는 검색어를 입력합니다. 해당 검색어를 반드시 포함하는 결과 값만 보여줍니다. (예: “구글 검색 연산자”)
OR ( | )
OR 명령어 앞뒤에 원하는 검색어를 입력합니다. 두 검색어 중 하나만 일치해도 결과 값을 보여줍니다. (예: 구글 검색 연산자 OR 구글 검색 명령어)
AND
AND 명령어 앞뒤에 원하는 검색어를 입력합니다. 두 검색어가 “둘다 일치하는” 결과 값만 보여줍니다. (예: 헤들리 AND 마케팅)
–
- 명령어 앞에 있는 검색어를 검색하되, 명령어 뒤에 있는 검색어를 제외한 결과 값만 보여줍니다. 예시와 같이 검색할 경우, 영화를 검색하되, CGV와 관련된 영화는 검색되지 않습니다. (예: 영화 -cgv)
*
어떤 단어와도 매치되는 결과 값을 보여줍니다.(예: 구글 * 고급 검색)
()
고급 검색시 검색 명령어나 검색어를 그룹으로 묶을 수 있는 명령어 입니다. (예: 구글 검색 ( 명령어 OR 연산자 ) )
₩, $
제품이나 서비스의 가격을 검색할 때 사용할 수 있는 명령어 입니다. (예: 아이폰 ₩ )
..
명령어 앞뒤에 연도를 기입하는경우, 해당 연도 안에 포함되는 결과 값만 보여줍니다. (예: 마케팅 트렌드 2018..2020 )
in
단위를 변환할 수 있는 명령어입니다. 현재 영어 단위만 사용 가능합니다. (예: 100 kph in mph)
2. 고급 검색 명령어(Advanced Search Operators)
고급 검색 명령어는 일반 검색 명령어와는 조금 다르게, 도메인 URL과 같은 특별한 매개 변수(Parameter)의 입력을 필요로 하기도 합니다.일반 검색 명령어로 찾기 어렵거나 검색 결과 값을 더 세부적으로 필터하고 싶을 때 사용하는 명령어 입니다. 일반 검색 명령어와 같이 여러 명령어를 함께 사용할 수 있습니다.
site:
명령어 뒤에 원하는 사이트의 주소(URL)를 입력하는 경우, 구글에 색인된(indexed) 페이지가 모두 표시됩니다. 구글 서치 콘솔에서 사이트맵을 업데이트 했거나, 새로운 페이지 및 글이 업데이트 되었는지 등을 확인할 때 유용합니다. (예: site:google.com)
source:
site와 비슷한 기능으로, 구글 뉴스(News)탭에서 보통 특정 언론사에서 발행된 뉴스를 검색할 때 사용합니다. (예: SEO source:Forbes )
intext:
검색어를 포함한 결과 값을 보여줍니다. 일반적인 구글 검색과 비슷하오나, 검색어가 제목에는 포함되어 있으나 본문(body text)에 포함이 되어있지 않은 결과값은 제외합니다. (intext:구글 검색 팁)
allintext:
intext: 명령어와 유사하나, 검색어의 모든 단어가 본문(body text)에 포함되어 있는 결과 값만 보여줍니다. (예:구글 고급 검색)
intitle:
제목(Title Tag)에 검색어가 포함된 결과 값만 보여줍니다. (예: 구글 검색법)
allintitle:
intitle: 명령어와 유사하오나, 검색어의 모든 단어가 제목(Title Tag)에 포함되어 있는 결과 값만 보여줍니다. (예: allintitle: 구글 검색 명령어 가이드)
inurl:
URL에 검색어가 포함된 웹 페이지의 결과 값만 보여주는 명령어 입니다. (예: inurl:google)
allinurl:
inurl: 명령어와 유사하나, 검색어의 모든 단어가 URL에 포함된 결과 값만을 보여줍니다. (예: allinurl:Google search console)
filetype:
특정 확장자(extension)를 가진 종류의 파일을 찾을 때 유용한 명령어 입니다. PDF, DOCX, TXT, PPT등 (예: research pdf)
ext:
filetype: 명령어와 동일합니다.
related:
검색되는 URL과 연관된 웹사이트 결과 값을 보여주는 명령어 입니다. (예: related:google.com)
AROUND(X)
근접 검색 명령어 입니다. 두개 이상의 단어나 문구가 X 의 단어 수 만큼 가까운 결과 값을 보여줍니다. 예시의 경우, apple과 iphone이 본문에 포함되어 있어야하고, 4개 단어를 초과하지 않는 거리 내에서의 결과 값을 보여줍니다. (예: apple AROUND(4) iphone)
define:
구글의 사전을 사용하여 검색되는 단어의 뜻을 보여줍니다. (define:SEO)
cache:
가장 최근에 캐시(cached)된 버전의 웹페이지를 보여줍니다. 당연하지만, 구글에서 이미 색인된(indexed)웹 페이지에만 해당됩니다. (cache:apple.com)
weather:
검색어 지역의 날씨를 알려줍니다. (예: weather:서울)
stocks:
주식 명령어 입니다. 주가 혹은 관련 정보를 보여줍니다. (stocks:aapl)
map:
지도 명령어 입니다. (map:seoul)
movie:
영화 명령어 입니다. 특정 영화에 관해 관련된 값을 보여줍니다. (movie:avengers)
구글은 빅 데이터를 분석하여 주기적으로 잘 사용되지 않거나, 필요성이 떨어진다고 생각되는 명령어들을 주기적으로 없애거나 생성합니다. 이 글의 출처에서 에디터분은 구글 SEO 검색엔진 최적화 작업을 진행하거나, 구글에서 웹페이지 색인(index)여부를 확인하거나, 혹은 PPC 키워드 광고 키워드 리서치를 할 때 등에도 구글 명령어를 활용하고 계시다고 합니다. 이런 구글 검색명령어가 낯설은 분도 많을 텐데요. 일단 일반적인 검색부터 자주 활용하면서 익숙해져봐야겠습니다.
유튜브 첫 채널을 개설했다면 프로필 사진을 추가하고 싶으실 건데요. 유튜브 채널 프로필, 커버 이미지 수정 및 추가 방법은 아래 순서를 따라가면 됩니다. 유튜브 첫 화면에서 프로필에 사람 아이콘을 누르면 나오는 드롭다운 메뉴에서 내 채널 메뉴를 클릭합니다.
저는 눈의 피로도를 위해 거의 다크모드 환경을 많이 사용하기에 어둑어둑합니다. 아직 준비중인 채널이라 업로드한 영상이 하나도 없네요.나온 화면에서 우측의 채널 맞춤설정 메뉴 버튼을 클릭합니다.
이제 유튜브 채널 스튜디오 메뉴로 이동했습니다. 탭 메뉴에서 브랜딩을 마우스로 클릭하면 프로필사진, 배너 이미지, 동영상 워터마크를 설정할 수 있습니다. 레이아웃을 들어가면 영상별로 카테고리도 분류할 수 있습니다.
유튜브 채널 프로필, 배너 이미지 사이즈
원래 목적으로 돌아와서 유튜브 채널 프로필, 배너 이미지 사이즈는 다음과 같습니다. 이미지보다 아래 표에 더 자세히 적어두었습니다. 정보 출처는 뇌피셜이 아니고 유튜브 측에서 제공한 정보입니다. (위 페이지에서 자세히 알아보기를 누르면 누구나 볼 수 있습니다.)
※ 채널 아이콘과 채널 아트의 수정 및 업데이트는 이제 모바일 수정은 불가합니다. PC로만 가능하다고 하네요!
프로필 사진 (동영상, 댓글 옆 위치) (채널 아이콘이라고도 부름)
98*98 픽셀 이상, 4MB 이하 PNG 또는 GIF (애니메이션 GIF 제외) 98*98 픽셀로 렌더링되는 정사각형 또는 원형 이미지 (권장 : 800*800픽셀 이미지)
배너 이미지 (채널 상단) (채널 아트라고도 부름 )
2048*1152픽셀 이상, 6MB 이하의 이미지 (권장 2560*1440 픽셀 이미지 한 장) 텍스트 및 로고가 잘리지 않는 최소 크기는 1235* 338 픽셀 이내 권장
영상 워터마크 (플레이어 우측 모서리 하단)
150*150픽셀, 1MB 이하의 PNG, GIF, BMP, JPEG
본래는 만들 때부터 맞춰서 제작하긴 하지만, 가지고 있거나 제작한 이미지 사이즈가 크다면, 이미지 크기를 조절하는 방법은 컴퓨터의 이미지 편집기, 온라인 이미지 크기 조절 도구 사용 등 다양합니다. 애플 맥에서는 Preview, 윈도우 컴퓨터에서는 Microsoft Photos 가 있고, 흔히 그림판이나 알씨 등도 사용하며 어도비 포토샵 등등 무궁무진합니다.
맥 프리뷰 (누르면 이동합니다)
각각의 유튜브 이미지 업로드는 아까 진입한 브랜딩 페이지에서 업로드를 눌러서 진행하시면 됩니다. 이번 글에서는 유튜브 채널 프로필, 배너 이미지, 워터마크의 권장 이미지 규격과 업로드 방법을 알아보았습니다. 도움이 되셨다면 광고 한번만 눌러주시면 큰 도움이 됩니다^^ 읽어주셔서 감사합니다~
두 번째 자바스크립트onchange를 사용한 경우에는 text (value1, value2, ...) 부분이 값으로 넘어갑니다. (출처)
onchange의 값이 갱신되지 않을 때 / 동작하지 않는 경우 해결하기
onchange가 select 태그 등에 동작하지 않는 원인은 select 태그를 클릭해서 값을 선택하지 않고, select 태그의 value 프로퍼티의 값을 스크립트를 사용해 업데이트 하는 경우입니다. onchange 이벤트는 해당 element의 blur 여부에 따라 동작하기 때문에 값이 갱신되지 않습니다.
onchange 동작 안됨 현상의 해결 방법은 해당 DOM에 onchange() 함수를 추가하여 사용하는 것입니다. 위와 같이 코드를 적용하면 updated()라는 함수가 뒤따라 실행하게 됩니다. (출처)
document.querySelector('select').value = '2';
// 엘리먼트를 찾아 값을 변경
document.querySelector('select').onchange();
// 값이 바뀐 엘리먼트에 onchange 함수를 실행
입력폼의 양식이 많은 경우 onchange()를 가지는 엘리먼트 요소가하나가 아닌 여러개인 경우가 있을 것입니다. 이 경우 하나씩 적용하기 보다 onchange를 가지는 모든 엘리먼트를 가져와 동작시키는 방법이 더욱 편합니다. 모든 onchange 속성을 가지는 태그를 찾아 그 값을 eval() 함수를 사용하여 실행하는 방법으로 아래와 같습니다.
var elements = document.querySelectorAll('[onchange]');
for(var i = 0; i < elements.length; i++) {
var thisFunc = elements[i].getAttribute('onchange');
eval(thisFunc);
};
객체리터럴이 대표적인 싱글톤패턴의 예입니다. 다만 속성이 노출되어 있어 싱글톤 패턴은 아래와 같이 비공개로 많이 사용합니다.
var singleton = (function() {
var instance;
var a = 'hello';
function initiate() {
return {
a: a,
b: function() {
alert(a);
}
};
}
return {
getInstance: function() {
if (!instance) {
instance = initiate();
}
return instance;
}
}
})();
var first = singleton.getInstance();
var second = singleton.getInstance();
console.log(first === second); // true;
IIFE 즉시실행함수 안에 비공개변수 a를 만들고, 그 안에 instance 변수와 initiate 함수를 만듭니다. initiate 함수 안의 내용이 실제 객체의 내용입니다.
getInstance 함수 호출 -> 내부 initiate 함수 호출-> instance에 객체 내용 저장, 반환 재호출되어 이미 instance가 있는 경우 그대로 반환
var Singleton = (function() {
var Singleton = function() {
this.type = "1";
}
var instance = null;
var createInstance = function() {
instance = new Singleton();
return instance;
}
return {
getInstance: function() {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();
function Client() {}
Client.prototype.test = function() {
var obj1 = Singleton.getInstance();
var obj2 = Singleton.getInstance();
if (obj1 === obj2) {
console.log("obj1과 obj2는 같은 인스턴스다.");
}
}
new Client().test();
// 출력결과
// obj1과 obj2는 같은 인스턴스다.
Atomics 객체
정적메소드로서 제공됩니다. 메모리가 공유되었을때, 멀티쓰레드는 메모리안에 같은 데이터들을 읽거나 쓸 수 있습니다. Atomic operations은 예측 가능한 값을 쓰고 읽으며 다음 작업이 시작되기 전에 작업이 완료되고, 작업이 중단되지 않도록 합니다. 지원 브라우저는 파이어폭스만 지원됩니다.
변수의 원자성은 보장하나 과정이 보장 되지 않으며 시스템이 변수를 컨트롤합니다.
데드락, Deadlock
서로 우위가 애매해서 기다리다 실행이 되지 않는 것. 서로 기다리는...
원인 : 운영체제 혹은 소프트웨어의 잘못된 자원 관리
의미 : 둘 이상의 프로세스가 함께 멈추어 버리는 현상. 데드락은 평소엔 별 문제가 없다가 가끔 쌩뚱맞게 일어나기 때문에 다중 쓰레드 프로그래밍의 주요 난점 중 하나
주요 패턴 : 다중 쓰레드 프로그래밍 환경에서의 ABA 문제, AB/BA 문제 등. 락(뮤텍스 같은 다중 프로세스 동기화 장치)을 저 순서대로 짜면 첫 락에 진입하자마자 쓰레드가 바뀌는 경우(Context-Switching) 다른 쓰레드가 자꾸 얻으려고 시도하는데 이미 락은 걸려 있고, 풀어주진 않고, 그래서 무한 대기하는 현상
해결 : 코드 순서를 조정하거나 처리 시간대를 다르게 바꾸어 동시에 일어나지 않게 하거나 락을 하나로 합칩니다. (이 경우
CPU 활용도는 좀 떨어집니다.)
크리티컬섹션 (Critical Section)
운영체제가 지원하는 동기화 방법 중 하나로 공유 자원의 독점을 보장해주는 역할을 합니다.
임계 구역, 치명적 영역. 즉 보호되어야 할 영역을 뜻합니다.
한 프로세스 내의 스레드 사이에서만 동기화가 가능. 접근을 대기시킵니다.
자바스크립트에서 크리티컬섹션 락 구현의 유사한 예로는 글로벌 변수 flag 를 두고 갱신중에는 flag = false, 완료후엔 flag = true 사용을 해야할 때는 flag == true 의 조건을 두는 방식이 있습니다.
Promise
Promise 객체는 비동기 작업의 완료/실패와 결과값을 나타냅니다. Promise를 사용하면 비동기메서드에서 동기 메서드처럼 값을 반환할 수 있습니다. JS에서 프로미스는 콜백 함수를 연결할 수 있는 이미 진행중인 프로세스를 나타앱니다.
▶ XSLT XPATH 노드 접근 표현식의 문법을 알아보겠습니다. XPATH는 XML 문서의 요소들을 노드 개념으로 접근, 소스 트리의 정확한 위치를 지정해주기 위한 경로지정 문법으로 XML과 별개의 문법 체계를 지닙니다.
XPATH : XML Path Language. W3C의 표준으로 확장 생성 언어 문서의 구조를 통해 경로 위에 지정한 구문을 사용하여 항목을 배치, 처리하는 방법을 기술하는 언어로 XSL 변환 (XSLT)과 XML 지시자 언어(XPointer)에 쓰입니다. XML 문서의 노드를 정의하기 위해 경로식을 사용하며함수와 기타 확장 가능 표현들이 있습니다. (출처)
'XPath is a language for addressing parts of an XML document,designed to be used by both XSLT and XPointer'
용어
tag : <로 시작해서 >로 끝나는 형식정의로 시작태그, 종료태그, 빈태그가 있습니다.
element : 시작, 종료태그와 태그 사이의 모든 내용으로 태그, 자식element, 속성, text(contents)가 있습니다.
node : XML문서는 여러 개의 Nodes(가지)로 구성된 Tree로 비유됩니다. XPath의 Node는 element, attribute, text, namespace, processing-instruction, comment, document 7가지가 있습니다.
노드 사이의 관계의 용어는 부모노드 Parent, 자식노드 Children, 형제노드 Siblings, 조상노드 Ancestors, 자손노드 Descendants를 사용합니다.
root element : Element tree 중 최상위의 Element
Atomic values : 부모나 자식이 없는 단일 Node들의 값
Items : Atomic values 단일 값들과 Node들
XSLT XPATH 노드 접근 표현식
/ : 최상위 엘리먼트 or 가상의 루트 노드
* : 노드 전체
. : 노드 자신
/a/b/c : 루트 노드의 자식 a의 자식 b의 자식인 c
a : 노드 자신 (상대경로)
//a : 모든 노드 중 a 노드 (첫 노드 검색 후 작업종료)
a[b] : b 노드를 자식으로 갖는 a노드
a[b='c'] : 자식 b 노드가 c텍스트를 갖는 a 노드
a[b='c']/d : 자식 b 노드가 c텍스트를 갖는 a 노드의 자식 d노드
a/@b : a노드의 속성 b
a[@b] : b 속성을 갖는 a노드
a[@b='c'] : b속성값 c를 갖는 a노드
a[@b='c']/d : b속성값 c를 갖는 a 노드의 자식 d노드
a/@* : a의 모든 속성노드
a/* : a의 모든 자식노드
XPATH 함수
XPath는 100여개 이상의 내장함수를 포함하고 있습니다. 이러한 함수들은 문자열, 숫자, 날짜와 시간비교, 시퀀스 생성, 논리값 등 매우 다양합니다. (출처)
nodename : 지정한 노드이름을 가진 모든 노드를 선택
name() : 노드명 반환 (ex. a/b/c/name())
processing-instruction() - 처리지시문을 반환
comment() - 주석 반환
text() : 노드 자신의 PCDATA 만 반환. (자식 X)
position() : 노드의 위치 지정 (ex. //a[position()=2])
last() : 노드집합의 마지막 노드
count() : 반환된 노드집합의 갯수
number() : Text형인 PCDATA를 숫자형으로 변환
sum() : 노드집합 안의 모든 산술값들의 합
boolean() : 값이 숫자 0이면 false, 나머지 true / 문자열일때 하나 이상이면 true / 노드집합일 때 비어있으면 false
SAP 3D Visual Enterprise Viewer SDK와 함께 JavaScript를 사용하여 브라우저에서 3d 모델을 로드하는 것은 매우 쉽습니다.아래 예제에서는 MyRHFile.rh라는 모델을 사용하고 있습니다. 실제 사용 시 이 파일의 이름을 변경해야 합니다.
<html>
<head> </head>
<body>
<object id="VEViewer" type="application/rh" width="100%" height=600px">
<div align="center">Couldn't instantiate VEViewer for some reason</div>
</object>
<script type="text/javascript">
function windowOnLoad()
{
VEViewer = document.getElementById("VEViewer");
VEViewer.FileName = "MyRHFile.rh";
}
// Initialisation
var VEViewer; window.onload = windowOnLoad;
</script>
</body>
</html>
로드 시 자바스크립트를 사용하여 objects를 강조 표시 (highlight objects) 하는 방법
SAP 3D Visual Enterprise Viewer SDK와 함께 JS를 사용하여 scene tree에서 objects를 강조 표시하는 방법을 보여줍니다. 모델에서 선택된 노드는 JS에서 명시적으로 지정됩니다.
<html>
<head>
<object id="Viewer" type="application/rh" width="100%" height=600px">
</object>
</head>
<body>
<script type="text/javascript">
onload = windowOnLoad;
function windowOnLoad()
{
Viewer = document.getElementById("Viewer");
Viewer.FileName = "MyRHFile.rh";
Viewer.SceneLoaded = SelectNodes;
}
function SelectNodes()
{
var nodes = Viewer.Scene.Nodes;
var nodeCount = Viewer.Scene.Nodes.Count;
// Loops thro' the scene tree to select objects [_1_Primary_Driven_Gear & _6_Left_Case]
for (var i = 0; i < nodeCount; i++)
{
var node = nodes.GetByIndex(i);
var output = node.name;
if(output=="_1_Primary_Driven_Gear" || output=="_6_Left_Case")
{
node.visible = true;
node.selected = true;
}
}
}
</script>
</body>
</html>
scene tree에서 object 및 steps 목록을 얻는 방법
JS로 SAP 3D Visual Enterprise Viewer의 scene tree를 탐색하여 object와 steps 목록들을 가져오는 방법입니다. 이 예제를 사용하려면 여기에 "c : \ SAPVisualEnterpriseViewerSDKSamples"디렉토리 예제를 만들어야합니다. 아래 코드를 .htm 파일에 저장해야합니다.이 디렉토리에는 MyRHFile.rh라는 샘플 .rh 파일도 있어야 합니다.코드를 수정하여 파일 이름을 변경할 수 있습니다.
참고:이 예에서는 document.write를 사용하지 않았습니다.그 이유는 출력이 느려지고insertAdjacentHTML을사용하여 결과를 출력하기 때문 입니다.
<html>
<head>
<object id="Viewer" type="application/rh" width="100%" height=600px">
</object>
</head>
<body>
<div id="firstDiv">Ojbect <strong>List</strong></div>
<script type="text/javascript">
onload = windowOnLoad;
function windowOnLoad()
{
Viewer = document.getElementById("Viewer");
Viewer.FileName = "MyRHFile.rh";
Viewer.SceneLoaded = GetNode;
}
function GetNode()
{
var nodes = Viewer.Scene.Nodes;
var nodeCount = Viewer.Scene.Nodes.Count;
// Traverse all the Scene's nodes
for (var i = 0; i < nodeCount; i++)
{
var node = nodes.GetByIndex(i);
var output = node.name;
var div1 = document.getElementById('firstDiv');
div1.insertAdjacentHTML('afterend', '<div id="secondDiv">Second <strong>'+output+'</strong></div>');
if(output=="_1_Primary_Driven_Gear" || output=="_6_Left_Case")
{
//node.visible = true;
//node.selected = true;
//var ExecuteQuery;
//var querytoexecute ="everything() set_opacity(0.3)";
//Viewer.Scene.ExecuteQuery(querytoexecute);
}
}
}
</script>
</body>
</html>
Object를 회전, 스케일 조절
SAP 3D Visual Enterprise Viewer와 JS로 객체를 회전, 확대, 축소하는 방법입니다. 버튼 같은 것을 누르면 작동하게 하겠죠. 그의 예시입니다.
<html>
<head>
<script id=clientEventHandlersJS language=javascript>
function LoadFile() {
var fileToUpload = document.getElementById("myfile").value;
document.getElementById("vev").LoadFile(fileToUpload);
}
function rh() {
return element("vev");
}
//ALL ROTATE CODE ETC
function BadNodeWarning() {
alert("Please select an object from your Model.");
}
function UpdateScene() {
Viewer = document.getElementById("vev");
Viewer.Scene.update();
}
function getSelected() {
Viewer = document.getElementById("vev");
var nodes = Viewer.Scene.Nodes;
for (var i = 0; i < nodes.count; i++) {
n = nodes.getByIndex(i);
if (n.selected) return n;
}
return null;
}
function RotateWorld_onclick() {
var n = getSelected();
if (!n) return BadNodeWarning();
// rotate in world coords
n.transform.rotateAboutZInplace(3.14159 / 7);
UpdateScene();
}
function ScaleWorld_onclick() {
var n = getSelected();
if (!n) return BadNodeWarning();
// rotate in world coords
n.transform.scaleInPlace(1.1, 1.1, 1.1);
UpdateScene();
}
</script>
<style>
p.controls span {
display: inline-block;
width: 150px;
}
p.controls input,
input[type="button"] {
width: 100px;
}
</style>
</head>
<body>
<h1>Sample Browse and Load SAP 3d Visual Enterprise Models </h1>
<b>Step One:</b> <br><br>
<input id="myfile" name="myfile" type="file"><br><br>
<b>Step Two:</b> <br><br>
<input value="Click Here To Load Your 3D Model" type="submit" onclick="return LoadFile()">
<br><br>
<object id="vev" style="width: 600px; height: 400px" type="application/rh"></object>
<p class="controls">
<span>World transformations:</span>
<input id="RotateWorld" type="button" value="Rotate" onclick="return RotateWorld_onclick()">
<input id="ScaleWorld" type="button" value="Scale" onclick="return ScaleWorld_onclick()">
</p>
</body>
</html>