banner made by Banner Maker

3월 Today I Learned

  • 로컬에 Pull Request 브랜치 가져오기
  • 엔디언 Endianess
  • Internet Explorer 웹 브라우저 버전 구분하기

로컬에 Pull Request 브랜치 가져오기


Category : git OpenSource

이전에 올렸던 banner-maker에 pull request 로 온 브랜치를 로컬에서 테스트 하는 중에, 올린 사람의 저장소가 아닌 내 저장소에 pr 브랜치 정보가 있지 않을까 하는 생각이 들었다.

검색해보니 역시 있었다. 매번 다른 유저의 저장소를 찾아가서 가져오는 것은 귀찮으므로 간단히 설정 파일에 pr 주소를 추가하면 자동으로 가져올 수 있다.

pr이 저장되고 있는 위치는 다음과 같다. pr/*은 pr 디렉토리 이하의 모든 브랜치를 가져온다는 의미이다.

+refs/pull/*/head:refs/remotes/origin/pr/*

vim으로 .git/config 파일을 열어서 remote "origin" 정보에 fetch를 한 줄 더 추가해준다.

[core]
    ...
[remote "origin"]
        url = https://github.com/godori/banner-maker.git
        fetch = +refs/heads/*:refs/remotes/origin/*
        fetch = +refs/pull/*/head:refs/remotes/origin/pr/*

git fetch origin 후에 git branch -a 로 확인해보면 다음 원격지의 pr 브랜치도 확인할 수 있다.

(HEAD detached at 751f812)
master
pr/15
remotes/origin/master
remotes/origin/pr/12
remotes/origin/pr/13
remotes/origin/pr/15
remotes/origin/pr/16

Ref

GitHub의 Pull Request를 로컬로 가져오기

엔디언 Endianess


Category : CS Network OS

평소에 잘 다룰 일이 없는 개념이라 잊고 있었는데 마침 생각이 나서 정리해보았다.

엔디안이란?

엔디안이란 1차원의 메모리에 연속된 데이터를 어떤 순서로 저장할 지 정하는 방식이다.

보통 컴퓨터 메모리에 데이터를 저장할 때 바이트 단위로 나누어서 저장한다. 메모리에는 시작 주소와 끝나는 주소가 있으며, 엔디안이란 나눠진 바이트를 저장할 때 시작 주소에 하위 바이트부터 저장할 지 상위 바이트를 저장할 지를 정할 수 있다.

0A0B0C0D 라는 32비트 정수를 시작점인 a에 저장한다고 하자. 0A쪽이 높은 단위의 바이트, 0D 쪽이 낮은 단위의 바이트이다. 높은 주소인 0A부터 넣으면 빅-엔디안, 낮은 주소인 0D부터 넣으면 리틀-엔디안 방식을 사용한 것이다.

즉, 0x12345678 이라는 정수가 있다면 빅 엔디안은 12 34 56 78 으로, 리틀 엔디안은 78 56 34 12 으로 저장한다. (87 65 43 21 이 아니다)

엔디안의 유래

엔디안이라는 용어의 유래는 걸리버 여행기에 나오는 소인국에서 달걀을 깨는 방법으로 싸우는 사람들의 격론에서 따온 것이다. 뭉툭한 쪽을 먼저 깨는 빅 엔디언과, 뾰족한 끝을 먼저 깨는 리틀 엔디언과의 논쟁인데, 한마디로 어느 쪽이 좋다고도 나쁘다고도 할 수 없고, 두 방법은 여러 아키텍쳐에서 공존하고 있다.

엔디안은 서로 다른 시스템간의 통신이 이루어질 때 특히 중요한데, 네트워크 프로토콜 설계 시에 엔디안을 고려하지 않으면 대 참사가 일어난다. 보통 네트워크 프로토콜은 빅 엔디안으로 표현하는 것이 일반적이다.

자바스크립트의 DataView 인터페이스와도 관련 있다.

Internet Explorer 웹 브라우저 버전 구분하기


Category : IE browser

웹 브라우저의 종류와 버전은 navigator.userAgent 속성의 값으로 구분할 수 있다.

    if (navigator.userAgent.toLowerCase().indexOf("chrome") !== -1) {
        console.log('This is chrome browser');
    }

IE8버전 부터 살펴보면 버전10 까지는 공통 문자열인 MSIE로 구분할 수 있지만, IE11 MSIE가 없다.

IE 8 : Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)
IE 9 : Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)
IE 10 : Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Win64; x64; Trident/6.0)
IE 11 : Mozilla/5.0 (Windows NT 6.3; Win64, x64; Trident/7.0; rv:11.0) like Gecko

대신 Trident라는 공통적인 문자열을 볼 수 있는데, 이는 MS 레이아웃 엔진의 이름이며 IE에서만 사용한다. 하지만 Trident도 IE7 이하에서는 표기하지 않는다는 점을 유의해야 한다.

다행히 IE8 이하의 사용률이 낮고 IE11은 Trident로 구분 가능하므로, MSIE 혹은 Trident를 적절히 포함하여 IE 브라우저를 구분하면 된다.

회사에는 이미 만들어진 라이브러리가 있었더랬다. (생각해보니 없을리가...)
참고로 IE8을 지원하기 위해서는 matches 나 includes 대신 indexOf를 사용해야 한다.

Ref

웹브라우저가 IE(인터넷 익스플로러)인지 확인하기
Internet Explorer User Agent String