Mac docker 설치하기

https://docs.docker.com/docker-for-mac/install


Download from Docker Hub 선택한다. 




Please Login To Download를 선택한다. 








회원가입이 안되어있어서 회원가입을 진행하였다. DockerID, Email, Password 입력하고 약관에 동의를 체크한다음 Sign Up 선택한다.



이메일 인증을 완료하면, 회원가입이 성공적으로 완료된다.




Get Docker 버튼을 클릭하여 Docker.dmg 파일을 다운로드 한다.



Docker 이미지를 Drag & Drop 하여설치한다. 




Docker 를 실행한다. 


Next 버튼을 선택한다. 



Desktop에 access 할 권한이필요하므로 OK 버튼을 선택한다. 



DockerID, Password 를 입력하고 로그인 한다. 



docker version 을 입력해서 설치된 버전을 확인한다. 

블로그 이미지

클라인STR

,

리액트 컴포넌트 라이프 사이클 (React Component Life Cycle)


생성 될 때 (Mount) 호출되는 함수 

constructor : 컴포넌트를 새로 만들 때마다 호출되는 클래스 생성자 메서드

getDerivedStateFromProps :  props에 있는 값을 state에 동기화하는 메서드

render : UI를 렌더링하는 메서드 

componentDidMount : 컴포넌트가 웹 브라우저상에 나타난 후 호출하는 메서드 




업데이트 할때 (Update) 호출되는 함수


컴포넌트가 업데이트되는 경우는 4자이다. 


  • props가 바뀔 때
  • state가 바뀔 때
  • 부모 컴포넌트가 리렌더링될 때
  • this.forceUpdate가 강제로 렌더링을 트리거 할때


getDerivedStateFromProps : , 마운트 과정에서 호출되며 props가 바뀌어서 업데이트할 때도 호출된다. 

shouldComponentUpdate : 컴포넌트가 리렌더링을 해야 할지 말아야 할지를 결정하는 메서드이다. 여기에 false를 반환하면 아래 메서드들을 호출하지 않는다.

render : 컴포넌트를 리렌더링하는 메서드 

getSnapshotBeforeUpdate : 컴포넌트 변화를 DOM에 반영하기 바로 직전에 호출하는 메서드

componentDidUpdate : 컴포넌트의 업데이트 작업이 끝난 후 호출하는 메서드


제거될 때 (UNMOUNT) 호출되는 함수

componentWillUnmount :  컴포넌트가 웹 브라우저상에서 사라지기 전에 호출하는 메서드



render() 

이 메서드 안에서 this.props와 this.state에 접근할 수 있다. 아무것도 보여주고 싶지않다면 null 값이나 false 값을 반환하도록 한다.

이 메서드 안에서는 state 값을 변형해서는 안되며, 웹 브라우저에 접근해서 도 안된다. 

DOM 정보를 가져오거나 변화를 줄 때는 componentDidMount 에서 처리해야 한다.



construcotr 

컴포넌트 생성자 메서드로 컴포넌트를 만들 때 처음 실행된다. state 초기화 할 수 있다.


getDerivedStateFromProps

리액트 v16.3 이후에 새로 만든 라이프사이클 메서드 이다. props로 받아 온 값을 state에 동기화시키는 용도로 사용하며, 컴포넌트를 마운트하거나 props 변경할 때 호출한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
static getDerivedStateFromProps(nextProps, prevState) {
    
    
    if (nextProps.value !== prevState.value) { // 조건에 따라 특정 값 동기화
      return {
        value: nextProps. value,
       
      };
    }
 
    // state를 변경할 필요가 없다면 null을 반환
    return null;
  }
 
cs



componentDidMount 

컴포넌트를 만들고 첫 렌더링을 마친뒤 실행된다. 이 안에서는 다른 자바스크립트 라이브러리 또는 프레임워크 함수를 호출하거나 이벤트 등록, setTimeout, setInterval, 네트워크 요청 같은 비동기 작업을 처리하면 된다. 



shouldComponentUpdate

props 또는 state를 변경했을 때, 리렌더링을 시작할지 여부를 지정하는 메서드이다. 반드시 true 또는 false 값을 반환해야한다.

이 메서드가 false를 반환하면 업데이트 과정은 중지된다.

이 메서드 안에서 현재 props와 state는 this.props와 this.state로 접근하고, 새로 설정될 props 또는 state는 nextProps와 nextState로 접근할 수 있다.



getSnapshotBeforeUpdate

리액트 v16.3 이후에 만든 메서드이다. 이 메서드는 render 메서드를 호출한 후 DOM에 변화를 반영하기로 바로 직전에 호출하는 메서드 이다. 여기에서는 반환하는 값은 componentDidUpdate 에서 세번째 파라미터인 snapshot 값으로 전달 받을 수 있다. 

주로 업데이트 하기 직전의 값을 참고할 때 사용된다. (예 : 스크롤바 위치 유지)

1
2
3
4
5
6
getSnapshotBeforeUpdate(prevProps, prevState) {
      if(prevState.array !== this.state.array) {
          const {scrollTop, scrollHeight} = this.list
          return {scrollTop, scrollHeight}
      }
  }

cs



componentDidUpdate

리렌더링을 완료한 후 실행된다. 업데이트 가 끝난 직후 이므로, DOM관련 처리를 해도 무방하다. 여기에서는 prevProps 또는 prevState를 사용하여 컴포넌트가 이전에 가졌던 데이터에 접근할 수 있다.  또 getSnapshotBeforeUpdate에서 반환 값이 있다면 여기에서 snapshot 값을 전달받을 수 있다.

1
componentDidUpdate(prevProps, prevState, snapshot) {. . . }
cs




componentWillUnmount

컴포넌트를 DOM에서 제거할 때 실행한다. componentDidMount 에서  등록한 이벤트, 타이머, 직접 생성한 DOM이 있다면 여기에서 제거 작업을 해야 한다.



원문 : 래액트를 다루는 기술 

블로그 이미지

클라인STR

,


Git 로컬저장소를 GitHub 에 푸쉬하는법




   Start a project 버튼을 선택한다.



Repository name을 입력하고, 저장소를 공용으로 쓸지 개인으로 쓸지 선택한다. 

Create repository 버튼을 선택하면 저장소가 생성된다. 




git remote add origin https://github.com/kknd83/finedust.git


명령어를 이용해서 원격지 저장소를 설정한다.


git init 명령어를 이용해서 로컬저장소를 생성한다. 이미 저장소가 생성되어 있으므로 해당과정을 생략하였다. 


echo "# finedust" >> README.md

 git add README.md

 git commit -m "README.md add"

README.md 파일을 생성한뒤 commit 한다.


git remote -v 


통해서 현재 연결된 원격지 저장소 정보를 확인한다.



git config --local user.email "이메일"

git config --local user.name "계정"

git config --local e


git conifg 명령어를 이용하여 git local 정보를 설정해주고, 설정값을 git conifg --local e 명령어로 확인 할 수 있다.





Repository not found 에러가 발생하였다. 




git remote set-url origin "https://계정명@github.com/계정명/레포지토리명.git"


위에 명령어로 원격 저장소 주소를 변경한다음  git push -u origin master  원격저장소로 push 한다.




Github 원격저장소에 푸쉬가 정상적으로 된 내용을 확인할 수 있다. 



블로그 이미지

클라인STR

,

GitHub 시작하기

형상관리 2019. 1. 23. 14:09

GitHub 서비스 계정 생성



sign up  버튼을 클릭한다.




username, Email address , password 입력한다.



   Verify account 에서 이미지 옮기기를 수행한다.



검증하기 눌러서 한번더 검증하고 Create an account 버튼을 선택한다.




사용할 Plan 을 선택한 다음 , Continue 버튼을 클릭한다. 





문항에 알맞는 내용을 체크하고 Submit 버튼을 선택한다.



가입이 완료되면 이메일 인증을 해야된다. 가입시 작성한 이메일 내용을 확인한뒤 이메일 인증을 완료한다.




블로그 이미지

클라인STR

,

PlayStation4 할인행사 



소니인터랙티브엔터테인먼트코리아(이하 SIEK, 대표: 안도 테츠야)는 2019년 1월 24일(목)부터 2019년 2월 3일(일)까지 11일 동안 기간 한정으로 PlayStation®4 Pro(이하 PS4™ Pro) 1TB, PlayStation®4(이하 PS4™) 1TB 및 PlayStation®VR(이하 PS VR) All-in-one-pack을 정상 판매가 대비 최대 15만원 인하*1된 특별 가격에 판매한다.

 

해당 기간 동안 PS4™ Pro 1TB는 348,000원(정상 판매가 498,000원), PS4™ 1TB는 248,000원(정상 판매가 378,000원), PS VR All-in-one-pack은 298,000원(정상 판매가 448,000원)에 판매된다.



이번 특가 판매는 한정 수량으로 진행되며, 사전에 준비된 수량이 모두 소진될 경우 특가 판매가 조기에 종료될 수 있다.

 

한정 기간 동안 한정 수량으로 진행되는 이번 특가 판매는 PlayStation® 파트너샵 플러스를 비롯하여 PlayStation®의 주요 온, 오프라인 판매점에서 진행된다. PlayStation® 주요 판매점은 PlayStation® 공식 홈페이지에서 확인할 수 있다.


매장명주소전화번호
PlayStation 파트너샵+ 가든파이브점서울 송파구 충민로66 가든파이브 테크노관 4층 플레이스테이션 라운지02-2673-2403
PlayStation 파트너샵+ 목동점서울 양천구 목동동로 257 현대백화점 본관 지하 1층 플레이스테이션 라운지02-2163-1073
PlayStation 파트너샵+ 세종점세종 도움1로 106 메가시티 128호070-8827-1656
PlayStation 파트너샵+ 아이파크몰점서울 용산구 한강대로23길 55 현대아이파크몰 디지털관 3층 196~201호070-8822-1656
PlayStation 파트너샵+ 울산점울산 남구 삼산로 261 현대백화점 8층 플레이스테이션 라운지052-228-0865
PlayStation 파트너샵+ 천호점서울 강동구 천호대로 1005 현대백화점 6층 플레이스테이션 라운지02-2225-7675
PlayStation 파트너샵+ 코엑스점서울 강남구 영동대로 513 스타필드 코엑스몰 지하 2층02-6002-3266
PlayStation 파트너샵+ 판교점경기 성남시 분당구 판교역로146번길 20 현대백화점 6층 플레이스테이션 라운지031-5170-1658
건담스테이션전북 전주시 완산구 유연로 288063-228-7278
게이머즈경기 오산시 오산로 374 105~106호031-374-6878
게임RYU경기 하남시 덕풍동로 119 하남프라자 1층 110호010-5440-5091
게임나라대구 북구 유통단지로 45 유통단지전자관 3층 141호053-604-1056
게임매니아광주 동구 제봉로 59062-224-3384
게임박스서울 광진구 광나루로56길 85 테크노마트 8층 A-60, 77호02-3424-8025
게임스테이션 부산점부산 중구 대청로 77-1051-245-9117
게임스테이션 수원점경기 수원시 팔달구 매산로 94031-238-7868
게임친구전북 익산시 익산대로 177063-857-6366
게임홀릭인천 남구 주안로 48-1010-4110-3991
나라게임경남 진주시 남강로659번길 6055-744-8249
드림플레이어즈 천안점충남 천안시 동남구 대흥로 293041-553-2467
드림플레이어즈 청주점충북 청주시 서원구 사직대로 282043-263-2467
비젼유아이씨서울 서대문구 수색로 144 국제빌딩 1층070-7431-3977
와이세븐스타일서울 용산구 청파로 100 나진상가 13동 나열 111호~113호070-8809-4109
와이에스엔터테인먼트경남 창원시 성산구 원이대로682번길 10 하바드빌딩 102호055-284-8111
워커홀릭 대전점대전 중구 중앙로 133-1042-252-1277
워커홀릭 용산점서울 용산구 청파로 100 나진상가 12동 나열 126호070-8654-1277
원스탑게임기부산 부산진구 중앙대로 786 서면지하상가 라 70호051-802-8679
위브엔터테인먼트서울 용산구 청파로 101 나진상가 10동 가열 103호02-703-1564
팔팔게임랜드대구 중구 국채보상로 626053-421-5916
플레이스테이션 평택점경기도 평택시 중앙로 82-1031-652-7891
한우리 국제전자센터점서울 서초구 효령로 304 국제전자센터 9층 114호02-3465-0048
한우리 신도림점서울 구로구 새말로 97 테크노마트 2층 37호02-2111-7144
현대게임마트경북 구미시 원평동 구미중앙로 129054-451-6361
*이마트, 홈플러스, 하이마트, 롯데마트, 교보문고, 롯데백화점, 신세계백화점, 소니 스토어 등

PlayStation® 온라인 쇼핑몰















출처 : https://asia.playstation.com/ko-kr/press-releases/2019/190121-ps4-promotion/


블로그 이미지

클라인STR

,

오늘부터 위메프 특가 이벤트를 한다는 내용이 실시간 검색어 및 포탈의 뒤덥었다.


카톡으로 친구가 이런메시지를 보내왔는데 왠지 이상하다는 것이었다. 








네이버 플러스친구를 유도 하고있으며 , 몇 개의 이벤트를 추가로 하기 위해서 카페 가입을 유도하고 있다.


해당 플러스 친구 계정은 몇 분뒤 자동으로 차단 되었다. 



카페나 커뮤니티, SNS 를 통해서 홍보 한뒤 사용자의 참여를 유도하는 허위성 이벤트를 조심해야될 듯하다. 


추가 - 1월 28일 위메프 이벤트에 따른 추가 피싱사례




 이벤트 -> 카톡플핀친구추가 같은 형태인듯하다.

블로그 이미지

클라인STR

,


Json Object 에서 특정 key 값의 최대, 최소 값 구하기 


https://lodash.com/



_.minBy(array, [iteratee=_.identity])


_.maxBy(array, [iteratee=_.identity])


var objects = [{ 'n'1 }, { 'n'2 }];
 
_.maxBy(objects, function(o) { return o.n; });
// => { 'n': 2 }
 
// The `_.property` iteratee shorthand.
_.maxBy(objects, 'n');
// => { 'n': 2 }


var objects = [{ 'n'1 }, { 'n'2 }];
 
_.minBy(objects, function(o) { return o.n; });
// => { 'n': 1 }
 
// The `_.property` iteratee shorthand.
_.minBy(objects, 'n');
// => { 'n': 1 }


참고 https://stackoverflow.com/questions/33351934/get-the-min-and-max-from-array-of-objects-with-underscore-js


https://lodash.com/docs/4.17.11#minBy

https://lodash.com/docs/4.17.11#maxBy

블로그 이미지

클라인STR

,


공공데이터포털 에서 아래와 같은 API 서비스를 이용하였다.


1. 측정소정보 조회 서비스



측정소 정보 서비스 조회하기 이다.  실제 대기오염 지표를 조회하는 방법중 현재 위치에 근처에 있는 근접 측정소를 조회한뒤 해당 측정소에 대기오염 지표를 조회한다. 




2. 대기오염정보 조회 서비스



대기오염 정보조회 서비스를 이용해서 대기오염지수를 조회한다. 먼저 조회해서 확인해볼 데이터는 측정소별 실시간 측정정보 조회이다.  해당 API에 대한 자세한 정보는 airkorea_openapi_guide-v1_6_1.docx 통해서  확인가능하다.



3. 근접측정소 목록 조회 하기






TM 좌표를 기준으로 가장 가까운 측정소 list를 구한다. 

TM좌표 구하는 방법에 대한것은 이전 포스팅을 참고한다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
async function getNearbyMsrstnList(tmX, tmY) {
    let url = `${API_NMT}?tmX=${tmX}&tmY=${tmY}&pageNo=1&numOfRows=10&ServiceKey=${SERVICE_KEY}&_returnType=json`;
    
    let res = await fetch(url)
    .then(response => response.json())
    .then(data => {
        
        // data.list.
       let tms = _.minBy(data.list, 'tm');
       
       return tms;
       
    })
    .catch(error => {
        console.log("error");
        
    });
    return await getMsrstnAcctoRltmMesureDnsty(res.stationName);
}

cs


tm좌표를 기준으로 가장 가까운 측정소 리스트를 조회한다음, 현재 위치에서 측정소 거리가 가장 가까운 Object를 찾는다. 



4. 측정소별 실시간 정보 조회 하기





측정소별 실시간 측정정보를 조회하기 위해서는 측정소명이 필요한데  근접측정소 목록 조회결과 값으로 측정소 명을 알 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
async function getMsrstnAcctoRltmMesureDnsty(stationName) {
    let url = `${API_MSRSTN}?stationName=${encodeURIComponent(stationName)}&dataTerm=${DATA_TYPE}&pageNo=1&numOfRows=1&ServiceKey=${SERVICE_KEY}&_returnType=json`;
    console.log(url);
    return await fetch(url)
    .then(response => response.json())
    .then(data => {
        console.log("getMsrstnAcctoRltmMesureDnsty");
        console.log(data.list);
        console.log(data.list[0].mangName);
        console.log(data.list[0].dataTime);
        console.log(data.list[0].pm10Grade);
        console.log(data.list[0].pm10Value);
        console.log(data.list[0].pm25Grade);
        console.log(data.list[0].pm25Value);
        console.log(data.list[0].so2Value);
        console.log(data.list[0].so2Grade);
 
        console.log(data.list[0].coGrade);
        console.log(data.list[0].coValue);
        console.log(data.list[0].khaiGrade);
        console.log(data.list[0].khaiValue);
       
        return data.list[0];
    })
    .catch(error => {
        console.log("error");
        console.log(error);
        
    });
}

cs






블로그 이미지

클라인STR

,